python-hwpx 5.7.0__tar.gz → 6.0.2__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-5.7.0 → python_hwpx-6.0.2}/NOTICE +8 -0
- {python_hwpx-5.7.0/src/python_hwpx.egg-info → python_hwpx-6.0.2}/PKG-INFO +19 -9
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/README.md +18 -8
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/pyproject.toml +51 -1
- python_hwpx-5.7.0/src/hwpx/document.py → python_hwpx-6.0.2/src/hwpx/_document/_legacy.py +1177 -1535
- python_hwpx-6.0.2/src/hwpx/_document/_resolve.py +173 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/fields.py +212 -62
- python_hwpx-6.0.2/src/hwpx/_document/headings.py +187 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/layout.py +171 -59
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/media.py +122 -38
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/memos.py +49 -13
- python_hwpx-6.0.2/src/hwpx/_document/ns/__init__.py +68 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/_base.py +40 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/fields.py +160 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/media.py +92 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/notes.py +210 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/page.py +468 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/parts.py +68 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/refs.py +72 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/shapes.py +250 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/styles.py +371 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/tables.py +80 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/text.py +146 -0
- python_hwpx-6.0.2/src/hwpx/_document/ns/tracking.py +151 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/persistence.py +11 -3
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/shapes.py +44 -15
- python_hwpx-6.0.2/src/hwpx/_document/tracked.py +242 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/body_patch.py +78 -12
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/capabilities.py +275 -3
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/contract_docs/support-matrix.md +34 -2
- python_hwpx-6.0.2/src/hwpx/document.py +785 -0
- python_hwpx-6.0.2/src/hwpx/errors.py +270 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/layout/lint.py +8 -3
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/layout/report.py +11 -2
- python_hwpx-6.0.2/src/hwpx/model.py +78 -0
- python_hwpx-6.0.2/src/hwpx/objects/__init__.py +57 -0
- python_hwpx-6.0.2/src/hwpx/objects/binary_item.py +58 -0
- python_hwpx-6.0.2/src/hwpx/objects/checkbox.py +103 -0
- python_hwpx-6.0.2/src/hwpx/objects/form_field.py +191 -0
- python_hwpx-6.0.2/src/hwpx/objects/results.py +242 -0
- python_hwpx-6.0.2/src/hwpx/objects/tracked.py +66 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/_document_primitives.py +71 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/document_parts.py +28 -12
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/header_part.py +114 -3
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/memo.py +78 -0
- python_hwpx-6.0.2/src/hwpx/oxml/section_format.py +1178 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/patch.py +22 -1
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/report.py +34 -2
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/save_pipeline.py +21 -4
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/table_patch.py +1 -1
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/idempotence.py +7 -5
- {python_hwpx-5.7.0 → python_hwpx-6.0.2/src/python_hwpx.egg-info}/PKG-INFO +19 -9
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/SOURCES.txt +40 -0
- python_hwpx-6.0.2/tests/test_add_heading.py +289 -0
- python_hwpx-6.0.2/tests/test_body_patch.py +162 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_capabilities_surface.py +62 -1
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_check_box_authoring.py +8 -8
- python_hwpx-6.0.2/tests/test_coverage_ledger.py +414 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_facade_surface.py +14 -3
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_formatting.py +241 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_documentation_code_fences.py +1 -1
- python_hwpx-6.0.2/tests/test_engine_surface_6_0.py +447 -0
- python_hwpx-6.0.2/tests/test_error_contract.py +235 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_existing_document_format_editing.py +9 -6
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_field_authoring.py +30 -31
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_fields.py +16 -15
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_fit_integration.py +18 -12
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_golden_api.py +4 -4
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_image_object_workflow.py +4 -4
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_memo_and_style_editing.py +19 -7
- python_hwpx-6.0.2/tests/test_namespace_hygiene.py +151 -0
- python_hwpx-6.0.2/tests/test_ns_fields.py +157 -0
- python_hwpx-6.0.2/tests/test_ns_media.py +94 -0
- python_hwpx-6.0.2/tests/test_ns_notes.py +120 -0
- python_hwpx-6.0.2/tests/test_ns_page.py +237 -0
- python_hwpx-6.0.2/tests/test_ns_refs.py +65 -0
- python_hwpx-6.0.2/tests/test_ns_shapes.py +77 -0
- python_hwpx-6.0.2/tests/test_ns_tables.py +109 -0
- python_hwpx-6.0.2/tests/test_ns_tracking.py +142 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_product_boundary.py +6 -1
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_public_artifact_hygiene.py +5 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_redline_authoring.py +13 -7
- python_hwpx-6.0.2/tests/test_return_contract.py +517 -0
- python_hwpx-6.0.2/tests/test_section_properties_real_roundtrip.py +101 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_set_paragraph_format_keep.py +1 -1
- python_hwpx-6.0.2/tests/test_style_resolution.py +295 -0
- python_hwpx-5.7.0/src/hwpx/_document/tracked.py +0 -170
- python_hwpx-5.7.0/src/hwpx/errors.py +0 -77
- python_hwpx-5.7.0/src/hwpx/oxml/section_format.py +0 -513
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/LICENSE +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/setup.cfg +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/_document/_units.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/Skeleton.hwpx +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/contract_docs/known-traps.md +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/contract_docs/mutation-semantics.md +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/data/contract_docs/recipes-traversal.md +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/authoring.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/eqedit.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/mathml.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/render.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/equation/tokens.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/experimental.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/apply.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/engine.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/measure.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/policy.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/form_fit/report.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/ingest/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/ingest/base.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/ingest/hwpx_converter.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/layout/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/mutation_report.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/opc/package.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/opc/relationships.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/opc/security.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/opc/xml_utils.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/_document_impl.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/body.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/canonical_defaults.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/color.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/common.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/document.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/header.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/namespaces.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/numbering.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/objects.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/paragraph.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/parser.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/run.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/schema.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/section.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/section_story.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/simple_parts.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/table.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/oxml/utils.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/package.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/_execute.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/_model.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/_schema.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/plan/_validate.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/py.typed +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/ledger.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/policy.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/quality/rendering.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/templates.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/__init__.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/_schemas/header.xsd +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/_schemas/section.xsd +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/archive_cli.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/doc_diff.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/document_viewer.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/exporter.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/generic_inventory.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/id_integrity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/ir_equality.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/layout_preview.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/mail_merge.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/markdown_export.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/object_finder.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/package_reconcile.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/package_validator.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/page_guard.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/read_fidelity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/recover.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/redline.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/repair.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/report_utils.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/roundtrip_diff.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/table_cleanup.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/table_navigation.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/template_analyzer.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/text_extract_cli.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/text_extractor.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/toc_author.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/toc_fidelity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/hwpx/tools/validator.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/dependency_links.txt +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/entry_points.txt +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/requires.txt +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/src/python_hwpx.egg-info/top_level.txt +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_add_control.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_adoption_metrics_snapshot.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_authoring_defaults.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_authoring_quality_corpus.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_blind_eval_fixture.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_byte_patch_identity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_cell_line_spacing.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_chart_authoring.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_comment_node_robustness.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_contract_docs_sync.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_corpus_read_fidelity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_coverage_promotion.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_coverage_targets.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_deviations_registry.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_doc_diff.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_context_manager.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_ops_runtime_boundary.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_save_api.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_document_viewer.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_edit_plan.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_equation_authoring.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_equation_converter.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_equation_render.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_error_messages.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_evalplan_core_primitives.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_fill_core_primitives.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_form_fit.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_fuzz_catalog_derive_expected.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_fuzz_loop.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_fuzz_regressions.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_gap_closure_tools.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_hp_tab_support.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_hwpxlib_corpus_read.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_id_generator_range.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_ingest.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_inline_models.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_integration_hwpx_compatibility.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_integration_roundtrip.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_layout_cache_scope.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_layout_lint.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_layout_preview.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_library_boundary_closure.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_llms_txt.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_mail_merge_xlsx.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_markdown_export.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_moved_surface_hints.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_mutation_report.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_namespace_handling.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_new_features.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_note_authoring_contract.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_opc_package.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_open_safety_corpus.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_oxml_modularization.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_oxml_parsing.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_packaging_license_metadata.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_packaging_py_typed.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_paragraph_keep_together.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_paragraph_section_management.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_public_runtime_boundary.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_read_fidelity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_recover_broken_zip.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_redline_verify.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_release_workflow_safety.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_repair_repack.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_report_utils.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_repr_snapshots.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_roundtrip_fidelity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_row_heights.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_save_pipeline.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_section_headers.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_shape_geometry_contract.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_skeleton_template_ids.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_split_cell.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_split_merged_cell.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_stable_surface.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_cleanup.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_navigation.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_patch.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_patch_dryrun.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_table_patch_m105.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_tables_default_border.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_template_analyzer_enrichment.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_text_extractor_annotations.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_toc_author.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_toc_fidelity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_validation_severity.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_validator_comment_nodes.py +0 -0
- {python_hwpx-5.7.0 → python_hwpx-6.0.2}/tests/test_version_metadata.py +0 -0
|
@@ -58,6 +58,14 @@ neolord0/hwpxlib (https://github.com/neolord0/hwpxlib), licensed Apache-2.0.
|
|
|
58
58
|
Only sample DATA files are vendored; no hwpxlib source code or structure is
|
|
59
59
|
copied (clean-room). Pinned ref is recorded in manifest.json.
|
|
60
60
|
|
|
61
|
+
## Hancom file-format specification attribution
|
|
62
|
+
|
|
63
|
+
Parts of this project were developed with reference to the publicly
|
|
64
|
+
released Hancom file-format documentation (HWP 5.0 / HWPML) and the
|
|
65
|
+
public OWPML schema. As required by that documentation:
|
|
66
|
+
|
|
67
|
+
“본 제품은 한글과컴퓨터의 ᄒᆞᆫ글 문서 파일(.hwp) 공개 문서를 참고하여 개발하였습니다.”
|
|
68
|
+
|
|
61
69
|
────────────────────────────────────────
|
|
62
70
|
DISCLAIMER — HWPX Format
|
|
63
71
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-hwpx
|
|
3
|
-
Version:
|
|
3
|
+
Version: 6.0.2
|
|
4
4
|
Summary: 한글 없이 HWPX 문서를 열고, 편집하고, 생성하고, 검증하는 Python 문서 라이브러리
|
|
5
5
|
Author: python-hwpx Maintainers
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -100,16 +100,21 @@ AI 도구가 정확한 API를 배우도록 [llms.txt](https://airmang.github.io/
|
|
|
100
100
|
pip install python-hwpx # Python 3.10+
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
+
<!-- standalone-python-example -->
|
|
104
|
+
|
|
103
105
|
```python
|
|
104
106
|
from hwpx import HwpxDocument
|
|
105
107
|
|
|
106
|
-
doc = HwpxDocument.
|
|
107
|
-
doc.
|
|
108
|
-
doc.
|
|
108
|
+
doc = HwpxDocument.new()
|
|
109
|
+
doc.add_heading("2026 운영계획", level=1)
|
|
110
|
+
doc.add_paragraph("가. 추진 배경", style="개요 2")
|
|
111
|
+
doc.save_to_path("계획.hwpx")
|
|
109
112
|
```
|
|
110
113
|
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
스타일은 이름으로 지정하고, 오타는 저장이 아니라 **그 줄에서** 잡힌다.
|
|
115
|
+
기존 문서를 고치려면 `HwpxDocument.open("보고서.hwpx")`로 시작하면 된다.
|
|
116
|
+
|
|
117
|
+
문서 저작·양식 채움·시험지 조판 같은 상위 워크플로가 필요하면
|
|
113
118
|
[`python-hwpx-automation`](https://github.com/airmang/python-hwpx-automation)을
|
|
114
119
|
함께 설치하세요.
|
|
115
120
|
|
|
@@ -158,10 +163,15 @@ print(report.preservation.untouched_part_payloads.to_dict())
|
|
|
158
163
|
|
|
159
164
|
## 실측으로 말합니다
|
|
160
165
|
|
|
161
|
-
만든 파일이 실제 한컴오피스에서
|
|
162
|
-
|
|
166
|
+
만든 파일이 실제 한컴오피스에서 열리는지 재서 그대로 공개합니다. 측정마다
|
|
167
|
+
스택과 날짜를 병기합니다:
|
|
163
168
|
|
|
164
|
-
- **한컴 열림
|
|
169
|
+
- **한컴 열림 120/120 · 렌더 검증 120/120** — 현행 스택(5.7.0 · 실한컴
|
|
170
|
+
12.0.0.3288 · 2026-08-03)의 축소 측정: 기준 스트라텀 + 신규 저작 표면
|
|
171
|
+
6종(각주·누름틀·수식·차트·체크박스·편집 계획). 영수증은 행마다 bucket이
|
|
172
|
+
있어 `jq` 한 줄로 재현됩니다
|
|
173
|
+
- **한컴 열림 476/476** — 전수 동결 코퍼스(N=497) 측정
|
|
174
|
+
(3.4.1 · 실한컴 12.0.0.3288 · 2026-07-19)
|
|
165
175
|
- **미수정 영역 바이트 보존 497/497** · 개인정보 유출 0
|
|
166
176
|
- **렌더 검증 416/476** — 한컴 자체가 PDF 내보내기를 거부한 43건도 숨기지 않고 집계
|
|
167
177
|
- 전체 수치와 주의사항: [실측 코퍼스 메트릭](https://airmang.github.io/python-hwpx/corpus-metrics.html) · 기능별 등급: [지원 매트릭스](docs/support-matrix.md)
|
|
@@ -49,16 +49,21 @@ AI 도구가 정확한 API를 배우도록 [llms.txt](https://airmang.github.io/
|
|
|
49
49
|
pip install python-hwpx # Python 3.10+
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
+
<!-- standalone-python-example -->
|
|
53
|
+
|
|
52
54
|
```python
|
|
53
55
|
from hwpx import HwpxDocument
|
|
54
56
|
|
|
55
|
-
doc = HwpxDocument.
|
|
56
|
-
doc.
|
|
57
|
-
doc.
|
|
57
|
+
doc = HwpxDocument.new()
|
|
58
|
+
doc.add_heading("2026 운영계획", level=1)
|
|
59
|
+
doc.add_paragraph("가. 추진 배경", style="개요 2")
|
|
60
|
+
doc.save_to_path("계획.hwpx")
|
|
58
61
|
```
|
|
59
62
|
|
|
60
|
-
|
|
61
|
-
|
|
63
|
+
스타일은 이름으로 지정하고, 오타는 저장이 아니라 **그 줄에서** 잡힌다.
|
|
64
|
+
기존 문서를 고치려면 `HwpxDocument.open("보고서.hwpx")`로 시작하면 된다.
|
|
65
|
+
|
|
66
|
+
문서 저작·양식 채움·시험지 조판 같은 상위 워크플로가 필요하면
|
|
62
67
|
[`python-hwpx-automation`](https://github.com/airmang/python-hwpx-automation)을
|
|
63
68
|
함께 설치하세요.
|
|
64
69
|
|
|
@@ -107,10 +112,15 @@ print(report.preservation.untouched_part_payloads.to_dict())
|
|
|
107
112
|
|
|
108
113
|
## 실측으로 말합니다
|
|
109
114
|
|
|
110
|
-
만든 파일이 실제 한컴오피스에서
|
|
111
|
-
|
|
115
|
+
만든 파일이 실제 한컴오피스에서 열리는지 재서 그대로 공개합니다. 측정마다
|
|
116
|
+
스택과 날짜를 병기합니다:
|
|
112
117
|
|
|
113
|
-
- **한컴 열림
|
|
118
|
+
- **한컴 열림 120/120 · 렌더 검증 120/120** — 현행 스택(5.7.0 · 실한컴
|
|
119
|
+
12.0.0.3288 · 2026-08-03)의 축소 측정: 기준 스트라텀 + 신규 저작 표면
|
|
120
|
+
6종(각주·누름틀·수식·차트·체크박스·편집 계획). 영수증은 행마다 bucket이
|
|
121
|
+
있어 `jq` 한 줄로 재현됩니다
|
|
122
|
+
- **한컴 열림 476/476** — 전수 동결 코퍼스(N=497) 측정
|
|
123
|
+
(3.4.1 · 실한컴 12.0.0.3288 · 2026-07-19)
|
|
114
124
|
- **미수정 영역 바이트 보존 497/497** · 개인정보 유출 0
|
|
115
125
|
- **렌더 검증 416/476** — 한컴 자체가 PDF 내보내기를 거부한 43건도 숨기지 않고 집계
|
|
116
126
|
- 전체 수치와 주의사항: [실측 코퍼스 메트릭](https://airmang.github.io/python-hwpx/corpus-metrics.html) · 기능별 등급: [지원 매트릭스](docs/support-matrix.md)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-hwpx"
|
|
7
|
-
version = "
|
|
7
|
+
version = "6.0.2"
|
|
8
8
|
description = "한글 없이 HWPX 문서를 열고, 편집하고, 생성하고, 검증하는 Python 문서 라이브러리"
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -102,11 +102,17 @@ include-package-data = true
|
|
|
102
102
|
packages = [
|
|
103
103
|
"hwpx",
|
|
104
104
|
"hwpx._document",
|
|
105
|
+
# 6.0: 루트 표면 34 뒤의 11개 도메인 네임스페이스. 이 줄이 없으면 휠이
|
|
106
|
+
# `hwpx._document.ns` 없이 나가고 `import hwpx` 자체가 깨진다 — 소스
|
|
107
|
+
# 트리에서만 통과하는 종류의 결함이라 doc-fence 휠 실행 게이트가 잡았다.
|
|
108
|
+
"hwpx._document.ns",
|
|
105
109
|
"hwpx.data",
|
|
106
110
|
"hwpx.equation",
|
|
107
111
|
"hwpx.form_fit",
|
|
108
112
|
"hwpx.ingest",
|
|
109
113
|
"hwpx.layout",
|
|
114
|
+
# 6.0: add_* 가 반환하는 도메인 객체·결과 dataclass (WP-C가 채운다).
|
|
115
|
+
"hwpx.objects",
|
|
110
116
|
"hwpx.opc",
|
|
111
117
|
"hwpx.oxml",
|
|
112
118
|
"hwpx.plan",
|
|
@@ -162,6 +168,28 @@ files = [
|
|
|
162
168
|
"src/hwpx/tools/mail_merge.py",
|
|
163
169
|
"src/hwpx/tools/redline.py",
|
|
164
170
|
"src/hwpx/_document/_units.py",
|
|
171
|
+
# 6.0 (062-engine-surface WP-A): 새 모듈은 게이트 안에서 태어난다. 이
|
|
172
|
+
# 목록이 옛 모듈을 점진 편입하는 것이라고 해서, 새로 만드는 것까지 밖에
|
|
173
|
+
# 둘 이유는 없다.
|
|
174
|
+
#
|
|
175
|
+
# 예외 하나: `_document/_legacy.py`. 본문이 5.8.0 `document.py`의 것을
|
|
176
|
+
# **그대로** 옮긴 것이고(그 자리에서는 타입 청결했다), 믹스인으로 분리된
|
|
177
|
+
# 탓에 `self`가 `HwpxDocument`가 아니라 `Self@_LegacyFacade`로 좁혀져
|
|
178
|
+
# 위임 호출 52건이 전부 같은 한 가지 이유로 붉어진다. `self` 주석을 달면
|
|
179
|
+
# `inspect.signature`가 바뀌어 shim 락의 시그니처 동일성(이주 창의 핵심
|
|
180
|
+
# 약속)이 깨진다. 7.0에서 파일째 삭제되므로 편입하지 않는다.
|
|
181
|
+
"src/hwpx/model.py",
|
|
182
|
+
"src/hwpx/objects/__init__.py",
|
|
183
|
+
# 6.0 (062-engine-surface WP-C): 반환 규약 소유 모듈 5종 — 같은 이유로
|
|
184
|
+
# 게이트 안에서 태어난다(위 WP-A 주석 참조).
|
|
185
|
+
"src/hwpx/objects/binary_item.py",
|
|
186
|
+
"src/hwpx/objects/checkbox.py",
|
|
187
|
+
"src/hwpx/objects/form_field.py",
|
|
188
|
+
"src/hwpx/objects/results.py",
|
|
189
|
+
"src/hwpx/objects/tracked.py",
|
|
190
|
+
"src/hwpx/_document/_resolve.py",
|
|
191
|
+
"src/hwpx/_document/headings.py",
|
|
192
|
+
"src/hwpx/_document/ns",
|
|
165
193
|
"src/hwpx/_document/fields.py",
|
|
166
194
|
"src/hwpx/_document/layout.py",
|
|
167
195
|
"src/hwpx/_document/media.py",
|
|
@@ -223,6 +251,28 @@ include = [
|
|
|
223
251
|
"src/hwpx/tools/mail_merge.py",
|
|
224
252
|
"src/hwpx/tools/redline.py",
|
|
225
253
|
"src/hwpx/_document/_units.py",
|
|
254
|
+
# 6.0 (062-engine-surface WP-A): 새 모듈은 게이트 안에서 태어난다. 이
|
|
255
|
+
# 목록이 옛 모듈을 점진 편입하는 것이라고 해서, 새로 만드는 것까지 밖에
|
|
256
|
+
# 둘 이유는 없다.
|
|
257
|
+
#
|
|
258
|
+
# 예외 하나: `_document/_legacy.py`. 본문이 5.8.0 `document.py`의 것을
|
|
259
|
+
# **그대로** 옮긴 것이고(그 자리에서는 타입 청결했다), 믹스인으로 분리된
|
|
260
|
+
# 탓에 `self`가 `HwpxDocument`가 아니라 `Self@_LegacyFacade`로 좁혀져
|
|
261
|
+
# 위임 호출 52건이 전부 같은 한 가지 이유로 붉어진다. `self` 주석을 달면
|
|
262
|
+
# `inspect.signature`가 바뀌어 shim 락의 시그니처 동일성(이주 창의 핵심
|
|
263
|
+
# 약속)이 깨진다. 7.0에서 파일째 삭제되므로 편입하지 않는다.
|
|
264
|
+
"src/hwpx/model.py",
|
|
265
|
+
"src/hwpx/objects/__init__.py",
|
|
266
|
+
# 6.0 (062-engine-surface WP-C): 반환 규약 소유 모듈 5종 — 같은 이유로
|
|
267
|
+
# 게이트 안에서 태어난다(위 WP-A 주석 참조).
|
|
268
|
+
"src/hwpx/objects/binary_item.py",
|
|
269
|
+
"src/hwpx/objects/checkbox.py",
|
|
270
|
+
"src/hwpx/objects/form_field.py",
|
|
271
|
+
"src/hwpx/objects/results.py",
|
|
272
|
+
"src/hwpx/objects/tracked.py",
|
|
273
|
+
"src/hwpx/_document/_resolve.py",
|
|
274
|
+
"src/hwpx/_document/headings.py",
|
|
275
|
+
"src/hwpx/_document/ns",
|
|
226
276
|
"src/hwpx/_document/fields.py",
|
|
227
277
|
"src/hwpx/_document/layout.py",
|
|
228
278
|
"src/hwpx/_document/media.py",
|