docvortex 0.4.9__tar.gz → 0.4.11__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.11}/PKG-INFO +2 -3
- {docvortex-0.4.9 → docvortex-0.4.11}/README.md +1 -2
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/epub/xhtml.py +11 -2
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/constants.py +2 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/resources.py +55 -5
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/image.py +4 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/styles.py +7 -3
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/table.py +3 -9
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/text.py +86 -26
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/resources.py +22 -20
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/mathml.py +23 -2
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/contracts.py +6 -1
- docvortex-0.4.11/src/docvortex/foundation/_svg_raster.py +158 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/version.py +1 -1
- {docvortex-0.4.9 → docvortex-0.4.11/src/docvortex.egg-info}/PKG-INFO +2 -3
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex.egg-info/SOURCES.txt +2 -1
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_cli_logging.py +1 -1
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_odf_test_utils.py +6 -1
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_epub.py +49 -1
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_html.py +173 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_odf.py +217 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_office_title_types.py +42 -10
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_shared_helpers.py +47 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_office_demo_pages.py +3 -2
- docvortex-0.4.11/tests/unittest/test_svg_raster.py +79 -0
- docvortex-0.4.9/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/LICENSE.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/MANIFEST.in +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/README.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/demo.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/METADATA.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/USAGE.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/flash-manual-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/flash-round2-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/flash-rule-generalization-2026-09-15.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/flash-title-coverage-2026-09-16.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/docs/sdk-0.4.md +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/pyproject.toml +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/setup.cfg +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/_document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/text/dedup.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/options.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/result.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_manual_annotations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_manual_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_reviewed_history.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_round2_annotations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_round2_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_round3_annotations.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_round3_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/pdf_char_dedup.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_architecture.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_document_metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_history_geometry_tools.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_release_ci_gate.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_manual_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_round2_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_round3_annotations.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_rule_generalization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_spatial_evidence.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_object_clipping.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_text_dedup.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tools/__init__.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tools/build_html_css.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.9 → docvortex-0.4.11}/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.11
|
|
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
|
|
|
@@ -35,6 +35,7 @@ from docvortex.content.markup.projector import (
|
|
|
35
35
|
|
|
36
36
|
from ....content.spans import normalize_span_dicts
|
|
37
37
|
from ....foundation._image_payload import parse_image_data_uri_strict
|
|
38
|
+
from ....foundation._svg_raster import serialize_svg_image
|
|
38
39
|
from .._shared.hyperlink import sanitize_hyperlink_target
|
|
39
40
|
from .constants import IMAGE_MEDIA_BY_EXTENSION, SVG_MEDIA_TYPE
|
|
40
41
|
from .package import EpubPackage
|
|
@@ -275,14 +276,22 @@ class _EpubMarkupContext:
|
|
|
275
276
|
)
|
|
276
277
|
|
|
277
278
|
def resolve_image(self, source: str, *, alt: str = "") -> ResolvedMarkupImage | None:
|
|
278
|
-
"""读取并严格校验一个 EPUB
|
|
279
|
+
"""读取并严格校验一个 EPUB 包内图片引用,SVG 光栅化为 PNG。"""
|
|
279
280
|
target = self.package.resolve_reference(source, base_part=self.chapter_path)
|
|
280
281
|
if target is None:
|
|
281
282
|
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
282
283
|
media_type = (self.package.content_type_for(target.path) or "").casefold()
|
|
283
284
|
extension = target.path.rsplit(".", 1)[-1].casefold() if "." in target.path else ""
|
|
284
285
|
media_type = media_type or IMAGE_MEDIA_BY_EXTENSION.get(extension, "")
|
|
285
|
-
if
|
|
286
|
+
if media_type == SVG_MEDIA_TYPE:
|
|
287
|
+
payload = self.package.read_part(target.path, asset=True)
|
|
288
|
+
if payload is None:
|
|
289
|
+
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
290
|
+
data_uri = serialize_svg_image(payload)
|
|
291
|
+
if data_uri is None:
|
|
292
|
+
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
293
|
+
return ResolvedMarkupImage(image_base64=data_uri, alt=alt)
|
|
294
|
+
if not media_type.startswith("image/"):
|
|
286
295
|
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
287
296
|
payload = self.package.read_part(target.path, asset=True)
|
|
288
297
|
if payload is None:
|
|
@@ -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
|
|
|
@@ -13,12 +14,14 @@ from docvortex.content.markup import ResolvedMarkupImage
|
|
|
13
14
|
from docvortex.document.contracts import HtmlSourceContext
|
|
14
15
|
|
|
15
16
|
from ....foundation._image_payload import parse_image_data_uri_strict, validate_remote_image_url
|
|
17
|
+
from ....foundation._svg_raster import looks_like_svg_payload, serialize_svg_image
|
|
16
18
|
from .._shared.hyperlink import sanitize_hyperlink_target
|
|
17
19
|
from .constants import (
|
|
18
20
|
MAX_HTML_IMAGE_BYTES,
|
|
19
21
|
MAX_HTML_IMAGE_TOTAL_BYTES,
|
|
20
22
|
MAX_HTML_STYLESHEET_BYTES,
|
|
21
23
|
MAX_HTML_STYLESHEET_TOTAL_BYTES,
|
|
24
|
+
MAX_REMOTE_IMAGE_FETCH_SECONDS,
|
|
22
25
|
)
|
|
23
26
|
from .errors import HtmlResourceLimitError
|
|
24
27
|
|
|
@@ -65,6 +68,7 @@ class HtmlResourceContext:
|
|
|
65
68
|
self._image_bytes = 0
|
|
66
69
|
self._stylesheet_bytes = 0
|
|
67
70
|
self._image_cache: dict[Path, str] = {}
|
|
71
|
+
self._remote_image_cache: dict[str, str] = {}
|
|
68
72
|
self._data_image_cache: dict[str, ResolvedMarkupImage] = {}
|
|
69
73
|
self._stylesheet_cache: dict[Path, str] = {}
|
|
70
74
|
self._local_root = source_context.local_resource_root.resolve() if source_context.local_resource_root else None
|
|
@@ -157,14 +161,14 @@ class HtmlResourceContext:
|
|
|
157
161
|
return sanitize_hyperlink_target(normalized, allow_relative=True, allow_fragment=True)
|
|
158
162
|
|
|
159
163
|
def resolve_image(self, source: str, *, alt: str = "") -> ResolvedMarkupImage | None:
|
|
160
|
-
"""按 data URI
|
|
164
|
+
"""按 data URI、远程 URL、本地安全文件的顺序解析图片,远程图片仅在来源显式开启下载时内嵌。"""
|
|
161
165
|
normalized = (source or "").strip()
|
|
162
166
|
if not normalized:
|
|
163
167
|
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
164
168
|
if normalized.casefold().startswith("data:"):
|
|
165
169
|
return self._resolve_data_image(normalized, alt=alt)
|
|
166
170
|
if remote_url := self._resolve_remote_image_url(normalized):
|
|
167
|
-
return
|
|
171
|
+
return self._resolve_remote_image(remote_url, alt=alt)
|
|
168
172
|
local_path = self._resolve_local_path(normalized)
|
|
169
173
|
if local_path is None or not local_path.is_file():
|
|
170
174
|
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
@@ -175,7 +179,10 @@ class HtmlResourceContext:
|
|
|
175
179
|
payload = source_file.read(MAX_HTML_IMAGE_BYTES + 1)
|
|
176
180
|
if len(payload) > MAX_HTML_IMAGE_BYTES:
|
|
177
181
|
raise HtmlResourceLimitError(f"HTML image exceeds max_html_image_bytes={MAX_HTML_IMAGE_BYTES}")
|
|
178
|
-
|
|
182
|
+
if local_path.suffix.casefold() == ".svg" or looks_like_svg_payload(payload):
|
|
183
|
+
data_uri = serialize_svg_image(payload)
|
|
184
|
+
else:
|
|
185
|
+
data_uri = _image_data_uri(payload)
|
|
179
186
|
if data_uri is None:
|
|
180
187
|
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
181
188
|
self._charge_image_bytes(len(payload))
|
|
@@ -225,7 +232,7 @@ class HtmlResourceContext:
|
|
|
225
232
|
return self.anchors.note_anchor(note) if self.anchors else None
|
|
226
233
|
|
|
227
234
|
def _resolve_data_image(self, data_uri: str, *, alt: str) -> ResolvedMarkupImage | None:
|
|
228
|
-
"""严格解析 data URI
|
|
235
|
+
"""严格解析 data URI 并执行图片预算,SVG 光栅化为 PNG 后内嵌。"""
|
|
229
236
|
if cached := self._data_image_cache.get(data_uri):
|
|
230
237
|
return ResolvedMarkupImage(image_base64=cached.image_base64, alt=alt)
|
|
231
238
|
if len(data_uri) > MAX_HTML_IMAGE_BYTES * 2:
|
|
@@ -235,7 +242,15 @@ class HtmlResourceContext:
|
|
|
235
242
|
except ValueError:
|
|
236
243
|
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
237
244
|
if extension == "svg":
|
|
238
|
-
|
|
245
|
+
if len(payload) > MAX_HTML_IMAGE_BYTES:
|
|
246
|
+
raise HtmlResourceLimitError(f"HTML image exceeds max_html_image_bytes={MAX_HTML_IMAGE_BYTES}")
|
|
247
|
+
raster_uri = serialize_svg_image(payload)
|
|
248
|
+
if raster_uri is None:
|
|
249
|
+
return ResolvedMarkupImage(alt=alt) if alt else None
|
|
250
|
+
self._charge_image_bytes(len(payload))
|
|
251
|
+
resolved = ResolvedMarkupImage(image_base64=raster_uri, alt=alt)
|
|
252
|
+
self._data_image_cache[data_uri] = resolved
|
|
253
|
+
return resolved
|
|
239
254
|
if len(payload) > MAX_HTML_IMAGE_BYTES:
|
|
240
255
|
raise HtmlResourceLimitError(f"HTML image exceeds max_html_image_bytes={MAX_HTML_IMAGE_BYTES}")
|
|
241
256
|
self._charge_image_bytes(len(payload))
|
|
@@ -243,6 +258,41 @@ class HtmlResourceContext:
|
|
|
243
258
|
self._data_image_cache[data_uri] = resolved
|
|
244
259
|
return resolved
|
|
245
260
|
|
|
261
|
+
def _resolve_remote_image(self, remote_url: str, *, alt: str) -> ResolvedMarkupImage:
|
|
262
|
+
"""远程图片默认保持外链,来源显式开启下载时按缓存下载内嵌。"""
|
|
263
|
+
if not self.source_context.fetch_remote_images:
|
|
264
|
+
return ResolvedMarkupImage(image_url=remote_url, alt=alt)
|
|
265
|
+
if cached := self._remote_image_cache.get(remote_url):
|
|
266
|
+
return ResolvedMarkupImage(image_base64=cached, alt=alt)
|
|
267
|
+
data_uri = self._fetch_remote_image(remote_url)
|
|
268
|
+
if data_uri is None:
|
|
269
|
+
return ResolvedMarkupImage(image_url=remote_url, alt=alt)
|
|
270
|
+
self._remote_image_cache[remote_url] = data_uri
|
|
271
|
+
return ResolvedMarkupImage(image_base64=data_uri, alt=alt)
|
|
272
|
+
|
|
273
|
+
def _fetch_remote_image(self, remote_url: str) -> str | None:
|
|
274
|
+
"""在单图上限与超时约束内下载远程图片并复核签名,网络失败返回 None 退回外链。"""
|
|
275
|
+
try:
|
|
276
|
+
with urlopen(remote_url, timeout=MAX_REMOTE_IMAGE_FETCH_SECONDS) as response:
|
|
277
|
+
chunks: list[bytes] = []
|
|
278
|
+
remaining = MAX_HTML_IMAGE_BYTES + 1
|
|
279
|
+
while remaining > 0:
|
|
280
|
+
chunk = response.read(remaining)
|
|
281
|
+
if not chunk:
|
|
282
|
+
break
|
|
283
|
+
chunks.append(chunk)
|
|
284
|
+
remaining -= len(chunk)
|
|
285
|
+
except (OSError, ValueError):
|
|
286
|
+
return None
|
|
287
|
+
payload = b"".join(chunks)
|
|
288
|
+
if len(payload) > MAX_HTML_IMAGE_BYTES:
|
|
289
|
+
raise HtmlResourceLimitError(f"HTML image exceeds max_html_image_bytes={MAX_HTML_IMAGE_BYTES}")
|
|
290
|
+
data_uri = _image_data_uri(payload)
|
|
291
|
+
if data_uri is None:
|
|
292
|
+
return None
|
|
293
|
+
self._charge_image_bytes(len(payload))
|
|
294
|
+
return data_uri
|
|
295
|
+
|
|
246
296
|
def _charge_image_bytes(self, byte_count: int) -> None:
|
|
247
297
|
"""累计实际保留的图片字节,并在超限时终止整份文档。"""
|
|
248
298
|
self._image_bytes += byte_count
|
|
@@ -11,6 +11,7 @@ from loguru import logger
|
|
|
11
11
|
from metafile_render import MetafileError, MetafileResourceLimitError, render_metafile
|
|
12
12
|
from PIL import Image, ImageDraw, ImageFont, UnidentifiedImageError
|
|
13
13
|
|
|
14
|
+
from ....foundation._svg_raster import is_svg_image_part, looks_like_svg_payload, serialize_svg_image
|
|
14
15
|
from ....foundation.image_encoding import image_to_b64str
|
|
15
16
|
|
|
16
17
|
VECTOR_IMAGE_FORMATS = frozenset({"WMF", "EMF"})
|
|
@@ -267,6 +268,9 @@ def serialize_office_image(
|
|
|
267
268
|
return rendered
|
|
268
269
|
return serialize_vector_part_with_placeholder(part_name, content_type)
|
|
269
270
|
|
|
271
|
+
if is_svg_image_part(part_name, content_type) or looks_like_svg_payload(image_data):
|
|
272
|
+
return serialize_svg_image(image_data)
|
|
273
|
+
|
|
270
274
|
try:
|
|
271
275
|
pil_image = Image.open(BytesIO(image_data))
|
|
272
276
|
if is_vector_image(pil_image):
|
|
@@ -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
|
|
@@ -20,6 +20,7 @@ from .....content.spans import (
|
|
|
20
20
|
inline_span_plain_text,
|
|
21
21
|
strip_span_dicts,
|
|
22
22
|
)
|
|
23
|
+
from .....foundation._svg_raster import serialize_svg_image
|
|
23
24
|
from .....foundation.image_encoding import image_to_b64str
|
|
24
25
|
from .....schema import BlockType
|
|
25
26
|
from ..._shared.hyperlink import sanitize_hyperlink_target
|
|
@@ -108,16 +109,36 @@ def _style_html(text: str, style: TextStyle) -> str:
|
|
|
108
109
|
return rendered
|
|
109
110
|
|
|
110
111
|
|
|
112
|
+
_SVG_RENDER_DPI = 200
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _frame_render_size(frame: etree._Element | None) -> tuple[int, int] | None:
|
|
116
|
+
"""按 draw:frame 显示尺寸换算渲染像素,作为 SVG 光栅化的目标尺寸。"""
|
|
117
|
+
from .converters import _length_to_points
|
|
118
|
+
|
|
119
|
+
if frame is None:
|
|
120
|
+
return None
|
|
121
|
+
width = _length_to_points(frame.get(qname("svg", "width")))
|
|
122
|
+
height = _length_to_points(frame.get(qname("svg", "height")))
|
|
123
|
+
if width <= 0 or height <= 0:
|
|
124
|
+
return None
|
|
125
|
+
return (max(1, round(width / 72 * _SVG_RENDER_DPI)), max(1, round(height / 72 * _SVG_RENDER_DPI)))
|
|
126
|
+
|
|
127
|
+
|
|
111
128
|
def _serialize_odf_image(
|
|
112
129
|
image_bytes: bytes,
|
|
113
130
|
*,
|
|
114
131
|
part_name: str | None,
|
|
115
132
|
content_type: str | None,
|
|
133
|
+
size_hint: tuple[int, int] | None = None,
|
|
116
134
|
) -> str | None:
|
|
117
|
-
"""序列化 ODF 图片;SVG
|
|
135
|
+
"""序列化 ODF 图片;SVG 光栅化为 PNG,SVM 和 GDIMeta 使用安全占位图保留对象位置。"""
|
|
118
136
|
normalized_type = (content_type or "").split(";", 1)[0].strip().casefold()
|
|
119
137
|
suffix = (part_name or "").rsplit(".", 1)[-1].casefold() if "." in (part_name or "") else ""
|
|
120
138
|
if normalized_type == "image/svg+xml" or suffix == "svg":
|
|
139
|
+
rendered = serialize_svg_image(image_bytes, size_hint=size_hint)
|
|
140
|
+
if rendered is not None:
|
|
141
|
+
return rendered
|
|
121
142
|
placeholder = create_text_placeholder((320, 180), ["SVG image", "Preview unavailable"])
|
|
122
143
|
return image_to_b64str(placeholder, image_format="JPEG")
|
|
123
144
|
if suffix == "svm" or "gdimetafile" in normalized_type or image_bytes.startswith(b"VCLMTF"):
|
|
@@ -453,7 +474,7 @@ class OdfBlockParser:
|
|
|
453
474
|
style_name = element.get(qname("text", "style-name")) or inherited_style
|
|
454
475
|
level = self.styles.list_level(style_name, depth)
|
|
455
476
|
key = (style_name or "", depth)
|
|
456
|
-
start = level.start
|
|
477
|
+
start = level.start if level is not None else 1
|
|
457
478
|
continue_list = element.get(qname("text", "continue-list"))
|
|
458
479
|
if continue_list and continue_list in self._list_ids:
|
|
459
480
|
start = self._list_ids[continue_list]
|
|
@@ -466,17 +487,20 @@ class OdfBlockParser:
|
|
|
466
487
|
active_master: str | None = None
|
|
467
488
|
|
|
468
489
|
def flush_content(fragment_start: int) -> None:
|
|
469
|
-
"""把当前合法子块冻结为一个 LIST
|
|
490
|
+
"""把当前合法子块冻结为一个 LIST 分片;无标记列表按普通段落序列输出。"""
|
|
470
491
|
if content:
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
492
|
+
if level is None:
|
|
493
|
+
results.extend(content)
|
|
494
|
+
else:
|
|
495
|
+
block: dict[str, Any] = {
|
|
496
|
+
"type": BlockType.LIST,
|
|
497
|
+
"attribute": "ordered" if level.ordered else "unordered",
|
|
498
|
+
"ilevel": depth,
|
|
499
|
+
"content": list(content),
|
|
500
|
+
}
|
|
501
|
+
if level.ordered:
|
|
502
|
+
block["start"] = fragment_start
|
|
503
|
+
results.append(block)
|
|
480
504
|
content.clear()
|
|
481
505
|
if fragment_notes:
|
|
482
506
|
results.extend(fragment_notes)
|
|
@@ -709,7 +733,15 @@ class OdfBlockParser:
|
|
|
709
733
|
)
|
|
710
734
|
if not image_bytes:
|
|
711
735
|
return None, alt
|
|
712
|
-
return
|
|
736
|
+
return (
|
|
737
|
+
_serialize_odf_image(
|
|
738
|
+
image_bytes,
|
|
739
|
+
part_name=part_name,
|
|
740
|
+
content_type=content_type,
|
|
741
|
+
size_hint=_frame_render_size(parent),
|
|
742
|
+
),
|
|
743
|
+
alt,
|
|
744
|
+
)
|
|
713
745
|
|
|
714
746
|
def _object_root(self, object_element: etree._Element) -> tuple[etree._Element | None, str | None]:
|
|
715
747
|
"""读取 draw:object 指向的子文档内容树和成员路径。"""
|
|
@@ -875,6 +907,20 @@ class OdfBlockParser:
|
|
|
875
907
|
"""把单元格行内流中的 note marker 排入当前逻辑页队列。"""
|
|
876
908
|
self.notes.extend(atom.content for atom in atoms if isinstance(atom, InlineNote))
|
|
877
909
|
|
|
910
|
+
def _render_cell_paragraph(self, child: etree._Element, parts: list[str]) -> None:
|
|
911
|
+
"""把单元格里的一个裸段落渲染为 <p>,并回收行内块组的单元格子块。"""
|
|
912
|
+
atoms = self.parse_inline_atoms(child)
|
|
913
|
+
self._queue_inline_notes(atoms)
|
|
914
|
+
rendered_atoms = [atom for atom in atoms if not isinstance(atom, InlineImage)] if self._collect_cell_visuals else atoms
|
|
915
|
+
parts.append(f"<p>{render_atoms_to_html(rendered_atoms)}</p>")
|
|
916
|
+
for atom in atoms:
|
|
917
|
+
if isinstance(atom, InlineBlockGroup):
|
|
918
|
+
self._append_cell_blocks(
|
|
919
|
+
parts,
|
|
920
|
+
atom.blocks,
|
|
921
|
+
inline_image_rendered=atom.inline_image_rendered and not self._collect_cell_visuals,
|
|
922
|
+
)
|
|
923
|
+
|
|
878
924
|
def render_cell_html(self, cell: etree._Element) -> str:
|
|
879
925
|
"""把表格单元格中的段落、列表、嵌套表和 frame 转为 HTML。"""
|
|
880
926
|
parts: list[str] = []
|
|
@@ -882,19 +928,7 @@ class OdfBlockParser:
|
|
|
882
928
|
if not isinstance(child.tag, str):
|
|
883
929
|
continue
|
|
884
930
|
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
|
-
)
|
|
931
|
+
self._render_cell_paragraph(child, parts)
|
|
898
932
|
elif child.tag == qname("text", "list"):
|
|
899
933
|
parts.append(self._render_list_html(child))
|
|
900
934
|
elif child.tag == qname("table", "table"):
|
|
@@ -915,6 +949,8 @@ class OdfBlockParser:
|
|
|
915
949
|
"""把单元格内 ODF 列表递归渲染为 ol/ul HTML。"""
|
|
916
950
|
style_name = element.get(qname("text", "style-name")) or inherited_style
|
|
917
951
|
level = self.styles.list_level(style_name, depth)
|
|
952
|
+
if level is None:
|
|
953
|
+
return self._render_unmarked_list_html(element, depth=depth, inherited_style=style_name)
|
|
918
954
|
tag = "ol" if level.ordered else "ul"
|
|
919
955
|
start = f' start="{level.start}"' if level.ordered and level.start != 1 else ""
|
|
920
956
|
parts = [f"<{tag}{start}>"]
|
|
@@ -940,6 +976,30 @@ class OdfBlockParser:
|
|
|
940
976
|
parts.append(f"</{tag}>")
|
|
941
977
|
return "".join(parts)
|
|
942
978
|
|
|
979
|
+
def _render_unmarked_list_html(
|
|
980
|
+
self,
|
|
981
|
+
element: etree._Element,
|
|
982
|
+
*,
|
|
983
|
+
depth: int,
|
|
984
|
+
inherited_style: str | None,
|
|
985
|
+
) -> str:
|
|
986
|
+
"""把引用空列表样式(无可见标记)的单元格列表按裸段落序列渲染。"""
|
|
987
|
+
parts: list[str] = []
|
|
988
|
+
for item in element:
|
|
989
|
+
if not isinstance(item.tag, str) or item.tag not in {
|
|
990
|
+
qname("text", "list-item"),
|
|
991
|
+
qname("text", "list-header"),
|
|
992
|
+
}:
|
|
993
|
+
continue
|
|
994
|
+
for child in item:
|
|
995
|
+
if not isinstance(child.tag, str):
|
|
996
|
+
continue
|
|
997
|
+
if child.tag in {qname("text", "p"), qname("text", "h")}:
|
|
998
|
+
self._render_cell_paragraph(child, parts)
|
|
999
|
+
elif child.tag == qname("text", "list"):
|
|
1000
|
+
parts.append(self._render_list_html(child, depth=depth + 1, inherited_style=inherited_style))
|
|
1001
|
+
return "".join(part for part in parts if part)
|
|
1002
|
+
|
|
943
1003
|
def drain_notes(self) -> list[str]:
|
|
944
1004
|
"""取出当前累计脚注并清空共享队列。"""
|
|
945
1005
|
values = list(self.notes)
|
{docvortex-0.4.9 → docvortex-0.4.11}/src/docvortex/analyzers/native/office/pptx/resources.py
RENAMED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"""PPTX 图片、图表与公式资源,复用当前转换器的单文档状态。"""
|
|
2
2
|
|
|
3
|
-
import base64
|
|
4
3
|
from typing import Any, Optional
|
|
5
4
|
from loguru import logger
|
|
6
5
|
from pptx.enum.shapes import MSO_SHAPE_TYPE
|
|
@@ -222,11 +221,19 @@ class _PptxResources:
|
|
|
222
221
|
return
|
|
223
222
|
|
|
224
223
|
if content_type == "image/svg+xml":
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
224
|
+
img_base64 = serialize_office_image(image_bytes, content_type=content_type)
|
|
225
|
+
if img_base64 is None:
|
|
226
|
+
# SVG 光栅化失败时回退到 PowerPoint 为 SVG 原生伴随存储的栅量 blip。
|
|
227
|
+
fallback_data = self._get_shape_image_data(shape, include_svg=False)
|
|
228
|
+
if fallback_data is not None and fallback_data[1] != "image/svg+xml":
|
|
229
|
+
img_base64 = serialize_office_image(fallback_data[0], content_type=fallback_data[1])
|
|
230
|
+
if img_base64 is not None:
|
|
231
|
+
self.cur_page.append(
|
|
232
|
+
{
|
|
233
|
+
"type": BlockType.IMAGE,
|
|
234
|
+
"image_base64": img_base64,
|
|
235
|
+
}
|
|
236
|
+
)
|
|
230
237
|
return
|
|
231
238
|
|
|
232
239
|
img_base64 = serialize_office_image(
|
|
@@ -256,19 +263,14 @@ class _PptxResources:
|
|
|
256
263
|
)
|
|
257
264
|
|
|
258
265
|
@staticmethod
|
|
259
|
-
def
|
|
260
|
-
"""按原有图片、图表与公式资源规则执行 _bytes_to_data_uri,保持输入顺序与降级行为。"""
|
|
261
|
-
encoded = base64.b64encode(image_bytes).decode("utf-8")
|
|
262
|
-
return f"data:{content_type};base64,{encoded}"
|
|
263
|
-
|
|
264
|
-
@staticmethod
|
|
265
|
-
def _find_first_embedded_image_rid(shape) -> Optional[str]:
|
|
266
|
+
def _find_first_embedded_image_rid(shape, *, include_svg: bool = True) -> Optional[str]:
|
|
266
267
|
"""按原有图片、图表与公式资源规则执行 _find_first_embedded_image_rid,保持输入顺序与降级行为。"""
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
268
|
+
if include_svg:
|
|
269
|
+
svg_blips = shape._element.findall(f".//{{{SVG_BLIP_NS}}}svgBlip")
|
|
270
|
+
for svg_blip in svg_blips:
|
|
271
|
+
relationship_id = svg_blip.get(f"{{{RELATIONSHIP_NS}}}embed")
|
|
272
|
+
if relationship_id:
|
|
273
|
+
return relationship_id
|
|
272
274
|
|
|
273
275
|
blips = shape._element.findall(f".//{{{DRAWINGML_NS}}}blip")
|
|
274
276
|
for blip in blips:
|
|
@@ -296,11 +298,11 @@ class _PptxResources:
|
|
|
296
298
|
return False
|
|
297
299
|
return True
|
|
298
300
|
|
|
299
|
-
def _get_shape_image_data(self, shape) -> Optional[tuple[bytes, Optional[str]]]:
|
|
301
|
+
def _get_shape_image_data(self, shape, *, include_svg: bool = True) -> Optional[tuple[bytes, Optional[str]]]:
|
|
300
302
|
"""按原有图片、图表与公式资源规则执行 _get_shape_image_data,保持输入顺序与降级行为。"""
|
|
301
303
|
relationship_id = None
|
|
302
304
|
if hasattr(shape, "_element"):
|
|
303
|
-
relationship_id = self._find_first_embedded_image_rid(shape)
|
|
305
|
+
relationship_id = self._find_first_embedded_image_rid(shape, include_svg=include_svg)
|
|
304
306
|
|
|
305
307
|
if relationship_id:
|
|
306
308
|
try:
|
|
@@ -6,6 +6,7 @@ import re
|
|
|
6
6
|
|
|
7
7
|
from lxml import etree # type: ignore[reportMissingImports]
|
|
8
8
|
|
|
9
|
+
from ..foundation._text import normalize_formula_tag_content
|
|
9
10
|
from ..foundation.xml_names import local_name
|
|
10
11
|
|
|
11
12
|
_OPERATOR_MAP = {
|
|
@@ -71,6 +72,8 @@ _LATEX_MATH_TOKEN_ESCAPES = {
|
|
|
71
72
|
"}": r"\}",
|
|
72
73
|
"~": r"\~{}",
|
|
73
74
|
}
|
|
75
|
+
# Word 线性格式把公式编号分隔符写作 ``#(n)``;经 mo 转义后行尾呈现为 ``\#(n)``。
|
|
76
|
+
_EQUATION_TAG_RE = re.compile(r"\\#\s*\(([^()]*)\)\s*$")
|
|
74
77
|
|
|
75
78
|
|
|
76
79
|
def _escape_text(value: str) -> str:
|
|
@@ -83,6 +86,22 @@ def _escape_math_token(value: str) -> str:
|
|
|
83
86
|
return "".join(_LATEX_MATH_TOKEN_ESCAPES.get(char, char) for char in value)
|
|
84
87
|
|
|
85
88
|
|
|
89
|
+
def _tag_equation_number(latex: str) -> str | None:
|
|
90
|
+
"""把 Word 公式编号分隔符残留的行尾 ``\\#(n)`` 转换为 LaTeX ``\\tag``。
|
|
91
|
+
|
|
92
|
+
参考 OMML 转换器 ``do_eqarr`` 的既有语义:单行公式数组末尾的编号
|
|
93
|
+
``#(n)`` 输出为 ``公式\\tag{n}``,同时避免 ``\\tag`` 进入 matrix 环境。
|
|
94
|
+
"""
|
|
95
|
+
match = _EQUATION_TAG_RE.search(latex)
|
|
96
|
+
if match is None:
|
|
97
|
+
return None
|
|
98
|
+
formula = latex[: match.start()].rstrip()
|
|
99
|
+
tag_content = normalize_formula_tag_content(match.group(1))
|
|
100
|
+
if not formula or not tag_content:
|
|
101
|
+
return None
|
|
102
|
+
return rf"{formula}\tag{{{tag_content}}}"
|
|
103
|
+
|
|
104
|
+
|
|
86
105
|
def _children(element: etree._Element) -> list[etree._Element]:
|
|
87
106
|
"""返回当前元素的全部普通 XML 子元素。"""
|
|
88
107
|
return [child for child in element if isinstance(child.tag, str)]
|
|
@@ -107,7 +126,7 @@ def _convert(element: etree._Element) -> str:
|
|
|
107
126
|
if name in {"mi", "mn"}:
|
|
108
127
|
return _GREEK_MAP.get(text, _escape_math_token(text))
|
|
109
128
|
if name == "mo":
|
|
110
|
-
return _OPERATOR_MAP.get(text, text)
|
|
129
|
+
return _OPERATOR_MAP.get(text, _escape_math_token(text))
|
|
111
130
|
if name == "mtext":
|
|
112
131
|
return rf"\text{{{_escape_text(text)}}}"
|
|
113
132
|
if name == "mspace":
|
|
@@ -139,6 +158,8 @@ def _convert(element: etree._Element) -> str:
|
|
|
139
158
|
return rf"\left{opening}{separators[0].join(values)}\right{closing}"
|
|
140
159
|
if name == "mtable":
|
|
141
160
|
rows = [_convert(child) for child in children if local_name(child) in {"mtr", "mlabeledtr"}]
|
|
161
|
+
if len(rows) == 1 and (tagged := _tag_equation_number(rows[0])) is not None:
|
|
162
|
+
return tagged
|
|
142
163
|
return r"\begin{matrix}" + r" \\ ".join(rows) + r"\end{matrix}"
|
|
143
164
|
if name in {"mtr", "mlabeledtr"}:
|
|
144
165
|
return " & ".join(_convert(child) for child in children)
|
|
@@ -160,7 +181,7 @@ def mathml_to_latex(math_element: etree._Element) -> str | None:
|
|
|
160
181
|
if "tex" in encoding and (annotation.text or "").strip():
|
|
161
182
|
return (annotation.text or "").strip()
|
|
162
183
|
latex = _convert(math_element).strip()
|
|
163
|
-
return latex or None
|
|
184
|
+
return _tag_equation_number(latex) or latex or None
|
|
164
185
|
|
|
165
186
|
|
|
166
187
|
__all__ = ["mathml_to_latex"]
|
|
@@ -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"]
|