docvortex 0.4.21__tar.gz → 0.4.23__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.21/src/docvortex.egg-info → docvortex-0.4.23}/PKG-INFO +12 -10
- {docvortex-0.4.21 → docvortex-0.4.23}/README.md +11 -9
- {docvortex-0.4.21 → docvortex-0.4.23}/schemas/middle-2.0.json +1 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/schemas/model-2.0.json +1 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/converter.py +4 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/selector.py +31 -0
- docvortex-0.4.23/src/docvortex/analyzers/native/mhtml/__init__.py +3 -0
- docvortex-0.4.23/src/docvortex/analyzers/native/mhtml/converter.py +73 -0
- docvortex-0.4.23/src/docvortex/analyzers/native/mhtml/resources.py +80 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/tables.py +18 -2
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/image.py +52 -18
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/limits.py +2 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/metadata.py +7 -5
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/models.py +98 -1
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/native_text.py +48 -1
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_annotations.py +221 -66
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_detection.py +9 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_rules.py +526 -180
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/api.py +9 -1
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/detection.py +10 -1
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/filetypes.py +19 -1
- docvortex-0.4.23/src/docvortex/document/mhtml.py +258 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/metadata.py +33 -12
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/schema.py +1 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/version.py +1 -1
- {docvortex-0.4.21 → docvortex-0.4.23/src/docvortex.egg-info}/PKG-INFO +12 -10
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/SOURCES.txt +6 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/benchmarks/flash_pdf.py +53 -3
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_document_metadata.py +29 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_format_matrix.py +23 -2
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_image_mtef_test_utils.py +14 -0
- docvortex-0.4.23/tests/unittest/_mhtml_test_utils.py +67 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_special_char_tables.py +39 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_image_mtef.py +54 -4
- docvortex-0.4.23/tests/unittest/test_flash_mhtml.py +299 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_tables.py +249 -1
- {docvortex-0.4.21 → docvortex-0.4.23}/LICENSE.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/MANIFEST.in +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/README.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/demo.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/METADATA.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/USAGE.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-manual-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-round2-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-rule-generalization-2026-09-15.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-title-coverage-2026-09-16.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/docs/sdk-0.4.md +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/pyproject.toml +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/setup.cfg +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/region_discovery.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/_document.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/dedup.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/_images.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_svg_raster.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/options.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/result.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_manual_annotations.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_manual_review_decisions.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_reviewed_history.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round2_annotations.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round2_review_decisions.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round3_annotations.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round3_review_decisions.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/pdf_char_dedup.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/pdf_numeric_citations_review.json +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_architecture.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_cli_logging.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_export_image_names.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_history_geometry_tools.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_cpu_evidence.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_numeric_citations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_release_ci_gate.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/numeric_citations_introduction.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_manual_annotations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_short_tails.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_round2_annotations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_round3_annotations.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_rule_generalization.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_spatial_evidence.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_cjk_objects.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_object_clipping.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_text_dedup.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_svg_raster.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tools/__init__.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tools/build_html_css.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.21 → docvortex-0.4.23}/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.23
|
|
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
|
|
@@ -127,17 +127,19 @@ use `overwrite=True` in Python or `--overwrite` in the CLI to replace them.
|
|
|
127
127
|
|
|
128
128
|
## Supported formats
|
|
129
129
|
|
|
130
|
-
### Native inputs ·
|
|
130
|
+
### Native inputs · 17 formats
|
|
131
131
|
|
|
132
|
-
| Document family |
|
|
132
|
+
| Document family | File extensions |
|
|
133
133
|
| --- | --- |
|
|
134
|
-
| PDF with native text |
|
|
135
|
-
| Word & rich text |
|
|
136
|
-
| Presentations |
|
|
137
|
-
| Spreadsheets |
|
|
138
|
-
| OpenDocument |
|
|
139
|
-
| E-books
|
|
140
|
-
|
|
|
134
|
+
| PDF with native text | `.pdf` |
|
|
135
|
+
| Word & rich text | `.doc`, `.docx`, `.rtf` |
|
|
136
|
+
| Presentations | `.ppt`, `.pptx` |
|
|
137
|
+
| Spreadsheets | `.xls`, `.xlsx`, `.csv`, `.tsv` |
|
|
138
|
+
| OpenDocument | `.odt`, `.ods`, `.odp` |
|
|
139
|
+
| E-books | `.epub` |
|
|
140
|
+
| Web documents | `.html`, `.htm`, `.shtml` |
|
|
141
|
+
| Web archives | `.mhtml`, `.mht` |
|
|
142
|
+
| Open Fixed-layout Document | `.ofd` |
|
|
141
143
|
|
|
142
144
|
### Outputs · 7 formats
|
|
143
145
|
|
|
@@ -73,17 +73,19 @@ use `overwrite=True` in Python or `--overwrite` in the CLI to replace them.
|
|
|
73
73
|
|
|
74
74
|
## Supported formats
|
|
75
75
|
|
|
76
|
-
### Native inputs ·
|
|
76
|
+
### Native inputs · 17 formats
|
|
77
77
|
|
|
78
|
-
| Document family |
|
|
78
|
+
| Document family | File extensions |
|
|
79
79
|
| --- | --- |
|
|
80
|
-
| PDF with native text |
|
|
81
|
-
| Word & rich text |
|
|
82
|
-
| Presentations |
|
|
83
|
-
| Spreadsheets |
|
|
84
|
-
| OpenDocument |
|
|
85
|
-
| E-books
|
|
86
|
-
|
|
|
80
|
+
| PDF with native text | `.pdf` |
|
|
81
|
+
| Word & rich text | `.doc`, `.docx`, `.rtf` |
|
|
82
|
+
| Presentations | `.ppt`, `.pptx` |
|
|
83
|
+
| Spreadsheets | `.xls`, `.xlsx`, `.csv`, `.tsv` |
|
|
84
|
+
| OpenDocument | `.odt`, `.ods`, `.odp` |
|
|
85
|
+
| E-books | `.epub` |
|
|
86
|
+
| Web documents | `.html`, `.htm`, `.shtml` |
|
|
87
|
+
| Web archives | `.mhtml`, `.mht` |
|
|
88
|
+
| Open Fixed-layout Document | `.ofd` |
|
|
87
89
|
|
|
88
90
|
### Outputs · 7 formats
|
|
89
91
|
|
|
@@ -41,6 +41,10 @@ class HtmlConverter:
|
|
|
41
41
|
raise HtmlResourceLimitError(f"HTML resource limit exceeded: max_html_bytes={MAX_HTML_BYTES}")
|
|
42
42
|
document = parse_html_document(file_bytes, source_context)
|
|
43
43
|
resources = HtmlResourceContext(document.source_context, base_href=document.base_href)
|
|
44
|
+
self._convert_document(document, resources)
|
|
45
|
+
|
|
46
|
+
def _convert_document(self, document: HtmlDocument, resources: HtmlResourceContext) -> None:
|
|
47
|
+
"""复用已解析 DOM 和资源适配器,供 HTML 与网页归档共享正文投影。"""
|
|
44
48
|
wire_result = decode_docvortex_html_wire(document.body, resources)
|
|
45
49
|
if wire_result.blocks is not None:
|
|
46
50
|
blocks = wire_result.blocks
|
|
@@ -331,6 +331,7 @@ def _is_containment_equivalent(first: _ScoredCandidate, second: _ScoredCandidate
|
|
|
331
331
|
|
|
332
332
|
def _soft_prune(root: etree._Element) -> None:
|
|
333
333
|
"""在候选副本中删除确定的导航/表单和高噪声 token 子树。"""
|
|
334
|
+
_prune_article_comments(root)
|
|
334
335
|
metrics_by_element = _collect_soft_prune_metrics(root)
|
|
335
336
|
for element in list(root.iterdescendants()):
|
|
336
337
|
if not isinstance(element.tag, str):
|
|
@@ -349,6 +350,36 @@ def _soft_prune(root: etree._Element) -> None:
|
|
|
349
350
|
_drop_tree_preserve_tail(element)
|
|
350
351
|
|
|
351
352
|
|
|
353
|
+
def _is_comment_region(element: etree._Element) -> bool:
|
|
354
|
+
"""按完整词与驼峰边界识别评论容器,不匹配正文文本或任意子串。"""
|
|
355
|
+
value = f"{element.get('id') or ''} {element.get('class') or ''}"
|
|
356
|
+
value = re.sub(r"([a-z0-9])([A-Z])", r"\1 \2", value).casefold()
|
|
357
|
+
return bool(frozenset(_TOKEN_RE.split(value)) & {"comment", "comments"})
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def _prune_article_comments(root: etree._Element) -> None:
|
|
361
|
+
"""仅在单篇独立文章明确存在时移除附属评论,保留论坛及讨论型正文。"""
|
|
362
|
+
articles = [
|
|
363
|
+
element
|
|
364
|
+
for element in root.iter()
|
|
365
|
+
if isinstance(element.tag, str)
|
|
366
|
+
and (local_name(element) == "article" or "articlebody" in (element.get("itemprop") or "").casefold().split())
|
|
367
|
+
and not any(_is_comment_region(parent) for parent in (element, *element.iterancestors()))
|
|
368
|
+
and len(_normalized_text(" ".join(element.itertext()))) >= _MIN_TEXT_CHARS
|
|
369
|
+
]
|
|
370
|
+
# 嵌套 articleBody 与 article 属于同一正文;多个独立 article 按论坛处理。
|
|
371
|
+
outer_articles = [element for element in articles if not any(parent in articles for parent in element.iterancestors())]
|
|
372
|
+
if len(outer_articles) != 1:
|
|
373
|
+
return
|
|
374
|
+
article = outer_articles[0]
|
|
375
|
+
for element in list(root.iterdescendants()):
|
|
376
|
+
if not isinstance(element.tag, str) or not _is_comment_region(element):
|
|
377
|
+
continue
|
|
378
|
+
if element is article or element in article.iterancestors():
|
|
379
|
+
continue
|
|
380
|
+
_drop_tree_preserve_tail(element)
|
|
381
|
+
|
|
382
|
+
|
|
352
383
|
def _collect_soft_prune_metrics(root: etree._Element) -> dict[etree._Element, _SoftPruneMetrics]:
|
|
353
384
|
"""单次后序遍历预计算每个元素的完整子树文本、链接和语义对象统计。"""
|
|
354
385
|
elements = [element for element in root.iter() if isinstance(element.tag, str)]
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""把 MHTML 主文档及归档资源投影为现有 HTML 语义块。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import BinaryIO
|
|
6
|
+
|
|
7
|
+
from docvortex.document.contracts import HtmlSourceContext
|
|
8
|
+
from docvortex.document.mhtml import MAX_ARCHIVE_BYTES, MhtmlArchive
|
|
9
|
+
from docvortex.result import Diagnostic
|
|
10
|
+
from docvortex.schema import DocumentProperties
|
|
11
|
+
|
|
12
|
+
from ..html.converter import HtmlConverter
|
|
13
|
+
from ..html.document import HtmlDocument, parse_html_document
|
|
14
|
+
from ..html.metadata import read_html_properties
|
|
15
|
+
from .resources import MhtmlResourceContext
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def read_archive_properties(archive: MhtmlArchive) -> tuple[DocumentProperties, list[str]]:
|
|
19
|
+
"""复用 HTML 声明元数据,仅用 MIME Subject 补充缺失标题。"""
|
|
20
|
+
properties, warnings = read_html_properties(archive.html, archive.source_context)
|
|
21
|
+
properties.title = properties.title or archive.subject
|
|
22
|
+
return properties, warnings
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class MhtmlConverter(HtmlConverter):
|
|
26
|
+
"""通过一次解包生成正文、元数据和可选资源诊断。"""
|
|
27
|
+
|
|
28
|
+
def __init__(self) -> None:
|
|
29
|
+
"""初始化与单次转换绑定的元数据及诊断。"""
|
|
30
|
+
super().__init__()
|
|
31
|
+
self.properties = DocumentProperties()
|
|
32
|
+
self.diagnostics: tuple[Diagnostic, ...] = ()
|
|
33
|
+
|
|
34
|
+
def convert(self, file_binary: BinaryIO, *, source_context: HtmlSourceContext | None = None) -> None:
|
|
35
|
+
"""加载主 HTML 后调用共享投影,不合并 iframe 或其他 HTML 附件。"""
|
|
36
|
+
archive = MhtmlArchive(file_binary.read(MAX_ARCHIVE_BYTES + 1), source_context)
|
|
37
|
+
self.properties, warnings = read_archive_properties(archive)
|
|
38
|
+
document = parse_html_document(archive.html, archive.source_context)
|
|
39
|
+
if document.title is None and archive.subject:
|
|
40
|
+
from dataclasses import replace
|
|
41
|
+
|
|
42
|
+
document = replace(document, title=archive.subject)
|
|
43
|
+
resources = MhtmlResourceContext(archive, base_href=document.base_href)
|
|
44
|
+
_restore_picture_sources(document, archive)
|
|
45
|
+
self._convert_document(document, resources)
|
|
46
|
+
self.diagnostics = tuple(Diagnostic("read_metadata_failed", warning) for warning in warnings) + tuple(
|
|
47
|
+
archive.diagnostics
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _restore_picture_sources(document: HtmlDocument, archive: MhtmlArchive) -> None:
|
|
52
|
+
"""当回退图片未归档时采用已保存的 picture/srcset 候选,不发起外部请求。"""
|
|
53
|
+
for image in document.body.iter("img"):
|
|
54
|
+
if (image.get("src") or "").strip().casefold().startswith("data:"):
|
|
55
|
+
continue
|
|
56
|
+
if archive.find(image.get("src") or "", base_href=document.base_href) is not None:
|
|
57
|
+
continue
|
|
58
|
+
picture = next((parent for parent in image.iterancestors() if parent.tag == "picture"), None)
|
|
59
|
+
sources = list(picture.iter("source")) if picture is not None else []
|
|
60
|
+
for source in [*sources, image]:
|
|
61
|
+
# 浏览器归档中的网络候选按逗号分隔;data URI 无需做归档匹配。
|
|
62
|
+
candidates = (source.get("srcset") or "").split(",")
|
|
63
|
+
selected = next(
|
|
64
|
+
(
|
|
65
|
+
fields[0]
|
|
66
|
+
for candidate in candidates
|
|
67
|
+
if (fields := candidate.split()) and archive.find(fields[0], base_href=document.base_href) is not None
|
|
68
|
+
),
|
|
69
|
+
None,
|
|
70
|
+
)
|
|
71
|
+
if selected:
|
|
72
|
+
image.set("src", selected)
|
|
73
|
+
break
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""使用 MIME 内嵌图片和样式的 HTML 资源适配器。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from docvortex.content.markup import ResolvedMarkupImage
|
|
6
|
+
from docvortex.document.mhtml import ArchivePart, MhtmlArchive, MhtmlParseError
|
|
7
|
+
from docvortex.foundation._svg_raster import looks_like_svg_payload, serialize_svg_image
|
|
8
|
+
|
|
9
|
+
from ..html.constants import MAX_HTML_IMAGE_BYTES
|
|
10
|
+
from ..html.errors import HtmlResourceLimitError
|
|
11
|
+
from ..html.resources import HtmlResourceContext, _image_data_uri
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MhtmlResourceContext(HtmlResourceContext):
|
|
15
|
+
"""仅从归档读取资源,复用 HTML 的链接、图片校验和字节预算。"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, archive: MhtmlArchive, *, base_href: str | None = None) -> None:
|
|
18
|
+
"""绑定归档并初始化以 MIME 部件为键的去重缓存。"""
|
|
19
|
+
super().__init__(archive.source_context, base_href=base_href)
|
|
20
|
+
self.archive = archive
|
|
21
|
+
self._archive_images: dict[ArchivePart, str | None] = {}
|
|
22
|
+
self._archive_stylesheets: dict[ArchivePart, str | None] = {}
|
|
23
|
+
|
|
24
|
+
def _payload(self, part: ArchivePart, reference: str) -> bytes | None:
|
|
25
|
+
"""可选部件损坏时记录诊断;资源限额错误仍向调用方传播。"""
|
|
26
|
+
try:
|
|
27
|
+
return self.archive.decode(part)
|
|
28
|
+
except MhtmlParseError:
|
|
29
|
+
self.archive.report("mhtml_resource_invalid", reference)
|
|
30
|
+
return None
|
|
31
|
+
|
|
32
|
+
def resolve_image(self, source: str, *, alt: str = "") -> ResolvedMarkupImage | None:
|
|
33
|
+
"""优先恢复归档图片,缺失时沿用安全外链或替代文本降级。"""
|
|
34
|
+
if not source.strip() or source.strip().casefold().startswith("data:"):
|
|
35
|
+
return super().resolve_image(source, alt=alt)
|
|
36
|
+
part = self.archive.find(source, base_href=self.base_href)
|
|
37
|
+
if part is None:
|
|
38
|
+
self.archive.report("mhtml_resource_missing", source)
|
|
39
|
+
return super().resolve_image(source, alt=alt)
|
|
40
|
+
if part not in self._archive_images:
|
|
41
|
+
payload = self._payload(part, source)
|
|
42
|
+
data_uri = None
|
|
43
|
+
if payload is not None:
|
|
44
|
+
if len(payload) > MAX_HTML_IMAGE_BYTES:
|
|
45
|
+
raise HtmlResourceLimitError(f"MHTML image exceeds max_html_image_bytes={MAX_HTML_IMAGE_BYTES}")
|
|
46
|
+
if looks_like_svg_payload(payload):
|
|
47
|
+
data_uri = serialize_svg_image(payload)
|
|
48
|
+
else:
|
|
49
|
+
data_uri = _image_data_uri(payload)
|
|
50
|
+
if data_uri is not None:
|
|
51
|
+
self._charge_image_bytes(len(payload))
|
|
52
|
+
else:
|
|
53
|
+
self.archive.report("mhtml_resource_invalid", source)
|
|
54
|
+
self._archive_images[part] = data_uri
|
|
55
|
+
if data_uri := self._archive_images[part]:
|
|
56
|
+
return ResolvedMarkupImage(image_base64=data_uri, alt=alt)
|
|
57
|
+
return super().resolve_image(source, alt=alt)
|
|
58
|
+
|
|
59
|
+
def load_stylesheet(self, href: str) -> str | None:
|
|
60
|
+
"""按 HTML 源顺序读取归档 CSS,仅解释现有静态样式子集。"""
|
|
61
|
+
part = self.archive.find(href, base_href=self.base_href)
|
|
62
|
+
if part is None:
|
|
63
|
+
self.archive.report("mhtml_resource_missing", href)
|
|
64
|
+
return None
|
|
65
|
+
if part in self._archive_stylesheets:
|
|
66
|
+
return self._archive_stylesheets[part]
|
|
67
|
+
payload = self._payload(part, href)
|
|
68
|
+
text = None
|
|
69
|
+
if payload is not None:
|
|
70
|
+
if part.message.get_content_type() != "text/css":
|
|
71
|
+
self.archive.report("mhtml_resource_invalid", href)
|
|
72
|
+
else:
|
|
73
|
+
self._charge_stylesheet_bytes(len(payload))
|
|
74
|
+
try:
|
|
75
|
+
text = payload.decode(part.message.get_content_charset() or "utf-8-sig", errors="replace")
|
|
76
|
+
except LookupError:
|
|
77
|
+
self.archive.report("mhtml_resource_invalid", href)
|
|
78
|
+
text = payload.decode("utf-8-sig", errors="replace")
|
|
79
|
+
self._archive_stylesheets[part] = text
|
|
80
|
+
return text
|
|
@@ -185,7 +185,8 @@ class _DocxTables:
|
|
|
185
185
|
"""提取与 Mammoth 渲染规则一致的 XML 表格轻量签名。
|
|
186
186
|
|
|
187
187
|
按文档顺序收集 w:t 及特殊字符元素,并且只处理 WordprocessingML
|
|
188
|
-
命名空间,以排除 Mammoth 不渲染的 OMML m:t
|
|
188
|
+
命名空间,以排除 Mammoth 不渲染的 OMML m:t 公式文本。纵向合并的
|
|
189
|
+
continuation 单元格会被 Mammoth 折叠掉,因此其整个子树也不参与文本签名。
|
|
189
190
|
"""
|
|
190
191
|
w_ns = _DocxConstants._BLIP_NAMESPACES["w"]
|
|
191
192
|
char_tags = (
|
|
@@ -194,7 +195,22 @@ class _DocxTables:
|
|
|
194
195
|
f"{{{w_ns}}}softHyphen",
|
|
195
196
|
f"{{{w_ns}}}sym",
|
|
196
197
|
)
|
|
197
|
-
|
|
198
|
+
continuation_nodes = set()
|
|
199
|
+
for cell in xml_table.iter(f"{{{w_ns}}}tc"):
|
|
200
|
+
properties = cell.find(f"{{{w_ns}}}tcPr")
|
|
201
|
+
vmerge = properties.find(f"{{{w_ns}}}vMerge") if properties is not None else None
|
|
202
|
+
if vmerge is None:
|
|
203
|
+
continue
|
|
204
|
+
# Mammoth 将缺少 val 或 val=continue 的单元格视为 continuation,
|
|
205
|
+
# 并在计算 rowspan 时丢弃该单元格的全部内容。
|
|
206
|
+
if vmerge.get(f"{{{w_ns}}}val") in (None, "continue"):
|
|
207
|
+
continuation_nodes.update(cell.iter())
|
|
208
|
+
|
|
209
|
+
text = "".join(
|
|
210
|
+
_DocxTables._xml_table_char_fragment(node)
|
|
211
|
+
for node in xml_table.iter()
|
|
212
|
+
if node not in continuation_nodes and node.tag in char_tags
|
|
213
|
+
)
|
|
198
214
|
return {
|
|
199
215
|
"row_count": len(xml_table.xpath('.//*[local-name()="tr"]')),
|
|
200
216
|
"cell_count": len(xml_table.xpath('.//*[local-name()="tc"]')),
|
{docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/image.py
RENAMED
|
@@ -10,7 +10,7 @@ import struct
|
|
|
10
10
|
from loguru import logger
|
|
11
11
|
|
|
12
12
|
from ..errors import LegacyOfficeResourceLimitError
|
|
13
|
-
from ..limits import
|
|
13
|
+
from ..limits import MAX_ENTRY_BYTES, MAX_EQUATION_CANDIDATE_TOTAL_BYTES, MAX_PICTURE_RECORDS, MAX_RECORDS
|
|
14
14
|
from .mtef import decode_mtef
|
|
15
15
|
|
|
16
16
|
_PLACEABLE_WMF_MAGIC = b"\xd7\xcd\xc6\x9a"
|
|
@@ -271,14 +271,18 @@ def _wmf_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
|
|
|
271
271
|
def _gif_subblocks(
|
|
272
272
|
image_data: bytes,
|
|
273
273
|
cursor: int,
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
274
|
+
*,
|
|
275
|
+
collect_payload: bool,
|
|
276
|
+
subblock_counter: list[int],
|
|
277
|
+
) -> tuple[bytes | None, int]:
|
|
278
|
+
"""读取 GIF sub-block 序列;仅对已识别的公式扩展保留 payload。"""
|
|
277
279
|
|
|
278
280
|
chunks: list[bytes] = []
|
|
279
281
|
total = 0
|
|
280
282
|
while True:
|
|
281
|
-
|
|
283
|
+
subblock_counter[0] += 1
|
|
284
|
+
if subblock_counter[0] > MAX_RECORDS:
|
|
285
|
+
raise LegacyOfficeResourceLimitError(f"GIF sub-block count exceeds max_records={MAX_RECORDS}")
|
|
282
286
|
if cursor >= len(image_data):
|
|
283
287
|
raise _ImageEquationError("GIF sub-block length is truncated")
|
|
284
288
|
size = image_data[cursor]
|
|
@@ -290,8 +294,9 @@ def _gif_subblocks(
|
|
|
290
294
|
raise _ImageEquationError("GIF sub-block data is truncated")
|
|
291
295
|
total += size
|
|
292
296
|
if total > MAX_ENTRY_BYTES:
|
|
293
|
-
raise LegacyOfficeResourceLimitError(f"GIF
|
|
294
|
-
|
|
297
|
+
raise LegacyOfficeResourceLimitError(f"GIF sub-block payload exceeds max_entry_bytes={MAX_ENTRY_BYTES}")
|
|
298
|
+
if collect_payload:
|
|
299
|
+
chunks.append(image_data[cursor:end])
|
|
295
300
|
cursor = end
|
|
296
301
|
|
|
297
302
|
|
|
@@ -310,6 +315,7 @@ def _gif_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
|
|
|
310
315
|
candidates: list[bytes] = []
|
|
311
316
|
recognized = False
|
|
312
317
|
counter = [0]
|
|
318
|
+
subblock_counter = [0]
|
|
313
319
|
saw_trailer = False
|
|
314
320
|
while cursor < len(image_data):
|
|
315
321
|
_charge_picture_record(counter)
|
|
@@ -328,7 +334,12 @@ def _gif_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
|
|
|
328
334
|
if cursor >= len(image_data):
|
|
329
335
|
raise _ImageEquationError("GIF image data is truncated")
|
|
330
336
|
cursor += 1 # LZW minimum code size
|
|
331
|
-
_image_payload, cursor = _gif_subblocks(
|
|
337
|
+
_image_payload, cursor = _gif_subblocks(
|
|
338
|
+
image_data,
|
|
339
|
+
cursor,
|
|
340
|
+
collect_payload=False,
|
|
341
|
+
subblock_counter=subblock_counter,
|
|
342
|
+
)
|
|
332
343
|
continue
|
|
333
344
|
if marker != 0x21:
|
|
334
345
|
raise _ImageEquationError("GIF block marker is invalid")
|
|
@@ -337,7 +348,12 @@ def _gif_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
|
|
|
337
348
|
extension_label = image_data[cursor]
|
|
338
349
|
cursor += 1
|
|
339
350
|
if extension_label != 0xFF:
|
|
340
|
-
_payload, cursor = _gif_subblocks(
|
|
351
|
+
_payload, cursor = _gif_subblocks(
|
|
352
|
+
image_data,
|
|
353
|
+
cursor,
|
|
354
|
+
collect_payload=False,
|
|
355
|
+
subblock_counter=subblock_counter,
|
|
356
|
+
)
|
|
341
357
|
continue
|
|
342
358
|
if cursor >= len(image_data):
|
|
343
359
|
raise _ImageEquationError("GIF application block size is truncated")
|
|
@@ -348,12 +364,24 @@ def _gif_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
|
|
|
348
364
|
raise _ImageEquationError("GIF application identifier is truncated")
|
|
349
365
|
application = image_data[cursor:application_end]
|
|
350
366
|
cursor = application_end
|
|
351
|
-
payload, cursor = _gif_subblocks(image_data, cursor, counter)
|
|
352
367
|
if application_size != 11:
|
|
368
|
+
_payload, cursor = _gif_subblocks(
|
|
369
|
+
image_data,
|
|
370
|
+
cursor,
|
|
371
|
+
collect_payload=False,
|
|
372
|
+
subblock_counter=subblock_counter,
|
|
373
|
+
)
|
|
353
374
|
continue
|
|
354
375
|
application_id = application[:8]
|
|
355
376
|
authentication = application[8:11]
|
|
356
|
-
|
|
377
|
+
is_mathtype = application_id == b"MathType" and authentication == b"001"
|
|
378
|
+
payload, cursor = _gif_subblocks(
|
|
379
|
+
image_data,
|
|
380
|
+
cursor,
|
|
381
|
+
collect_payload=is_mathtype,
|
|
382
|
+
subblock_counter=subblock_counter,
|
|
383
|
+
)
|
|
384
|
+
if is_mathtype and payload is not None:
|
|
357
385
|
recognized = True
|
|
358
386
|
candidates.append(payload)
|
|
359
387
|
# MathType/002 是 baseline,必须明确忽略。
|
|
@@ -406,6 +434,12 @@ class OfficeImageEquationDecoder:
|
|
|
406
434
|
_cache: dict[tuple[str, bytes], str | None] = field(default_factory=dict)
|
|
407
435
|
_warned: set[tuple[str, bytes]] = field(default_factory=set)
|
|
408
436
|
|
|
437
|
+
@property
|
|
438
|
+
def candidate_total_bytes(self) -> int:
|
|
439
|
+
"""返回已计入预算的公式 candidate 总字节数。"""
|
|
440
|
+
|
|
441
|
+
return self.total_bytes
|
|
442
|
+
|
|
409
443
|
def decode(
|
|
410
444
|
self,
|
|
411
445
|
image_data: object | None,
|
|
@@ -421,23 +455,23 @@ class OfficeImageEquationDecoder:
|
|
|
421
455
|
if image_format is None:
|
|
422
456
|
return None
|
|
423
457
|
if len(image_data) > MAX_ENTRY_BYTES:
|
|
424
|
-
raise LegacyOfficeResourceLimitError(f"image
|
|
458
|
+
raise LegacyOfficeResourceLimitError(f"office image exceeds max_entry_bytes={MAX_ENTRY_BYTES}")
|
|
425
459
|
digest = hashlib.sha256(image_data).digest()
|
|
426
460
|
cache_key = (image_format, digest)
|
|
427
461
|
if cache_key in self._cache:
|
|
428
462
|
return self._cache[cache_key]
|
|
429
|
-
if self.total_bytes + len(image_data) > MAX_ASSET_TOTAL_BYTES:
|
|
430
|
-
raise LegacyOfficeResourceLimitError(
|
|
431
|
-
f"image equation payloads exceed max_asset_total_bytes={MAX_ASSET_TOTAL_BYTES}"
|
|
432
|
-
)
|
|
433
|
-
self.total_bytes += len(image_data)
|
|
434
|
-
|
|
435
463
|
recognized = False
|
|
436
464
|
try:
|
|
437
465
|
if image_format == "wmf":
|
|
438
466
|
candidates, recognized = _wmf_mtef_candidates(image_data)
|
|
439
467
|
else:
|
|
440
468
|
candidates, recognized = _gif_mtef_candidates(image_data)
|
|
469
|
+
candidate_bytes = sum(len(candidate) for candidate in candidates)
|
|
470
|
+
if self.total_bytes + candidate_bytes > MAX_EQUATION_CANDIDATE_TOTAL_BYTES:
|
|
471
|
+
raise LegacyOfficeResourceLimitError(
|
|
472
|
+
f"image equation candidates exceed max_equation_candidate_total_bytes={MAX_EQUATION_CANDIDATE_TOTAL_BYTES}"
|
|
473
|
+
)
|
|
474
|
+
self.total_bytes += candidate_bytes
|
|
441
475
|
latex = _select_candidate_latex(candidates)
|
|
442
476
|
except LegacyOfficeResourceLimitError:
|
|
443
477
|
raise
|
|
@@ -5,6 +5,8 @@ from typing import Final
|
|
|
5
5
|
MAX_ENTRY_BYTES: Final = 128 * 1024 * 1024
|
|
6
6
|
MAX_TOTAL_BYTES: Final = 512 * 1024 * 1024
|
|
7
7
|
MAX_ASSET_TOTAL_BYTES: Final = 128 * 1024 * 1024
|
|
8
|
+
# 公式探测单独计费,避免普通图片耗尽嵌入素材预算;初始值与素材预算保持一致。
|
|
9
|
+
MAX_EQUATION_CANDIDATE_TOTAL_BYTES: Final = 128 * 1024 * 1024
|
|
8
10
|
MAX_GRID_SLOTS: Final = 4_000_000
|
|
9
11
|
MAX_RECORD_DEPTH: Final = 64
|
|
10
12
|
MAX_RECORDS: Final = 16_000_000
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
from io import BytesIO
|
|
6
6
|
from datetime import datetime, timezone
|
|
7
7
|
import posixpath
|
|
8
|
+
from pathlib import Path
|
|
8
9
|
from zipfile import ZipFile
|
|
9
10
|
|
|
10
11
|
import lxml.etree as etree
|
|
@@ -12,7 +13,7 @@ import lxml.etree as etree
|
|
|
12
13
|
from ....document.properties import property_count, property_date, property_text, property_values
|
|
13
14
|
from ....errors import DocumentError
|
|
14
15
|
from ....schema import DocumentProperties
|
|
15
|
-
from .limits import MAX_ENTRY_BYTES
|
|
16
|
+
from .limits import MAX_ENTRY_BYTES
|
|
16
17
|
|
|
17
18
|
_DC = "{http://purl.org/dc/elements/1.1/}"
|
|
18
19
|
_DCT = "{http://purl.org/dc/terms/}"
|
|
@@ -43,14 +44,15 @@ def _element_value(root: etree._Element | None, tag: str) -> str | None:
|
|
|
43
44
|
return None
|
|
44
45
|
|
|
45
46
|
|
|
46
|
-
def read_ooxml_properties(data: bytes, suffix: str) -> tuple[DocumentProperties, list[str]]:
|
|
47
|
+
def read_ooxml_properties(data: bytes | str | Path, suffix: str) -> tuple[DocumentProperties, list[str]]:
|
|
47
48
|
"""读取 OOXML 核心属性和结构计数,坏的可选属性不阻止其他读取。"""
|
|
48
49
|
properties = DocumentProperties()
|
|
49
50
|
warnings: list[str] = []
|
|
50
|
-
|
|
51
|
+
package_source = BytesIO(data) if isinstance(data, bytes) else data
|
|
52
|
+
with ZipFile(package_source) as package:
|
|
51
53
|
infos = package.infolist()
|
|
52
|
-
if len(infos) > 100_000
|
|
53
|
-
raise DocumentError("resource_limit", "OOXML metadata package
|
|
54
|
+
if len(infos) > 100_000:
|
|
55
|
+
raise DocumentError("resource_limit", "OOXML metadata package has too many members")
|
|
54
56
|
if len({info.filename for info in infos}) != len(infos):
|
|
55
57
|
raise DocumentError("open_failed", "Duplicate OOXML package members")
|
|
56
58
|
if _xml_part(package, "[Content_Types].xml") is None:
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Iterable, Iterator, MutableSet
|
|
5
6
|
from dataclasses import dataclass, field
|
|
6
7
|
from typing import TYPE_CHECKING, Any, Literal
|
|
7
8
|
|
|
@@ -13,6 +14,102 @@ if TYPE_CHECKING:
|
|
|
13
14
|
from .inline.types import PDFTextScriptLine
|
|
14
15
|
|
|
15
16
|
|
|
17
|
+
class _SharedLineIndexSet(MutableSet[int]):
|
|
18
|
+
"""共享只读基底,仅为单个候选记录增删差集,避免复制大型行号集合。"""
|
|
19
|
+
|
|
20
|
+
__slots__ = ("base", "added", "removed")
|
|
21
|
+
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
base: frozenset[int],
|
|
25
|
+
values: Iterable[int] = (),
|
|
26
|
+
) -> None:
|
|
27
|
+
"""以共享基底和候选已有成员初始化集合。"""
|
|
28
|
+
|
|
29
|
+
self.base = base
|
|
30
|
+
self.removed: set[int] = set()
|
|
31
|
+
if isinstance(values, _SharedLineIndexSet) and values.base is base:
|
|
32
|
+
# 与共享基底求并集时,基底成员天然全部可见,只需保留额外成员。
|
|
33
|
+
self.added = set(values.added)
|
|
34
|
+
elif isinstance(values, (set, frozenset)):
|
|
35
|
+
self.added = values.difference(base)
|
|
36
|
+
else:
|
|
37
|
+
self.added = {value for value in values if value not in base}
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def from_exact_values(
|
|
41
|
+
cls,
|
|
42
|
+
base: frozenset[int],
|
|
43
|
+
values: Iterable[int],
|
|
44
|
+
) -> _SharedLineIndexSet:
|
|
45
|
+
"""以共享基底精确表示给定集合,而不是默认并入全部基底成员。"""
|
|
46
|
+
|
|
47
|
+
visible = set(values)
|
|
48
|
+
instance = cls.__new__(cls)
|
|
49
|
+
instance.base = base
|
|
50
|
+
instance.added = visible.difference(base)
|
|
51
|
+
instance.removed = set(base.difference(visible))
|
|
52
|
+
return instance
|
|
53
|
+
|
|
54
|
+
def __contains__(self, value: object) -> bool:
|
|
55
|
+
"""按基底、删除集和新增集判断成员是否可见。"""
|
|
56
|
+
|
|
57
|
+
if value in self.added:
|
|
58
|
+
return True
|
|
59
|
+
return value in self.base and value not in self.removed
|
|
60
|
+
|
|
61
|
+
def __iter__(self) -> Iterator[int]:
|
|
62
|
+
"""迭代当前可见成员,不展开持久化副本。"""
|
|
63
|
+
|
|
64
|
+
for value in self.base:
|
|
65
|
+
if value not in self.removed:
|
|
66
|
+
yield value
|
|
67
|
+
yield from self.added
|
|
68
|
+
|
|
69
|
+
def __len__(self) -> int:
|
|
70
|
+
"""返回当前可见成员数量。"""
|
|
71
|
+
|
|
72
|
+
return len(self.base) - len(self.removed) + len(self.added)
|
|
73
|
+
|
|
74
|
+
def add(self, value: int) -> None:
|
|
75
|
+
"""加入成员;基底已有成员只需撤销删除标记。"""
|
|
76
|
+
|
|
77
|
+
if value in self.base:
|
|
78
|
+
self.removed.discard(value)
|
|
79
|
+
return
|
|
80
|
+
self.added.add(value)
|
|
81
|
+
|
|
82
|
+
def discard(self, value: int) -> None:
|
|
83
|
+
"""删除成员;基底成员以差集标记表示。"""
|
|
84
|
+
|
|
85
|
+
if value in self.added:
|
|
86
|
+
self.added.discard(value)
|
|
87
|
+
return
|
|
88
|
+
if value in self.base:
|
|
89
|
+
self.removed.add(value)
|
|
90
|
+
|
|
91
|
+
def update(self, values: Iterable[int]) -> None:
|
|
92
|
+
"""并入成员;同共享基底的候选直接合并差集。"""
|
|
93
|
+
|
|
94
|
+
if isinstance(values, _SharedLineIndexSet) and values.base is self.base:
|
|
95
|
+
self.removed.intersection_update(values.removed)
|
|
96
|
+
for value in values.added:
|
|
97
|
+
self.add(value)
|
|
98
|
+
return
|
|
99
|
+
for value in values:
|
|
100
|
+
self.add(value)
|
|
101
|
+
|
|
102
|
+
def difference_update(self, values: Iterable[int]) -> None:
|
|
103
|
+
"""移除给定成员,并保持共享基底不变。"""
|
|
104
|
+
|
|
105
|
+
if isinstance(values, (set, frozenset)):
|
|
106
|
+
self.added.difference_update(values)
|
|
107
|
+
self.removed.update(self.base.intersection(values))
|
|
108
|
+
return
|
|
109
|
+
for value in values:
|
|
110
|
+
self.discard(value)
|
|
111
|
+
|
|
112
|
+
|
|
16
113
|
@dataclass(slots=True)
|
|
17
114
|
class _LineItem:
|
|
18
115
|
"""保存单个可视文本行及其 source/ink/canonical 几何。"""
|
|
@@ -122,7 +219,7 @@ class _TableCandidate:
|
|
|
122
219
|
angle: int
|
|
123
220
|
score: float
|
|
124
221
|
core_bbox: BBox | None = None
|
|
125
|
-
line_indices:
|
|
222
|
+
line_indices: MutableSet[int] = field(default_factory=set)
|
|
126
223
|
annotations: list[_TableAnnotation] = field(default_factory=list)
|
|
127
224
|
|
|
128
225
|
|