docvortex 0.4.9__tar.gz → 0.4.10__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.9/src/docvortex.egg-info → docvortex-0.4.10}/PKG-INFO +2 -3
- {docvortex-0.4.9 → docvortex-0.4.10}/README.md +1 -2
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/constants.py +2 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/resources.py +40 -2
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/styles.py +7 -3
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/table.py +3 -9
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/text.py +55 -24
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/contracts.py +6 -1
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/version.py +1 -1
- {docvortex-0.4.9 → docvortex-0.4.10/src/docvortex.egg-info}/PKG-INFO +2 -3
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex.egg-info/SOURCES.txt +0 -1
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_cli_logging.py +1 -1
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_html.py +136 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_odf.py +155 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_office_demo_pages.py +3 -2
- docvortex-0.4.9/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/LICENSE.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/MANIFEST.in +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/README.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/demo.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/METADATA.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/USAGE.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/flash-manual-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/flash-round2-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/flash-rule-generalization-2026-09-15.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/flash-title-coverage-2026-09-16.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/docs/sdk-0.4.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/pyproject.toml +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/setup.cfg +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/_document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/text/dedup.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/options.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/result.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_manual_annotations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_manual_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_reviewed_history.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_round2_annotations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_round2_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_round3_annotations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_round3_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/pdf_char_dedup.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_architecture.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_document_metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_history_geometry_tools.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_release_ci_gate.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_manual_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_round2_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_round3_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_rule_generalization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_spatial_evidence.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_object_clipping.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_text_dedup.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tools/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tools/build_html_css.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.10}/tools/font_geometry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: docvortex
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.10
|
|
4
4
|
Summary: A fast, multi-format document parsing and conversion engine
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Repository, https://github.com/myhloli/DocVortex
|
|
@@ -82,8 +82,7 @@ then exports the result in the formats your workflow needs.
|
|
|
82
82
|
- **Portable results** — save document structure and image assets in a Bundle, then export again without the source file.
|
|
83
83
|
- **Composable APIs** — use the complete pipeline or integrate analysis, postprocessing and rendering separately.
|
|
84
84
|
|
|
85
|
-
Native parsing works without an OCR or VLM inference service. Use DocVortex
|
|
86
|
-
directly through its CLI or Python SDK, independently of MinerU.
|
|
85
|
+
Native parsing works without an OCR or VLM inference service. Use DocVortex directly through its CLI or Python SDK.
|
|
87
86
|
|
|
88
87
|

|
|
89
88
|
|
|
@@ -28,8 +28,7 @@ then exports the result in the formats your workflow needs.
|
|
|
28
28
|
- **Portable results** — save document structure and image assets in a Bundle, then export again without the source file.
|
|
29
29
|
- **Composable APIs** — use the complete pipeline or integrate analysis, postprocessing and rendering separately.
|
|
30
30
|
|
|
31
|
-
Native parsing works without an OCR or VLM inference service. Use DocVortex
|
|
32
|
-
directly through its CLI or Python SDK, independently of MinerU.
|
|
31
|
+
Native parsing works without an OCR or VLM inference service. Use DocVortex directly through its CLI or Python SDK.
|
|
33
32
|
|
|
34
33
|

|
|
35
34
|
|
|
@@ -8,6 +8,7 @@ MAX_HTML_NODES: Final = 2_000_000
|
|
|
8
8
|
MAX_HTML_DEPTH: Final = 256
|
|
9
9
|
MAX_HTML_IMAGE_BYTES: Final = 20 * 1024 * 1024
|
|
10
10
|
MAX_HTML_IMAGE_TOTAL_BYTES: Final = 128 * 1024 * 1024
|
|
11
|
+
MAX_REMOTE_IMAGE_FETCH_SECONDS: Final = 10
|
|
11
12
|
MAX_HTML_STYLESHEET_BYTES: Final = 5 * 1024 * 1024
|
|
12
13
|
MAX_HTML_STYLESHEET_TOTAL_BYTES: Final = 20 * 1024 * 1024
|
|
13
14
|
MAX_HTML_RENDERED_BYTES: Final = 256 * 1024 * 1024
|
|
@@ -22,4 +23,5 @@ __all__ = [
|
|
|
22
23
|
"MAX_HTML_RENDERED_BYTES",
|
|
23
24
|
"MAX_HTML_STYLESHEET_BYTES",
|
|
24
25
|
"MAX_HTML_STYLESHEET_TOTAL_BYTES",
|
|
26
|
+
"MAX_REMOTE_IMAGE_FETCH_SECONDS",
|
|
25
27
|
]
|
|
@@ -6,6 +6,7 @@ import base64
|
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from typing import Protocol
|
|
8
8
|
from urllib.parse import SplitResult, unquote, urljoin, urlsplit, urlunsplit
|
|
9
|
+
from urllib.request import urlopen
|
|
9
10
|
|
|
10
11
|
from lxml import etree # type: ignore[reportMissingImports]
|
|
11
12
|
|
|
@@ -19,6 +20,7 @@ from .constants import (
|
|
|
19
20
|
MAX_HTML_IMAGE_TOTAL_BYTES,
|
|
20
21
|
MAX_HTML_STYLESHEET_BYTES,
|
|
21
22
|
MAX_HTML_STYLESHEET_TOTAL_BYTES,
|
|
23
|
+
MAX_REMOTE_IMAGE_FETCH_SECONDS,
|
|
22
24
|
)
|
|
23
25
|
from .errors import HtmlResourceLimitError
|
|
24
26
|
|
|
@@ -65,6 +67,7 @@ class HtmlResourceContext:
|
|
|
65
67
|
self._image_bytes = 0
|
|
66
68
|
self._stylesheet_bytes = 0
|
|
67
69
|
self._image_cache: dict[Path, str] = {}
|
|
70
|
+
self._remote_image_cache: dict[str, str] = {}
|
|
68
71
|
self._data_image_cache: dict[str, ResolvedMarkupImage] = {}
|
|
69
72
|
self._stylesheet_cache: dict[Path, str] = {}
|
|
70
73
|
self._local_root = source_context.local_resource_root.resolve() if source_context.local_resource_root else None
|
|
@@ -157,14 +160,14 @@ class HtmlResourceContext:
|
|
|
157
160
|
return sanitize_hyperlink_target(normalized, allow_relative=True, allow_fragment=True)
|
|
158
161
|
|
|
159
162
|
def resolve_image(self, source: str, *, alt: str = "") -> ResolvedMarkupImage | None:
|
|
160
|
-
"""按 data URI
|
|
163
|
+
"""按 data URI、远程 URL、本地安全文件的顺序解析图片,远程图片仅在来源显式开启下载时内嵌。"""
|
|
161
164
|
normalized = (source or "").strip()
|
|
162
165
|
if not normalized:
|
|
163
166
|
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
164
167
|
if normalized.casefold().startswith("data:"):
|
|
165
168
|
return self._resolve_data_image(normalized, alt=alt)
|
|
166
169
|
if remote_url := self._resolve_remote_image_url(normalized):
|
|
167
|
-
return
|
|
170
|
+
return self._resolve_remote_image(remote_url, alt=alt)
|
|
168
171
|
local_path = self._resolve_local_path(normalized)
|
|
169
172
|
if local_path is None or not local_path.is_file():
|
|
170
173
|
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
@@ -243,6 +246,41 @@ class HtmlResourceContext:
|
|
|
243
246
|
self._data_image_cache[data_uri] = resolved
|
|
244
247
|
return resolved
|
|
245
248
|
|
|
249
|
+
def _resolve_remote_image(self, remote_url: str, *, alt: str) -> ResolvedMarkupImage:
|
|
250
|
+
"""远程图片默认保持外链,来源显式开启下载时按缓存下载内嵌。"""
|
|
251
|
+
if not self.source_context.fetch_remote_images:
|
|
252
|
+
return ResolvedMarkupImage(image_url=remote_url, alt=alt)
|
|
253
|
+
if cached := self._remote_image_cache.get(remote_url):
|
|
254
|
+
return ResolvedMarkupImage(image_base64=cached, alt=alt)
|
|
255
|
+
data_uri = self._fetch_remote_image(remote_url)
|
|
256
|
+
if data_uri is None:
|
|
257
|
+
return ResolvedMarkupImage(image_url=remote_url, alt=alt)
|
|
258
|
+
self._remote_image_cache[remote_url] = data_uri
|
|
259
|
+
return ResolvedMarkupImage(image_base64=data_uri, alt=alt)
|
|
260
|
+
|
|
261
|
+
def _fetch_remote_image(self, remote_url: str) -> str | None:
|
|
262
|
+
"""在单图上限与超时约束内下载远程图片并复核签名,网络失败返回 None 退回外链。"""
|
|
263
|
+
try:
|
|
264
|
+
with urlopen(remote_url, timeout=MAX_REMOTE_IMAGE_FETCH_SECONDS) as response:
|
|
265
|
+
chunks: list[bytes] = []
|
|
266
|
+
remaining = MAX_HTML_IMAGE_BYTES + 1
|
|
267
|
+
while remaining > 0:
|
|
268
|
+
chunk = response.read(remaining)
|
|
269
|
+
if not chunk:
|
|
270
|
+
break
|
|
271
|
+
chunks.append(chunk)
|
|
272
|
+
remaining -= len(chunk)
|
|
273
|
+
except (OSError, ValueError):
|
|
274
|
+
return None
|
|
275
|
+
payload = b"".join(chunks)
|
|
276
|
+
if len(payload) > MAX_HTML_IMAGE_BYTES:
|
|
277
|
+
raise HtmlResourceLimitError(f"HTML image exceeds max_html_image_bytes={MAX_HTML_IMAGE_BYTES}")
|
|
278
|
+
data_uri = _image_data_uri(payload)
|
|
279
|
+
if data_uri is None:
|
|
280
|
+
return None
|
|
281
|
+
self._charge_image_bytes(len(payload))
|
|
282
|
+
return data_uri
|
|
283
|
+
|
|
246
284
|
def _charge_image_bytes(self, byte_count: int) -> None:
|
|
247
285
|
"""累计实际保留的图片字节,并在超限时终止整份文档。"""
|
|
248
286
|
self._image_bytes += byte_count
|
|
@@ -260,11 +260,15 @@ class OdfStyles:
|
|
|
260
260
|
current = definition.parent or ""
|
|
261
261
|
return False
|
|
262
262
|
|
|
263
|
-
def list_level(self, style_name: str | None, depth: int) -> ListLevel:
|
|
264
|
-
"""
|
|
263
|
+
def list_level(self, style_name: str | None, depth: int) -> ListLevel | None:
|
|
264
|
+
"""返回指定列表深度的定义;样式已定义但无任何层级时返回 None(无可见标记)。"""
|
|
265
265
|
if not style_name:
|
|
266
266
|
return ListLevel()
|
|
267
|
-
levels = self._list_styles.get(style_name
|
|
267
|
+
levels = self._list_styles.get(style_name)
|
|
268
|
+
if levels is None:
|
|
269
|
+
return ListLevel()
|
|
270
|
+
if not levels:
|
|
271
|
+
return None
|
|
268
272
|
return levels.get(depth, ListLevel())
|
|
269
273
|
|
|
270
274
|
def table_is_visible(self, style_name: str | None) -> bool:
|
|
@@ -169,7 +169,6 @@ def parse_table_grid(
|
|
|
169
169
|
duplicated_text_bytes = 0
|
|
170
170
|
row_index = 0
|
|
171
171
|
pending_empty_rows = 0
|
|
172
|
-
pending_empty_width = 0
|
|
173
172
|
|
|
174
173
|
def ensure_row(target_row: int, width: int = 0) -> list[GridCell | None]:
|
|
175
174
|
"""在兼容独立表格调用的同时应用可选文档级预留。"""
|
|
@@ -179,7 +178,6 @@ def parse_table_grid(
|
|
|
179
178
|
|
|
180
179
|
for row_element, header in _iter_rows(table):
|
|
181
180
|
row_repeat = _positive_int(row_element.get(qname("table", "number-rows-repeated")))
|
|
182
|
-
_validate_grid_extent(row_index + row_repeat, grid.width)
|
|
183
181
|
cell_templates: list[tuple[bool, int, GridCell | None]] = []
|
|
184
182
|
for cell in row_element:
|
|
185
183
|
if not isinstance(cell.tag, str):
|
|
@@ -219,18 +217,14 @@ def parse_table_grid(
|
|
|
219
217
|
)
|
|
220
218
|
if not row_has_content:
|
|
221
219
|
pending_empty_rows += row_repeat
|
|
222
|
-
pending_empty_width = max(
|
|
223
|
-
pending_empty_width,
|
|
224
|
-
sum(repeat * (template.col_span if template is not None else 1) for _, repeat, template in cell_templates),
|
|
225
|
-
)
|
|
226
220
|
continue
|
|
227
221
|
if pending_empty_rows:
|
|
228
|
-
_validate_grid_extent(row_index + pending_empty_rows,
|
|
222
|
+
_validate_grid_extent(row_index + pending_empty_rows, grid.width)
|
|
229
223
|
for _ in range(pending_empty_rows):
|
|
230
|
-
ensure_row(row_index,
|
|
224
|
+
ensure_row(row_index, grid.width)
|
|
231
225
|
row_index += 1
|
|
232
226
|
pending_empty_rows = 0
|
|
233
|
-
|
|
227
|
+
_validate_grid_extent(row_index + row_repeat, grid.width)
|
|
234
228
|
for _ in range(row_repeat):
|
|
235
229
|
row = ensure_row(row_index)
|
|
236
230
|
col_index = 0
|
|
@@ -453,7 +453,7 @@ class OdfBlockParser:
|
|
|
453
453
|
style_name = element.get(qname("text", "style-name")) or inherited_style
|
|
454
454
|
level = self.styles.list_level(style_name, depth)
|
|
455
455
|
key = (style_name or "", depth)
|
|
456
|
-
start = level.start
|
|
456
|
+
start = level.start if level is not None else 1
|
|
457
457
|
continue_list = element.get(qname("text", "continue-list"))
|
|
458
458
|
if continue_list and continue_list in self._list_ids:
|
|
459
459
|
start = self._list_ids[continue_list]
|
|
@@ -466,17 +466,20 @@ class OdfBlockParser:
|
|
|
466
466
|
active_master: str | None = None
|
|
467
467
|
|
|
468
468
|
def flush_content(fragment_start: int) -> None:
|
|
469
|
-
"""把当前合法子块冻结为一个 LIST
|
|
469
|
+
"""把当前合法子块冻结为一个 LIST 分片;无标记列表按普通段落序列输出。"""
|
|
470
470
|
if content:
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
471
|
+
if level is None:
|
|
472
|
+
results.extend(content)
|
|
473
|
+
else:
|
|
474
|
+
block: dict[str, Any] = {
|
|
475
|
+
"type": BlockType.LIST,
|
|
476
|
+
"attribute": "ordered" if level.ordered else "unordered",
|
|
477
|
+
"ilevel": depth,
|
|
478
|
+
"content": list(content),
|
|
479
|
+
}
|
|
480
|
+
if level.ordered:
|
|
481
|
+
block["start"] = fragment_start
|
|
482
|
+
results.append(block)
|
|
480
483
|
content.clear()
|
|
481
484
|
if fragment_notes:
|
|
482
485
|
results.extend(fragment_notes)
|
|
@@ -875,6 +878,20 @@ class OdfBlockParser:
|
|
|
875
878
|
"""把单元格行内流中的 note marker 排入当前逻辑页队列。"""
|
|
876
879
|
self.notes.extend(atom.content for atom in atoms if isinstance(atom, InlineNote))
|
|
877
880
|
|
|
881
|
+
def _render_cell_paragraph(self, child: etree._Element, parts: list[str]) -> None:
|
|
882
|
+
"""把单元格里的一个裸段落渲染为 <p>,并回收行内块组的单元格子块。"""
|
|
883
|
+
atoms = self.parse_inline_atoms(child)
|
|
884
|
+
self._queue_inline_notes(atoms)
|
|
885
|
+
rendered_atoms = [atom for atom in atoms if not isinstance(atom, InlineImage)] if self._collect_cell_visuals else atoms
|
|
886
|
+
parts.append(f"<p>{render_atoms_to_html(rendered_atoms)}</p>")
|
|
887
|
+
for atom in atoms:
|
|
888
|
+
if isinstance(atom, InlineBlockGroup):
|
|
889
|
+
self._append_cell_blocks(
|
|
890
|
+
parts,
|
|
891
|
+
atom.blocks,
|
|
892
|
+
inline_image_rendered=atom.inline_image_rendered and not self._collect_cell_visuals,
|
|
893
|
+
)
|
|
894
|
+
|
|
878
895
|
def render_cell_html(self, cell: etree._Element) -> str:
|
|
879
896
|
"""把表格单元格中的段落、列表、嵌套表和 frame 转为 HTML。"""
|
|
880
897
|
parts: list[str] = []
|
|
@@ -882,19 +899,7 @@ class OdfBlockParser:
|
|
|
882
899
|
if not isinstance(child.tag, str):
|
|
883
900
|
continue
|
|
884
901
|
if child.tag in {qname("text", "p"), qname("text", "h")}:
|
|
885
|
-
|
|
886
|
-
self._queue_inline_notes(atoms)
|
|
887
|
-
rendered_atoms = (
|
|
888
|
-
[atom for atom in atoms if not isinstance(atom, InlineImage)] if self._collect_cell_visuals else atoms
|
|
889
|
-
)
|
|
890
|
-
parts.append(f"<p>{render_atoms_to_html(rendered_atoms)}</p>")
|
|
891
|
-
for atom in atoms:
|
|
892
|
-
if isinstance(atom, InlineBlockGroup):
|
|
893
|
-
self._append_cell_blocks(
|
|
894
|
-
parts,
|
|
895
|
-
atom.blocks,
|
|
896
|
-
inline_image_rendered=atom.inline_image_rendered and not self._collect_cell_visuals,
|
|
897
|
-
)
|
|
902
|
+
self._render_cell_paragraph(child, parts)
|
|
898
903
|
elif child.tag == qname("text", "list"):
|
|
899
904
|
parts.append(self._render_list_html(child))
|
|
900
905
|
elif child.tag == qname("table", "table"):
|
|
@@ -915,6 +920,8 @@ class OdfBlockParser:
|
|
|
915
920
|
"""把单元格内 ODF 列表递归渲染为 ol/ul HTML。"""
|
|
916
921
|
style_name = element.get(qname("text", "style-name")) or inherited_style
|
|
917
922
|
level = self.styles.list_level(style_name, depth)
|
|
923
|
+
if level is None:
|
|
924
|
+
return self._render_unmarked_list_html(element, depth=depth, inherited_style=style_name)
|
|
918
925
|
tag = "ol" if level.ordered else "ul"
|
|
919
926
|
start = f' start="{level.start}"' if level.ordered and level.start != 1 else ""
|
|
920
927
|
parts = [f"<{tag}{start}>"]
|
|
@@ -940,6 +947,30 @@ class OdfBlockParser:
|
|
|
940
947
|
parts.append(f"</{tag}>")
|
|
941
948
|
return "".join(parts)
|
|
942
949
|
|
|
950
|
+
def _render_unmarked_list_html(
|
|
951
|
+
self,
|
|
952
|
+
element: etree._Element,
|
|
953
|
+
*,
|
|
954
|
+
depth: int,
|
|
955
|
+
inherited_style: str | None,
|
|
956
|
+
) -> str:
|
|
957
|
+
"""把引用空列表样式(无可见标记)的单元格列表按裸段落序列渲染。"""
|
|
958
|
+
parts: list[str] = []
|
|
959
|
+
for item in element:
|
|
960
|
+
if not isinstance(item.tag, str) or item.tag not in {
|
|
961
|
+
qname("text", "list-item"),
|
|
962
|
+
qname("text", "list-header"),
|
|
963
|
+
}:
|
|
964
|
+
continue
|
|
965
|
+
for child in item:
|
|
966
|
+
if not isinstance(child.tag, str):
|
|
967
|
+
continue
|
|
968
|
+
if child.tag in {qname("text", "p"), qname("text", "h")}:
|
|
969
|
+
self._render_cell_paragraph(child, parts)
|
|
970
|
+
elif child.tag == qname("text", "list"):
|
|
971
|
+
parts.append(self._render_list_html(child, depth=depth + 1, inherited_style=inherited_style))
|
|
972
|
+
return "".join(part for part in parts if part)
|
|
973
|
+
|
|
943
974
|
def drain_notes(self) -> list[str]:
|
|
944
975
|
"""取出当前累计脚注并清空共享队列。"""
|
|
945
976
|
values = list(self.notes)
|
|
@@ -8,11 +8,16 @@ from pathlib import Path
|
|
|
8
8
|
|
|
9
9
|
@dataclass(frozen=True, slots=True)
|
|
10
10
|
class HtmlSourceContext:
|
|
11
|
-
"""保存相对链接解析及 HTML 解码所需的来源上下文。
|
|
11
|
+
"""保存相对链接解析及 HTML 解码所需的来源上下文。
|
|
12
|
+
|
|
13
|
+
fetch_remote_images 默认关闭,远程图片仅记录 URL;开启后解析阶段会对受限
|
|
14
|
+
HTTP(S) 图片发起网络请求并内嵌,不可信输入的 SSRF 风险由调用者承担。
|
|
15
|
+
"""
|
|
12
16
|
|
|
13
17
|
source_uri: str | None = None
|
|
14
18
|
local_resource_root: Path | None = None
|
|
15
19
|
transport_encoding: str | None = None
|
|
20
|
+
fetch_remote_images: bool = False
|
|
16
21
|
|
|
17
22
|
|
|
18
23
|
__all__ = ["HtmlSourceContext"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: docvortex
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.10
|
|
4
4
|
Summary: A fast, multi-format document parsing and conversion engine
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Repository, https://github.com/myhloli/DocVortex
|
|
@@ -82,8 +82,7 @@ then exports the result in the formats your workflow needs.
|
|
|
82
82
|
- **Portable results** — save document structure and image assets in a Bundle, then export again without the source file.
|
|
83
83
|
- **Composable APIs** — use the complete pipeline or integrate analysis, postprocessing and rendering separately.
|
|
84
84
|
|
|
85
|
-
Native parsing works without an OCR or VLM inference service. Use DocVortex
|
|
86
|
-
directly through its CLI or Python SDK, independently of MinerU.
|
|
85
|
+
Native parsing works without an OCR or VLM inference service. Use DocVortex directly through its CLI or Python SDK.
|
|
87
86
|
|
|
88
87
|

|
|
89
88
|
|
|
@@ -430,7 +430,6 @@ src/docvortex/render/_internal/pdf/title_layout.py
|
|
|
430
430
|
src/docvortex/render/_internal/structured_content/__init__.py
|
|
431
431
|
src/docvortex/render/_internal/structured_content/renderer.py
|
|
432
432
|
src/docvortex/resources/epub/docvortex.css
|
|
433
|
-
src/docvortex/resources/fasttext-langdetect/lid.176.ftz
|
|
434
433
|
src/docvortex/resources/fonts/DroidSansFallbackFull.ttf
|
|
435
434
|
src/docvortex/resources/fonts/NOTICE
|
|
436
435
|
src/docvortex/resources/fonts/manifest.json
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import base64
|
|
4
|
+
import threading
|
|
5
|
+
from collections.abc import Iterator
|
|
6
|
+
from contextlib import contextmanager
|
|
4
7
|
from copy import copy
|
|
8
|
+
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
5
9
|
from io import BytesIO
|
|
6
10
|
from pathlib import Path
|
|
7
11
|
|
|
@@ -19,6 +23,7 @@ from docvortex.analyzers.native.html import HtmlResourceLimitError
|
|
|
19
23
|
from docvortex.analyzers.native.html import document as html_document_module
|
|
20
24
|
from docvortex.analyzers.native.html import resources as html_resources_module
|
|
21
25
|
from docvortex.analyzers.native.html import selector as html_selector_module
|
|
26
|
+
from docvortex.analyzers.native.html.constants import MAX_HTML_IMAGE_BYTES
|
|
22
27
|
from docvortex.analyzers.native.html.resources import HtmlResourceContext
|
|
23
28
|
from docvortex.api import parse
|
|
24
29
|
from docvortex.codecs.html import decode_docvortex_html_wire
|
|
@@ -1982,3 +1987,134 @@ def test_html_invalid_mathml_and_asciimath_remain_visible_text() -> None:
|
|
|
1982
1987
|
|
|
1983
1988
|
assert "not-latex" in markdown and "sqrt(2)" in markdown
|
|
1984
1989
|
assert not any(block.type == BlockType.EQUATION for block in middle.pages[0].blocks)
|
|
1990
|
+
|
|
1991
|
+
|
|
1992
|
+
def _tiny_png_bytes() -> bytes:
|
|
1993
|
+
"""构造 1x1 红色像素的最小合法 PNG。"""
|
|
1994
|
+
buffer = BytesIO()
|
|
1995
|
+
Image.new("RGB", (1, 1), (255, 0, 0)).save(buffer, format="PNG")
|
|
1996
|
+
return buffer.getvalue()
|
|
1997
|
+
|
|
1998
|
+
|
|
1999
|
+
@contextmanager
|
|
2000
|
+
def _local_image_server(routes: dict[str, bytes]) -> Iterator[tuple[str, list[str]]]:
|
|
2001
|
+
"""在回环地址启动按路径返回固定字节的计数服务,退出时关闭。"""
|
|
2002
|
+
hits: list[str] = []
|
|
2003
|
+
|
|
2004
|
+
class Handler(BaseHTTPRequestHandler):
|
|
2005
|
+
def do_GET(self) -> None:
|
|
2006
|
+
hits.append(self.path)
|
|
2007
|
+
body = routes[self.path]
|
|
2008
|
+
self.send_response(200)
|
|
2009
|
+
self.send_header("Content-Length", str(len(body)))
|
|
2010
|
+
self.end_headers()
|
|
2011
|
+
self.wfile.write(body)
|
|
2012
|
+
|
|
2013
|
+
def log_message(self, *args: object) -> None:
|
|
2014
|
+
return
|
|
2015
|
+
|
|
2016
|
+
server = ThreadingHTTPServer(("127.0.0.1", 0), Handler)
|
|
2017
|
+
threading.Thread(target=server.serve_forever, daemon=True).start()
|
|
2018
|
+
try:
|
|
2019
|
+
yield f"http://127.0.0.1:{server.server_address[1]}", hits
|
|
2020
|
+
finally:
|
|
2021
|
+
server.shutdown()
|
|
2022
|
+
server.server_close()
|
|
2023
|
+
|
|
2024
|
+
|
|
2025
|
+
def _remote_chart_middle(url: str) -> MiddleJson:
|
|
2026
|
+
"""构造主图片指向远程 URL 的 chart wire 文档,复现导出 HTML 回灌场景。"""
|
|
2027
|
+
return MiddleJson.model_validate(
|
|
2028
|
+
{
|
|
2029
|
+
"pages": [
|
|
2030
|
+
{
|
|
2031
|
+
"page_idx": 0,
|
|
2032
|
+
"blocks": [
|
|
2033
|
+
{
|
|
2034
|
+
"type": "chart",
|
|
2035
|
+
"index": 0,
|
|
2036
|
+
"content": [{"type": "chart_body", "index": 0, "content": "", "image_url": url}],
|
|
2037
|
+
}
|
|
2038
|
+
],
|
|
2039
|
+
}
|
|
2040
|
+
],
|
|
2041
|
+
"is_full_document": True,
|
|
2042
|
+
"metadata": {"file_suffix": "html", "producer": {"name": "docvortex", "version": "0.2.0"}},
|
|
2043
|
+
"schema": "docvortex.middle",
|
|
2044
|
+
"schema_version": "2.0",
|
|
2045
|
+
}
|
|
2046
|
+
)
|
|
2047
|
+
|
|
2048
|
+
|
|
2049
|
+
def test_html_remote_images_stay_external_and_offline_by_default(tmp_path: Path) -> None:
|
|
2050
|
+
"""默认不下载远程图片:保持外链、零网络请求,save_bundle 仍拒绝未物化图片。"""
|
|
2051
|
+
with _local_image_server({"/chart.png": _tiny_png_bytes()}) as (base, hits):
|
|
2052
|
+
url = f"{base}/chart.png"
|
|
2053
|
+
default = HtmlResourceContext(HtmlSourceContext())
|
|
2054
|
+
resolved = default.resolve_image(url, alt="chart")
|
|
2055
|
+
assert resolved is not None and resolved.image_url == url and not resolved.image_base64
|
|
2056
|
+
|
|
2057
|
+
rendered = render_html(_remote_chart_middle(url), standalone=False)
|
|
2058
|
+
result = parse(rendered.encode(), file_suffix="html")
|
|
2059
|
+
body = result.middle_json.pages[0].blocks[0].content[0]
|
|
2060
|
+
assert body.image_url == url and not body.image_path
|
|
2061
|
+
|
|
2062
|
+
with pytest.raises(ValueError, match="must be materialized"):
|
|
2063
|
+
result.save_bundle(tmp_path / "bundle")
|
|
2064
|
+
assert hits == []
|
|
2065
|
+
|
|
2066
|
+
|
|
2067
|
+
def test_html_remote_image_fetch_embeds_and_caches_by_url() -> None:
|
|
2068
|
+
"""开启下载后有效图片内嵌为 data URI,同一 URL 复用缓存不重复请求。"""
|
|
2069
|
+
png = _tiny_png_bytes()
|
|
2070
|
+
with _local_image_server({"/chart.png": png}) as (base, hits):
|
|
2071
|
+
context = HtmlResourceContext(HtmlSourceContext(fetch_remote_images=True))
|
|
2072
|
+
first = context.resolve_image(f"{base}/chart.png", alt="chart")
|
|
2073
|
+
assert first is not None and first.image_url is None
|
|
2074
|
+
assert first.image_base64 is not None and first.image_base64.startswith("data:image/png;base64,")
|
|
2075
|
+
assert base64.b64decode(first.image_base64.split(",", 1)[1]) == png
|
|
2076
|
+
assert hits == ["/chart.png"]
|
|
2077
|
+
|
|
2078
|
+
second = context.resolve_image(f"{base}/chart.png", alt="chart")
|
|
2079
|
+
assert second is not None and second.image_base64 == first.image_base64
|
|
2080
|
+
assert hits == ["/chart.png"]
|
|
2081
|
+
|
|
2082
|
+
|
|
2083
|
+
def test_html_remote_image_fetch_falls_back_to_url_when_unavailable() -> None:
|
|
2084
|
+
"""非图片字节或网络不可达时下载退回外链,不阻断解析。"""
|
|
2085
|
+
with _local_image_server({"/text.png": b"not-an-image"}) as (base, hits):
|
|
2086
|
+
context = HtmlResourceContext(HtmlSourceContext(fetch_remote_images=True))
|
|
2087
|
+
resolved = context.resolve_image(f"{base}/text.png", alt="chart")
|
|
2088
|
+
assert resolved is not None and resolved.image_url == f"{base}/text.png" and not resolved.image_base64
|
|
2089
|
+
|
|
2090
|
+
dead = "http://127.0.0.1:9/chart.png"
|
|
2091
|
+
resolved = context.resolve_image(dead)
|
|
2092
|
+
assert resolved is not None and resolved.image_url == dead and not resolved.image_base64
|
|
2093
|
+
|
|
2094
|
+
|
|
2095
|
+
def test_html_remote_image_fetch_rejects_oversized_download() -> None:
|
|
2096
|
+
"""下载超过单图上限的远程图片时与本地文件一致地终止整份文档。"""
|
|
2097
|
+
oversized = b"\x89PNG\r\n\x1a\n" + b"\x00" * (MAX_HTML_IMAGE_BYTES + 1)
|
|
2098
|
+
with _local_image_server({"/big.png": oversized}) as (base, hits):
|
|
2099
|
+
context = HtmlResourceContext(HtmlSourceContext(fetch_remote_images=True))
|
|
2100
|
+
with pytest.raises(HtmlResourceLimitError, match="max_html_image_bytes"):
|
|
2101
|
+
context.resolve_image(f"{base}/big.png")
|
|
2102
|
+
|
|
2103
|
+
|
|
2104
|
+
def test_html_remote_image_fetch_roundtrips_into_saved_bundle(tmp_path: Path) -> None:
|
|
2105
|
+
"""开启下载后:远程图片在解析阶段内嵌,save_bundle 不再依赖网络且图片入包。"""
|
|
2106
|
+
png = _tiny_png_bytes()
|
|
2107
|
+
with _local_image_server({"/chart.png": png}) as (base, hits):
|
|
2108
|
+
url = f"{base}/chart.png"
|
|
2109
|
+
rendered = render_html(_remote_chart_middle(url), standalone=False)
|
|
2110
|
+
result = parse(
|
|
2111
|
+
rendered.encode(),
|
|
2112
|
+
file_suffix="html",
|
|
2113
|
+
source_context=HtmlSourceContext(fetch_remote_images=True),
|
|
2114
|
+
)
|
|
2115
|
+
assert hits == ["/chart.png"]
|
|
2116
|
+
body = result.middle_json.pages[0].blocks[0].content[0]
|
|
2117
|
+
assert body.image_path and not body.image_url and not body.image_base64
|
|
2118
|
+
|
|
2119
|
+
result.save_bundle(tmp_path / "bundle")
|
|
2120
|
+
assert [path.read_bytes() for path in sorted((tmp_path / "bundle" / "images").glob("*"))] == [png]
|