docvortex 0.4.16__tar.gz → 0.4.18__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.16/src/docvortex.egg-info → docvortex-0.4.18}/PKG-INFO +1 -1
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +5 -4
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/line_layout.py +54 -67
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/html/renderer.py +5 -5
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/version.py +1 -1
- {docvortex-0.4.16 → docvortex-0.4.18/src/docvortex.egg-info}/PKG-INFO +1 -1
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex.egg-info/SOURCES.txt +1 -0
- docvortex-0.4.18/tests/unittest/test_flash_pdf_short_tails.py +184 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_spreadsheet_projector.py +70 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/LICENSE.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/MANIFEST.in +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/README.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/README.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/demo.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/METADATA.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/USAGE.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/flash-manual-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/flash-round2-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/flash-rule-generalization-2026-09-15.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/flash-title-coverage-2026-09-16.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/docs/sdk-0.4.md +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/pyproject.toml +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/setup.cfg +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/spreadsheet/region_discovery.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/api.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/_document.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/text/dedup.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/_svg_raster.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/options.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/result.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_manual_annotations.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_manual_review_decisions.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_reviewed_history.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_round2_annotations.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_round2_review_decisions.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_round3_annotations.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_round3_review_decisions.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/pdf_char_dedup.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_architecture.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_cli_logging.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_document_metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_history_geometry_tools.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_cpu_evidence.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_release_ci_gate.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_manual_annotations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_round2_annotations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_round3_annotations.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_rule_generalization.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_flash_spatial_evidence.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_object_clipping.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_text_dedup.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_svg_raster.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tools/__init__.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tools/build_html_css.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.16 → docvortex-0.4.18}/tools/font_geometry.py +0 -0
{docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/office/spreadsheet/projector.py
RENAMED
|
@@ -708,10 +708,11 @@ class SpreadsheetProjector:
|
|
|
708
708
|
if cell.alignment.vertical:
|
|
709
709
|
style["vertical-align"] = cell.alignment.vertical
|
|
710
710
|
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
711
|
+
# 渐变填充没有 patternType;只提取既有纯色背景,其他填充仍保留内容及其余样式。
|
|
712
|
+
fill = cell.fill
|
|
713
|
+
if getattr(fill, "patternType", None) == "solid" and fill.fgColor:
|
|
714
|
+
color = fill.fgColor.rgb
|
|
715
|
+
if hasattr(fill.fgColor, "type") and fill.fgColor.type == "rgb" and color:
|
|
715
716
|
if isinstance(color, str) and len(color) == 8:
|
|
716
717
|
style["background-color"] = "#" + color[2:]
|
|
717
718
|
return style
|
|
@@ -679,78 +679,65 @@ def _reattach_span_lane_continuations(
|
|
|
679
679
|
span_lane.lines.sort(key=lambda item: (item[1][1], item[1][0], item[0].source_index))
|
|
680
680
|
|
|
681
681
|
|
|
682
|
+
def _lane_accepts_short_tail(
|
|
683
|
+
candidate: tuple[_LineItem, BBox],
|
|
684
|
+
lane: _TextLane,
|
|
685
|
+
median_height: float,
|
|
686
|
+
) -> bool:
|
|
687
|
+
"""用同一组前序行证据判断当前栏或其他栏是否能够接纳正文短尾。"""
|
|
688
|
+
|
|
689
|
+
candidate_line, candidate_bbox = candidate
|
|
690
|
+
preceding = [
|
|
691
|
+
item for item in lane.lines if item[0].semantic_type == candidate_line.semantic_type and item[1][1] < candidate_bbox[1]
|
|
692
|
+
]
|
|
693
|
+
if not preceding:
|
|
694
|
+
return False
|
|
695
|
+
# 同位置前序行按栏内稳定排序取 source_index 较小者,避免后续插入触发排序后改变已用证据。
|
|
696
|
+
previous = max(preceding, key=lambda item: (item[1][1], item[1][0], -item[0].source_index))
|
|
697
|
+
previous_line, previous_bbox = previous
|
|
698
|
+
pair_height = max(
|
|
699
|
+
_line_effective_height(*previous),
|
|
700
|
+
_line_effective_height(*candidate),
|
|
701
|
+
median_height,
|
|
702
|
+
)
|
|
703
|
+
lane_width = max(0.1, lane.right - lane.left)
|
|
704
|
+
if (
|
|
705
|
+
previous_bbox[2] - previous_bbox[0] < 0.65 * lane_width
|
|
706
|
+
or candidate_bbox[2] - candidate_bbox[0] > 0.85 * lane_width
|
|
707
|
+
or candidate_bbox[0] < lane.left - 0.75 * pair_height
|
|
708
|
+
or candidate_bbox[2] > lane.right + 0.75 * pair_height
|
|
709
|
+
or abs(candidate_bbox[0] - previous_bbox[0]) > 0.75 * pair_height
|
|
710
|
+
or not _title_fonts_compatible(previous_line, candidate_line)
|
|
711
|
+
):
|
|
712
|
+
return False
|
|
713
|
+
gap = _effective_body_text_row_gap(previous, candidate)
|
|
714
|
+
if not -0.25 * pair_height <= gap <= 0.9 * pair_height:
|
|
715
|
+
return False
|
|
716
|
+
if (
|
|
717
|
+
previous_line.visual_row_id is not None
|
|
718
|
+
and candidate_line.visual_row_id is not None
|
|
719
|
+
and not 0 < candidate_line.visual_row_id - previous_line.visual_row_id <= 2
|
|
720
|
+
):
|
|
721
|
+
return False
|
|
722
|
+
return True
|
|
723
|
+
|
|
724
|
+
|
|
682
725
|
def _reattach_cross_lane_short_tails(
|
|
683
726
|
lanes: list[_TextLane],
|
|
684
727
|
median_height: float,
|
|
685
728
|
) -> None:
|
|
686
|
-
"""
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
] = []
|
|
697
|
-
for source_lane in lanes:
|
|
698
|
-
for candidate in source_lane.lines:
|
|
699
|
-
candidate_line, candidate_bbox = candidate
|
|
700
|
-
if candidate_line.semantic_type is not None:
|
|
701
|
-
continue
|
|
702
|
-
matches: list[tuple[float, _TextLane]] = []
|
|
703
|
-
for target_lane in lanes:
|
|
704
|
-
if target_lane is source_lane or not target_lane.lines:
|
|
705
|
-
continue
|
|
706
|
-
preceding = [
|
|
707
|
-
item
|
|
708
|
-
for item in target_lane.lines
|
|
709
|
-
if item[0].semantic_type == candidate_line.semantic_type and item[1][1] < candidate_bbox[1]
|
|
710
|
-
]
|
|
711
|
-
if not preceding:
|
|
712
|
-
continue
|
|
713
|
-
previous = max(
|
|
714
|
-
preceding,
|
|
715
|
-
key=lambda item: (item[1][1], item[1][0]),
|
|
716
|
-
)
|
|
717
|
-
previous_line, previous_bbox = previous
|
|
718
|
-
pair_height = max(
|
|
719
|
-
_line_effective_height(*previous),
|
|
720
|
-
_line_effective_height(*candidate),
|
|
721
|
-
median_height,
|
|
722
|
-
)
|
|
723
|
-
lane_width = max(0.1, target_lane.right - target_lane.left)
|
|
724
|
-
if (
|
|
725
|
-
previous_bbox[2] - previous_bbox[0] < 0.65 * lane_width
|
|
726
|
-
or candidate_bbox[2] - candidate_bbox[0] > 0.85 * lane_width
|
|
727
|
-
or candidate_bbox[0] < target_lane.left - 0.75 * pair_height
|
|
728
|
-
or candidate_bbox[2] > target_lane.right + 0.75 * pair_height
|
|
729
|
-
or abs(candidate_bbox[0] - previous_bbox[0]) > 0.75 * pair_height
|
|
730
|
-
or not _title_fonts_compatible(previous_line, candidate_line)
|
|
731
|
-
):
|
|
732
|
-
continue
|
|
733
|
-
gap = _effective_body_text_row_gap(previous, candidate)
|
|
734
|
-
if not -0.25 * pair_height <= gap <= 0.9 * pair_height:
|
|
735
|
-
continue
|
|
736
|
-
if (
|
|
737
|
-
previous_line.visual_row_id is not None
|
|
738
|
-
and candidate_line.visual_row_id is not None
|
|
739
|
-
and not 0 < candidate_line.visual_row_id - previous_line.visual_row_id <= 2
|
|
740
|
-
):
|
|
741
|
-
continue
|
|
742
|
-
matches.append((max(0.0, gap), target_lane))
|
|
743
|
-
if len(matches) == 1:
|
|
744
|
-
gap, target_lane = matches[0]
|
|
745
|
-
moves.append((candidate_bbox[1] + gap, source_lane, target_lane, candidate))
|
|
746
|
-
if not moves:
|
|
747
|
-
return
|
|
748
|
-
_score, source_lane, target_lane, candidate = min(
|
|
749
|
-
moves,
|
|
750
|
-
key=lambda item: item[0],
|
|
751
|
-
)
|
|
752
|
-
if candidate not in source_lane.lines:
|
|
729
|
+
"""按前序依赖顺序,把具有唯一栏归属的正文短尾迁回对应栏。"""
|
|
730
|
+
|
|
731
|
+
# 栏边界固定,且匹配只依赖 y0 严格更小的行;先确定上方行后,每行至多迁移一次。
|
|
732
|
+
# 保留原始对象及其来源栏,不能用 source_index 合并或跳过不同的文本行。
|
|
733
|
+
pending = [(lane, candidate) for lane in lanes for candidate in lane.lines if candidate[0].semantic_type is None]
|
|
734
|
+
pending.sort(key=lambda item: (item[1][1][1], item[1][1][0], item[1][0].source_index))
|
|
735
|
+
for source_lane, candidate in pending:
|
|
736
|
+
# 当前栏也必须参与唯一性判断;多个栏均能接纳时保留原位,避免双向迁移。
|
|
737
|
+
matches = [lane for lane in lanes if _lane_accepts_short_tail(candidate, lane, median_height)]
|
|
738
|
+
if len(matches) != 1 or matches[0] is source_lane:
|
|
753
739
|
continue
|
|
740
|
+
target_lane = matches[0]
|
|
754
741
|
source_lane.lines.remove(candidate)
|
|
755
742
|
target_lane.lines.append(candidate)
|
|
756
743
|
target_lane.lines.sort(
|
|
@@ -70,14 +70,14 @@ from ....schema import (
|
|
|
70
70
|
)
|
|
71
71
|
|
|
72
72
|
_STYLE_RESOURCE_NAME = "docvortex.min.css"
|
|
73
|
-
_MATHJAX_URL = "https://
|
|
73
|
+
_MATHJAX_URL = "https://gcore.jsdelivr.net/npm/mathjax@4.1.2/tex-chtml.js"
|
|
74
74
|
_MATHJAX_INTEGRITY = "sha384-zAhQQhdaMeHsMProNntGGg6nOUVcfuF9F22C3d1qJ9NZAVzCplXk1X85D2O5iufn"
|
|
75
|
-
_PRISM_CORE_URL = "https://
|
|
75
|
+
_PRISM_CORE_URL = "https://gcore.jsdelivr.net/npm/prismjs@1.30.0/components/prism-core.min.js"
|
|
76
76
|
_PRISM_CORE_INTEGRITY = "sha384-zLRFO4dwowZvh8kzutOb5AWhH7f39HeJp+N7PtHF1SQtTBnifRx0AtmvTYs3F4YV"
|
|
77
|
-
_PRISM_AUTOLOADER_URL = "https://
|
|
77
|
+
_PRISM_AUTOLOADER_URL = "https://gcore.jsdelivr.net/npm/prismjs@1.30.0/plugins/autoloader/prism-autoloader.min.js"
|
|
78
78
|
_PRISM_AUTOLOADER_INTEGRITY = "sha384-Uq05+JLko69eOiPr39ta9bh7kld5PKZoU+fF7g0EXTAriEollhZ+DrN8Q/Oi8J2Q"
|
|
79
|
-
_PRISM_LANGUAGES_PATH = "https://
|
|
80
|
-
_MERMAID_URL = "https://
|
|
79
|
+
_PRISM_LANGUAGES_PATH = "https://gcore.jsdelivr.net/npm/prismjs@1.30.0/components/"
|
|
80
|
+
_MERMAID_URL = "https://gcore.jsdelivr.net/npm/mermaid@11.16.1/dist/mermaid.min.js"
|
|
81
81
|
_MERMAID_INTEGRITY = "sha384-aBQXj4hK6Jm05i7aQAsUV3bLdSUrHX1BGYfMB0166TtWt/RRaw+h0Eelme9OCOvy"
|
|
82
82
|
_MERMAID_MAX_TEXT_SIZE = 50_000
|
|
83
83
|
_MERMAID_FLOWCHART_HEADER_RE = re.compile(
|
|
@@ -567,6 +567,7 @@ tests/unittest/test_flash_pdf_reviewed_history.py
|
|
|
567
567
|
tests/unittest/test_flash_pdf_samples.py
|
|
568
568
|
tests/unittest/test_flash_pdf_scripts.py
|
|
569
569
|
tests/unittest/test_flash_pdf_semantics.py
|
|
570
|
+
tests/unittest/test_flash_pdf_short_tails.py
|
|
570
571
|
tests/unittest/test_flash_pdf_tables.py
|
|
571
572
|
tests/unittest/test_flash_pdf_text_blocks.py
|
|
572
573
|
tests/unittest/test_flash_pdf_text_visibility.py
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"""覆盖短尾迁移的终止性、唯一归属及前序依赖;死循环反例在可回收子进程内运行。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import subprocess
|
|
6
|
+
import sys
|
|
7
|
+
from collections import Counter
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
from docvortex.analyzers.native.pdf.line_layout import _infer_text_lanes, _reattach_cross_lane_short_tails
|
|
13
|
+
from docvortex.analyzers.native.pdf.models import _LineItem, _TextLane
|
|
14
|
+
from docvortex.schema import BBox
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _line(text: str, bbox: BBox, index: int) -> tuple[_LineItem, BBox]:
|
|
18
|
+
"""构造具有明确有效行高的文本行及局部几何。"""
|
|
19
|
+
return _LineItem(text=text, bbox=bbox, angle=0, source_index=index, effective_height=10.0), bbox
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _ambiguous_lanes(offset: float = 0.0, tails: int = 1) -> list[_TextLane]:
|
|
23
|
+
"""构造两栏均可接纳的短尾组,并用横向偏移隔离不同组。"""
|
|
24
|
+
first = _TextLane(left=offset, right=offset + 200.0)
|
|
25
|
+
second = _TextLane(left=offset, right=offset + 200.0)
|
|
26
|
+
first.lines.append(_line("first predecessor", (offset + 10, 100, offset + 150, 110), 0))
|
|
27
|
+
second.lines.append(_line("second predecessor", (offset + 10, 100, offset + 150, 110), 1))
|
|
28
|
+
for index in range(tails):
|
|
29
|
+
first.lines.append(_line(f"tail {index}", (offset + 15, 118, offset + 140, 128), index + 2))
|
|
30
|
+
return [first, second]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _membership(lanes: list[_TextLane]) -> tuple[tuple[int, ...], ...]:
|
|
34
|
+
"""按对象身份记录栏内顺序,避免重复文本或 source_index 掩盖丢行。"""
|
|
35
|
+
return tuple(tuple(id(line) for line, _bbox in lane.lines) for lane in lanes)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _run_and_check_stability(lanes: list[_TextLane]) -> None:
|
|
39
|
+
"""验证迁移不丢行、不重复、不改边界,且再次执行保持同一结果。"""
|
|
40
|
+
before = Counter(id(line) for lane in lanes for line, _bbox in lane.lines)
|
|
41
|
+
bounds = [(lane.left, lane.right, lane.is_span) for lane in lanes]
|
|
42
|
+
_reattach_cross_lane_short_tails(lanes, 10.0)
|
|
43
|
+
assert Counter(id(line) for lane in lanes for line, _bbox in lane.lines) == before
|
|
44
|
+
assert [(lane.left, lane.right, lane.is_span) for lane in lanes] == bounds
|
|
45
|
+
settled = _membership(lanes)
|
|
46
|
+
_reattach_cross_lane_short_tails(lanes, 10.0)
|
|
47
|
+
assert _membership(lanes) == settled
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _case_ambiguous_current_lane() -> None:
|
|
51
|
+
"""验证当前栏与其他栏同时匹配时保留原位,不发生往返振荡。"""
|
|
52
|
+
lanes = _ambiguous_lanes()
|
|
53
|
+
original = _membership(lanes)
|
|
54
|
+
_run_and_check_stability(lanes)
|
|
55
|
+
assert _membership(lanes) == original
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _case_independent_groups_and_valid_tail() -> None:
|
|
59
|
+
"""验证多个独立歧义组不会耗尽轮数或阻止稍后的合法短尾迁回。"""
|
|
60
|
+
lanes = _ambiguous_lanes(tails=8) + _ambiguous_lanes(offset=400.0, tails=8)
|
|
61
|
+
original = _membership(lanes)
|
|
62
|
+
destination = _TextLane(left=810.0, right=1000.0)
|
|
63
|
+
previous = _line("late predecessor", (815, 200, 965, 210), 0)
|
|
64
|
+
tail = _line("late valid tail", (815, 218, 965, 228), 1)
|
|
65
|
+
destination.lines.append(previous)
|
|
66
|
+
lanes[0].lines.append(tail)
|
|
67
|
+
lanes.append(destination)
|
|
68
|
+
_run_and_check_stability(lanes)
|
|
69
|
+
assert _membership(lanes[:-1]) == original
|
|
70
|
+
assert destination.lines == [previous, tail]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _case_inferred_body_and_span_lanes() -> None:
|
|
74
|
+
"""验证正常栏推断生成的正文栏和跨栏栏带不会互相争抢短尾。"""
|
|
75
|
+
geometry = [_line("wide predecessor", (0, 100, 300, 110), 0)]
|
|
76
|
+
for y in (103.0, 140.0, 160.0):
|
|
77
|
+
for x in (0.0, 160.0):
|
|
78
|
+
geometry.append(_line(f"column {x} {y}", (x, y, x + 140, y + 10), len(geometry)))
|
|
79
|
+
tail = _line("tail", (0, 118, 100, 128), len(geometry))
|
|
80
|
+
geometry.append(tail)
|
|
81
|
+
lanes = _infer_text_lanes(geometry, 300.0, 10.0)
|
|
82
|
+
assert len(lanes) == 3
|
|
83
|
+
assert any(lane.is_span for lane in lanes)
|
|
84
|
+
assert tail in lanes[0].lines
|
|
85
|
+
_run_and_check_stability(lanes)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _case_chained_tails() -> None:
|
|
89
|
+
"""验证逆序输入的连续短尾依次迁回,重复 source_index 不会漏掉后续行。"""
|
|
90
|
+
previous = _line("predecessor", (10, 100, 150, 110), 0)
|
|
91
|
+
first = _line("first tail", (10, 118, 150, 128), 1)
|
|
92
|
+
second = _line("second tail", (10, 136, 130, 146), 1)
|
|
93
|
+
source = _TextLane(left=210, right=400, lines=[second, first])
|
|
94
|
+
target = _TextLane(left=0, right=200, lines=[previous])
|
|
95
|
+
_run_and_check_stability([source, target])
|
|
96
|
+
assert source.lines == []
|
|
97
|
+
assert target.lines == [previous, first, second]
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _case_predecessor_changes_membership() -> None:
|
|
101
|
+
"""验证先迁移上方行后再判断短尾,不能用最初的栏状态一次性计算所有目标。"""
|
|
102
|
+
anchor = _line("anchor", (0, 100, 200, 110), 0)
|
|
103
|
+
first = _line("first tail", (0, 118, 140, 128), 1)
|
|
104
|
+
second = _line("second tail", (0, 136, 100, 146), 2)
|
|
105
|
+
source = _TextLane(left=0, right=300, lines=[second, first])
|
|
106
|
+
target = _TextLane(left=0, right=200, lines=[anchor])
|
|
107
|
+
_run_and_check_stability([source, target])
|
|
108
|
+
assert source.lines == []
|
|
109
|
+
assert target.lines == [anchor, first, second]
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _case_equal_height_peers() -> None:
|
|
113
|
+
"""验证同高度的先处理行不会成为另一个同行片段的前序证据。"""
|
|
114
|
+
anchor = _line("anchor", (10, 100, 150, 110), 0)
|
|
115
|
+
first = _line("first peer", (10, 118, 150, 128), 1)
|
|
116
|
+
second = _line("second peer", (10, 118, 130, 128), 2)
|
|
117
|
+
first[0].visual_row_id = 2
|
|
118
|
+
second[0].visual_row_id = 2
|
|
119
|
+
anchor[0].visual_row_id = 1
|
|
120
|
+
source = _TextLane(left=210, right=400, lines=[second, first])
|
|
121
|
+
target = _TextLane(left=0, right=200, lines=[anchor])
|
|
122
|
+
_run_and_check_stability([source, target])
|
|
123
|
+
assert source.lines == []
|
|
124
|
+
assert target.lines == [anchor, first, second]
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _case_non_unique_or_missing_target() -> None:
|
|
128
|
+
"""验证两个其他栏匹配、没有匹配和非正文行均保持原位。"""
|
|
129
|
+
targets = _ambiguous_lanes(tails=0)
|
|
130
|
+
ambiguous = _line("two targets", (15, 118, 140, 128), 2)
|
|
131
|
+
missing = _line("no target", (415, 118, 540, 128), 3)
|
|
132
|
+
title = _line("title", (15, 118, 140, 128), 4)
|
|
133
|
+
title[0].semantic_type = "paragraph_title"
|
|
134
|
+
source = _TextLane(left=600, right=800, lines=[ambiguous, missing, title])
|
|
135
|
+
lanes = [source, *targets]
|
|
136
|
+
original = _membership(lanes)
|
|
137
|
+
_run_and_check_stability(lanes)
|
|
138
|
+
assert _membership(lanes) == original
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _case_same_position_predecessors() -> None:
|
|
142
|
+
"""验证同坐标前序行的平局选择不随迁入后排序改变,首次调用即得到稳定归属。"""
|
|
143
|
+
first_anchor = _line("A anchor", (10, 100, 150, 110), 1)
|
|
144
|
+
second_anchor = _line("B anchor", (10, 100, 150, 110), 2)
|
|
145
|
+
first_tail = _line("A tail", (10, 118, 150, 128), 3)
|
|
146
|
+
second_tail = _line("B tail", (10, 118.5, 150, 128.5), 4)
|
|
147
|
+
for item, family in ((first_anchor, "A"), (second_anchor, "B"), (first_tail, "A"), (second_tail, "B")):
|
|
148
|
+
item[0].font_signature = (family, 0)
|
|
149
|
+
item[0].font_coverage = 1.0
|
|
150
|
+
target = _TextLane(left=0, right=200, lines=[second_anchor, first_anchor])
|
|
151
|
+
source = _TextLane(left=300, right=500, lines=[first_tail, second_tail])
|
|
152
|
+
_run_and_check_stability([target, source])
|
|
153
|
+
assert target.lines == [first_anchor, second_anchor, first_tail]
|
|
154
|
+
assert source.lines == [second_tail]
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@pytest.mark.parametrize(
|
|
158
|
+
"case",
|
|
159
|
+
[
|
|
160
|
+
"ambiguous_current_lane",
|
|
161
|
+
"independent_groups_and_valid_tail",
|
|
162
|
+
"inferred_body_and_span_lanes",
|
|
163
|
+
"chained_tails",
|
|
164
|
+
"predecessor_changes_membership",
|
|
165
|
+
"equal_height_peers",
|
|
166
|
+
"non_unique_or_missing_target",
|
|
167
|
+
"same_position_predecessors",
|
|
168
|
+
],
|
|
169
|
+
)
|
|
170
|
+
def test_short_tail_assignment_terminates_and_preserves_members(case: str) -> None:
|
|
171
|
+
"""在可强制终止并回收的子进程内检查归属,任何异常通过退出码和标准错误上报。"""
|
|
172
|
+
completed = subprocess.run(
|
|
173
|
+
[sys.executable, str(Path(__file__).resolve()), case],
|
|
174
|
+
capture_output=True,
|
|
175
|
+
text=True,
|
|
176
|
+
encoding="utf-8",
|
|
177
|
+
timeout=20,
|
|
178
|
+
check=False,
|
|
179
|
+
)
|
|
180
|
+
assert completed.returncode == 0, completed.stdout + completed.stderr
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
if __name__ == "__main__":
|
|
184
|
+
globals()[f"_case_{sys.argv[1]}"]()
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from io import BytesIO
|
|
4
|
+
|
|
3
5
|
import pytest
|
|
4
6
|
from _span_test_utils import inline
|
|
5
7
|
from bs4 import BeautifulSoup
|
|
6
8
|
from openpyxl import Workbook
|
|
7
9
|
from openpyxl.cell.rich_text import CellRichText, TextBlock
|
|
8
10
|
from openpyxl.cell.text import InlineFont
|
|
11
|
+
from openpyxl.styles import Alignment, Font, GradientFill, PatternFill
|
|
9
12
|
from openpyxl.worksheet.worksheet import Worksheet
|
|
10
13
|
|
|
14
|
+
from docvortex.analyzers.native import XlsxModel
|
|
11
15
|
from docvortex.analyzers.native.office.spreadsheet.html import render_spreadsheet_table
|
|
12
16
|
from docvortex.analyzers.native.office.spreadsheet.models import AnchoredBlock, ExcelCell, ExcelTable, SheetImage
|
|
13
17
|
from docvortex.analyzers.native.office.spreadsheet.projector import SpreadsheetProjector
|
|
@@ -17,6 +21,72 @@ from docvortex.analyzers.native.office.xlsx.xlsx_converter import XlsxConverter
|
|
|
17
21
|
from docvortex.schema import BlockType
|
|
18
22
|
|
|
19
23
|
|
|
24
|
+
@pytest.mark.parametrize(
|
|
25
|
+
("fill", "background"),
|
|
26
|
+
[
|
|
27
|
+
(PatternFill(), None),
|
|
28
|
+
(PatternFill(patternType="solid", fgColor="FF99CCFF"), "#99CCFF"),
|
|
29
|
+
(PatternFill(patternType="darkGrid", fgColor="FF99CCFF"), None),
|
|
30
|
+
(GradientFill(stop=("FFFFFF", "99CCFF")), None),
|
|
31
|
+
(GradientFill(type="path", stop=("FFFFFF", "99CCFF")), None),
|
|
32
|
+
],
|
|
33
|
+
ids=["none", "solid", "pattern", "linear-gradient", "path-gradient"],
|
|
34
|
+
)
|
|
35
|
+
def test_cell_fill_preserves_content_and_supported_styles(fill: PatternFill | GradientFill, background: str | None) -> None:
|
|
36
|
+
"""验证不同填充经过 StyleProxy 后均能提取内容,渐变不影响字体、对齐或纯色支持。"""
|
|
37
|
+
workbook = Workbook()
|
|
38
|
+
sheet = workbook.active
|
|
39
|
+
assert sheet is not None
|
|
40
|
+
sheet["A1"] = 240
|
|
41
|
+
sheet["A1"].fill = fill
|
|
42
|
+
sheet["A1"].font = Font(b=True, i=True, color="FF112233")
|
|
43
|
+
sheet["A1"].alignment = Alignment(horizontal="center", vertical="top")
|
|
44
|
+
styles = SpreadsheetProjector()._extract_cell_style(sheet["A1"])
|
|
45
|
+
expected = {
|
|
46
|
+
"font-weight": "bold",
|
|
47
|
+
"font-style": "italic",
|
|
48
|
+
"color": "#112233",
|
|
49
|
+
"text-align": "center",
|
|
50
|
+
"vertical-align": "top",
|
|
51
|
+
}
|
|
52
|
+
if background is not None:
|
|
53
|
+
expected["background-color"] = background
|
|
54
|
+
assert styles == expected
|
|
55
|
+
|
|
56
|
+
# 单格也会经过样式提取;通过公共入口锁定 issue 中的最小失败路径。
|
|
57
|
+
stream = BytesIO()
|
|
58
|
+
workbook.save(stream)
|
|
59
|
+
pages = XlsxModel().predict(BytesIO(stream.getvalue()))
|
|
60
|
+
assert pages == [[{"type": BlockType.TEXT, "content": inline("240")}]]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_xlsx_mixed_fills_preserve_all_sheets_and_merged_cells() -> None:
|
|
64
|
+
"""验证两类渐变与纯色混用时仍输出全部工作表、单元格内容和合并跨度。"""
|
|
65
|
+
workbook = Workbook()
|
|
66
|
+
sheet = workbook.active
|
|
67
|
+
assert sheet is not None
|
|
68
|
+
sheet.title = "Mixed"
|
|
69
|
+
sheet.append(["linear", "path", "solid"])
|
|
70
|
+
sheet.append(["merged", None, "plain"])
|
|
71
|
+
sheet.merge_cells("A2:B2")
|
|
72
|
+
sheet["A1"].fill = GradientFill(stop=("FFFFFF", "99CCFF"))
|
|
73
|
+
sheet["B1"].fill = GradientFill(type="path", stop=("FFFFFF", "99CCFF"))
|
|
74
|
+
sheet["C1"].fill = PatternFill(patternType="solid", fgColor="FF99CCFF")
|
|
75
|
+
sheet["A2"].fill = GradientFill(stop=("FFFFFF", "99CCFF"))
|
|
76
|
+
workbook.create_sheet("Following")["A1"] = "still parsed"
|
|
77
|
+
stream = BytesIO()
|
|
78
|
+
workbook.save(stream)
|
|
79
|
+
|
|
80
|
+
pages = XlsxModel().predict(BytesIO(stream.getvalue()))
|
|
81
|
+
assert len(pages) == 2
|
|
82
|
+
table = next(block for block in pages[0] if block["type"] == BlockType.TABLE)
|
|
83
|
+
soup = BeautifulSoup(table["content"], "html.parser")
|
|
84
|
+
cells = soup.find_all(["th", "td"])
|
|
85
|
+
assert [cell.get_text() for cell in cells] == ["linear", "path", "solid", "merged", "plain"]
|
|
86
|
+
assert cells[3]["colspan"] == "2"
|
|
87
|
+
assert pages[1][-1] == {"type": BlockType.TEXT, "content": inline("still parsed")}
|
|
88
|
+
|
|
89
|
+
|
|
20
90
|
def _cell(
|
|
21
91
|
row: int,
|
|
22
92
|
col: int,
|
|
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
|
{docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/__init__.py
RENAMED
|
File without changes
|
{docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/anchors.py
RENAMED
|
File without changes
|
{docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/formula.py
RENAMED
|
File without changes
|
{docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/projector.py
RENAMED
|
File without changes
|
{docvortex-0.4.16 → docvortex-0.4.18}/src/docvortex/analyzers/native/_shared/markup/styles.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|