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.
- {python_hwpx-6.4.0/src/python_hwpx.egg-info → python_hwpx-6.6.0}/PKG-INFO +6 -4
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/README.md +5 -3
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/pyproject.toml +82 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/__init__.py +3 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/_legacy.py +3 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/fields.py +50 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/layout.py +289 -62
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/media.py +217 -38
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/memos.py +54 -9
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/fields.py +26 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/media.py +23 -4
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/page.py +27 -4
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/parts.py +71 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/shapes.py +6 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/styles.py +157 -8
- python_hwpx-6.6.0/src/hwpx/_document/ns/text.py +312 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/tracking.py +5 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/persistence.py +133 -13
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/shapes.py +81 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/tracked.py +49 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/body_patch.py +6 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/capabilities.py +1 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/data/contract_docs/known-traps.md +37 -2
- python_hwpx-6.6.0/src/hwpx/data/contract_docs/mutation-semantics.md +113 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/data/contract_docs/support-matrix.md +7 -8
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/document.py +65 -5
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/authoring.py +13 -10
- python_hwpx-6.6.0/src/hwpx/equation/mathml.py +135 -0
- python_hwpx-6.6.0/src/hwpx/equation/measure.py +371 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/render.py +2 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/tokens.py +11 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/errors.py +49 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/__init__.py +4 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/apply.py +1 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/engine.py +10 -11
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/measure.py +280 -22
- python_hwpx-6.6.0/src/hwpx/hwp5/__init__.py +7 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/binary.py +124 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/bodytext.py +201 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/cfb.py +601 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/controls.py +1175 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/docinfo.py +881 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/docinfo_writer.py +647 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/errors.py +75 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/fileheader.py +87 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/header_xml.py +703 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/owpml.py +390 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/package.py +331 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/reader.py +149 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/records.py +214 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/section_common.py +149 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/section_writer.py +1826 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/section_xml.py +1514 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/shape_xml.py +709 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/shapes.py +842 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/summary.py +204 -0
- python_hwpx-6.6.0/src/hwpx/hwp5/writer.py +325 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/ingest/hwpx_converter.py +1 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/layout/__init__.py +2 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/layout/lint.py +147 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/model.py +2 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/__init__.py +12 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/form_field.py +75 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/results.py +131 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/opc/package.py +148 -16
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/opc/relationships.py +16 -3
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/opc/xml_utils.py +44 -15
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/_document_primitives.py +59 -34
- python_hwpx-6.6.0/src/hwpx/oxml/_paragraph_text_edit.py +117 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/color.py +36 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/document_parts.py +125 -157
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/drop_cap.py +45 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/header.py +6 -2
- python_hwpx-6.6.0/src/hwpx/oxml/header_fonts.py +291 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/header_part.py +23 -18
- python_hwpx-6.6.0/src/hwpx/oxml/hyperlink_form.py +159 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/master_page_authoring.py +66 -4
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/memo.py +4 -8
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/note_authoring.py +2 -3
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/numbering_kinds.py +48 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/objects.py +71 -42
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/paragraph.py +96 -76
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/run.py +209 -44
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/section.py +283 -3
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/section_format.py +199 -13
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/section_layout.py +87 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/section_story.py +253 -38
- python_hwpx-6.6.0/src/hwpx/oxml/shape_position.py +128 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/table.py +226 -75
- python_hwpx-6.6.0/src/hwpx/oxml/table_merge.py +82 -0
- python_hwpx-6.6.0/src/hwpx/oxml/table_sizes.py +334 -0
- python_hwpx-6.6.0/src/hwpx/oxml/utils.py +214 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/patch.py +16 -3
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/table_patch.py +233 -73
- python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-body.xsd +18 -0
- python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-core.xsd +905 -0
- python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-header.xsd +1869 -0
- python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-paralist.xsd +2813 -0
- python_hwpx-6.6.0/src/hwpx/tools/_schemas/owpml-xml.xsd +15 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/document_merge.py +92 -15
- python_hwpx-6.6.0/src/hwpx/tools/exporter.py +664 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/layout_preview.py +44 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/mail_merge.py +19 -13
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/markdown_export.py +37 -16
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/package_validator.py +17 -4
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/read_fidelity.py +4 -4
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/redline.py +4 -4
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/table_navigation.py +3 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/template_analyzer.py +5 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/text_extractor.py +54 -24
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/toc_author.py +110 -9
- python_hwpx-6.6.0/src/hwpx/tools/validator.py +433 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0/src/python_hwpx.egg-info}/PKG-INFO +6 -4
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/SOURCES.txt +98 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_authoring_defaults.py +33 -14
- python_hwpx-6.6.0/tests/test_border_line_types.py +72 -0
- python_hwpx-6.6.0/tests/test_cell_border_neighbors.py +135 -0
- python_hwpx-6.6.0/tests/test_cell_fields.py +177 -0
- python_hwpx-6.6.0/tests/test_cell_margins.py +168 -0
- python_hwpx-6.6.0/tests/test_cell_text_rewrite_semantics.py +120 -0
- python_hwpx-6.6.0/tests/test_char_pr_child_order.py +64 -0
- python_hwpx-6.6.0/tests/test_character_width_ratio.py +35 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_chart_authoring.py +141 -0
- python_hwpx-6.6.0/tests/test_color_arguments.py +170 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_container_authoring.py +8 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_formatting.py +12 -7
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_merge.py +168 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_documentation_code_fences.py +1 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_drop_cap_authoring.py +88 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_edit_fidelity_corpus.py +16 -5
- python_hwpx-6.6.0/tests/test_equalize_widths_per_row.py +297 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_equation_authoring.py +2 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_equation_converter.py +25 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_equation_render.py +47 -0
- python_hwpx-6.6.0/tests/test_equation_size.py +97 -0
- python_hwpx-6.6.0/tests/test_error_messages.py +143 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_existing_document_format_editing.py +5 -3
- python_hwpx-6.6.0/tests/test_export_captions_dutmal.py +162 -0
- python_hwpx-6.6.0/tests/test_export_cell_text_spaces.py +29 -0
- python_hwpx-6.6.0/tests/test_export_list_labels.py +194 -0
- python_hwpx-6.6.0/tests/test_export_text_boxes.py +157 -0
- python_hwpx-6.6.0/tests/test_exporter_table_text.py +164 -0
- python_hwpx-6.6.0/tests/test_fill_image_hancom_modes.py +73 -0
- python_hwpx-6.6.0/tests/test_form_fit_hancom_rules.py +191 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_fit_integration.py +13 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_golden_api.py +25 -6
- python_hwpx-6.6.0/tests/test_heading_style_shapes.py +58 -0
- python_hwpx-6.6.0/tests/test_hwp5_container.py +255 -0
- python_hwpx-6.6.0/tests/test_hwp5_hancom_files.py +154 -0
- python_hwpx-6.6.0/tests/test_hwp5_open.py +1188 -0
- python_hwpx-6.6.0/tests/test_hwp5_save.py +1870 -0
- python_hwpx-6.6.0/tests/test_hyperlink_hancom_form.py +110 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_image_object_workflow.py +37 -0
- python_hwpx-6.6.0/tests/test_insert_row_merged_cells.py +130 -0
- python_hwpx-6.6.0/tests/test_internal_calls_skip_moved_names.py +77 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_layout_cache_scope.py +33 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_layout_lint.py +92 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_layout_preview.py +3 -2
- python_hwpx-6.6.0/tests/test_line_width_arguments.py +94 -0
- python_hwpx-6.6.0/tests/test_list_defaults_vs_hancom.py +80 -0
- python_hwpx-6.6.0/tests/test_manifest_resolve_once.py +52 -0
- python_hwpx-6.6.0/tests/test_markdown_export_shape_text.py +75 -0
- python_hwpx-6.6.0/tests/test_master_page_pages_taken.py +83 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_memo_and_style_editing.py +68 -1
- python_hwpx-6.6.0/tests/test_merge_cells_hancom_files.py +46 -0
- python_hwpx-6.6.0/tests/test_merge_cells_keeps_contents.py +179 -0
- python_hwpx-6.6.0/tests/test_namespace_normalization.py +109 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_tracking.py +7 -10
- python_hwpx-6.6.0/tests/test_number_formats.py +132 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_oxml_modularization.py +5 -4
- python_hwpx-6.6.0/tests/test_package_hygiene.py +467 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_page_number_control.py +29 -0
- python_hwpx-6.6.0/tests/test_page_number_format.py +73 -0
- python_hwpx-6.6.0/tests/test_page_orientation.py +157 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_para_pr_dedup.py +3 -2
- python_hwpx-6.6.0/tests/test_paragraph_align_distribute_space.py +41 -0
- python_hwpx-6.6.0/tests/test_paragraph_border.py +168 -0
- python_hwpx-6.6.0/tests/test_paragraph_format_targets.py +218 -0
- python_hwpx-6.6.0/tests/test_paragraph_hyperlink_style.py +127 -0
- python_hwpx-6.6.0/tests/test_paragraph_margin_default_scale.py +89 -0
- python_hwpx-6.6.0/tests/test_paragraph_remove_in_containers.py +133 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_polygon_authoring.py +17 -3
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_product_boundary.py +14 -1
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_public_artifact_hygiene.py +2 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_read_fidelity.py +48 -0
- python_hwpx-6.6.0/tests/test_replace_text_barriers.py +113 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_return_contract.py +2 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_run_choice_atom_authoring.py +6 -8
- python_hwpx-6.6.0/tests/test_run_content_kinds.py +117 -0
- python_hwpx-6.6.0/tests/test_run_font_refs.py +53 -0
- python_hwpx-6.6.0/tests/test_run_style_base.py +100 -0
- python_hwpx-6.6.0/tests/test_save_keeps_inline_text_caches.py +78 -0
- python_hwpx-6.6.0/tests/test_save_verifies_once.py +62 -0
- python_hwpx-6.6.0/tests/test_section_clear_body.py +611 -0
- python_hwpx-6.6.0/tests/test_section_columns.py +157 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_section_headers.py +91 -0
- python_hwpx-6.6.0/tests/test_section_ids_order.py +136 -0
- python_hwpx-6.6.0/tests/test_set_column_widths_uniform_split.py +64 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_shape_geometry_contract.py +32 -1
- python_hwpx-6.6.0/tests/test_shape_position_frames.py +321 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_split_merged_cell.py +2 -2
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_stable_surface.py +5 -4
- python_hwpx-6.6.0/tests/test_stale_layout_cache_sweep.py +174 -0
- python_hwpx-6.6.0/tests/test_story_edits_reach_control_copy.py +256 -0
- python_hwpx-6.6.0/tests/test_style_font_border_reads.py +703 -0
- python_hwpx-6.6.0/tests/test_tab_character_writing.py +103 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_cell_equalize.py +8 -7
- python_hwpx-6.6.0/tests/test_table_page_flow.py +57 -0
- python_hwpx-6.6.0/tests/test_table_patch_structure_fixes.py +224 -0
- python_hwpx-6.6.0/tests/test_text_extractor_nested_once.py +107 -0
- python_hwpx-6.6.0/tests/test_text_inline_elements.py +180 -0
- python_hwpx-6.6.0/tests/test_text_replace_everywhere.py +211 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_toc_author.py +129 -8
- python_hwpx-6.6.0/tests/test_tracked_paragraph_delete_break.py +47 -0
- python_hwpx-6.6.0/tests/test_validator_full_schema.py +152 -0
- python_hwpx-6.4.0/src/hwpx/_document/ns/text.py +0 -175
- python_hwpx-6.4.0/src/hwpx/data/contract_docs/mutation-semantics.md +0 -65
- python_hwpx-6.4.0/src/hwpx/equation/mathml.py +0 -69
- python_hwpx-6.4.0/src/hwpx/oxml/utils.py +0 -94
- python_hwpx-6.4.0/src/hwpx/tools/exporter.py +0 -220
- python_hwpx-6.4.0/src/hwpx/tools/validator.py +0 -207
- python_hwpx-6.4.0/tests/test_error_messages.py +0 -57
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/LICENSE +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/NOTICE +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/setup.cfg +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/__init__.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/_resolve.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/_units.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/headings.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/highlight.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/__init__.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/_base.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/notes.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/refs.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/_document/ns/tables.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/data/Skeleton.hwpx +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/data/contract_docs/recipes-traversal.md +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/__init__.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/equation/eqedit.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/experimental.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/policy.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/form_fit/report.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/ingest/__init__.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/ingest/base.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/layout/report.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/mutation_report.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/binary_item.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/checkbox.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/highlight.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/objects/tracked.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/opc/security.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/__init__.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/_document_impl.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/body.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/canonical_defaults.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/common.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/document.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/document_metadata.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/dutmal_compose.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/field_marks.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/header_compat.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/history_part.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/master_page.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/namespaces.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/numbering.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/parser.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/schema.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/settings.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/simple_parts.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/oxml/version_part.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/package.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/__init__.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/_execute.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/_model.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/_schema.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/plan/_validate.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/py.typed +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/__init__.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/ledger.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/policy.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/rendering.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/report.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/quality/save_pipeline.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/templates.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/__init__.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/_schemas/header.xsd +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/_schemas/section.xsd +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/archive_cli.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/doc_diff.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/document_viewer.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/generic_inventory.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/id_integrity.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/idempotence.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/ir_equality.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/object_finder.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/package_reconcile.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/page_guard.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/recover.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/repair.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/report_utils.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/roundtrip_diff.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/table_cleanup.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/text_extract_cli.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/hwpx/tools/toc_fidelity.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/dependency_links.txt +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/entry_points.txt +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/requires.txt +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/src/python_hwpx.egg-info/top_level.txt +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_add_control.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_add_heading.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_adoption_metrics_snapshot.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_arc_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_authoring_quality_corpus.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_blind_eval_fixture.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_body_patch.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_border_fill_image_gradient.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_build_element_census.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_byte_patch_identity.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_capabilities_surface.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_cell_line_spacing.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_check_box_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_column_break.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_comment_node_robustness.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_contract_docs_sync.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_corpus_read_fidelity.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_coverage_ledger.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_coverage_promotion.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_coverage_targets.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_deviations_registry.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_doc_diff.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_context_manager.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_facade_surface.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_metadata.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_ops_runtime_boundary.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_save_api.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_document_viewer.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_dutmal_compose_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_edit_plan.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_editor_surface_inventory.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_engine_surface_6_0.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_error_contract.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_evalplan_core_primitives.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_field_marks.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_field_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_fields.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_fill_core_primitives.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_form_fit.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_fuzz_catalog_derive_expected.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_fuzz_loop.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_fuzz_regressions.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_gap_closure_tools.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_header_compat_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_highlight_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_hp_tab_support.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_hwpxlib_corpus_read.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_id_generator_range.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_id_integrity.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_index_mark.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ingest.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_inline_models.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_instid_attribute_case.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_integration_hwpx_compatibility.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_integration_roundtrip.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_library_boundary_closure.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_llms_txt.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_mail_merge_xlsx.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_markdown_export.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_master_page_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_memo_shape_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_moved_surface_hints.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_mutation_report.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_namespace_handling.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_namespace_hygiene.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_native_edit_contract.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_new_features.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_note_authoring_contract.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_fields.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_media.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_notes.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_page.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_refs.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_shapes.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_ns_tables.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_opc_package.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_open_safety_corpus.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_outline_numbering.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_oxml_parsing.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_packaging_license_metadata.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_packaging_py_typed.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_paragraph_keep_together.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_paragraph_property_version_switch.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_paragraph_section_management.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_part_hierarchy_read_models.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_public_runtime_boundary.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_recover_broken_zip.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_redline_authoring.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_redline_verify.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_release_workflow_safety.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_repair_repack.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_report_utils.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_repr_snapshots.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_roundtrip_fidelity.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_roundtrip_fidelity_corpus.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_row_heights.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_safe_edit_example.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_save_pipeline.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_section_properties_real_roundtrip.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_set_paragraph_format_keep.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_shape_open_safety_risk_check.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_skeleton_template_ids.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_split_cell.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_style_resolution.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_tab_definition_version_switch.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_cleanup.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_label.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_navigation.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_patch.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_patch_dryrun.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_patch_m105.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_table_split_merge.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_tables_default_border.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_template_analyzer_enrichment.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_text_extractor_annotations.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_text_extractor_run_choice_atoms.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_title_mark.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_toc_fidelity.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_tracked_overlap_render_smoke.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_validation_severity.py +0 -0
- {python_hwpx-6.4.0 → python_hwpx-6.6.0}/tests/test_validator_comment_nodes.py +0 -0
- {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.
|
|
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(
|
|
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(
|
|
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.
|
|
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
|
|