docvortex 0.4.12__tar.gz → 0.4.13__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.
- {docvortex-0.4.12/src/docvortex.egg-info → docvortex-0.4.13}/PKG-INFO +1 -1
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/converters.py +29 -1
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/table.py +60 -27
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +109 -317
- docvortex-0.4.13/src/docvortex/analyzers/native/office/spreadsheet/region_discovery.py +338 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/version.py +1 -1
- {docvortex-0.4.12 → docvortex-0.4.13/src/docvortex.egg-info}/PKG-INFO +1 -1
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/SOURCES.txt +1 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_odf.py +119 -2
- {docvortex-0.4.12 → docvortex-0.4.13}/LICENSE.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/MANIFEST.in +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/README.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/README.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/demo.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/METADATA.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/USAGE.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-manual-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-round2-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-rule-generalization-2026-09-15.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-title-coverage-2026-09-16.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/docs/sdk-0.4.md +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/pyproject.toml +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/setup.cfg +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/api.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/_document.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/dedup.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_svg_raster.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/options.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/result.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_manual_annotations.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_manual_review_decisions.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_reviewed_history.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round2_annotations.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round2_review_decisions.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round3_annotations.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round3_review_decisions.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/pdf_char_dedup.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_architecture.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_cli_logging.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_document_metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_history_geometry_tools.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_release_ci_gate.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_manual_annotations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_round2_annotations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_round3_annotations.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_rule_generalization.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_spatial_evidence.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_object_clipping.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_text_dedup.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_svg_raster.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tools/__init__.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tools/build_html_css.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.12 → docvortex-0.4.13}/tools/font_geometry.py +0 -0
{docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/converters.py
RENAMED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import html
|
|
5
6
|
import re
|
|
6
7
|
from dataclasses import dataclass
|
|
7
8
|
from typing import Any, BinaryIO, Iterator
|
|
@@ -14,7 +15,7 @@ from .constants import OdfSuffix, qname
|
|
|
14
15
|
from .models import InlineNote
|
|
15
16
|
from .package import OdfPackage
|
|
16
17
|
from .styles import OdfStyles
|
|
17
|
-
from .table import OdfTableExpansionBudget, parse_table_grid, split_table_regions, table_grid_to_html
|
|
18
|
+
from .table import OdfTableExpansionBudget, TableGrid, parse_table_grid, split_table_regions, table_grid_to_html
|
|
18
19
|
from .text import (
|
|
19
20
|
OdfBlockParser,
|
|
20
21
|
OdfMasterPageChange,
|
|
@@ -27,6 +28,29 @@ from .text import (
|
|
|
27
28
|
_LENGTH_RE = re.compile(r"^\s*(?P<value>[+-]?(?:\d+(?:\.\d*)?|\.\d+))(?P<unit>cm|mm|in|pt|pc|px)?\s*$")
|
|
28
29
|
_LENGTH_TO_PT = {"": 1.0, "pt": 1.0, "pc": 12.0, "in": 72.0, "cm": 72.0 / 2.54, "mm": 72.0 / 25.4, "px": 0.75}
|
|
29
30
|
|
|
31
|
+
_PARAGRAPH_JOIN_RE = re.compile(r"\s*</p>\s*<p>\s*")
|
|
32
|
+
_BREAK_TAG_RE = re.compile(r"<br\s*/?>")
|
|
33
|
+
_PARAGRAPH_TAG_RE = re.compile(r"</?p>")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _singleton_region_plain_text(region: TableGrid) -> str | None:
|
|
37
|
+
"""把无结构的单格区域还原为可降级的纯文本。
|
|
38
|
+
|
|
39
|
+
对齐 Excel 投影的单格降级条件:1x1、无合并跨度、无媒体公式等结构化
|
|
40
|
+
HTML;仅由段落包装与换行组成的单元格才视为普通文本。
|
|
41
|
+
"""
|
|
42
|
+
if len(region.rows) != 1 or region.width != 1 or (0, 0) in region.covered:
|
|
43
|
+
return None
|
|
44
|
+
cell = region.rows[0][0] if region.rows[0] else None
|
|
45
|
+
if cell is None or cell.row_span > 1 or cell.col_span > 1:
|
|
46
|
+
return None
|
|
47
|
+
normalized = _BREAK_TAG_RE.sub("\n", _PARAGRAPH_JOIN_RE.sub("\n", cell.html))
|
|
48
|
+
normalized = _PARAGRAPH_TAG_RE.sub("", normalized)
|
|
49
|
+
if "<" in normalized:
|
|
50
|
+
return None
|
|
51
|
+
plain = html.unescape(normalized).strip()
|
|
52
|
+
return plain or None
|
|
53
|
+
|
|
30
54
|
|
|
31
55
|
@dataclass(frozen=True, slots=True)
|
|
32
56
|
class _OdfContext:
|
|
@@ -319,6 +343,10 @@ def _sheet_blocks(sheet: etree._Element, parser: OdfBlockParser) -> list[dict[st
|
|
|
319
343
|
grid = parse_table_grid(sheet, parser.render_cell_html, expansion_budget=parser.table_expansion_budget)
|
|
320
344
|
blocks: list[dict[str, Any]] = []
|
|
321
345
|
for region in split_table_regions(grid):
|
|
346
|
+
plain_text = _singleton_region_plain_text(region)
|
|
347
|
+
if plain_text is not None:
|
|
348
|
+
blocks.append({"type": BlockType.TEXT, "content": text_spans(plain_text)})
|
|
349
|
+
continue
|
|
322
350
|
content = table_grid_to_html(region)
|
|
323
351
|
if content:
|
|
324
352
|
blocks.append({"type": BlockType.TABLE, "content": content})
|
|
@@ -10,6 +10,12 @@ from dataclasses import dataclass
|
|
|
10
10
|
from lxml import etree # type: ignore[reportMissingImports]
|
|
11
11
|
|
|
12
12
|
from ..limits import MAX_GRID_SLOTS
|
|
13
|
+
from ..spreadsheet.region_discovery import (
|
|
14
|
+
discover_connected_regions,
|
|
15
|
+
keep_maximal_by_semantic_sets,
|
|
16
|
+
region_semantic_positions,
|
|
17
|
+
select_best_gap_candidate,
|
|
18
|
+
)
|
|
13
19
|
from .constants import MAX_EXPANSION_TEXT_BYTES, qname
|
|
14
20
|
from .errors import OdfResourceLimitError
|
|
15
21
|
from .models import GridCell, TableGrid
|
|
@@ -326,37 +332,64 @@ def crop_table_grid(grid: TableGrid, bounds: tuple[int, int, int, int]) -> Table
|
|
|
326
332
|
return trim_table_grid(TableGrid(rows=rows, header_rows=header_rows, covered=covered))
|
|
327
333
|
|
|
328
334
|
|
|
335
|
+
def _grid_cell_at(grid: TableGrid, row: int, col: int) -> GridCell | None:
|
|
336
|
+
"""安全返回网格坐标上的原点单元格,越界或未物化位置返回 None。"""
|
|
337
|
+
cells = grid.rows[row] if 0 <= row < len(grid.rows) else []
|
|
338
|
+
return cells[col] if 0 <= col < len(cells) else None
|
|
339
|
+
|
|
340
|
+
|
|
329
341
|
def split_table_regions(grid: TableGrid) -> list[TableGrid]:
|
|
330
|
-
"""
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
342
|
+
"""洪水填充发现离散数据区域,并按 gap 候选评分选择稳定分割。
|
|
343
|
+
|
|
344
|
+
与 XLS/XLSX 投影器共用区域发现算法:连通性掩码把可见内容、合并跨度和
|
|
345
|
+
covered 占位都视为内容格,BFS 四向连通并在容忍距离内跨越空白;对候选
|
|
346
|
+
tolerance 按惩罚指标选优后,逐区域裁剪出包围盒网格。
|
|
347
|
+
"""
|
|
348
|
+
max_row = len(grid.rows) - 1
|
|
349
|
+
max_col = grid.width - 1
|
|
350
|
+
if max_row < 0 or max_col < 0:
|
|
351
|
+
return []
|
|
352
|
+
|
|
353
|
+
def has_content(row: int, col: int) -> bool:
|
|
354
|
+
"""判断坐标是否有可见内容或属于合并占位(对齐 Excel 投影语义)。"""
|
|
355
|
+
if (row, col) in grid.covered:
|
|
356
|
+
return True
|
|
357
|
+
cell = _grid_cell_at(grid, row, col)
|
|
358
|
+
return cell is not None and (cell.has_content or cell.row_span > 1 or cell.col_span > 1)
|
|
359
|
+
|
|
360
|
+
# 仅从有可见内容的坐标出发,对齐 Excel 投影只以有值格为起点的行为。
|
|
361
|
+
starts = [
|
|
362
|
+
(row, col)
|
|
363
|
+
for row, cells in enumerate(grid.rows)
|
|
364
|
+
for col, cell in enumerate(cells)
|
|
335
365
|
if cell is not None and cell.has_content
|
|
336
366
|
]
|
|
337
|
-
if not
|
|
367
|
+
if not starts:
|
|
338
368
|
return []
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
369
|
+
|
|
370
|
+
def has_semantic_content(row: int, col: int) -> bool:
|
|
371
|
+
"""判断坐标是否包含可见或结构化 HTML 语义。"""
|
|
372
|
+
cell = _grid_cell_at(grid, row, col)
|
|
373
|
+
return cell is not None and cell.has_content
|
|
374
|
+
|
|
375
|
+
def span_at(row: int, col: int) -> tuple[int, int]:
|
|
376
|
+
"""返回原点单元格的合并跨度,非原点或空位返回 1x1。"""
|
|
377
|
+
cell = _grid_cell_at(grid, row, col)
|
|
378
|
+
return (cell.row_span, cell.col_span) if cell is not None else (1, 1)
|
|
379
|
+
|
|
380
|
+
_, _, best_regions = select_best_gap_candidate(
|
|
381
|
+
lambda tolerance: discover_connected_regions(has_content, starts, max_row, max_col, tolerance),
|
|
382
|
+
has_semantic_content,
|
|
383
|
+
span_at,
|
|
384
|
+
)
|
|
385
|
+
semantic_sets = [region_semantic_positions(region, has_semantic_content) for region in best_regions]
|
|
386
|
+
regions: list[TableGrid] = []
|
|
387
|
+
for index in keep_maximal_by_semantic_sets(semantic_sets):
|
|
388
|
+
region = best_regions[index]
|
|
389
|
+
cropped = crop_table_grid(grid, (region.row_start, region.row_end, region.col_start, region.col_end))
|
|
390
|
+
if cropped.rows:
|
|
391
|
+
regions.append(cropped)
|
|
392
|
+
return regions
|
|
360
393
|
|
|
361
394
|
|
|
362
395
|
def _render_html_row(grid: TableGrid, row_index: int, *, header: bool) -> str:
|
{docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/projector.py
RENAMED
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import collections
|
|
6
6
|
import html
|
|
7
|
-
from collections.abc import Iterator
|
|
7
|
+
from collections.abc import Callable, Iterator
|
|
8
8
|
from typing import Any
|
|
9
9
|
|
|
10
10
|
from loguru import logger
|
|
@@ -17,10 +17,12 @@ from ..._shared.hyperlink import OFFICE_EXTERNAL_HYPERLINK_SCHEMES, sanitize_hyp
|
|
|
17
17
|
from .....content.spans import text_spans
|
|
18
18
|
from .html import EQUATION_BOOKENDS, render_spreadsheet_table
|
|
19
19
|
from .models import AnchoredBlock, DataRegion, ExcelCell, ExcelTable, FormulaMap, SheetImage
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
from .region_discovery import (
|
|
21
|
+
ConnectedRegion,
|
|
22
|
+
discover_connected_regions,
|
|
23
|
+
keep_maximal_by_semantic_sets,
|
|
24
|
+
select_best_gap_candidate,
|
|
25
|
+
)
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
class _MergedCellLookup:
|
|
@@ -365,176 +367,50 @@ class SpreadsheetProjector:
|
|
|
365
367
|
|
|
366
368
|
def _filter_semantic_subset_tables(self, tables: list[ExcelTable]) -> list[ExcelTable]:
|
|
367
369
|
"""删除语义坐标严格包含于其它候选的重复表格。"""
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
for table_idx, table in enumerate(tables):
|
|
372
|
-
if any(
|
|
373
|
-
semantic_positions[table_idx] < semantic_positions[other_idx]
|
|
374
|
-
for other_idx in range(len(tables))
|
|
375
|
-
if other_idx != table_idx
|
|
376
|
-
):
|
|
377
|
-
continue
|
|
378
|
-
filtered_tables.append(table)
|
|
379
|
-
|
|
380
|
-
return filtered_tables
|
|
381
|
-
|
|
382
|
-
def _build_table_content_mask(self, excel_table: ExcelTable) -> list[list[bool]]:
|
|
383
|
-
"""构造包含合并跨度的表格语义内容掩码。"""
|
|
384
|
-
mask = [[False for _ in range(excel_table.num_cols)] for _ in range(excel_table.num_rows)]
|
|
385
|
-
for cell in excel_table.data:
|
|
386
|
-
if not self._cell_has_semantic_content(excel_table, cell):
|
|
387
|
-
continue
|
|
388
|
-
for row_idx in range(cell.row, min(cell.row + cell.row_span, excel_table.num_rows)):
|
|
389
|
-
for col_idx in range(cell.col, min(cell.col + cell.col_span, excel_table.num_cols)):
|
|
390
|
-
mask[row_idx][col_idx] = True
|
|
391
|
-
return mask
|
|
370
|
+
semantic_sets = [self._get_table_semantic_positions(table) for table in tables]
|
|
371
|
+
return [tables[index] for index in keep_maximal_by_semantic_sets(semantic_sets)]
|
|
392
372
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
current = 0
|
|
398
|
-
for flag in flags:
|
|
399
|
-
if flag:
|
|
400
|
-
current += 1
|
|
401
|
-
max_count = max(max_count, current)
|
|
402
|
-
else:
|
|
403
|
-
current = 0
|
|
404
|
-
return max_count
|
|
405
|
-
|
|
406
|
-
@staticmethod
|
|
407
|
-
def _is_real_singleton_table(excel_table: ExcelTable) -> bool:
|
|
408
|
-
"""判断候选是否是单格且不可进一步拆分的真实表格。"""
|
|
409
|
-
if excel_table.num_rows != 1 or excel_table.num_cols != 1 or len(excel_table.data) != 1:
|
|
410
|
-
return False
|
|
411
|
-
cell = excel_table.data[0]
|
|
412
|
-
return cell.row_span == 1 and cell.col_span == 1
|
|
413
|
-
|
|
414
|
-
def _summarize_table_for_gap_selection(self, excel_table: ExcelTable) -> dict[str, float | int | bool]:
|
|
415
|
-
"""计算 gap 候选评分使用的单表形态指标。"""
|
|
416
|
-
table_area = excel_table.num_rows * excel_table.num_cols
|
|
417
|
-
content_mask = self._build_table_content_mask(excel_table)
|
|
418
|
-
content_area = sum(sum(1 for flag in row if flag) for row in content_mask)
|
|
419
|
-
blank_ratio = 1.0 - (content_area / max(table_area, 1))
|
|
420
|
-
|
|
421
|
-
interior_blank_rows = [not any(content_mask[row_idx]) for row_idx in range(1, max(excel_table.num_rows - 1, 1))]
|
|
422
|
-
interior_blank_cols = [
|
|
423
|
-
not any(content_mask[row_idx][col_idx] for row_idx in range(excel_table.num_rows))
|
|
424
|
-
for col_idx in range(1, max(excel_table.num_cols - 1, 1))
|
|
425
|
-
]
|
|
426
|
-
if excel_table.num_rows <= 2:
|
|
427
|
-
interior_blank_rows = []
|
|
428
|
-
if excel_table.num_cols <= 2:
|
|
429
|
-
interior_blank_cols = []
|
|
430
|
-
|
|
431
|
-
interior_blank_row_count = sum(interior_blank_rows)
|
|
432
|
-
interior_blank_col_count = sum(interior_blank_cols)
|
|
433
|
-
max_consecutive_interior_blank_lines = max(
|
|
434
|
-
self._count_max_consecutive_true(interior_blank_rows),
|
|
435
|
-
self._count_max_consecutive_true(interior_blank_cols),
|
|
436
|
-
)
|
|
373
|
+
def _sheet_semantic_predicates(
|
|
374
|
+
self, sheet: Worksheet
|
|
375
|
+
) -> tuple[Callable[[int, int], bool], Callable[[int, int], tuple[int, int]]]:
|
|
376
|
+
"""构造 gap 评分使用的语义内容与合并跨度查询。
|
|
437
377
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
"interior_blank_row_count": interior_blank_row_count,
|
|
443
|
-
"interior_blank_col_count": interior_blank_col_count,
|
|
444
|
-
"max_consecutive_interior_blank_lines": max_consecutive_interior_blank_lines,
|
|
445
|
-
"real_singleton": self._is_real_singleton_table(excel_table),
|
|
446
|
-
}
|
|
378
|
+
语义判断与 _build_excel_cell 物化结果保持一致:普通值取非空白文本,
|
|
379
|
+
DISPIMG 公式仅在解析出媒体时算内容,另叠加锚定图片与公式映射。
|
|
380
|
+
"""
|
|
381
|
+
merged_lookup = self._get_merged_cell_lookup(sheet)
|
|
447
382
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
table_area = int(table_summary["table_area"])
|
|
463
|
-
blank_ratio = float(table_summary["blank_ratio"])
|
|
464
|
-
interior_blank_row_count = int(table_summary["interior_blank_row_count"])
|
|
465
|
-
interior_blank_col_count = int(table_summary["interior_blank_col_count"])
|
|
466
|
-
max_consecutive_interior_blank_lines = int(table_summary["max_consecutive_interior_blank_lines"])
|
|
467
|
-
|
|
468
|
-
total_area += table_area
|
|
469
|
-
weighted_blank_numerator += table_area * blank_ratio
|
|
470
|
-
total_interior_blank_lines += interior_blank_row_count + interior_blank_col_count
|
|
471
|
-
total_possible_interior_lines += max(table.num_rows - 2, 0) + max(table.num_cols - 2, 0)
|
|
472
|
-
for row_idx in range(table.anchor[1], table.anchor[1] + table.num_rows):
|
|
473
|
-
row_cover_count[row_idx] += 1
|
|
474
|
-
|
|
475
|
-
if bool(table_summary["real_singleton"]):
|
|
476
|
-
real_singleton_count += 1
|
|
477
|
-
if table_area >= 6 and blank_ratio > 0.35:
|
|
478
|
-
sparse_large_table_count += 1
|
|
479
|
-
if max_consecutive_interior_blank_lines >= 2:
|
|
480
|
-
severe_separator_count += 1
|
|
481
|
-
|
|
482
|
-
occupied_row_count = max(len(row_cover_count), 1)
|
|
483
|
-
row_overlap_excess_ratio = sum(max(0, count - 1) for count in row_cover_count.values()) / occupied_row_count
|
|
383
|
+
def has_semantic_content(row: int, col: int) -> bool:
|
|
384
|
+
"""判断源坐标是否含文本、媒体或公式语义。"""
|
|
385
|
+
cell = sheet._cells.get((row + 1, col + 1))
|
|
386
|
+
if cell is not None and cell.value is not None:
|
|
387
|
+
raw_text = str(cell.value)
|
|
388
|
+
if "DISPIMG" in raw_text:
|
|
389
|
+
resolved_image = self._resolve_cell_image(raw_text)
|
|
390
|
+
if resolved_image and resolved_image.strip():
|
|
391
|
+
return True
|
|
392
|
+
elif raw_text.strip():
|
|
393
|
+
return True
|
|
394
|
+
if any(media.strip() for media in self.table_image_map.get((row, col), [])):
|
|
395
|
+
return True
|
|
396
|
+
return bool(self.math_map.get((row, col)))
|
|
484
397
|
|
|
485
|
-
return
|
|
486
|
-
"real_singleton_ratio": real_singleton_count / max(table_count, 1),
|
|
487
|
-
"weighted_blank_ratio": weighted_blank_numerator / max(total_area, 1),
|
|
488
|
-
"interior_blank_line_ratio": total_interior_blank_lines / max(total_possible_interior_lines, 1),
|
|
489
|
-
"sparse_large_table_ratio": sparse_large_table_count / max(table_count, 1),
|
|
490
|
-
"severe_separator_count": severe_separator_count,
|
|
491
|
-
"row_overlap_excess_ratio": row_overlap_excess_ratio,
|
|
492
|
-
}
|
|
398
|
+
return has_semantic_content, merged_lookup.get_anchor_span
|
|
493
399
|
|
|
494
400
|
def _select_best_gap_candidate(self, sheet: Worksheet) -> tuple[int, float, list[ExcelTable]]:
|
|
495
401
|
"""按固定候选与偏好顺序选择最稳定的 gap tolerance。"""
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
+ 2.5 * float(summary["interior_blank_line_ratio"])
|
|
503
|
-
+ 1.5 * float(summary["sparse_large_table_ratio"])
|
|
504
|
-
+ 1.0 * float(summary["real_singleton_ratio"])
|
|
505
|
-
+ 0.5 * float(summary["weighted_blank_ratio"])
|
|
506
|
-
+ 1.0 * float(summary["row_overlap_excess_ratio"])
|
|
507
|
-
)
|
|
508
|
-
candidates.append(
|
|
509
|
-
{
|
|
510
|
-
"gap_tolerance": gap_tolerance,
|
|
511
|
-
"penalty": penalty,
|
|
512
|
-
"tables": self._filter_semantic_subset_tables(raw_tables),
|
|
513
|
-
**summary,
|
|
514
|
-
}
|
|
515
|
-
)
|
|
516
|
-
|
|
517
|
-
min_penalty = min(float(candidate["penalty"]) for candidate in candidates)
|
|
518
|
-
near_best_candidates = [
|
|
519
|
-
candidate
|
|
520
|
-
for candidate in candidates
|
|
521
|
-
if float(candidate["penalty"]) <= (min_penalty + AUTO_GAP_TOLERANCE_PREFERENCE_MARGIN)
|
|
522
|
-
]
|
|
523
|
-
|
|
524
|
-
best_candidate = min(
|
|
525
|
-
near_best_candidates,
|
|
526
|
-
key=lambda candidate: (
|
|
527
|
-
int(candidate["severe_separator_count"]),
|
|
528
|
-
AUTO_GAP_TOLERANCE_PREFERENCE[int(candidate["gap_tolerance"])],
|
|
529
|
-
float(candidate["interior_blank_line_ratio"]),
|
|
530
|
-
float(candidate["penalty"]),
|
|
531
|
-
),
|
|
402
|
+
bounds: DataRegion = self._find_true_data_bounds(sheet)
|
|
403
|
+
has_semantic_content, span_at = self._sheet_semantic_predicates(sheet)
|
|
404
|
+
gap_tolerance, penalty, best_regions = select_best_gap_candidate(
|
|
405
|
+
lambda tolerance: self._discover_sheet_regions(sheet, bounds, tolerance),
|
|
406
|
+
has_semantic_content,
|
|
407
|
+
span_at,
|
|
532
408
|
)
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
best_candidate["tables"],
|
|
409
|
+
merged_lookup = self._get_merged_cell_lookup(sheet)
|
|
410
|
+
tables = self._filter_semantic_subset_tables(
|
|
411
|
+
[self._materialize_region(sheet, region, merged_lookup) for region in best_regions]
|
|
537
412
|
)
|
|
413
|
+
return gap_tolerance, penalty, tables
|
|
538
414
|
|
|
539
415
|
def _select_best_tables(self, sheet: Worksheet) -> list[ExcelTable]:
|
|
540
416
|
"""选择并记录当前工作表的最佳表格候选集合。"""
|
|
@@ -585,28 +461,77 @@ class SpreadsheetProjector:
|
|
|
585
461
|
def _find_data_tables_with_gap_raw(self, sheet: Worksheet, gap_tolerance: int) -> list[ExcelTable]:
|
|
586
462
|
"""在固定 gap_tolerance 下查找工作表中的所有数据表格。"""
|
|
587
463
|
bounds: DataRegion = self._find_true_data_bounds(sheet) # 获取真实数据边界
|
|
588
|
-
|
|
589
|
-
|
|
464
|
+
merged_lookup = self._get_merged_cell_lookup(sheet)
|
|
465
|
+
return [
|
|
466
|
+
self._materialize_region(sheet, region, merged_lookup)
|
|
467
|
+
for region in self._discover_sheet_regions(sheet, bounds, gap_tolerance)
|
|
468
|
+
]
|
|
469
|
+
|
|
470
|
+
def _discover_sheet_regions(
|
|
471
|
+
self,
|
|
472
|
+
sheet: Worksheet,
|
|
473
|
+
bounds: DataRegion,
|
|
474
|
+
gap_tolerance: int,
|
|
475
|
+
) -> list[ConnectedRegion]:
|
|
476
|
+
"""对当前工作表按 gap_tolerance 洪水填充发现连通数据区域。"""
|
|
477
|
+
merged_lookup = self._get_merged_cell_lookup(sheet)
|
|
478
|
+
max_row, max_col = bounds.max_row - 1, bounds.max_col - 1
|
|
479
|
+
|
|
480
|
+
def has_content(row: int, col: int) -> bool:
|
|
481
|
+
"""检查指定单元格(0-based索引)是否有内容(有值或属于合并区域)。"""
|
|
482
|
+
cell = sheet._cells.get((row + 1, col + 1))
|
|
483
|
+
if cell is not None and cell.value is not None:
|
|
484
|
+
return True
|
|
485
|
+
return merged_lookup.contains_merged_cell(row, col)
|
|
590
486
|
|
|
591
487
|
# 仅遍历已存在且有值的单元格,避免 iter_rows 在稀疏大表上创建大量空单元格。
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
488
|
+
return discover_connected_regions(
|
|
489
|
+
has_content,
|
|
490
|
+
self._get_non_empty_cell_positions(sheet, bounds),
|
|
491
|
+
max_row,
|
|
492
|
+
max_col,
|
|
493
|
+
gap_tolerance,
|
|
494
|
+
)
|
|
596
495
|
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
gap_tolerance,
|
|
605
|
-
)
|
|
606
|
-
visited.update(visited_cells) # 将已访问单元格加入全局记录
|
|
607
|
-
tables.append(table_bounds)
|
|
496
|
+
def _materialize_region(
|
|
497
|
+
self,
|
|
498
|
+
sheet: Worksheet,
|
|
499
|
+
region: ConnectedRegion,
|
|
500
|
+
merged_lookup: _MergedCellLookup,
|
|
501
|
+
) -> ExcelTable:
|
|
502
|
+
"""把连通区域包围盒物化为紧凑的表格 IR,正确处理合并单元格。
|
|
608
503
|
|
|
609
|
-
|
|
504
|
+
遍历发现区域的边界框(bbox 内部的空格作为空单元格保留,维持矩形布局),
|
|
505
|
+
跳过被合并单元格遮蔽的坐标并把跨度挂到合并锚点上。
|
|
506
|
+
"""
|
|
507
|
+
data: list[ExcelCell] = []
|
|
508
|
+
for source_row in range(region.row_start, region.row_end + 1):
|
|
509
|
+
for source_col in range(region.col_start, region.col_end + 1):
|
|
510
|
+
# 跳过被合并单元格遮蔽的单元格(非左上角)。
|
|
511
|
+
if merged_lookup.is_hidden_merged_cell(source_row, source_col):
|
|
512
|
+
continue
|
|
513
|
+
|
|
514
|
+
# 计算合并跨度(默认为 1x1)。
|
|
515
|
+
row_span, col_span = merged_lookup.get_anchor_span(source_row, source_col)
|
|
516
|
+
|
|
517
|
+
data.append(
|
|
518
|
+
self._build_excel_cell(
|
|
519
|
+
sheet,
|
|
520
|
+
source_row - region.row_start,
|
|
521
|
+
source_col - region.col_start,
|
|
522
|
+
source_row,
|
|
523
|
+
source_col,
|
|
524
|
+
row_span=row_span,
|
|
525
|
+
col_span=col_span,
|
|
526
|
+
)
|
|
527
|
+
)
|
|
528
|
+
|
|
529
|
+
return ExcelTable(
|
|
530
|
+
anchor=(region.col_start, region.row_start),
|
|
531
|
+
num_rows=region.num_rows,
|
|
532
|
+
num_cols=region.num_cols,
|
|
533
|
+
data=data,
|
|
534
|
+
)
|
|
610
535
|
|
|
611
536
|
def _get_non_empty_cell_positions(
|
|
612
537
|
self,
|
|
@@ -661,139 +586,6 @@ class SpreadsheetProjector:
|
|
|
661
586
|
|
|
662
587
|
return DataRegion(min_row, max_row, min_col, max_col)
|
|
663
588
|
|
|
664
|
-
def _find_table_bounds(
|
|
665
|
-
self,
|
|
666
|
-
sheet: Worksheet,
|
|
667
|
-
start_row: int,
|
|
668
|
-
start_col: int,
|
|
669
|
-
max_row: int,
|
|
670
|
-
max_col: int,
|
|
671
|
-
gap_tolerance: int,
|
|
672
|
-
) -> tuple[ExcelTable, set[tuple[int, int]]]:
|
|
673
|
-
"""使用洪水填充(BFS)策略确定表格边界。
|
|
674
|
-
|
|
675
|
-
该方法通过广度优先搜索(BFS)算法识别 Excel 工作表中连续的非空单元格区域,
|
|
676
|
-
能够准确检测非矩形表格(如 L 形、错位列等),并支持通过间隔容忍度
|
|
677
|
-
连接相邻但不直接相连的单元格。
|
|
678
|
-
|
|
679
|
-
算法分两个阶段执行:
|
|
680
|
-
1. 洪水填充阶段:使用 BFS 从给定位置出发,找出所有相连的单元格。
|
|
681
|
-
2. 数据提取阶段:构建矩形边界框并提取单元格数据,正确处理合并单元格。
|
|
682
|
-
|
|
683
|
-
参数:
|
|
684
|
-
sheet: 待分析的 Excel 工作表。
|
|
685
|
-
start_row: 洪水填充起始行索引(从0开始)。
|
|
686
|
-
start_col: 洪水填充起始列索引(从0开始)。
|
|
687
|
-
max_row: 工作表中可考虑的最大行索引(从0开始)。
|
|
688
|
-
max_col: 工作表中可考虑的最大列索引(从0开始)。
|
|
689
|
-
gap_tolerance: 允许跨越空白单元格查找邻居的最大间隔。
|
|
690
|
-
|
|
691
|
-
返回:
|
|
692
|
-
一个元组,包含:
|
|
693
|
-
- ExcelTable:表示检测到的表格对象,含锚点位置、尺寸和单元格数据。
|
|
694
|
-
- set[tuple[int, int]]:洪水填充期间访问的所有 (行, 列) 元组集合,
|
|
695
|
-
用于防止重复扫描。
|
|
696
|
-
|
|
697
|
-
说明:
|
|
698
|
-
该方法遵循 GAP_TOLERANCE 选项,允许在容忍距离内将被空单元格隔开的
|
|
699
|
-
单元格视为同一表格的一部分。
|
|
700
|
-
"""
|
|
701
|
-
|
|
702
|
-
# BFS 队列,存储待处理的 (行, 列) 坐标
|
|
703
|
-
queue = collections.deque([(start_row, start_col)])
|
|
704
|
-
|
|
705
|
-
# 记录当前表格内已访问的单元格(避免重复加入队列)
|
|
706
|
-
# 调用方维护全局 visited 集合,防止重复启动新表格
|
|
707
|
-
table_cells: set[tuple[int, int]] = set()
|
|
708
|
-
table_cells.add((start_row, start_col))
|
|
709
|
-
|
|
710
|
-
# 动态记录当前表格的行列边界
|
|
711
|
-
min_r, max_r = start_row, start_row
|
|
712
|
-
min_c, max_c = start_col, start_col
|
|
713
|
-
merged_lookup = self._get_merged_cell_lookup(sheet)
|
|
714
|
-
|
|
715
|
-
def has_content(r: int, c: int) -> bool:
|
|
716
|
-
"""检查指定单元格(0-based索引)是否有内容(有值或属于合并区域)。"""
|
|
717
|
-
if r < 0 or c < 0 or r > max_row or c > max_col:
|
|
718
|
-
return False
|
|
719
|
-
|
|
720
|
-
# 1. 检查单元格直接值
|
|
721
|
-
cell = sheet._cells.get((r + 1, c + 1))
|
|
722
|
-
if cell is not None and cell.value is not None:
|
|
723
|
-
return True
|
|
724
|
-
|
|
725
|
-
# 2. 检查是否属于某个合并单元格区域
|
|
726
|
-
return merged_lookup.contains_merged_cell(r, c)
|
|
727
|
-
|
|
728
|
-
# --- 第一阶段:洪水填充(连通性检测)---
|
|
729
|
-
while queue:
|
|
730
|
-
curr_r, curr_c = queue.popleft()
|
|
731
|
-
|
|
732
|
-
# 动态更新表格边界
|
|
733
|
-
min_r = min(min_r, curr_r)
|
|
734
|
-
max_r = max(max_r, curr_r)
|
|
735
|
-
min_c = min(min_c, curr_c)
|
|
736
|
-
max_c = max(max_c, curr_c)
|
|
737
|
-
|
|
738
|
-
# 四个方向(上、下、左、右)的邻居检测
|
|
739
|
-
directions = [
|
|
740
|
-
(0, 1), # 右
|
|
741
|
-
(0, -1), # 左
|
|
742
|
-
(1, 0), # 下
|
|
743
|
-
(-1, 0), # 上
|
|
744
|
-
]
|
|
745
|
-
|
|
746
|
-
for dr, dc in directions:
|
|
747
|
-
# 在容忍距离范围内逐步检查邻居(优先检查最近的)
|
|
748
|
-
for step in range(1, gap_tolerance + 2):
|
|
749
|
-
nr, nc = curr_r + (dr * step), curr_c + (dc * step)
|
|
750
|
-
|
|
751
|
-
if (nr, nc) in table_cells:
|
|
752
|
-
break # 已属于当前表格,不跨越继续查找
|
|
753
|
-
|
|
754
|
-
if has_content(nr, nc):
|
|
755
|
-
table_cells.add((nr, nc))
|
|
756
|
-
queue.append((nr, nc))
|
|
757
|
-
# 在该方向找到连接点,停止扩展间隔
|
|
758
|
-
break
|
|
759
|
-
|
|
760
|
-
# --- 第二阶段:数据提取(语义网格构建)---
|
|
761
|
-
data = []
|
|
762
|
-
|
|
763
|
-
# 遍历发现区域的边界框(bbox内部的空格作为空单元格保留,维持矩形布局)
|
|
764
|
-
for ri in range(min_r, max_r + 1):
|
|
765
|
-
for rj in range(min_c, max_c + 1):
|
|
766
|
-
# 跳过被合并单元格遮蔽的单元格(非左上角)
|
|
767
|
-
if merged_lookup.is_hidden_merged_cell(ri, rj):
|
|
768
|
-
continue
|
|
769
|
-
|
|
770
|
-
# 计算合并跨度(默认为 1x1)
|
|
771
|
-
row_span, col_span = merged_lookup.get_anchor_span(ri, rj)
|
|
772
|
-
|
|
773
|
-
data.append(
|
|
774
|
-
self._build_excel_cell(
|
|
775
|
-
sheet,
|
|
776
|
-
ri - min_r, # 相对于表格起始行的偏移
|
|
777
|
-
rj - min_c, # 相对于表格起始列的偏移
|
|
778
|
-
ri,
|
|
779
|
-
rj,
|
|
780
|
-
row_span=row_span,
|
|
781
|
-
col_span=col_span,
|
|
782
|
-
)
|
|
783
|
-
)
|
|
784
|
-
|
|
785
|
-
# 返回给调用方的 visited_cells 严格为包含数据/合并的单元格,
|
|
786
|
-
# 使主循环不会重复扫描已处理的单元格。
|
|
787
|
-
return (
|
|
788
|
-
ExcelTable(
|
|
789
|
-
anchor=(min_c, min_r),
|
|
790
|
-
num_rows=max_r + 1 - min_r,
|
|
791
|
-
num_cols=max_c + 1 - min_c,
|
|
792
|
-
data=data,
|
|
793
|
-
),
|
|
794
|
-
table_cells,
|
|
795
|
-
)
|
|
796
|
-
|
|
797
589
|
def _get_merged_cell_lookup(self, sheet: Worksheet) -> _MergedCellLookup:
|
|
798
590
|
"""获取工作表合并单元格缓存,同一轮转换内每个 sheet 只构建一次。"""
|
|
799
591
|
cache_key = id(sheet)
|