python-hwpx 6.7.0__tar.gz → 6.8.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.7.0/src/python_hwpx.egg-info → python_hwpx-6.8.0}/PKG-INFO +1 -1
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/pyproject.toml +1 -1
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/__init__.py +84 -34
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/persistence.py +14 -2
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/document.py +4 -2
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/equation/authoring.py +6 -3
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/equation/eqedit.py +7 -2
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/equation/measure.py +169 -73
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/errors.py +28 -0
- python_hwpx-6.8.0/src/hwpx/form_fit/_glyph_table.py +3765 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/form_fit/measure.py +605 -40
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/errors.py +12 -22
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/ingest/hwpx_converter.py +2 -1
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/layout/pages.py +1494 -216
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/_document_primitives.py +2 -2
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/header_part.py +1 -1
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/table_sizes.py +29 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/utils.py +18 -1
- python_hwpx-6.8.0/src/hwpx/tools/__init__.py +277 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/package_validator.py +2 -2
- {python_hwpx-6.7.0 → python_hwpx-6.8.0/src/python_hwpx.egg-info}/PKG-INFO +1 -1
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/python_hwpx.egg-info/SOURCES.txt +7 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_coverage_ledger.py +12 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_document_formatting.py +38 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_documentation_code_fences.py +21 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_equation_authoring.py +5 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_equation_converter.py +13 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_equation_measure_hancom_saved.py +7 -5
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_equation_size.py +4 -2
- python_hwpx-6.8.0/tests/test_equation_width_hancom_boxes.py +73 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_existing_document_format_editing.py +31 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_form_fit_hancom_rules.py +227 -2
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_hwp5_save.py +35 -0
- python_hwpx-6.8.0/tests/test_layer_leak_guard.py +181 -0
- python_hwpx-6.8.0/tests/test_layout_page_estimate.py +1593 -0
- python_hwpx-6.8.0/tests/test_lazy_hwp5_import.py +87 -0
- python_hwpx-6.8.0/tests/test_lazy_tools_import.py +91 -0
- python_hwpx-6.8.0/tests/test_lazy_tools_submodules.py +149 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_product_boundary.py +2 -1
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_public_artifact_hygiene.py +14 -0
- python_hwpx-6.8.0/tests/test_size_ratchet.py +102 -0
- python_hwpx-6.7.0/src/hwpx/tools/__init__.py +0 -131
- python_hwpx-6.7.0/tests/test_layout_page_estimate.py +0 -758
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/LICENSE +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/NOTICE +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/README.md +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/setup.cfg +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/_legacy.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/_resolve.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/_units.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/fields.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/headings.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/highlight.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/layout.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/media.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/memos.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/_base.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/fields.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/media.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/notes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/page.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/parts.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/refs.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/shapes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/styles.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/tables.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/text.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/ns/tracking.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/shapes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_document/tracked.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/_moved_modules.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/body_patch.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/capabilities.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/data/Skeleton.hwpx +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/data/contract_docs/known-traps.md +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/data/contract_docs/mutation-semantics.md +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/data/contract_docs/recipes-traversal.md +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/data/contract_docs/support-matrix.md +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/equation/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/equation/mathml.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/equation/render.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/equation/tokens.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/experimental.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/form_fit/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/form_fit/apply.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/form_fit/engine.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/form_fit/policy.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/form_fit/report.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/binary.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/bodytext.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/cfb.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/controls.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/docinfo.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/docinfo_writer.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/fileheader.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/header_xml.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/owpml.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/package.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/reader.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/records.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/section_common.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/section_writer.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/section_xml.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/shape_xml.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/shapes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/summary.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/hwp5/writer.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/ingest/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/ingest/base.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/layout/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/layout/lint.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/layout/report.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/model.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/mutation_report.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/objects/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/objects/binary_item.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/objects/checkbox.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/objects/form_field.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/objects/highlight.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/objects/results.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/objects/tracked.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/opc/package.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/opc/relationships.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/opc/security.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/opc/xml_utils.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/_document_impl.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/_paragraph_text_edit.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/body.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/canonical_defaults.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/color.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/common.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/curves.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/document.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/document_metadata.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/document_parts.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/drop_cap.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/dutmal_compose.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/field_marks.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/header.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/header_compat.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/header_fonts.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/history_part.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/hyperlink_form.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/master_page.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/master_page_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/memo.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/namespaces.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/note_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/numbering.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/numbering_kinds.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/objects.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/paragraph.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/paragraph_heading.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/parser.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/run.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/schema.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/section.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/section_format.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/section_layout.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/section_story.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/settings.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/shape_position.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/simple_parts.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/table.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/table_merge.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/oxml/version_part.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/package.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/patch.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/plan/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/plan/_execute.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/plan/_model.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/plan/_schema.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/plan/_validate.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/py.typed +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/quality/__init__.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/quality/ledger.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/quality/policy.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/quality/rendering.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/quality/report.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/quality/save_pipeline.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/table_patch.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/templates.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/_schemas/header.xsd +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/_schemas/owpml-body.xsd +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/_schemas/owpml-core.xsd +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/_schemas/owpml-header.xsd +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/_schemas/owpml-paralist.xsd +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/_schemas/owpml-xml.xsd +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/_schemas/section.xsd +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/archive_cli.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/doc_diff.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/document_merge.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/document_viewer.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/exporter.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/generic_inventory.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/id_integrity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/idempotence.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/ir_equality.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/layout_preview.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/mail_merge.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/markdown_export.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/object_finder.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/package_reconcile.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/page_guard.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/read_fidelity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/recover.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/redline.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/repair.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/report_utils.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/roundtrip_diff.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/table_cleanup.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/table_navigation.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/template_analyzer.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/text_extract_cli.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/text_extractor.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/toc_author.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/toc_fidelity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/hwpx/tools/validator.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/python_hwpx.egg-info/dependency_links.txt +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/python_hwpx.egg-info/entry_points.txt +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/python_hwpx.egg-info/requires.txt +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/src/python_hwpx.egg-info/top_level.txt +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_add_control.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_add_heading.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_adoption_metrics_snapshot.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_arc_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_authoring_defaults.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_authoring_quality_corpus.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_blind_eval_fixture.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_body_patch.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_border_fill_image_gradient.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_border_line_types.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_build_element_census.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_byte_patch_identity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_capabilities_surface.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_cell_border_neighbors.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_cell_fields.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_cell_line_spacing.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_cell_margins.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_cell_text_rewrite_semantics.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_char_pr_child_order.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_character_width_ratio.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_chart_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_check_box_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_color_arguments.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_column_break.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_comment_node_robustness.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_container_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_contract_docs_sync.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_corpus_read_fidelity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_coverage_promotion.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_coverage_targets.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_curve_connector_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_deviations_registry.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_doc_diff.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_document_context_manager.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_document_facade_surface.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_document_merge.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_document_metadata.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_document_ops_runtime_boundary.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_document_save_api.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_document_viewer.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_drop_cap_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_dutmal_compose_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_edit_fidelity_corpus.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_edit_plan.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_editor_surface_inventory.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_engine_surface_6_0.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_equalize_widths_per_row.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_equation_render.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_error_contract.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_error_messages.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_evalplan_core_primitives.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_export_captions_dutmal.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_export_cell_text_spaces.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_export_list_labels.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_export_notes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_export_text_boxes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_exporter_table_text.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_field_marks.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_field_type_ids.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_fill_image_hancom_modes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_form_field_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_form_fields.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_form_fill_core_primitives.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_form_fit.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_form_fit_integration.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_fuzz_catalog_derive_expected.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_fuzz_loop.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_fuzz_regressions.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_gap_closure_tools.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_golden_api.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_header_compat_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_header_control_before_field.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_heading_style_shapes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_highlight_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_hp_tab_support.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_hwp5_container.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_hwp5_hancom_files.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_hwp5_open.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_hwpxlib_corpus_read.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_hyperlink_hancom_form.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_id_generator_range.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_id_integrity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_image_object_workflow.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_index_mark.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ingest.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_inline_models.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_insert_row_merged_cells.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_instid_attribute_case.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_integration_hwpx_compatibility.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_integration_roundtrip.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_internal_calls_skip_moved_names.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_layout_cache_scope.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_layout_lint.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_layout_preview.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_library_boundary_closure.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_line_width_arguments.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_list_continue.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_list_defaults_vs_hancom.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_llms_txt.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_mail_merge_xlsx.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_manifest_resolve_once.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_markdown_export.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_markdown_export_shape_text.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_master_page_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_master_page_pages_taken.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_memo_and_style_editing.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_memo_fields.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_memo_shape_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_merge_cells_hancom_files.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_merge_cells_keeps_contents.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_moved_module_imports.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_moved_surface_hints.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_mutation_report.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_namespace_handling.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_namespace_hygiene.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_namespace_normalization.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_native_edit_contract.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_new_features.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_note_authoring_contract.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ns_fields.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ns_media.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ns_notes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ns_page.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ns_refs.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ns_shapes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ns_tables.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_ns_tracking.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_number_formats.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_opc_package.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_open_safety_corpus.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_outline_numbering.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_oxml_modularization.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_oxml_parsing.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_package_hygiene.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_packaging_license_metadata.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_packaging_py_typed.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_page_number_control.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_page_number_format.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_page_orientation.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_para_pr_dedup.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_align_distribute_space.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_border.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_format_targets.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_hyperlink_style.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_keep_together.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_margin_default_scale.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_property_lookup.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_property_version_switch.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_remove_in_containers.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_paragraph_section_management.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_part_hierarchy_read_models.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_polygon_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_public_runtime_boundary.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_read_fidelity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_recover_broken_zip.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_redline_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_redline_verify.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_release_workflow_safety.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_remove_unused_charts.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_remove_unused_images.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_repair_repack.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_replace_text_barriers.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_report_utils.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_repr_snapshots.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_return_contract.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_roundtrip_fidelity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_roundtrip_fidelity_corpus.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_row_heights.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_run_choice_atom_authoring.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_run_content_kinds.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_run_font_refs.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_run_style_base.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_safe_edit_example.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_save_keeps_inline_text_caches.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_save_pipeline.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_save_verifies_once.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_section_clear_body.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_section_columns.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_section_headers.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_section_ids_order.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_section_properties_real_roundtrip.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_set_column_widths_uniform_split.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_set_paragraph_format_keep.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_shape_geometry_contract.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_shape_open_safety_risk_check.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_shape_original_size.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_shape_position_frames.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_skeleton_template_ids.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_split_cell.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_split_merged_cell.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_stable_surface.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_stale_layout_cache_sweep.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_story_edits_reach_control_copy.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_style_font_border_reads.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_style_resolution.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_tab_character_writing.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_tab_definition_version_switch.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_cell_equalize.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_cleanup.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_label.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_navigation.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_page_flow.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_patch.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_patch_dryrun.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_patch_m105.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_patch_structure_fixes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_table_split_merge.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_tables_default_border.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_template_analyzer_enrichment.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_text_box_fields.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_text_extractor_annotations.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_text_extractor_nested_once.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_text_extractor_run_choice_atoms.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_text_inline_elements.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_text_replace_everywhere.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_title_mark.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_toc_author.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_toc_fidelity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_tracked_overlap_render_smoke.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_tracked_paragraph_delete_break.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_validation_severity.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_validator_comment_nodes.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_validator_form_parameters.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_validator_full_schema.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_validator_hancom_open_rules.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_validator_section_ids.py +0 -0
- {python_hwpx-6.7.0 → python_hwpx-6.8.0}/tests/test_version_metadata.py +0 -0
|
@@ -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.8.0"
|
|
8
8
|
description = "한글 없이 HWPX 문서를 열고, 편집하고, 생성하고, 검증하는 Python 문서 라이브러리"
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import importlib
|
|
15
15
|
import warnings
|
|
16
16
|
from dataclasses import dataclass
|
|
17
|
-
from typing import Literal
|
|
17
|
+
from typing import TYPE_CHECKING, Literal
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def _resolve_version() -> str:
|
|
@@ -28,9 +28,9 @@ def _resolve_version() -> str:
|
|
|
28
28
|
|
|
29
29
|
# --- experimental / deprecated 최상위 표면 (지연 접근, 접근 시 경고) ---------------
|
|
30
30
|
#
|
|
31
|
-
# stable 이름은 아래에서 eager import
|
|
32
|
-
#
|
|
33
|
-
# 4.0.0에서 제거되는 이름은 0개 — 모두 계속 import 가능합니다.
|
|
31
|
+
# stable 이름은 경고 없이 해석됩니다. 대부분 아래에서 eager import 되고, ``hwpx.tools``의
|
|
32
|
+
# 이름은 ``_TOOLS_STABLE_EXPORTS``가 지연 해석합니다. 여기 등록된 이름만 지연 해석되어
|
|
33
|
+
# 경고를 냅니다. 4.0.0에서 제거되는 이름은 0개 — 모두 계속 import 가능합니다.
|
|
34
34
|
|
|
35
35
|
_EXPERIMENTAL_EXPORTS = {
|
|
36
36
|
# 문서 ingestion 프레임워크(임의 포맷 -> HWPX). 계약 유동.
|
|
@@ -293,8 +293,8 @@ class RetiredSurface(ImportError):
|
|
|
293
293
|
def __getattr__(name: str) -> object:
|
|
294
294
|
"""Resolve dynamic module attributes.
|
|
295
295
|
|
|
296
|
-
``__version__
|
|
297
|
-
해석 시 ``DeprecationWarning``을 냅니다.
|
|
296
|
+
``__version__``과 ``hwpx.tools``의 stable 이름은 경고 없이 지연 해석하고,
|
|
297
|
+
experimental/deprecated 이름은 해석 시 ``DeprecationWarning``을 냅니다.
|
|
298
298
|
"""
|
|
299
299
|
|
|
300
300
|
if name == "__version__":
|
|
@@ -318,6 +318,17 @@ def __getattr__(name: str) -> object:
|
|
|
318
318
|
warnings.warn(_deprecated_message(name), DeprecationWarning, stacklevel=2)
|
|
319
319
|
return getattr(importlib.import_module(module_name), name)
|
|
320
320
|
|
|
321
|
+
if name in _TOOLS_STABLE_EXPORTS or name == "tools":
|
|
322
|
+
# Not ``from . import tools``: that asks this module for ``tools`` first and
|
|
323
|
+
# re-enters this function.
|
|
324
|
+
import hwpx.tools as tools
|
|
325
|
+
|
|
326
|
+
if name == "tools":
|
|
327
|
+
return tools
|
|
328
|
+
value = getattr(tools, name)
|
|
329
|
+
globals()[name] = value
|
|
330
|
+
return value
|
|
331
|
+
|
|
321
332
|
moved = _MOVED_TO_COMPANION.get(name)
|
|
322
333
|
if moved is not None:
|
|
323
334
|
statement = moved.import_statement(name)
|
|
@@ -346,11 +357,76 @@ def __dir__() -> list[str]:
|
|
|
346
357
|
return sorted(
|
|
347
358
|
set(globals())
|
|
348
359
|
| set(__all__)
|
|
360
|
+
| {"tools"}
|
|
349
361
|
| set(_EXPERIMENTAL_EXPORTS)
|
|
350
362
|
| set(_DEPRECATED_EXPORTS)
|
|
351
363
|
)
|
|
352
364
|
|
|
353
365
|
|
|
366
|
+
# --- 지연 stable 최상위 표면 (첫 접근 때 해석, 경고 없음) ---------------------------
|
|
367
|
+
#
|
|
368
|
+
# ``hwpx.tools``에 사는 stable 이름은 첫 접근 때 ``__getattr__``이 그 모듈을 읽어
|
|
369
|
+
# 같은 객체를 돌려주고 모듈 전역에 둡니다(경고 없음). ``import hwpx``가 도구 모듈
|
|
370
|
+
# 전부(내보내기·비교·검증 등)를 읽지 않게 하려는 것입니다. ``__all__``·``dir()``·
|
|
371
|
+
# ``from hwpx import *``에는 그대로 있습니다.
|
|
372
|
+
|
|
373
|
+
#: ``hwpx.tools``의 하위 모듈이 정의하고 ``hwpx.tools``가 다시 내보내는 stable 이름(텍스트 추출·개체
|
|
374
|
+
#: 찾기·문서 비교·메일 머지·패키지 검증). 정적 import로 해석하므로 동적 import 지점은
|
|
375
|
+
#: 늘지 않는다.
|
|
376
|
+
_TOOLS_STABLE_EXPORTS = frozenset(
|
|
377
|
+
{
|
|
378
|
+
"DEFAULT_NAMESPACES",
|
|
379
|
+
"ParagraphInfo",
|
|
380
|
+
"SectionInfo",
|
|
381
|
+
"TextExtractor",
|
|
382
|
+
"FoundElement",
|
|
383
|
+
"ObjectFinder",
|
|
384
|
+
"DOC_DIFF_REPORT_VERSION",
|
|
385
|
+
"REFERENCE_CONSISTENCY_REPORT_VERSION",
|
|
386
|
+
"diff_paragraphs",
|
|
387
|
+
"doc_diff",
|
|
388
|
+
"inspect_reference_consistency",
|
|
389
|
+
"MAIL_MERGE_REPORT_VERSION",
|
|
390
|
+
"inspect_mail_merge_placeholders",
|
|
391
|
+
"load_mail_merge_rows",
|
|
392
|
+
"merge_template_rows",
|
|
393
|
+
"EditorOpenSafetyReport",
|
|
394
|
+
"PackageValidationReport",
|
|
395
|
+
"validate_editor_open_safety",
|
|
396
|
+
"validate_package",
|
|
397
|
+
}
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
if TYPE_CHECKING: # type checkers see the real objects; at runtime they load lazily
|
|
402
|
+
from .tools.doc_diff import (
|
|
403
|
+
DOC_DIFF_REPORT_VERSION,
|
|
404
|
+
REFERENCE_CONSISTENCY_REPORT_VERSION,
|
|
405
|
+
diff_paragraphs,
|
|
406
|
+
doc_diff,
|
|
407
|
+
inspect_reference_consistency,
|
|
408
|
+
)
|
|
409
|
+
from .tools.mail_merge import (
|
|
410
|
+
MAIL_MERGE_REPORT_VERSION,
|
|
411
|
+
inspect_mail_merge_placeholders,
|
|
412
|
+
load_mail_merge_rows,
|
|
413
|
+
merge_template_rows,
|
|
414
|
+
)
|
|
415
|
+
from .tools.object_finder import FoundElement, ObjectFinder
|
|
416
|
+
from .tools.package_validator import (
|
|
417
|
+
EditorOpenSafetyReport,
|
|
418
|
+
PackageValidationReport,
|
|
419
|
+
validate_editor_open_safety,
|
|
420
|
+
validate_package,
|
|
421
|
+
)
|
|
422
|
+
from .tools.text_extractor import (
|
|
423
|
+
DEFAULT_NAMESPACES,
|
|
424
|
+
ParagraphInfo,
|
|
425
|
+
SectionInfo,
|
|
426
|
+
TextExtractor,
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
|
|
354
430
|
# ``import hwpx.builder`` goes through the import system, not ``__getattr__``,
|
|
355
431
|
# so the moved module names get their destination from a finder instead.
|
|
356
432
|
from . import _moved_modules
|
|
@@ -359,35 +435,9 @@ _moved_modules.install(_MOVED_TO_COMPANION)
|
|
|
359
435
|
|
|
360
436
|
|
|
361
437
|
# --- stable 최상위 표면 (eager import) ------------------------------------------
|
|
362
|
-
|
|
363
|
-
DEFAULT_NAMESPACES,
|
|
364
|
-
ParagraphInfo,
|
|
365
|
-
SectionInfo,
|
|
366
|
-
TextExtractor,
|
|
367
|
-
)
|
|
368
|
-
from .tools.object_finder import FoundElement, ObjectFinder
|
|
369
|
-
from .tools.doc_diff import (
|
|
370
|
-
DOC_DIFF_REPORT_VERSION,
|
|
371
|
-
REFERENCE_CONSISTENCY_REPORT_VERSION,
|
|
372
|
-
diff_paragraphs,
|
|
373
|
-
doc_diff,
|
|
374
|
-
inspect_reference_consistency,
|
|
375
|
-
)
|
|
376
|
-
from .tools.mail_merge import (
|
|
377
|
-
MAIL_MERGE_REPORT_VERSION,
|
|
378
|
-
inspect_mail_merge_placeholders,
|
|
379
|
-
load_mail_merge_rows,
|
|
380
|
-
merge_template_rows,
|
|
381
|
-
)
|
|
382
|
-
from .tools.package_validator import (
|
|
383
|
-
EditorOpenSafetyReport,
|
|
384
|
-
PackageValidationReport,
|
|
385
|
-
validate_editor_open_safety,
|
|
386
|
-
validate_package,
|
|
387
|
-
)
|
|
438
|
+
# ``hwpx.tools``의 stable 이름은 위 ``_TOOLS_STABLE_EXPORTS``가 지연 해석한다.
|
|
388
439
|
from .ingest import HwpxMarkdownConverter
|
|
389
|
-
from .errors import HwpxError
|
|
390
|
-
from .hwp5.errors import Hwp5ConversionWarning, Hwp5Error
|
|
440
|
+
from .errors import Hwp5ConversionWarning, Hwp5Error, HwpxError
|
|
391
441
|
from .mutation_report import (
|
|
392
442
|
MutationReport,
|
|
393
443
|
PreservationDowngradeError,
|
|
@@ -408,7 +408,8 @@ def save_report(
|
|
|
408
408
|
oracle-verified ``visual_complete`` tier (plan §0.0).
|
|
409
409
|
|
|
410
410
|
Like the legacy savers it raises only if the serialize step's open-safety
|
|
411
|
-
check fails; all other gate outcomes are returned in the report.
|
|
411
|
+
check fails; all other gate outcomes are returned in the report. An ``.hwp``
|
|
412
|
+
path is written as HWP 5.0, as :func:`save_to_path` writes it.
|
|
412
413
|
"""
|
|
413
414
|
|
|
414
415
|
_run_pre_save_validation(doc)
|
|
@@ -420,10 +421,15 @@ def save_report(
|
|
|
420
421
|
output_path = path_or_stream
|
|
421
422
|
elif path_or_stream is not None:
|
|
422
423
|
output_stream = path_or_stream
|
|
424
|
+
# An .hwp target gets HWP 5.0 made from the HWPX parts the gate checks; it raises before anything is
|
|
425
|
+
# written when the HWP 5.0 writer cannot express the document.
|
|
426
|
+
hwp5 = None
|
|
427
|
+
if output_path is not None and str(output_path).lower().endswith(".hwp"):
|
|
428
|
+
hwp5 = _hwp5_bytes(archive_bytes)
|
|
423
429
|
|
|
424
430
|
report = doc._save_pipeline.run(
|
|
425
431
|
archive_bytes,
|
|
426
|
-
output_path=output_path,
|
|
432
|
+
output_path=None if hwp5 is not None else output_path,
|
|
427
433
|
output_stream=output_stream,
|
|
428
434
|
quality=quality or QualityPolicy.transparent(),
|
|
429
435
|
before=before,
|
|
@@ -432,6 +438,12 @@ def save_report(
|
|
|
432
438
|
reference_document=doc,
|
|
433
439
|
source_label="document.save_report",
|
|
434
440
|
)
|
|
441
|
+
if hwp5 is not None and report.ok: # the gate passed: publish the HWP 5.0 file in its place
|
|
442
|
+
from ..quality.save_pipeline import write_bytes_atomically
|
|
443
|
+
|
|
444
|
+
assert output_path is not None
|
|
445
|
+
write_bytes_atomically(output_path, hwp5)
|
|
446
|
+
report.output_path = str(output_path)
|
|
435
447
|
if report.ok:
|
|
436
448
|
_mark_save_clean(doc)
|
|
437
449
|
return report
|
|
@@ -37,7 +37,6 @@ from ._document import fields as _fields
|
|
|
37
37
|
from ._document import media as _media
|
|
38
38
|
from ._document import persistence as _persistence
|
|
39
39
|
from ._document.persistence import SaveFormat
|
|
40
|
-
from .hwp5.errors import Hwp5ConversionReport
|
|
41
40
|
from ._document import _resolve
|
|
42
41
|
from ._document import headings as _headings
|
|
43
42
|
from ._document import layout as _layout
|
|
@@ -64,6 +63,7 @@ register_owpml_namespaces(ET.register_namespace)
|
|
|
64
63
|
logger = logging.getLogger(__name__)
|
|
65
64
|
|
|
66
65
|
if TYPE_CHECKING:
|
|
66
|
+
from .hwp5.errors import Hwp5ConversionReport
|
|
67
67
|
from .tools.validator import ValidationReport
|
|
68
68
|
|
|
69
69
|
|
|
@@ -836,7 +836,9 @@ class HwpxDocument(_LegacyFacade):
|
|
|
836
836
|
oracle-verified ``visual_complete`` tier (plan §0.0).
|
|
837
837
|
|
|
838
838
|
Like the legacy savers it raises only if the serialize step's open-safety
|
|
839
|
-
check fails; all other gate outcomes are returned in the report.
|
|
839
|
+
check fails; all other gate outcomes are returned in the report. An ``.hwp``
|
|
840
|
+
path is written as HWP 5.0, as :meth:`save_to_path` writes it, and raises
|
|
841
|
+
:class:`~hwpx.Hwp5Error` before writing when the document cannot be.
|
|
840
842
|
"""
|
|
841
843
|
|
|
842
844
|
return _persistence.save_report(
|
|
@@ -270,6 +270,8 @@ class _LatexParser:
|
|
|
270
270
|
radicand = self._group_or_atom(depth)
|
|
271
271
|
return f"root {{{' '.join(index_parts)}}} of {{{radicand}}}"
|
|
272
272
|
return f"sqrt {{{self._group_or_atom(depth)}}}"
|
|
273
|
+
if token in ("\\lbrace", "\\rbrace"): # the command spellings of \{ and \}
|
|
274
|
+
return "LBRACE" if token == "\\lbrace" else "RBRACE"
|
|
273
275
|
if token in _TEXT_COMMANDS:
|
|
274
276
|
return self._text_literal()
|
|
275
277
|
if token == "\\mathbf":
|
|
@@ -407,8 +409,8 @@ class _LatexParser:
|
|
|
407
409
|
raise UnsupportedLatexError("missing \\left/\\right delimiter")
|
|
408
410
|
if token in _LATEX_DELIMITERS:
|
|
409
411
|
return _LATEX_DELIMITERS[token]
|
|
410
|
-
if token in ("\\{", "\\}"):
|
|
411
|
-
return "LBRACE" if token
|
|
412
|
+
if token in ("\\{", "\\}", "\\lbrace", "\\rbrace"):
|
|
413
|
+
return "LBRACE" if token in ("\\{", "\\lbrace") else "RBRACE"
|
|
412
414
|
if token in DELIMITERS and len(token) == 1:
|
|
413
415
|
return token
|
|
414
416
|
raise UnsupportedLatexError(f"unsupported \\left/\\right delimiter: {token}")
|
|
@@ -450,7 +452,8 @@ def estimate_equation_size(script: str, *, base_unit: int = 1100) -> tuple[int,
|
|
|
450
452
|
|
|
451
453
|
A reader that lays the page out from the file uses the stored box, so the
|
|
452
454
|
box has to fit the script; Hancom itself was observed (on macOS) to lay the
|
|
453
|
-
equation out again and rewrite the box when it saves the document
|
|
455
|
+
equation out again and rewrite the box when it saves the document, while on
|
|
456
|
+
Windows it keeps the stored box and lays the page out with it (see
|
|
454
457
|
:func:`hwpx.equation.measure.measure_equation`).
|
|
455
458
|
"""
|
|
456
459
|
|
|
@@ -42,8 +42,10 @@ from .tokens import (
|
|
|
42
42
|
MAX_SOURCE_LENGTH = 10_000
|
|
43
43
|
MAX_GROUP_DEPTH = 64
|
|
44
44
|
|
|
45
|
-
# Words EqEdit reads as symbols or
|
|
46
|
-
# (``T_{int}`` → ``T _{"int"}``
|
|
45
|
+
# Words EqEdit reads as symbols, structure or font switches. The writer quotes a bare identifier that collides
|
|
46
|
+
# with one (``T_{int}`` → ``T _{"int"}``, ``e^{it}`` → ``e ^{"it"}``: a lone ``it`` in a superscript switches to
|
|
47
|
+
# italic and draws nothing); the reader turns such a quoted word back into plain letters.
|
|
48
|
+
_FONT_SWITCHES = frozenset({"rm", "it", "bold", "RM", "IT", "BOLD"})
|
|
47
49
|
_RESERVED_WORDS = (
|
|
48
50
|
frozenset(GREEK)
|
|
49
51
|
| frozenset(OPERATORS)
|
|
@@ -52,6 +54,7 @@ _RESERVED_WORDS = (
|
|
|
52
54
|
| frozenset(ACCENTS)
|
|
53
55
|
| frozenset(MATRIX_ENVIRONMENTS)
|
|
54
56
|
| STRUCTURAL
|
|
57
|
+
| _FONT_SWITCHES
|
|
55
58
|
)
|
|
56
59
|
|
|
57
60
|
# Characters that always terminate a token even when not whitespace separated.
|
|
@@ -338,6 +341,8 @@ class _Parser:
|
|
|
338
341
|
return OPERATORS[token]
|
|
339
342
|
if token in FUNCTIONS:
|
|
340
343
|
return FUNCTIONS[token]
|
|
344
|
+
if token in ("LBRACE", "RBRACE"): # a literal brace outside LEFT/RIGHT
|
|
345
|
+
return r"\{" if token == "LBRACE" else r"\}"
|
|
341
346
|
if token.startswith('"') and token.endswith('"') and len(token) >= 2:
|
|
342
347
|
literal = token[1:-1]
|
|
343
348
|
if literal.isalpha() and literal in _RESERVED_WORDS:
|