python-hwpx 4.0.0__tar.gz → 4.1.1__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-4.0.0/src/python_hwpx.egg-info → python_hwpx-4.1.1}/PKG-INFO +1 -1
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/pyproject.toml +1 -1
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fit/wordbox.py +30 -4
- {python_hwpx-4.0.0 → python_hwpx-4.1.1/src/python_hwpx.egg-info}/PKG-INFO +1 -1
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_form_fit_wordbox.py +48 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/LICENSE +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/NOTICE +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/README.md +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/setup.cfg +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/_units.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/fields.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/layout.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/media.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/memos.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/persistence.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/shapes.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/_document/tracked.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/_batch_verification.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/blueprint/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/blueprint/bundle.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/blueprint/catalog.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/blueprint/dump.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/blueprint/mapping.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/blueprint/model.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/blueprint/native.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/blueprint/replay.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/catalog.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/cli.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/commands.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/document.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/form_plan.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/model.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/path.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/query.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/agent/story.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/authoring.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/benchmark/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/benchmark/blind_eval.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/body_patch.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/builder/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/builder/core.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/builder/report.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/badges.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/corpus/corpus.json +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/corpus/meeting_summary.hwpx +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/corpus/notice.hwpx +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/corpus/report_table.hwpx +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/corpus.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/report.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/roundtrip_batch.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/conformance/runner.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/data/Skeleton.hwpx +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/_support.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/composer.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/harvest.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/plan.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profile.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/fragments/body.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/fragments/heading.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/fragments/info_table.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/fragments/title.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/profile.json +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/template.hwpx +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/home_notice/fragments/body.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/home_notice/fragments/heading.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/home_notice/fragments/title.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/home_notice/profile.json +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/home_notice/template.hwpx +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/fragments/body.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/fragments/heading.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/fragments/info_table.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/fragments/title.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/profile.json +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/template.hwpx +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/report/fragments/body.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/report/fragments/heading.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/report/fragments/info_table.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/report/fragments/title.xml +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/report/profile.json +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/report/template.hwpx +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/validator.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/document.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/equation/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/equation/eqedit.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/equation/mathml.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/equation/render.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/equation/tokens.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/errors.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/evalplan_fill.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/exam/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/exam/compose.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/exam/ir.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/exam/measure.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/exam/parser.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/exam/profile.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/experimental.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/fill_residue.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fill.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fit/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fit/apply.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fit/engine.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fit/measure.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fit/policy.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fit/report.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/form_fit/seal.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/formfill_quality.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/guidance_scan.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/ingest/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/ingest/base.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/ingest/hwpx_converter.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/layout/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/layout/lint.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/layout/report.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/mutation_report.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/opc/package.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/opc/relationships.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/opc/security.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/opc/xml_utils.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/_document_impl.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/_document_primitives.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/body.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/canonical_defaults.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/common.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/document.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/document_parts.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/header.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/header_part.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/memo.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/namespaces.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/numbering.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/objects.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/paragraph.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/parser.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/run.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/schema.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/section.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/section_format.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/section_story.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/simple_parts.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/table.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/oxml/utils.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/package.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/patch.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/presets/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/presets/proposal.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/py.typed +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/quality/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/quality/ledger.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/quality/policy.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/quality/report.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/quality/save_pipeline.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/table_patch.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/template_formfit.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/templates.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/_schemas/header.xsd +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/_schemas/section.xsd +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/advanced_generators.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/archive_cli.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/doc_diff.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/document_viewer.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/exporter.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/fuzz/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/fuzz/__main__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/fuzz/catalog.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/fuzz/generator.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/fuzz/minimize.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/fuzz/runner.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/generic_inventory.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/id_integrity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/idempotence.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/ir_equality.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/layout_preview.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/mail_merge.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/markdown_export.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/object_finder.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/official_lint.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/package_reconcile.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/package_validator.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/page_guard.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/pii.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/read_fidelity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/recover.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/redline.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/repair.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/report_parser.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/report_utils.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/roundtrip_diff.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/style_profile.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/table_cleanup.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/table_compute.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/table_navigation.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/template_analyzer.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/text_extract_cli.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/text_extractor.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/toc_author.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/toc_fidelity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/tools/validator.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/__init__.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/_hancom_open_rate.ps1 +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/_refresh_hwpx_mac.applescript +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/_render_hwpx.ps1 +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/_render_hwpx_mac.applescript +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/detectors.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/diff.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/fixture_corpus.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/hancom_worker.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/masks.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/oracle.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/page_qa.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/qa_contracts.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/qa_metrics.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/visual/report.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/python_hwpx.egg-info/SOURCES.txt +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/python_hwpx.egg-info/dependency_links.txt +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/python_hwpx.egg-info/entry_points.txt +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/python_hwpx.egg-info/requires.txt +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/python_hwpx.egg-info/top_level.txt +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_advanced_generators.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_blueprint_contracts.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_blueprint_dump.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_blueprint_replay.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_catalog.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_cli.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_commands.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_contracts.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_document.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_mixed_form.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_path_query.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_agent_story_commands.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_authoring_native_toc.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_authoring_profile_routing.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_authoring_profile_routing_oracle.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_authoring_quality_corpus.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_authoring_render_check.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_authoring_v2_block_validation.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_blind_eval_fixture.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_body_patch.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_builder_core.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_builder_plan_v2.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_builder_vertical_slice.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_byte_patch_identity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_cell_line_spacing.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_comment_node_robustness.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_conformance.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_corpus_read_fidelity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_corpus_toc_verify.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_coverage_promotion.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_coverage_targets.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_design_builder.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_deviations_registry.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_doc_diff.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_document_context_manager.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_document_facade_surface.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_document_formatting.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_document_plan.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_document_plan_computed_fields.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_document_save_api.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_document_viewer.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_equation_converter.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_equation_render.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_evalplan_fill.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_exam_compose.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_exam_compose_oracle.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_exam_fixtures.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_exam_ir.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_exam_measure.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_exam_parser.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_exam_profile.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_existing_document_format_editing.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_fill_residue.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_form_fields.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_form_fill_split_run.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_form_fit.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_form_fit_integration.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_form_fit_seal.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_form_fit_seal_placement.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_formfill_differential_driver.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_formfill_quality.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_fuzz_catalog_derive_expected.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_fuzz_loop.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_fuzz_regressions.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_gap_closure_tools.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_government_report_preset.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_government_table_profile.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_guidance_scan.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_hancom_render_worker.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_hp_tab_support.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_hwpxlib_corpus_read.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_id_generator_range.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_id_integrity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_image_object_workflow.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_ingest.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_inline_models.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_integration_hwpx_compatibility.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_integration_roundtrip.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_kordoc_absorption.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_layout_cache_scope.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_layout_lint.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_layout_preview.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_m9_p0_spike_tools.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_mail_merge_fit.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_mail_merge_table_compute.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_mail_merge_xlsx.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_markdown_export.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_memo_and_style_editing.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_mixed_form_plan.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_mutation_contract_unification.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_mutation_report.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_mutation_report_projections.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_namespace_handling.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_new_features.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_official_document_style.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_official_lint_gongmun_gate.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_official_lint_tableaware.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_opc_package.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_open_safety_corpus.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_openrate.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_oxml_modularization.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_oxml_parsing.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_packaging_license_metadata.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_packaging_py_typed.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_paragraph_keep_together.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_paragraph_section_management.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_pii.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_pii_leak_sweep.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_pii_structural.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_pii_wiring.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_proposal_preset.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_public_runtime_boundary.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_question_split_detector.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_read_fidelity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_recover_broken_zip.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_redline_authoring.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_redline_verify.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_repair_repack.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_report_parser.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_report_utils.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_repr_snapshots.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_rhwp_t1_gates.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_rhwp_t2_verification.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_roundtrip_fidelity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_row_heights.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_save_pipeline.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_save_pipeline_no_bypass.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_schema_freeze.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_section_headers.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_set_paragraph_format_keep.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_skeleton_template_ids.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_split_cell.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_split_merged_cell.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_stable_surface.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_style_profile.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_table_cleanup.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_table_navigation.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_table_patch.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_table_patch_dryrun.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_table_patch_m105.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_tables_default_border.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_template_analyzer_enrichment.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_template_formfit.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_text_extractor_annotations.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_toc_author.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_toc_fidelity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_validation_severity.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_validator_comment_nodes.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_version_metadata.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_visual_fixture_corpus.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_visual_oracle.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_visual_oracle_budget.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_visual_qa_contracts.py +0 -0
- {python_hwpx-4.0.0 → python_hwpx-4.1.1}/tests/test_visual_qa_metrics.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-hwpx"
|
|
7
|
-
version = "4.
|
|
7
|
+
version = "4.1.1"
|
|
8
8
|
description = "한글 없이 HWPX 문서를 열고, 편집하고, 생성하고, 검증하는 Python 자동화 라이브러리"
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -681,6 +681,14 @@ def extract_cell_clips(pdf_path: str, *, page: int | None = None) -> list[Rect]:
|
|
|
681
681
|
These are the overflow clips — same coordinate space as the glyph boxes — so
|
|
682
682
|
no HWPX→PDF transform is needed. ``find_tables`` can raise on odd pages; such
|
|
683
683
|
a page contributes no clips rather than crashing.
|
|
684
|
+
|
|
685
|
+
Borders-only (``strategy="lines_strict"``): a cell rectangle is defined by its
|
|
686
|
+
*drawn borders*, not by the text inside it. The ``find_tables`` default snaps
|
|
687
|
+
edges to glyph positions, so a filled value can appear to *escape* a clip that
|
|
688
|
+
was mis-sized around the very text it holds — a false overflow. S-094 P3
|
|
689
|
+
measured this: the only 3 corpus pairs that flagged ``newOverflow`` (the nts
|
|
690
|
+
forms) all had the fill value escaping a text-snapped clip under the default,
|
|
691
|
+
and 0 escapes under ``lines_strict``; there were no real escapes to mask.
|
|
684
692
|
"""
|
|
685
693
|
|
|
686
694
|
if not fitz_available():
|
|
@@ -695,7 +703,7 @@ def extract_cell_clips(pdf_path: str, *, page: int | None = None) -> list[Rect]:
|
|
|
695
703
|
with doc:
|
|
696
704
|
for pno in _page_indices(doc, page):
|
|
697
705
|
try:
|
|
698
|
-
tables = doc[pno].find_tables().tables
|
|
706
|
+
tables = doc[pno].find_tables(strategy="lines_strict").tables
|
|
699
707
|
except Exception:
|
|
700
708
|
continue # layout analysis failed on this page -> no clips, no crash
|
|
701
709
|
for ti, table in enumerate(tables):
|
|
@@ -839,8 +847,21 @@ class LayoutSignature:
|
|
|
839
847
|
lesson that absolute glyph-overlap is unusable on real forms). Page count is
|
|
840
848
|
the dominant, high-confidence signal — a fill that spills onto a new page is
|
|
841
849
|
the canonical layout collapse. Per-table ``(rows, cols)`` is the finer
|
|
842
|
-
row/column signal
|
|
843
|
-
|
|
850
|
+
row/column signal, extracted from *drawn table borders only*
|
|
851
|
+
(``find_tables(strategy="lines_strict")``): a structural fingerprint must be
|
|
852
|
+
text-independent, so it is judged as a multiset *delta* (blank vs filled),
|
|
853
|
+
not an absolute count.
|
|
854
|
+
|
|
855
|
+
Why ``lines_strict`` and not the ``find_tables`` default (``"lines"``): the
|
|
856
|
+
default snaps table edges to *text* positions, so injecting a value into a
|
|
857
|
+
previously-empty cell makes it hallucinate a phantom ``(2,2)``/``(1,2)`` table
|
|
858
|
+
or wobble a real one by ±1 row/col even when the drawn grid and page count are
|
|
859
|
+
unchanged. S-094 P3 measured this on the frozen corpus (all 6 "table-shape"
|
|
860
|
+
differential failures were page-stable phantoms; under ``lines_strict`` blank
|
|
861
|
+
and filled agree, 0 regressions across 31 pairs; ``sen-24`` has byte-identical
|
|
862
|
+
drawn rectangles yet the default strategy still invented a ``(1,2)`` table from
|
|
863
|
+
the 3 added glyphs). Borders-only detection measures the grid the fill did not
|
|
864
|
+
touch.
|
|
844
865
|
"""
|
|
845
866
|
|
|
846
867
|
page_count: int
|
|
@@ -879,7 +900,12 @@ def extract_layout_signature(pdf_path: str) -> LayoutSignature:
|
|
|
879
900
|
for page in doc:
|
|
880
901
|
sizes.append((float(page.rect.width), float(page.rect.height)))
|
|
881
902
|
try:
|
|
882
|
-
|
|
903
|
+
# Borders-only ("lines_strict"): a *structural* fingerprint must
|
|
904
|
+
# not react to cell text. The default strategy snaps to glyph
|
|
905
|
+
# positions and invents phantom tables from a fill's added text
|
|
906
|
+
# (S-094 P3). Bordered form grids are detected identically either
|
|
907
|
+
# way; the text-sensitivity is the only difference we drop.
|
|
908
|
+
tables = page.find_tables(strategy="lines_strict").tables
|
|
883
909
|
except Exception:
|
|
884
910
|
continue # layout analysis failed on this page -> no tables, no crash
|
|
885
911
|
for table in tables:
|
|
@@ -731,6 +731,54 @@ def test_extract_layout_signature_degrades_when_fitz_absent(monkeypatch):
|
|
|
731
731
|
wb.extract_layout_signature("/nonexistent.pdf")
|
|
732
732
|
|
|
733
733
|
|
|
734
|
+
def test_extract_layout_signature_uses_borders_only_strategy(monkeypatch):
|
|
735
|
+
"""The structural fingerprint must detect tables from drawn borders only.
|
|
736
|
+
|
|
737
|
+
S-094 P3: the ``find_tables`` default (``"lines"``) snaps table edges to text
|
|
738
|
+
positions, so injecting a fill value into an empty cell invents phantom tables
|
|
739
|
+
and flips the "table-shape" signal even when the drawn grid is unchanged. The
|
|
740
|
+
fingerprint pins ``strategy="lines_strict"`` so it stays text-independent —
|
|
741
|
+
this test fails closed if a future edit drops back to the content-sensitive
|
|
742
|
+
default.
|
|
743
|
+
"""
|
|
744
|
+
|
|
745
|
+
import sys
|
|
746
|
+
import types
|
|
747
|
+
|
|
748
|
+
seen: list[str] = []
|
|
749
|
+
|
|
750
|
+
class _Tables:
|
|
751
|
+
tables = () # no tables; we only care which strategy was requested
|
|
752
|
+
|
|
753
|
+
class _Page:
|
|
754
|
+
rect = types.SimpleNamespace(width=100.0, height=100.0)
|
|
755
|
+
|
|
756
|
+
def find_tables(self, *, strategy="lines"):
|
|
757
|
+
seen.append(strategy)
|
|
758
|
+
return _Tables()
|
|
759
|
+
|
|
760
|
+
class _Doc:
|
|
761
|
+
def __iter__(self):
|
|
762
|
+
return iter([_Page()])
|
|
763
|
+
|
|
764
|
+
def __len__(self):
|
|
765
|
+
return 1
|
|
766
|
+
|
|
767
|
+
def __enter__(self):
|
|
768
|
+
return self
|
|
769
|
+
|
|
770
|
+
def __exit__(self, *exc):
|
|
771
|
+
return False
|
|
772
|
+
|
|
773
|
+
stub = types.ModuleType("fitz")
|
|
774
|
+
stub.open = lambda _path: _Doc()
|
|
775
|
+
monkeypatch.setitem(sys.modules, "fitz", stub)
|
|
776
|
+
monkeypatch.setattr(wb, "fitz_available", lambda: True)
|
|
777
|
+
|
|
778
|
+
wb.extract_layout_signature("/whatever.pdf")
|
|
779
|
+
assert seen == ["lines_strict"]
|
|
780
|
+
|
|
781
|
+
|
|
734
782
|
def test_verify_layout_stability_degrades_without_baseline():
|
|
735
783
|
# neither blank_hwpx nor blank_signature -> honest unverified before any render
|
|
736
784
|
v = wb.verify_form_layout_stability("filled.hwpx")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/fragments/body.xml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/profile.json
RENAMED
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/application_form/template.hwpx
RENAMED
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/home_notice/fragments/body.xml
RENAMED
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/home_notice/fragments/heading.xml
RENAMED
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/home_notice/fragments/title.xml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/fragments/body.xml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/fragments/title.xml
RENAMED
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/profile.json
RENAMED
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/official_notice/template.hwpx
RENAMED
|
File without changes
|
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/report/fragments/heading.xml
RENAMED
|
File without changes
|
{python_hwpx-4.0.0 → python_hwpx-4.1.1}/src/hwpx/design/profiles/report/fragments/info_table.xml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|