python-hwpx 6.4.0__tar.gz → 6.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. {python_hwpx-6.4.0/src/python_hwpx.egg-info → python_hwpx-6.6.0}/PKG-INFO +6 -4
  2. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/README.md +5 -3
  3. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/pyproject.toml +82 -1
  4. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/__init__.py +3 -0
  5. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/_legacy.py +3 -1
  6. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/fields.py +50 -2
  7. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/layout.py +289 -62
  8. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/media.py +217 -38
  9. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/memos.py +54 -9
  10. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/fields.py +26 -1
  11. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/media.py +23 -4
  12. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/page.py +27 -4
  13. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/parts.py +71 -2
  14. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/shapes.py +6 -1
  15. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/styles.py +157 -8
  16. python_hwpx-6.6.0/src/hwpx/_document/ns/text.py +312 -0
  17. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/tracking.py +5 -1
  18. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/persistence.py +133 -13
  19. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/shapes.py +81 -1
  20. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/tracked.py +49 -1
  21. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/body_patch.py +6 -2
  22. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/capabilities.py +1 -1
  23. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/data/contract_docs/known-traps.md +37 -2
  24. python_hwpx-6.6.0/src/hwpx/data/contract_docs/mutation-semantics.md +113 -0
  25. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/data/contract_docs/support-matrix.md +7 -8
  26. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/document.py +65 -5
  27. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/authoring.py +13 -10
  28. python_hwpx-6.6.0/src/hwpx/equation/mathml.py +135 -0
  29. python_hwpx-6.6.0/src/hwpx/equation/measure.py +371 -0
  30. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/render.py +2 -2
  31. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/tokens.py +11 -0
  32. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/errors.py +49 -2
  33. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/__init__.py +4 -0
  34. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/apply.py +1 -1
  35. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/engine.py +10 -11
  36. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/measure.py +280 -22
  37. python_hwpx-6.6.0/src/hwpx/hwp5/__init__.py +7 -0
  38. python_hwpx-6.6.0/src/hwpx/hwp5/binary.py +124 -0
  39. python_hwpx-6.6.0/src/hwpx/hwp5/bodytext.py +201 -0
  40. python_hwpx-6.6.0/src/hwpx/hwp5/cfb.py +601 -0
  41. python_hwpx-6.6.0/src/hwpx/hwp5/controls.py +1175 -0
  42. python_hwpx-6.6.0/src/hwpx/hwp5/docinfo.py +881 -0
  43. python_hwpx-6.6.0/src/hwpx/hwp5/docinfo_writer.py +647 -0
  44. python_hwpx-6.6.0/src/hwpx/hwp5/errors.py +75 -0
  45. python_hwpx-6.6.0/src/hwpx/hwp5/fileheader.py +87 -0
  46. python_hwpx-6.6.0/src/hwpx/hwp5/header_xml.py +703 -0
  47. python_hwpx-6.6.0/src/hwpx/hwp5/owpml.py +390 -0
  48. python_hwpx-6.6.0/src/hwpx/hwp5/package.py +331 -0
  49. python_hwpx-6.6.0/src/hwpx/hwp5/reader.py +149 -0
  50. python_hwpx-6.6.0/src/hwpx/hwp5/records.py +214 -0
  51. python_hwpx-6.6.0/src/hwpx/hwp5/section_common.py +149 -0
  52. python_hwpx-6.6.0/src/hwpx/hwp5/section_writer.py +1826 -0
  53. python_hwpx-6.6.0/src/hwpx/hwp5/section_xml.py +1514 -0
  54. python_hwpx-6.6.0/src/hwpx/hwp5/shape_xml.py +709 -0
  55. python_hwpx-6.6.0/src/hwpx/hwp5/shapes.py +842 -0
  56. python_hwpx-6.6.0/src/hwpx/hwp5/summary.py +204 -0
  57. python_hwpx-6.6.0/src/hwpx/hwp5/writer.py +325 -0
  58. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/ingest/hwpx_converter.py +1 -1
  59. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/layout/__init__.py +2 -0
  60. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/layout/lint.py +147 -2
  61. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/model.py +2 -0
  62. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/__init__.py +12 -1
  63. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/form_field.py +75 -1
  64. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/results.py +131 -0
  65. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/opc/package.py +148 -16
  66. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/opc/relationships.py +16 -3
  67. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/opc/xml_utils.py +44 -15
  68. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/_document_primitives.py +59 -34
  69. python_hwpx-6.6.0/src/hwpx/oxml/_paragraph_text_edit.py +117 -0
  70. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/color.py +36 -1
  71. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/document_parts.py +125 -157
  72. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/drop_cap.py +45 -0
  73. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/header.py +6 -2
  74. python_hwpx-6.6.0/src/hwpx/oxml/header_fonts.py +291 -0
  75. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/header_part.py +23 -18
  76. python_hwpx-6.6.0/src/hwpx/oxml/hyperlink_form.py +159 -0
  77. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/master_page_authoring.py +66 -4
  78. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/memo.py +4 -8
  79. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/note_authoring.py +2 -3
  80. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/numbering_kinds.py +48 -2
  81. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/objects.py +71 -42
  82. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/paragraph.py +96 -76
  83. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/run.py +209 -44
  84. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/section.py +283 -3
  85. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/section_format.py +199 -13
  86. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/section_layout.py +87 -0
  87. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/section_story.py +253 -38
  88. python_hwpx-6.6.0/src/hwpx/oxml/shape_position.py +128 -0
  89. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/table.py +226 -75
  90. python_hwpx-6.6.0/src/hwpx/oxml/table_merge.py +82 -0
  91. python_hwpx-6.6.0/src/hwpx/oxml/table_sizes.py +334 -0
  92. python_hwpx-6.6.0/src/hwpx/oxml/utils.py +214 -0
  93. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/patch.py +16 -3
  94. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/table_patch.py +233 -73
  95. python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-body.xsd +18 -0
  96. python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-core.xsd +905 -0
  97. python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-header.xsd +1869 -0
  98. python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-paralist.xsd +2813 -0
  99. python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-xml.xsd +15 -0
  100. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/document_merge.py +92 -15
  101. python_hwpx-6.6.0/src/hwpx/tools/exporter.py +664 -0
  102. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/layout_preview.py +44 -2
  103. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/mail_merge.py +19 -13
  104. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/markdown_export.py +37 -16
  105. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/package_validator.py +17 -4
  106. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/read_fidelity.py +4 -4
  107. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/redline.py +4 -4
  108. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/table_navigation.py +3 -2
  109. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/template_analyzer.py +5 -1
  110. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/text_extractor.py +54 -24
  111. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/toc_author.py +110 -9
  112. python_hwpx-6.6.0/src/hwpx/tools/validator.py +433 -0
  113. {python_hwpx-6.4.0 → python_hwpx-6.6.0/src/python_hwpx.egg-info}/PKG-INFO +6 -4
  114. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/SOURCES.txt +98 -0
  115. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_authoring_defaults.py +33 -14
  116. python_hwpx-6.6.0/tests/test_border_line_types.py +72 -0
  117. python_hwpx-6.6.0/tests/test_cell_border_neighbors.py +135 -0
  118. python_hwpx-6.6.0/tests/test_cell_fields.py +177 -0
  119. python_hwpx-6.6.0/tests/test_cell_margins.py +168 -0
  120. python_hwpx-6.6.0/tests/test_cell_text_rewrite_semantics.py +120 -0
  121. python_hwpx-6.6.0/tests/test_char_pr_child_order.py +64 -0
  122. python_hwpx-6.6.0/tests/test_character_width_ratio.py +35 -0
  123. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_chart_authoring.py +141 -0
  124. python_hwpx-6.6.0/tests/test_color_arguments.py +170 -0
  125. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_container_authoring.py +8 -0
  126. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_formatting.py +12 -7
  127. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_merge.py +168 -2
  128. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_documentation_code_fences.py +1 -1
  129. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_drop_cap_authoring.py +88 -0
  130. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_edit_fidelity_corpus.py +16 -5
  131. python_hwpx-6.6.0/tests/test_equalize_widths_per_row.py +297 -0
  132. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_equation_authoring.py +2 -0
  133. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_equation_converter.py +25 -0
  134. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_equation_render.py +47 -0
  135. python_hwpx-6.6.0/tests/test_equation_size.py +97 -0
  136. python_hwpx-6.6.0/tests/test_error_messages.py +143 -0
  137. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_existing_document_format_editing.py +5 -3
  138. python_hwpx-6.6.0/tests/test_export_captions_dutmal.py +162 -0
  139. python_hwpx-6.6.0/tests/test_export_cell_text_spaces.py +29 -0
  140. python_hwpx-6.6.0/tests/test_export_list_labels.py +194 -0
  141. python_hwpx-6.6.0/tests/test_export_text_boxes.py +157 -0
  142. python_hwpx-6.6.0/tests/test_exporter_table_text.py +164 -0
  143. python_hwpx-6.6.0/tests/test_fill_image_hancom_modes.py +73 -0
  144. python_hwpx-6.6.0/tests/test_form_fit_hancom_rules.py +191 -0
  145. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_fit_integration.py +13 -0
  146. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_golden_api.py +25 -6
  147. python_hwpx-6.6.0/tests/test_heading_style_shapes.py +58 -0
  148. python_hwpx-6.6.0/tests/test_hwp5_container.py +255 -0
  149. python_hwpx-6.6.0/tests/test_hwp5_hancom_files.py +154 -0
  150. python_hwpx-6.6.0/tests/test_hwp5_open.py +1188 -0
  151. python_hwpx-6.6.0/tests/test_hwp5_save.py +1870 -0
  152. python_hwpx-6.6.0/tests/test_hyperlink_hancom_form.py +110 -0
  153. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_image_object_workflow.py +37 -0
  154. python_hwpx-6.6.0/tests/test_insert_row_merged_cells.py +130 -0
  155. python_hwpx-6.6.0/tests/test_internal_calls_skip_moved_names.py +77 -0
  156. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_layout_cache_scope.py +33 -0
  157. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_layout_lint.py +92 -1
  158. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_layout_preview.py +3 -2
  159. python_hwpx-6.6.0/tests/test_line_width_arguments.py +94 -0
  160. python_hwpx-6.6.0/tests/test_list_defaults_vs_hancom.py +80 -0
  161. python_hwpx-6.6.0/tests/test_manifest_resolve_once.py +52 -0
  162. python_hwpx-6.6.0/tests/test_markdown_export_shape_text.py +75 -0
  163. python_hwpx-6.6.0/tests/test_master_page_pages_taken.py +83 -0
  164. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_memo_and_style_editing.py +68 -1
  165. python_hwpx-6.6.0/tests/test_merge_cells_hancom_files.py +46 -0
  166. python_hwpx-6.6.0/tests/test_merge_cells_keeps_contents.py +179 -0
  167. python_hwpx-6.6.0/tests/test_namespace_normalization.py +109 -0
  168. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_tracking.py +7 -10
  169. python_hwpx-6.6.0/tests/test_number_formats.py +132 -0
  170. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_oxml_modularization.py +5 -4
  171. python_hwpx-6.6.0/tests/test_package_hygiene.py +467 -0
  172. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_page_number_control.py +29 -0
  173. python_hwpx-6.6.0/tests/test_page_number_format.py +73 -0
  174. python_hwpx-6.6.0/tests/test_page_orientation.py +157 -0
  175. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_para_pr_dedup.py +3 -2
  176. python_hwpx-6.6.0/tests/test_paragraph_align_distribute_space.py +41 -0
  177. python_hwpx-6.6.0/tests/test_paragraph_border.py +168 -0
  178. python_hwpx-6.6.0/tests/test_paragraph_format_targets.py +218 -0
  179. python_hwpx-6.6.0/tests/test_paragraph_hyperlink_style.py +127 -0
  180. python_hwpx-6.6.0/tests/test_paragraph_margin_default_scale.py +89 -0
  181. python_hwpx-6.6.0/tests/test_paragraph_remove_in_containers.py +133 -0
  182. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_polygon_authoring.py +17 -3
  183. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_product_boundary.py +14 -1
  184. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_public_artifact_hygiene.py +2 -0
  185. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_read_fidelity.py +48 -0
  186. python_hwpx-6.6.0/tests/test_replace_text_barriers.py +113 -0
  187. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_return_contract.py +2 -0
  188. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_run_choice_atom_authoring.py +6 -8
  189. python_hwpx-6.6.0/tests/test_run_content_kinds.py +117 -0
  190. python_hwpx-6.6.0/tests/test_run_font_refs.py +53 -0
  191. python_hwpx-6.6.0/tests/test_run_style_base.py +100 -0
  192. python_hwpx-6.6.0/tests/test_save_keeps_inline_text_caches.py +78 -0
  193. python_hwpx-6.6.0/tests/test_save_verifies_once.py +62 -0
  194. python_hwpx-6.6.0/tests/test_section_clear_body.py +611 -0
  195. python_hwpx-6.6.0/tests/test_section_columns.py +157 -0
  196. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_section_headers.py +91 -0
  197. python_hwpx-6.6.0/tests/test_section_ids_order.py +136 -0
  198. python_hwpx-6.6.0/tests/test_set_column_widths_uniform_split.py +64 -0
  199. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_shape_geometry_contract.py +32 -1
  200. python_hwpx-6.6.0/tests/test_shape_position_frames.py +321 -0
  201. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_split_merged_cell.py +2 -2
  202. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_stable_surface.py +5 -4
  203. python_hwpx-6.6.0/tests/test_stale_layout_cache_sweep.py +174 -0
  204. python_hwpx-6.6.0/tests/test_story_edits_reach_control_copy.py +256 -0
  205. python_hwpx-6.6.0/tests/test_style_font_border_reads.py +703 -0
  206. python_hwpx-6.6.0/tests/test_tab_character_writing.py +103 -0
  207. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_cell_equalize.py +8 -7
  208. python_hwpx-6.6.0/tests/test_table_page_flow.py +57 -0
  209. python_hwpx-6.6.0/tests/test_table_patch_structure_fixes.py +224 -0
  210. python_hwpx-6.6.0/tests/test_text_extractor_nested_once.py +107 -0
  211. python_hwpx-6.6.0/tests/test_text_inline_elements.py +180 -0
  212. python_hwpx-6.6.0/tests/test_text_replace_everywhere.py +211 -0
  213. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_toc_author.py +129 -8
  214. python_hwpx-6.6.0/tests/test_tracked_paragraph_delete_break.py +47 -0
  215. python_hwpx-6.6.0/tests/test_validator_full_schema.py +152 -0
  216. python_hwpx-6.4.0/src/hwpx/_document/ns/text.py +0 -175
  217. python_hwpx-6.4.0/src/hwpx/data/contract_docs/mutation-semantics.md +0 -65
  218. python_hwpx-6.4.0/src/hwpx/equation/mathml.py +0 -69
  219. python_hwpx-6.4.0/src/hwpx/oxml/utils.py +0 -94
  220. python_hwpx-6.4.0/src/hwpx/tools/exporter.py +0 -220
  221. python_hwpx-6.4.0/src/hwpx/tools/validator.py +0 -207
  222. python_hwpx-6.4.0/tests/test_error_messages.py +0 -57
  223. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/LICENSE +0 -0
  224. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/NOTICE +0 -0
  225. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/setup.cfg +0 -0
  226. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/__init__.py +0 -0
  227. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/_resolve.py +0 -0
  228. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/_units.py +0 -0
  229. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/headings.py +0 -0
  230. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/highlight.py +0 -0
  231. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/__init__.py +0 -0
  232. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/_base.py +0 -0
  233. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/notes.py +0 -0
  234. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/refs.py +0 -0
  235. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/tables.py +0 -0
  236. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/data/Skeleton.hwpx +0 -0
  237. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/data/contract_docs/recipes-traversal.md +0 -0
  238. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/__init__.py +0 -0
  239. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/eqedit.py +0 -0
  240. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/experimental.py +0 -0
  241. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/policy.py +0 -0
  242. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/report.py +0 -0
  243. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/ingest/__init__.py +0 -0
  244. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/ingest/base.py +0 -0
  245. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/layout/report.py +0 -0
  246. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/mutation_report.py +0 -0
  247. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/binary_item.py +0 -0
  248. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/checkbox.py +0 -0
  249. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/highlight.py +0 -0
  250. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/tracked.py +0 -0
  251. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/opc/security.py +0 -0
  252. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/__init__.py +0 -0
  253. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/_document_impl.py +0 -0
  254. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/body.py +0 -0
  255. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/canonical_defaults.py +0 -0
  256. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/common.py +0 -0
  257. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/document.py +0 -0
  258. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/document_metadata.py +0 -0
  259. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/dutmal_compose.py +0 -0
  260. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/field_marks.py +0 -0
  261. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/header_compat.py +0 -0
  262. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/history_part.py +0 -0
  263. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/master_page.py +0 -0
  264. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/namespaces.py +0 -0
  265. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/numbering.py +0 -0
  266. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/parser.py +0 -0
  267. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/schema.py +0 -0
  268. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/settings.py +0 -0
  269. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/simple_parts.py +0 -0
  270. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/version_part.py +0 -0
  271. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/package.py +0 -0
  272. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/__init__.py +0 -0
  273. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/_execute.py +0 -0
  274. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/_model.py +0 -0
  275. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/_schema.py +0 -0
  276. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/_validate.py +0 -0
  277. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/py.typed +0 -0
  278. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/__init__.py +0 -0
  279. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/ledger.py +0 -0
  280. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/policy.py +0 -0
  281. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/rendering.py +0 -0
  282. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/report.py +0 -0
  283. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/save_pipeline.py +0 -0
  284. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/templates.py +0 -0
  285. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/__init__.py +0 -0
  286. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/_schemas/header.xsd +0 -0
  287. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/_schemas/section.xsd +0 -0
  288. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/archive_cli.py +0 -0
  289. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/doc_diff.py +0 -0
  290. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/document_viewer.py +0 -0
  291. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/generic_inventory.py +0 -0
  292. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/id_integrity.py +0 -0
  293. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/idempotence.py +0 -0
  294. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/ir_equality.py +0 -0
  295. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/object_finder.py +0 -0
  296. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/package_reconcile.py +0 -0
  297. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/page_guard.py +0 -0
  298. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/recover.py +0 -0
  299. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/repair.py +0 -0
  300. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/report_utils.py +0 -0
  301. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/roundtrip_diff.py +0 -0
  302. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/table_cleanup.py +0 -0
  303. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/text_extract_cli.py +0 -0
  304. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/toc_fidelity.py +0 -0
  305. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/dependency_links.txt +0 -0
  306. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/entry_points.txt +0 -0
  307. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/requires.txt +0 -0
  308. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/top_level.txt +0 -0
  309. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_add_control.py +0 -0
  310. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_add_heading.py +0 -0
  311. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_adoption_metrics_snapshot.py +0 -0
  312. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_arc_authoring.py +0 -0
  313. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_authoring_quality_corpus.py +0 -0
  314. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_blind_eval_fixture.py +0 -0
  315. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_body_patch.py +0 -0
  316. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_border_fill_image_gradient.py +0 -0
  317. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_build_element_census.py +0 -0
  318. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_byte_patch_identity.py +0 -0
  319. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_capabilities_surface.py +0 -0
  320. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_cell_line_spacing.py +0 -0
  321. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_check_box_authoring.py +0 -0
  322. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_column_break.py +0 -0
  323. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_comment_node_robustness.py +0 -0
  324. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_contract_docs_sync.py +0 -0
  325. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_corpus_read_fidelity.py +0 -0
  326. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_coverage_ledger.py +0 -0
  327. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_coverage_promotion.py +0 -0
  328. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_coverage_targets.py +0 -0
  329. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_deviations_registry.py +0 -0
  330. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_doc_diff.py +0 -0
  331. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_context_manager.py +0 -0
  332. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_facade_surface.py +0 -0
  333. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_metadata.py +0 -0
  334. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_ops_runtime_boundary.py +0 -0
  335. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_save_api.py +0 -0
  336. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_viewer.py +0 -0
  337. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_dutmal_compose_authoring.py +0 -0
  338. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_edit_plan.py +0 -0
  339. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_editor_surface_inventory.py +0 -0
  340. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_engine_surface_6_0.py +0 -0
  341. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_error_contract.py +0 -0
  342. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_evalplan_core_primitives.py +0 -0
  343. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_field_marks.py +0 -0
  344. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_field_authoring.py +0 -0
  345. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_fields.py +0 -0
  346. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_fill_core_primitives.py +0 -0
  347. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_fit.py +0 -0
  348. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_fuzz_catalog_derive_expected.py +0 -0
  349. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_fuzz_loop.py +0 -0
  350. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_fuzz_regressions.py +0 -0
  351. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_gap_closure_tools.py +0 -0
  352. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_header_compat_authoring.py +0 -0
  353. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_highlight_authoring.py +0 -0
  354. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_hp_tab_support.py +0 -0
  355. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_hwpxlib_corpus_read.py +0 -0
  356. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_id_generator_range.py +0 -0
  357. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_id_integrity.py +0 -0
  358. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_index_mark.py +0 -0
  359. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ingest.py +0 -0
  360. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_inline_models.py +0 -0
  361. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_instid_attribute_case.py +0 -0
  362. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_integration_hwpx_compatibility.py +0 -0
  363. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_integration_roundtrip.py +0 -0
  364. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_library_boundary_closure.py +0 -0
  365. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_llms_txt.py +0 -0
  366. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_mail_merge_xlsx.py +0 -0
  367. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_markdown_export.py +0 -0
  368. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_master_page_authoring.py +0 -0
  369. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_memo_shape_authoring.py +0 -0
  370. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_moved_surface_hints.py +0 -0
  371. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_mutation_report.py +0 -0
  372. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_namespace_handling.py +0 -0
  373. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_namespace_hygiene.py +0 -0
  374. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_native_edit_contract.py +0 -0
  375. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_new_features.py +0 -0
  376. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_note_authoring_contract.py +0 -0
  377. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_fields.py +0 -0
  378. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_media.py +0 -0
  379. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_notes.py +0 -0
  380. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_page.py +0 -0
  381. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_refs.py +0 -0
  382. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_shapes.py +0 -0
  383. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_tables.py +0 -0
  384. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_opc_package.py +0 -0
  385. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_open_safety_corpus.py +0 -0
  386. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_outline_numbering.py +0 -0
  387. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_oxml_parsing.py +0 -0
  388. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_packaging_license_metadata.py +0 -0
  389. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_packaging_py_typed.py +0 -0
  390. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_paragraph_keep_together.py +0 -0
  391. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_paragraph_property_version_switch.py +0 -0
  392. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_paragraph_section_management.py +0 -0
  393. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_part_hierarchy_read_models.py +0 -0
  394. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_public_runtime_boundary.py +0 -0
  395. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_recover_broken_zip.py +0 -0
  396. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_redline_authoring.py +0 -0
  397. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_redline_verify.py +0 -0
  398. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_release_workflow_safety.py +0 -0
  399. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_repair_repack.py +0 -0
  400. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_report_utils.py +0 -0
  401. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_repr_snapshots.py +0 -0
  402. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_roundtrip_fidelity.py +0 -0
  403. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_roundtrip_fidelity_corpus.py +0 -0
  404. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_row_heights.py +0 -0
  405. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_safe_edit_example.py +0 -0
  406. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_save_pipeline.py +0 -0
  407. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_section_properties_real_roundtrip.py +0 -0
  408. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_set_paragraph_format_keep.py +0 -0
  409. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_shape_open_safety_risk_check.py +0 -0
  410. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_skeleton_template_ids.py +0 -0
  411. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_split_cell.py +0 -0
  412. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_style_resolution.py +0 -0
  413. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_tab_definition_version_switch.py +0 -0
  414. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_cleanup.py +0 -0
  415. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_label.py +0 -0
  416. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_navigation.py +0 -0
  417. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_patch.py +0 -0
  418. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_patch_dryrun.py +0 -0
  419. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_patch_m105.py +0 -0
  420. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_split_merge.py +0 -0
  421. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_tables_default_border.py +0 -0
  422. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_template_analyzer_enrichment.py +0 -0
  423. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_text_extractor_annotations.py +0 -0
  424. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_text_extractor_run_choice_atoms.py +0 -0
  425. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_title_mark.py +0 -0
  426. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_toc_fidelity.py +0 -0
  427. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_tracked_overlap_render_smoke.py +0 -0
  428. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_validation_severity.py +0 -0
  429. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_validator_comment_nodes.py +0 -0
  430. {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_version_metadata.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-hwpx
3
- Version: 6.4.0
3
+ Version: 6.6.0
4
4
  Summary: 한글 없이 HWPX 문서를 열고, 편집하고, 생성하고, 검증하는 Python 문서 라이브러리
5
5
  Author: python-hwpx Maintainers
6
6
  License-Expression: Apache-2.0
@@ -218,13 +218,15 @@ GitHub Release에 첨부되는 `py3-none-any` wheel을 문서와 함께 올리
218
218
 
219
219
  | | python-hwpx | pyhwpx | pyhwp |
220
220
  |---|---|---|---|
221
- | **대상 포맷** | `.hwpx` (OWPML/OPC) | `.hwpx` | `.hwp` (v5 바이너리) |
221
+ | **대상 포맷** | `.hwpx` (OWPML/OPC), `.hwp` (HWP 5.0) | `.hwpx` | `.hwp` (v5 바이너리) |
222
222
  | **한/글 설치** | 불필요 | 필요 (Windows COM) | 불필요 |
223
223
  | **크로스 플랫폼** | ✅ Linux / macOS / Windows / CI | ❌ Windows 전용 | ✅ |
224
224
  | **편집/생성 API** | ✅ | ✅ (COM) | ❌ 대부분 읽기 |
225
225
  | **AI 에이전트 연동 (MCP)** | ✅ companion 경유 | ❌ | ❌ |
226
226
 
227
- > HWP(v5 바이너리)는 지원하지 않습니다. 한컴오피스에서 HWPX로 변환 후 사용하세요.
227
+ > HWP 5.0(`.hwp`)은 `HwpxDocument.open`으로 열어 같은 API로 편집하고,
228
+ > `save_to_path("x.hwp")`로 HWP로 저장합니다. 옮기지 못한 내용은
229
+ > `document.conversion_report`에 남고, 암호·배포용 문서는 `Hwp5Error`로 거부합니다.
228
230
 
229
231
  ## 알려진 제약
230
232
 
@@ -232,7 +234,7 @@ GitHub Release에 첨부되는 `py3-none-any` wheel을 문서와 함께 올리
232
234
  열지 못하는 파일이 됩니다(호출 시 경고만 나옵니다). 도형은 `add_line()` /
233
235
  `add_rectangle()` / `add_ellipse()`를 쓰세요.
234
236
  - 그림은 단순 개체 생성까지 지원합니다 (그룹·효과 미지원).
235
- - 암호화된 HWPX는 지원하지 않습니다.
237
+ - 암호화된 HWPX와 암호·배포용 HWP는 지원하지 않습니다.
236
238
 
237
239
  ## 기여하기
238
240
 
@@ -167,13 +167,15 @@ GitHub Release에 첨부되는 `py3-none-any` wheel을 문서와 함께 올리
167
167
 
168
168
  | | python-hwpx | pyhwpx | pyhwp |
169
169
  |---|---|---|---|
170
- | **대상 포맷** | `.hwpx` (OWPML/OPC) | `.hwpx` | `.hwp` (v5 바이너리) |
170
+ | **대상 포맷** | `.hwpx` (OWPML/OPC), `.hwp` (HWP 5.0) | `.hwpx` | `.hwp` (v5 바이너리) |
171
171
  | **한/글 설치** | 불필요 | 필요 (Windows COM) | 불필요 |
172
172
  | **크로스 플랫폼** | ✅ Linux / macOS / Windows / CI | ❌ Windows 전용 | ✅ |
173
173
  | **편집/생성 API** | ✅ | ✅ (COM) | ❌ 대부분 읽기 |
174
174
  | **AI 에이전트 연동 (MCP)** | ✅ companion 경유 | ❌ | ❌ |
175
175
 
176
- > HWP(v5 바이너리)는 지원하지 않습니다. 한컴오피스에서 HWPX로 변환 후 사용하세요.
176
+ > HWP 5.0(`.hwp`)은 `HwpxDocument.open`으로 열어 같은 API로 편집하고,
177
+ > `save_to_path("x.hwp")`로 HWP로 저장합니다. 옮기지 못한 내용은
178
+ > `document.conversion_report`에 남고, 암호·배포용 문서는 `Hwp5Error`로 거부합니다.
177
179
 
178
180
  ## 알려진 제약
179
181
 
@@ -181,7 +183,7 @@ GitHub Release에 첨부되는 `py3-none-any` wheel을 문서와 함께 올리
181
183
  열지 못하는 파일이 됩니다(호출 시 경고만 나옵니다). 도형은 `add_line()` /
182
184
  `add_rectangle()` / `add_ellipse()`를 쓰세요.
183
185
  - 그림은 단순 개체 생성까지 지원합니다 (그룹·효과 미지원).
184
- - 암호화된 HWPX는 지원하지 않습니다.
186
+ - 암호화된 HWPX와 암호·배포용 HWP는 지원하지 않습니다.
185
187
 
186
188
  ## 기여하기
187
189
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-hwpx"
7
- version = "6.4.0"
7
+ version = "6.6.0"
8
8
  description = "한글 없이 HWPX 문서를 열고, 편집하고, 생성하고, 검증하는 Python 문서 라이브러리"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  license = "Apache-2.0"
@@ -109,6 +109,9 @@ packages = [
109
109
  "hwpx.data",
110
110
  "hwpx.equation",
111
111
  "hwpx.form_fit",
112
+ # HWP 5.0(.hwp) 읽기·쓰기. `hwpx/__init__.py`가 이 패키지를 가져오므로 빠지면
113
+ # 휠에서 `import hwpx`가 깨진다.
114
+ "hwpx.hwp5",
112
115
  "hwpx.ingest",
113
116
  "hwpx.layout",
114
117
  # 6.0: add_* 가 반환하는 도메인 객체·결과 dataclass (WP-C가 채운다).
@@ -283,6 +286,45 @@ files = [
283
286
  # headroom -- same escape valve as dutmal_compose.py/objects.py/
284
287
  # field_marks.py above, per the WP-A rule.
285
288
  "src/hwpx/oxml/note_authoring.py",
289
+ # Grid clean-up after a cell merge (rows left without cells, columns no
290
+ # cell starts at) moved out of table.py -- born in the gate, per the WP-A rule.
291
+ "src/hwpx/oxml/table_merge.py",
292
+ # Hyperlink field target form (Hancom's Command/Path parameters,
293
+ # written and read in one place) -- born in the gate, per the WP-A rule.
294
+ "src/hwpx/oxml/hyperlink_form.py",
295
+ # Table width/height distribution (distribute cell width row by row) moved out
296
+ # of table.py -- born in the gate, per the WP-A rule.
297
+ "src/hwpx/oxml/table_sizes.py",
298
+ # Floating-shape reference frames (set_position) and shape-text
299
+ # vertical alignment -- objects.py's overflow module (1600-line cap),
300
+ # born in the gate, per the WP-A rule.
301
+ "src/hwpx/oxml/shape_position.py",
302
+ # Font table and border-fill reads plus replace_font (header.xml) --
303
+ # born in the gate, per the WP-A rule.
304
+ "src/hwpx/oxml/header_fonts.py",
305
+ # HWP 5.0 (.hwp) container and record layer -- born in the gate, per the
306
+ # WP-A rule.
307
+ "src/hwpx/hwp5/__init__.py",
308
+ "src/hwpx/hwp5/bodytext.py",
309
+ "src/hwpx/hwp5/cfb.py",
310
+ "src/hwpx/hwp5/docinfo.py",
311
+ "src/hwpx/hwp5/errors.py",
312
+ "src/hwpx/hwp5/fileheader.py",
313
+ "src/hwpx/hwp5/reader.py",
314
+ "src/hwpx/hwp5/records.py",
315
+ "src/hwpx/hwp5/binary.py",
316
+ "src/hwpx/hwp5/header_xml.py",
317
+ "src/hwpx/hwp5/owpml.py",
318
+ "src/hwpx/hwp5/package.py",
319
+ "src/hwpx/hwp5/section_xml.py",
320
+ "src/hwpx/hwp5/summary.py",
321
+ "src/hwpx/hwp5/controls.py",
322
+ "src/hwpx/hwp5/docinfo_writer.py",
323
+ "src/hwpx/hwp5/section_writer.py",
324
+ "src/hwpx/hwp5/shapes.py",
325
+ "src/hwpx/hwp5/section_common.py",
326
+ "src/hwpx/hwp5/shape_xml.py",
327
+ "src/hwpx/hwp5/writer.py",
286
328
  ]
287
329
  # 칩 후보 1 ✅ 6.14 트레인㊾-1에서 해소: `src/hwpx/table_patch.py`(2073줄,
288
330
  # 6.12 트레인㊸ 갭⑤ 정리 시 team-lead가 지목, f7e4e67 리뷰) — 위 files
@@ -450,6 +492,45 @@ include = [
450
492
  # headroom -- same escape valve as dutmal_compose.py/objects.py/
451
493
  # field_marks.py above, per the WP-A rule.
452
494
  "src/hwpx/oxml/note_authoring.py",
495
+ # Grid clean-up after a cell merge (rows left without cells, columns no
496
+ # cell starts at) moved out of table.py -- born in the gate, per the WP-A rule.
497
+ "src/hwpx/oxml/table_merge.py",
498
+ # Hyperlink field target form (Hancom's Command/Path parameters,
499
+ # written and read in one place) -- born in the gate, per the WP-A rule.
500
+ "src/hwpx/oxml/hyperlink_form.py",
501
+ # Table width/height distribution (distribute cell width row by row) moved out
502
+ # of table.py -- born in the gate, per the WP-A rule.
503
+ "src/hwpx/oxml/table_sizes.py",
504
+ # Floating-shape reference frames (set_position) and shape-text
505
+ # vertical alignment -- objects.py's overflow module (1600-line cap),
506
+ # born in the gate, per the WP-A rule.
507
+ "src/hwpx/oxml/shape_position.py",
508
+ # Font table and border-fill reads plus replace_font (header.xml) --
509
+ # born in the gate, per the WP-A rule.
510
+ "src/hwpx/oxml/header_fonts.py",
511
+ # HWP 5.0 (.hwp) container and record layer -- born in the gate, per the
512
+ # WP-A rule.
513
+ "src/hwpx/hwp5/__init__.py",
514
+ "src/hwpx/hwp5/bodytext.py",
515
+ "src/hwpx/hwp5/cfb.py",
516
+ "src/hwpx/hwp5/docinfo.py",
517
+ "src/hwpx/hwp5/errors.py",
518
+ "src/hwpx/hwp5/fileheader.py",
519
+ "src/hwpx/hwp5/reader.py",
520
+ "src/hwpx/hwp5/records.py",
521
+ "src/hwpx/hwp5/binary.py",
522
+ "src/hwpx/hwp5/header_xml.py",
523
+ "src/hwpx/hwp5/owpml.py",
524
+ "src/hwpx/hwp5/package.py",
525
+ "src/hwpx/hwp5/section_xml.py",
526
+ "src/hwpx/hwp5/summary.py",
527
+ "src/hwpx/hwp5/controls.py",
528
+ "src/hwpx/hwp5/docinfo_writer.py",
529
+ "src/hwpx/hwp5/section_writer.py",
530
+ "src/hwpx/hwp5/shapes.py",
531
+ "src/hwpx/hwp5/section_common.py",
532
+ "src/hwpx/hwp5/shape_xml.py",
533
+ "src/hwpx/hwp5/writer.py",
453
534
  ]
454
535
  pythonVersion = "3.10"
455
536
  typeCheckingMode = "basic"
@@ -376,6 +376,7 @@ from .tools.package_validator import (
376
376
  )
377
377
  from .ingest import HwpxMarkdownConverter
378
378
  from .errors import HwpxError
379
+ from .hwp5.errors import Hwp5ConversionWarning, Hwp5Error
379
380
  from .mutation_report import (
380
381
  MutationReport,
381
382
  PreservationDowngradeError,
@@ -415,6 +416,8 @@ __all__ = [
415
416
  "PackageValidationReport",
416
417
  "BytePreservingPatchResult",
417
418
  "HwpxError",
419
+ "Hwp5Error",
420
+ "Hwp5ConversionWarning",
418
421
  "MutationReport",
419
422
  "PreservationDowngradeError",
420
423
  "ParagraphTextPatch",
@@ -1241,7 +1241,9 @@ class _LegacyFacade:
1241
1241
  """Remove an embedded image by its manifest item id.
1242
1242
 
1243
1243
  This removes the binary data from the ZIP, the manifest entry, and
1244
- the header binItem entry.
1244
+ the header binItem entry. An item the document still points at is
1245
+ refused with ``HwpxValueError`` (code ``media-item-in-use``);
1246
+ ``doc.media.remove_image(item_id, force=True)`` removes it anyway.
1245
1247
 
1246
1248
  Returns:
1247
1249
  ``True`` if any component was removed.
@@ -8,10 +8,11 @@ from typing import TYPE_CHECKING, Any, Iterator, Mapping, Sequence, cast
8
8
 
9
9
  from ..errors import HwpxStateError, HwpxValueError
10
10
  from ..objects.checkbox import CheckBox
11
- from ..objects.form_field import FieldLocation, FieldParameter, FormField
11
+ from ..objects.form_field import CellField, FieldLocation, FieldParameter, FormField
12
12
  from ..objects.results import FieldFillResult
13
13
  from ..oxml import HwpxOxmlParagraph
14
14
  from ..oxml.namespaces import HP
15
+ from ..oxml.section_story import control_twins
15
16
 
16
17
  if TYPE_CHECKING:
17
18
  from hwpx.document import HwpxDocument
@@ -291,11 +292,13 @@ def _iter_form_field_matches(doc: "HwpxDocument") -> list[dict[str, Any]]:
291
292
  paragraph.element: index
292
293
  for index, paragraph in enumerate(section.paragraphs)
293
294
  }
295
+ # a header/footer python-hwpx keeps twice counts once: its hp:secPr copy
296
+ twins = control_twins(section.element)
294
297
 
295
298
  def iter_content_paragraphs(element: Any) -> Iterator[Any]:
296
299
  for child in element:
297
300
  local = _local_name(child)
298
- if local == "memogroup":
301
+ if local == "memogroup" or child in twins:
299
302
  continue
300
303
  if local == "p":
301
304
  yield child
@@ -403,6 +406,42 @@ def list_form_fields(doc: "HwpxDocument") -> tuple[FormField, ...]:
403
406
  return tuple(_form_field_from_match(doc, match) for match in _iter_form_field_matches(doc))
404
407
 
405
408
 
409
+ def _named_cells(paragraphs: Any) -> Iterator[Any]:
410
+ for paragraph in paragraphs:
411
+ for table in paragraph.tables:
412
+ for row in table.rows:
413
+ for cell in row.cells:
414
+ if cell.field_name:
415
+ yield cell
416
+ yield from _named_cells(cell.paragraphs)
417
+
418
+
419
+ def list_cell_fields(doc: "HwpxDocument") -> tuple[CellField, ...]:
420
+ """Named table cells (Hancom's cell fields) in document order: body tables and the tables in their cells."""
421
+
422
+ return tuple(CellField(cell) for section in doc.sections for cell in _named_cells(section.paragraphs))
423
+
424
+
425
+ def fill_cell_fields(doc: "HwpxDocument", value: str, *, name: str, index: int | None = None) -> tuple[CellField, ...]:
426
+ """Set the text of every cell field called *name*, or of the *index*-th of them only."""
427
+
428
+ wanted = (name or "").strip()
429
+ fields = [field for field in list_cell_fields(doc) if wanted and field.name == wanted]
430
+ if index is not None:
431
+ fields = fields[index : index + 1] if index >= 0 else []
432
+ if not fields:
433
+ where = f"{wanted!r}" if index is None else f"{wanted!r} at index {index}"
434
+ raise HwpxValueError(
435
+ f"no cell field named {where}",
436
+ code="field-cell-not-found",
437
+ context={"name": wanted, "index": index},
438
+ suggestion="List doc.fields.cells to see the cell field names.",
439
+ )
440
+ for field in fields:
441
+ field.text = value
442
+ return tuple(fields)
443
+
444
+
406
445
  _PROMPT_TEXT_COLOR = "#FF0000"
407
446
 
408
447
 
@@ -823,7 +862,10 @@ def _measure_form_field_fit(
823
862
  ) -> "FitResult":
824
863
  """Run the FormFit engine for a native field (plan §2 C)."""
825
864
 
865
+ from dataclasses import replace
866
+
826
867
  from hwpx.form_fit import DEFAULT_SAFETY, FitEngine, FitResult, SlotMetrics
868
+ from hwpx.form_fit.measure import text_style_from_refs
827
869
 
828
870
  runs = match["_runs"]
829
871
  begin_index = int(match["_begin_run_index"])
@@ -850,10 +892,16 @@ def _measure_form_field_fit(
850
892
  field_id=field_id,
851
893
  )
852
894
 
895
+ # The field sits inside its paragraph, so the paragraph's indent does not
896
+ # apply to the box.
897
+ text_style = text_style_from_refs(
898
+ doc._root, match["_paragraph"].para_pr_id_ref, [begin_ref]
899
+ )
853
900
  slot = SlotMetrics(
854
901
  available_width=float(box_width) * DEFAULT_SAFETY,
855
902
  font_pt=resolved_pt,
856
903
  max_lines=fit_policy.effective_max_lines,
904
+ text_style=replace(text_style, indent=0),
857
905
  )
858
906
  return FitEngine().fit(value, slot, fit_policy, field_id=field_id)
859
907