docvortex 0.4.18__tar.gz → 0.4.19__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.18/src/docvortex.egg-info → docvortex-0.4.19}/PKG-INFO +1 -1
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/sdk-0.4.md +24 -1
- docvortex-0.4.19/src/docvortex/export/_images.py +134 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/export/files.py +18 -16
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/export/middle.py +5 -60
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/version.py +1 -1
- {docvortex-0.4.18 → docvortex-0.4.19/src/docvortex.egg-info}/PKG-INFO +1 -1
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex.egg-info/SOURCES.txt +2 -0
- docvortex-0.4.19/tests/test_export_image_names.py +152 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_public_export_api.py +1 -1
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_middle_json_export.py +17 -17
- {docvortex-0.4.18 → docvortex-0.4.19}/LICENSE.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/MANIFEST.in +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/README.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/README.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/demo.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/METADATA.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/USAGE.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/flash-manual-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/flash-round2-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/flash-rule-generalization-2026-09-15.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/docs/flash-title-coverage-2026-09-16.md +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/pyproject.toml +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/setup.cfg +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/spreadsheet/region_discovery.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/api.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/_document.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/text/dedup.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/_svg_raster.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/options.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/result.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_manual_annotations.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_manual_review_decisions.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_reviewed_history.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_round2_annotations.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_round2_review_decisions.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_round3_annotations.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_round3_review_decisions.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/pdf_char_dedup.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_architecture.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_cli_logging.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_document_metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_history_geometry_tools.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_cpu_evidence.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_release_ci_gate.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_manual_annotations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_short_tails.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_round2_annotations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_round3_annotations.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_rule_generalization.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_spatial_evidence.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_object_clipping.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_text_dedup.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_svg_raster.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tools/__init__.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tools/build_html_css.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.18 → docvortex-0.4.19}/tools/font_geometry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# DocVortex 0.4 公共 SDK 与宿主迁移
|
|
2
2
|
|
|
3
|
-
本文记录 0.4 系列的公共模块边界。MinerU
|
|
3
|
+
本文记录 0.4 系列的公共模块边界。MinerU 的共享图片导出需要 `docvortex>=0.4.19,<1`,文档协议、解析路由、模型回退与渲染语义保持不变。
|
|
4
4
|
|
|
5
5
|
## 公开入口
|
|
6
6
|
|
|
@@ -22,6 +22,29 @@
|
|
|
22
22
|
|
|
23
23
|
跨库调用方可通过 `docvortex.export.materialize_middle(middle_json, assets=None)` 获取图片外置后的文档副本与 `AssetStore`,再通过 `validate_materialized_assets(document, assets)` 验证所有图片引用。直接图片和视觉 HTML 内嵌图片使用安全相对路径,原始图片字节及布局方向扩展保持不变;代码字面量不作为 HTML 素材处理。
|
|
24
24
|
|
|
25
|
+
### 0.4.19 图片命名与宿主回调
|
|
26
|
+
|
|
27
|
+
新物化图片统一沿用 MinerU Gradio 的命名:直接载荷为
|
|
28
|
+
`images/page_{page_idx}_{owner.type}_{owner.index}.{ext}`,其中 owner 是所属
|
|
29
|
+
image/table/chart 父块,独立公式使用 equation。视觉正文内的图片分别使用
|
|
30
|
+
`image_{index}_{ordinal}`、`table_image_{index}_{ordinal}`、`chart_image_{index}_{ordinal}`。
|
|
31
|
+
页号为从 0 开始的原始页索引;序号按每个正文的所有 `<img src=...>` 从 1 计数,外链也占序号。
|
|
32
|
+
扩展名转小写,缺省 jpg;图片字节不重新编码。同名同字节复用,同名异字节追加
|
|
33
|
+
`_duplicate_n`,最多检查 10000 个候选名称;不同语义名称不因字节相同而合并。
|
|
34
|
+
|
|
35
|
+
`materialize_middle` 新增两个可选的仅限关键字参数:
|
|
36
|
+
|
|
37
|
+
- `image_resolver: Callable[[ImagePayloadBlock, int], tuple[bytes, str] | None]`:接收副本中的载荷块和原始页号,返回字节及扩展名;返回 None 时保留载荷,不再触发默认解析。
|
|
38
|
+
- `asset_resolver: Callable[[str], bytes]`:接收经过实体/URL 解码及安全校验的 HTML 图片相对路径,返回字节;扩展名从引用路径取得。仅在明确传入回调时读取宿主资源,回调负责自身根目录限制。
|
|
39
|
+
|
|
40
|
+
不提供回调时保持内嵌图片的严格解析,不自动读文件或裁 PDF;已有相对路径保持原样。
|
|
41
|
+
输入 `assets` 保留为独立副本并参与冲突检查,重复物化不改变路径或字节。
|
|
42
|
+
新命名同步更新直接引用和 HTML src,保留 HTML 的属性、引号及其他正文。
|
|
43
|
+
|
|
44
|
+
此变更会改变新生成的 CLI/API ZIP 及 DocVortex 导出图片名称,消费者应读取文档实际引用,
|
|
45
|
+
不再自行拼接旧的 `*_body_*` 名称。历史结果包仍按已有引用读取,不自动迁移、不生成旧名别名;
|
|
46
|
+
MiddleJson 仍为 2.0,文件写出层的 overwrite 语义不变。
|
|
47
|
+
|
|
25
48
|
调用方负责将该副本及素材写入自己的结果包,不应先省略图片再从源 PDF 重裁。缺失引用、未物化网络图片或同名素材冲突会显式失败。物化不修改输入对象、不读取源 PDF、不下载网络资源;已有外部素材须通过 `AssetStore` 显式提供。
|
|
26
49
|
|
|
27
50
|
## 行为与资源所有权
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"""各导出入口共享的图片命名、冲突分配与引用改写。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import html
|
|
6
|
+
import re
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from pathlib import PurePosixPath
|
|
9
|
+
from urllib.parse import unquote
|
|
10
|
+
|
|
11
|
+
from ..assets import AssetStore, parse_image_data_uri_strict, validate_image_sidecar_path
|
|
12
|
+
from ..content.tree import iter_child_blocks
|
|
13
|
+
from ..schema import (
|
|
14
|
+
AlgorithmBodyBlock,
|
|
15
|
+
BlockBase,
|
|
16
|
+
ChartBlock,
|
|
17
|
+
ChartBodyBlock,
|
|
18
|
+
CodeBlock,
|
|
19
|
+
CodeBodyBlock,
|
|
20
|
+
ImageBlock,
|
|
21
|
+
ImageBodyBlock,
|
|
22
|
+
ImagePayloadBlock,
|
|
23
|
+
MiddleJson,
|
|
24
|
+
TableBlock,
|
|
25
|
+
TableBodyBlock,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
_HTML_IMAGE_SOURCE_RE = re.compile(
|
|
29
|
+
r"(?P<prefix><img\b(?:[^>\"']|\"[^\"]*\"|'[^']*')*?\s+src\s*=\s*)"
|
|
30
|
+
r"(?:(?P<quote>[\"'])(?P<quoted>.*?)(?P=quote)|(?P<unquoted>[^\s>]+))",
|
|
31
|
+
re.IGNORECASE | re.DOTALL,
|
|
32
|
+
)
|
|
33
|
+
_IMAGE_EXTENSIONS = frozenset({"jpg", "jpeg", "png", "gif", "webp", "bmp", "tiff", "svg"})
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _register_image(
|
|
37
|
+
assets: AssetStore,
|
|
38
|
+
payload: bytes,
|
|
39
|
+
extension: str,
|
|
40
|
+
*,
|
|
41
|
+
page_idx: int,
|
|
42
|
+
owner: BlockBase,
|
|
43
|
+
ordinal: int | None = None,
|
|
44
|
+
) -> str:
|
|
45
|
+
"""按原始页和视觉父块命名,冲突后缀独立于正文图片序号。"""
|
|
46
|
+
extension = extension.lower().lstrip(".") or "jpg"
|
|
47
|
+
if extension not in _IMAGE_EXTENSIONS:
|
|
48
|
+
raise ValueError(f"Unsupported image extension: {extension}")
|
|
49
|
+
if owner.index is None:
|
|
50
|
+
raise ValueError("Image owner must have a block index")
|
|
51
|
+
kind = str(owner.type)
|
|
52
|
+
if ordinal is not None and kind != "image":
|
|
53
|
+
kind += "_image"
|
|
54
|
+
suffix = f"_{ordinal}" if ordinal is not None else ""
|
|
55
|
+
stem = f"page_{page_idx}_{kind}_{owner.index}{suffix}"
|
|
56
|
+
for attempt in range(10000):
|
|
57
|
+
duplicate = f"_duplicate_{attempt}" if attempt else ""
|
|
58
|
+
path = validate_image_sidecar_path(f"images/{stem}{duplicate}.{extension}")
|
|
59
|
+
if path not in assets or assets[path] == payload:
|
|
60
|
+
assets.add(path, payload)
|
|
61
|
+
return path
|
|
62
|
+
raise ValueError("Too many conflicting image assets")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _materialize_markup(
|
|
66
|
+
content: str,
|
|
67
|
+
assets: AssetStore,
|
|
68
|
+
*,
|
|
69
|
+
page_idx: int,
|
|
70
|
+
owner: BlockBase,
|
|
71
|
+
asset_resolver: Callable[[str], bytes] | None,
|
|
72
|
+
) -> str:
|
|
73
|
+
"""按所有 img src 的出现顺序编号,仅替换图片引用的值。"""
|
|
74
|
+
ordinal = 0
|
|
75
|
+
|
|
76
|
+
def replace_source(match: re.Match[str]) -> str:
|
|
77
|
+
"""保留外链及原 HTML 属性,外链同样占用正文图片序号。"""
|
|
78
|
+
nonlocal ordinal
|
|
79
|
+
ordinal += 1
|
|
80
|
+
group = "quoted" if match.group("quote") else "unquoted"
|
|
81
|
+
source = html.unescape(match.group(group)).strip()
|
|
82
|
+
if source.startswith("data:"):
|
|
83
|
+
payload, extension = parse_image_data_uri_strict(source)
|
|
84
|
+
elif re.match(r"^[A-Za-z][A-Za-z0-9+.-]*:", source) or asset_resolver is None:
|
|
85
|
+
return match.group(0)
|
|
86
|
+
else:
|
|
87
|
+
safe_path = validate_image_sidecar_path(unquote(source))
|
|
88
|
+
payload = asset_resolver(safe_path)
|
|
89
|
+
extension = PurePosixPath(safe_path).suffix.lstrip(".")
|
|
90
|
+
path = _register_image(assets, payload, extension, page_idx=page_idx, owner=owner, ordinal=ordinal)
|
|
91
|
+
start, end = match.span(group)
|
|
92
|
+
original = match.group(0)
|
|
93
|
+
return original[: start - match.start()] + path + original[end - match.start() :]
|
|
94
|
+
|
|
95
|
+
return _HTML_IMAGE_SOURCE_RE.sub(replace_source, content)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _materialize_images(
|
|
99
|
+
middle_json: MiddleJson,
|
|
100
|
+
assets: AssetStore | None = None,
|
|
101
|
+
*,
|
|
102
|
+
image_resolver: Callable[[ImagePayloadBlock, int], tuple[bytes, str] | None] | None = None,
|
|
103
|
+
asset_resolver: Callable[[str], bytes] | None = None,
|
|
104
|
+
) -> tuple[MiddleJson, AssetStore]:
|
|
105
|
+
"""复制文档及素材索引,在同一次树遍历中完成命名和引用回填。"""
|
|
106
|
+
document = middle_json.model_copy(deep=True)
|
|
107
|
+
result = assets.copy() if assets is not None else AssetStore()
|
|
108
|
+
for page in document.pages:
|
|
109
|
+
pending = [(block, block) for block in reversed(page.blocks)]
|
|
110
|
+
while pending:
|
|
111
|
+
block, owner = pending.pop()
|
|
112
|
+
if isinstance(block, (CodeBlock, CodeBodyBlock, AlgorithmBodyBlock)):
|
|
113
|
+
continue
|
|
114
|
+
if isinstance(block, (ImageBlock, TableBlock, ChartBlock)):
|
|
115
|
+
owner = block
|
|
116
|
+
if isinstance(block, ImagePayloadBlock):
|
|
117
|
+
resolved = None
|
|
118
|
+
if image_resolver is not None:
|
|
119
|
+
resolved = image_resolver(block, page.page_idx)
|
|
120
|
+
elif block.image_base64 is not None:
|
|
121
|
+
resolved = parse_image_data_uri_strict(block.image_base64)
|
|
122
|
+
if resolved is not None:
|
|
123
|
+
payload, extension = resolved
|
|
124
|
+
block.image_path = _register_image(result, payload, extension, page_idx=page.page_idx, owner=owner)
|
|
125
|
+
block.image_base64 = None
|
|
126
|
+
block.image_url = None
|
|
127
|
+
elif image_resolver is None and block.image_path and block.image_path in result:
|
|
128
|
+
block.image_url = None
|
|
129
|
+
if isinstance(block, (ImageBodyBlock, TableBodyBlock, ChartBodyBlock)):
|
|
130
|
+
block.content = _materialize_markup(
|
|
131
|
+
block.content, result, page_idx=page.page_idx, owner=owner, asset_resolver=asset_resolver
|
|
132
|
+
)
|
|
133
|
+
pending.extend((child, owner) for child in reversed(list(iter_child_blocks(block))))
|
|
134
|
+
return document, result
|
|
@@ -2,30 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Callable
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
from urllib.parse import urlsplit
|
|
7
8
|
|
|
8
9
|
from ..assets import AssetStore
|
|
9
10
|
from ..content.tree import iter_child_blocks
|
|
10
|
-
from ..schema import MiddleJson
|
|
11
11
|
from ..result import ExportResult, RenderArtifact
|
|
12
|
-
from
|
|
12
|
+
from ..schema import ImagePayloadBlock, MiddleJson
|
|
13
|
+
from ._images import _materialize_images
|
|
14
|
+
from .middle import _commit_export_files, _resolve_export_target, _validate_export_path_relationships
|
|
13
15
|
|
|
14
16
|
|
|
15
|
-
def materialize_middle(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return
|
|
17
|
+
def materialize_middle(
|
|
18
|
+
middle_json: MiddleJson,
|
|
19
|
+
assets: AssetStore | None = None,
|
|
20
|
+
*,
|
|
21
|
+
image_resolver: Callable[[ImagePayloadBlock, int], tuple[bytes, str] | None] | None = None,
|
|
22
|
+
asset_resolver: Callable[[str], bytes] | None = None,
|
|
23
|
+
) -> tuple[MiddleJson, AssetStore]:
|
|
24
|
+
"""在副本上按视觉父块外置图片;仅通过显式回调获取宿主文件或裁图。
|
|
25
|
+
|
|
26
|
+
image_resolver 接收载荷块和原始页索引,返回字节与扩展名;返回 None
|
|
27
|
+
表示保留当前载荷,不触发默认解析。asset_resolver 仅接收经过校验的
|
|
28
|
+
HTML 图片相对路径。不提供回调时,只解析内嵌图片并保留已有素材引用。
|
|
29
|
+
"""
|
|
30
|
+
return _materialize_images(middle_json, assets, image_resolver=image_resolver, asset_resolver=asset_resolver)
|
|
29
31
|
|
|
30
32
|
|
|
31
33
|
def validate_materialized_assets(middle_json: MiddleJson, assets: AssetStore) -> None:
|
|
@@ -6,9 +6,9 @@ import os
|
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from tempfile import NamedTemporaryFile
|
|
9
|
-
from typing import Any, Sequence
|
|
10
9
|
|
|
11
|
-
from ..schema import
|
|
10
|
+
from ..schema import MiddleJson
|
|
11
|
+
from ._images import _materialize_images
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
@dataclass(frozen=True, slots=True)
|
|
@@ -20,65 +20,10 @@ class MiddleJsonExportResult:
|
|
|
20
20
|
image_paths: tuple[Path, ...]
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
def _iter_page_blocks(blocks: Sequence[BlockBase]) -> list[BlockBase]:
|
|
24
|
-
"""按深度优先顺序展开页面 block 树,供图片外置统一遍历。"""
|
|
25
|
-
result: list[BlockBase] = []
|
|
26
|
-
pending: list[BlockBase] = list(reversed(blocks))
|
|
27
|
-
while pending:
|
|
28
|
-
block = pending.pop()
|
|
29
|
-
result.append(block)
|
|
30
|
-
pending.extend(reversed(_iter_child_blocks(block)))
|
|
31
|
-
return result
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def _register_export_file(files: dict[str, bytes], relative_path: str, payload: bytes) -> None:
|
|
35
|
-
"""登记待写文件,并在同名内容冲突时立即终止导出。"""
|
|
36
|
-
existing = files.get(relative_path)
|
|
37
|
-
if existing is not None and existing != payload:
|
|
38
|
-
raise ValueError(f"Conflicting image payload for path: {relative_path}")
|
|
39
|
-
files[relative_path] = payload
|
|
40
|
-
|
|
41
|
-
|
|
42
23
|
def _prepare_export_copy(middle_json: MiddleJson) -> tuple[MiddleJson, dict[str, bytes]]:
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
exported = middle_json.model_copy(deep=True)
|
|
47
|
-
image_files: dict[str, bytes] = {}
|
|
48
|
-
for page in exported.pages:
|
|
49
|
-
for block in _iter_page_blocks(page.blocks):
|
|
50
|
-
data_uri = getattr(block, "image_base64", None)
|
|
51
|
-
if data_uri is not None:
|
|
52
|
-
if block.index is None:
|
|
53
|
-
raise ValueError(f"Image carrier requires index: page_idx={page.page_idx}, type={block.type}")
|
|
54
|
-
image_bytes, extension = parse_image_data_uri_strict(data_uri)
|
|
55
|
-
relative_path = f"images/page_{page.page_idx}_{block.type}_{block.index}.{extension}"
|
|
56
|
-
_register_export_file(image_files, relative_path, image_bytes)
|
|
57
|
-
block.image_path = relative_path # type: ignore[attr-defined]
|
|
58
|
-
block.image_base64 = None # type: ignore[attr-defined]
|
|
59
|
-
|
|
60
|
-
content = getattr(block, "content", None)
|
|
61
|
-
if (
|
|
62
|
-
str(block.type) not in {"table_body", "chart_body", "image_body"}
|
|
63
|
-
or not isinstance(content, str)
|
|
64
|
-
or "data:image/" not in content
|
|
65
|
-
):
|
|
66
|
-
continue
|
|
67
|
-
if block.index is None:
|
|
68
|
-
raise ValueError(f"HTML image carrier requires index: page_idx={page.page_idx}, type={block.type}")
|
|
69
|
-
ordinal = 0
|
|
70
|
-
|
|
71
|
-
def _replace_data_uri(match: Any) -> str:
|
|
72
|
-
"""将当前 HTML data URI 登记为 sidecar,并返回确定性相对路径。"""
|
|
73
|
-
nonlocal ordinal
|
|
74
|
-
ordinal += 1
|
|
75
|
-
image_bytes, extension = parse_image_data_uri_strict(match.group(0))
|
|
76
|
-
relative_path = f"images/page_{page.page_idx}_{block.type}_{block.index}_{ordinal}.{extension}"
|
|
77
|
-
_register_export_file(image_files, relative_path, image_bytes)
|
|
78
|
-
return relative_path
|
|
79
|
-
|
|
80
|
-
block.content = INLINE_IMAGE_DATA_URI_RE.sub(_replace_data_uri, content) # type: ignore[assignment]
|
|
81
|
-
return exported, image_files
|
|
24
|
+
"""复用统一物化流程,为原子文件导出提供文档副本及图片字节。"""
|
|
25
|
+
document, assets = _materialize_images(middle_json)
|
|
26
|
+
return document, dict(assets)
|
|
82
27
|
|
|
83
28
|
|
|
84
29
|
def _resolve_export_target(output_root: Path, relative_path: str) -> Path:
|
|
@@ -343,6 +343,7 @@ src/docvortex/document/pdf/text/extract.py
|
|
|
343
343
|
src/docvortex/document/pdf/text/geometry.py
|
|
344
344
|
src/docvortex/document/pdf/text/groups.py
|
|
345
345
|
src/docvortex/export/__init__.py
|
|
346
|
+
src/docvortex/export/_images.py
|
|
346
347
|
src/docvortex/export/bundle.py
|
|
347
348
|
src/docvortex/export/files.py
|
|
348
349
|
src/docvortex/export/middle.py
|
|
@@ -446,6 +447,7 @@ tests/test_complete_pipeline.py
|
|
|
446
447
|
tests/test_converter_lifecycle.py
|
|
447
448
|
tests/test_document_envelope.py
|
|
448
449
|
tests/test_document_metadata.py
|
|
450
|
+
tests/test_export_image_names.py
|
|
449
451
|
tests/test_format_matrix.py
|
|
450
452
|
tests/test_geometry_api.py
|
|
451
453
|
tests/test_history_geometry_tools.py
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""公共物化接口的命名、宿主回调、历史引用及冲突回归。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import base64
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from docvortex.assets import AssetStore
|
|
10
|
+
from docvortex.export import materialize_middle, validate_materialized_assets
|
|
11
|
+
from docvortex.schema import ImagePayloadBlock, MiddleJson, PageInfo, TableBlock, TableBodyBlock
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _uri(payload: bytes = b"\xff\xd8\xffimage") -> str:
|
|
15
|
+
"""生成可通过签名校验的 JPEG 载荷,避免引入图像解码依赖。"""
|
|
16
|
+
return "data:image/jpeg;base64," + base64.b64encode(payload).decode()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _document(content: str = "", image_base64: str | None = None) -> MiddleJson:
|
|
20
|
+
"""构造原始第六页的表格,父块和正文索引遵守共享协议。"""
|
|
21
|
+
return MiddleJson(
|
|
22
|
+
pages=[
|
|
23
|
+
PageInfo(
|
|
24
|
+
page_idx=5,
|
|
25
|
+
blocks=[
|
|
26
|
+
TableBlock(
|
|
27
|
+
type="table",
|
|
28
|
+
index=3,
|
|
29
|
+
content=[TableBodyBlock(type="table_body", index=3, content=content, image_base64=image_base64)],
|
|
30
|
+
)
|
|
31
|
+
],
|
|
32
|
+
)
|
|
33
|
+
],
|
|
34
|
+
metadata={"file_suffix": "docx", "producer": {"name": "test", "version": "1"}},
|
|
35
|
+
is_full_document=False,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_markup_ordinals_preserve_attributes_and_count_external_sources() -> None:
|
|
40
|
+
"""单双引号、无引号和外链按位置编号,非 src 属性及格式原样保留。"""
|
|
41
|
+
uri = _uri()
|
|
42
|
+
markup = (
|
|
43
|
+
'<img src="https://example.test/a.png">'
|
|
44
|
+
f'<IMG alt="a > b" data-src="untouched" SRC = \'{uri}\' width="20">'
|
|
45
|
+
f"<img src={uri} height=3>"
|
|
46
|
+
f'<img src="{uri}">'
|
|
47
|
+
)
|
|
48
|
+
middle = _document(markup)
|
|
49
|
+
original = middle.to_json()
|
|
50
|
+
saved, assets = materialize_middle(middle)
|
|
51
|
+
expected = markup
|
|
52
|
+
for ordinal in (2, 3, 4):
|
|
53
|
+
expected = expected.replace(uri, f"images/page_5_table_image_3_{ordinal}.jpg", 1)
|
|
54
|
+
assert saved.pages[0].blocks[0].content[0].content == expected
|
|
55
|
+
assert set(assets) == {f"images/page_5_table_image_3_{ordinal}.jpg" for ordinal in (2, 3, 4)}
|
|
56
|
+
validate_materialized_assets(saved, assets)
|
|
57
|
+
assert middle.to_json() == original
|
|
58
|
+
repeated, repeated_assets = materialize_middle(saved, assets)
|
|
59
|
+
assert repeated == saved and dict(repeated_assets) == dict(assets)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_collision_allocation_preserves_existing_assets_and_inline_ordinals() -> None:
|
|
63
|
+
"""同名异内容分配独立后缀,相同载荷复用,输入素材不被覆盖。"""
|
|
64
|
+
red, blue = b"\xff\xd8\xffred", b"\xff\xd8\xffblue"
|
|
65
|
+
direct = "images/page_5_table_3.jpg"
|
|
66
|
+
inline = "images/page_5_table_image_3_1.jpg"
|
|
67
|
+
supplied = AssetStore({direct: red, inline: red, "images/unrelated.png": b"keep"})
|
|
68
|
+
middle = _document(f'<img src="{_uri(blue)}">', _uri(blue))
|
|
69
|
+
saved, assets = materialize_middle(middle, supplied)
|
|
70
|
+
body = saved.pages[0].blocks[0].content[0]
|
|
71
|
+
assert body.image_path == "images/page_5_table_3_duplicate_1.jpg"
|
|
72
|
+
assert body.content == '<img src="images/page_5_table_image_3_1_duplicate_1.jpg">'
|
|
73
|
+
assert assets[direct] == supplied[direct] == red
|
|
74
|
+
assert assets[inline] == supplied[inline] == red
|
|
75
|
+
assert assets[body.image_path] == blue
|
|
76
|
+
assert set(supplied) == {direct, inline, "images/unrelated.png"}
|
|
77
|
+
repeated, repeated_assets = materialize_middle(middle, assets)
|
|
78
|
+
assert repeated == saved and dict(repeated_assets) == dict(assets)
|
|
79
|
+
with pytest.raises(ValueError, match="Conflicting asset payload"):
|
|
80
|
+
supplied.add(direct, blue)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_collision_candidates_are_bounded() -> None:
|
|
84
|
+
"""全部候选名称被不同内容占用时,明确失败而不覆盖任意素材。"""
|
|
85
|
+
assets = AssetStore({f"images/page_5_table_3{'_duplicate_' + str(n) if n else ''}.jpg": b"occupied" for n in range(10000)})
|
|
86
|
+
with pytest.raises(ValueError, match="Too many conflicting image assets"):
|
|
87
|
+
materialize_middle(_document(image_base64=_uri()), assets)
|
|
88
|
+
assert len(assets) == 10000
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def test_callbacks_receive_original_page_and_validated_relative_path() -> None:
|
|
92
|
+
"""宿主只提供字节,图片扩展名和旧 HTML 属性由共享导出逻辑保留。"""
|
|
93
|
+
middle = _document('<img src="图%20片.JPEG">', _uri())
|
|
94
|
+
calls: list[object] = []
|
|
95
|
+
|
|
96
|
+
def image_resolver(block: ImagePayloadBlock, page_idx: int) -> tuple[bytes, str]:
|
|
97
|
+
"""记录原始页号,模拟宿主从源 PDF 或本地文件取得载荷。"""
|
|
98
|
+
calls.append((block.type, page_idx))
|
|
99
|
+
return b"direct", ".PNG"
|
|
100
|
+
|
|
101
|
+
def asset_resolver(path: str) -> bytes:
|
|
102
|
+
"""接收完成 URL 解码及安全检查后的相对路径。"""
|
|
103
|
+
calls.append(path)
|
|
104
|
+
return b"inline"
|
|
105
|
+
|
|
106
|
+
saved, assets = materialize_middle(middle, image_resolver=image_resolver, asset_resolver=asset_resolver)
|
|
107
|
+
assert calls == [("table_body", 5), "图 片.JPEG"]
|
|
108
|
+
assert dict(assets) == {"images/page_5_table_3.png": b"direct", "images/page_5_table_image_3_1.jpeg": b"inline"}
|
|
109
|
+
assert saved.pages[0].blocks[0].content[0].content == '<img src="images/page_5_table_image_3_1.jpeg">'
|
|
110
|
+
assert middle.pages[0].blocks[0].content[0].image_base64 == _uri()
|
|
111
|
+
validate_materialized_assets(saved, assets)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def test_callback_none_preserves_payload_without_default_fallback() -> None:
|
|
115
|
+
"""宿主获取失败不会隐式回退,兼容 Gradio 忽略非法直接载荷的行为。"""
|
|
116
|
+
middle = _document(image_base64="invalid")
|
|
117
|
+
|
|
118
|
+
def unavailable(block: ImagePayloadBlock, page_idx: int) -> None:
|
|
119
|
+
"""模拟宿主无法取得图片字节。"""
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
saved, assets = materialize_middle(middle, image_resolver=unavailable)
|
|
123
|
+
assert saved == middle and not assets
|
|
124
|
+
with pytest.raises(ValueError, match="Invalid image data URI"):
|
|
125
|
+
materialize_middle(middle)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@pytest.mark.parametrize("reference", ["../outside.jpg", "%2e%2e/outside.jpg", "/outside.jpg"])
|
|
129
|
+
def test_unsafe_paths_rejected_before_asset_callback(reference: str) -> None:
|
|
130
|
+
"""宿主读取回调不能接收到目录穿越或绝对路径。"""
|
|
131
|
+
|
|
132
|
+
def reject_call(path: str) -> bytes:
|
|
133
|
+
"""安全校验失败时不允许触发真实文件读取。"""
|
|
134
|
+
raise AssertionError(path)
|
|
135
|
+
|
|
136
|
+
with pytest.raises(ValueError):
|
|
137
|
+
materialize_middle(_document(f'<img src="{reference}">'), asset_resolver=reject_call)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def test_historical_paths_stay_unchanged_and_missing_assets_still_fail() -> None:
|
|
141
|
+
"""默认不重命名历史引用,也不自动从当前目录读取缺失图片。"""
|
|
142
|
+
direct = "images/page_5_table_body_3.jpg"
|
|
143
|
+
inline = "images/page_5_table_body_3_1.jpg"
|
|
144
|
+
middle = _document(f'<img src="{inline}">')
|
|
145
|
+
middle.pages[0].blocks[0].content[0].image_path = direct
|
|
146
|
+
supplied = AssetStore({direct: b"old-direct", inline: b"old-inline"})
|
|
147
|
+
saved, assets = materialize_middle(middle, supplied)
|
|
148
|
+
assert saved == middle and dict(assets) == dict(supplied)
|
|
149
|
+
validate_materialized_assets(saved, assets)
|
|
150
|
+
missing, missing_assets = materialize_middle(middle)
|
|
151
|
+
with pytest.raises(ValueError, match="Missing materialized asset"):
|
|
152
|
+
validate_materialized_assets(missing, missing_assets)
|
|
@@ -56,7 +56,7 @@ def test_public_export_preserves_payloads_geometry_and_code() -> None:
|
|
|
56
56
|
before = middle.to_json()
|
|
57
57
|
exported, assets = materialize_middle(middle)
|
|
58
58
|
validate_materialized_assets(exported, assets)
|
|
59
|
-
assert set(assets) == {"images/
|
|
59
|
+
assert set(assets) == {"images/page_4_table_2.jpg", "images/page_4_table_image_2_1.jpg"}
|
|
60
60
|
assert all(payload == image for payload in assets.values())
|
|
61
61
|
assert exported.extensions == middle.extensions
|
|
62
62
|
assert exported.pages[0].blocks[1].content[0].content == markup
|
|
@@ -85,17 +85,17 @@ def test_export_writes_direct_and_multiple_html_images_without_mutating_source(t
|
|
|
85
85
|
exported_body = result.middle_json.pages[0].blocks[0].content[0]
|
|
86
86
|
|
|
87
87
|
assert {path.name for path in result.image_paths} == {
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
88
|
+
"page_3_table_4.jpg",
|
|
89
|
+
"page_3_table_image_4_1.gif",
|
|
90
|
+
"page_3_table_image_4_2.png",
|
|
91
91
|
}
|
|
92
|
-
assert (tmp_path / "images/
|
|
93
|
-
assert (tmp_path / "images/
|
|
94
|
-
assert (tmp_path / "images/
|
|
95
|
-
assert exported_body.image_path == "images/
|
|
92
|
+
assert (tmp_path / "images/page_3_table_4.jpg").read_bytes() == jpeg_payload
|
|
93
|
+
assert (tmp_path / "images/page_3_table_image_4_1.gif").read_bytes() == gif_payload
|
|
94
|
+
assert (tmp_path / "images/page_3_table_image_4_2.png").read_bytes() == png_payload
|
|
95
|
+
assert exported_body.image_path == "images/page_3_table_4.jpg"
|
|
96
96
|
assert exported_body.image_base64 is None
|
|
97
|
-
assert "images/
|
|
98
|
-
assert "images/
|
|
97
|
+
assert "images/page_3_table_image_4_1.gif" in exported_body.content
|
|
98
|
+
assert "images/page_3_table_image_4_2.png" in exported_body.content
|
|
99
99
|
assert "image_base64" not in exported_json
|
|
100
100
|
assert "data:image/" not in exported_json
|
|
101
101
|
assert middle_json.pages[0].blocks[0].content[0].image_base64 == jpeg_uri
|
|
@@ -116,7 +116,7 @@ def test_export_supports_strict_svg_payload(tmp_path: Path) -> None:
|
|
|
116
116
|
|
|
117
117
|
result = export_middle_json(middle_json, tmp_path)
|
|
118
118
|
|
|
119
|
-
assert (tmp_path / "images/
|
|
119
|
+
assert (tmp_path / "images/page_3_table_2.svg").read_bytes() == svg_payload
|
|
120
120
|
assert result.middle_json.pages[0].blocks[0].content[0].image_path.endswith(".svg")
|
|
121
121
|
|
|
122
122
|
|
|
@@ -136,9 +136,9 @@ def test_export_supports_direct_png_and_html_jpeg(tmp_path: Path) -> None:
|
|
|
136
136
|
|
|
137
137
|
result = export_middle_json(middle_json, tmp_path)
|
|
138
138
|
|
|
139
|
-
assert (tmp_path / "images/
|
|
140
|
-
assert (tmp_path / "images/
|
|
141
|
-
assert "images/
|
|
139
|
+
assert (tmp_path / "images/page_3_table_5.png").read_bytes() == png_payload
|
|
140
|
+
assert (tmp_path / "images/page_3_table_image_5_1.jpg").read_bytes() == jpeg_payload
|
|
141
|
+
assert "images/page_3_table_image_5_1.jpg" in result.middle_json.pages[0].blocks[0].content[0].content
|
|
142
142
|
|
|
143
143
|
|
|
144
144
|
@pytest.mark.parametrize(
|
|
@@ -174,7 +174,7 @@ def test_export_rejects_unparsed_inline_data_uri_before_writing(tmp_path: Path)
|
|
|
174
174
|
)
|
|
175
175
|
)
|
|
176
176
|
|
|
177
|
-
with pytest.raises(ValueError, match="
|
|
177
|
+
with pytest.raises(ValueError, match="Invalid image data URI"):
|
|
178
178
|
export_middle_json(middle_json, output_dir)
|
|
179
179
|
|
|
180
180
|
assert not output_dir.exists()
|
|
@@ -203,7 +203,7 @@ def test_export_preflights_conflicts_and_supports_explicit_overwrite(tmp_path: P
|
|
|
203
203
|
|
|
204
204
|
export_middle_json(first, tmp_path)
|
|
205
205
|
export_middle_json(first, tmp_path)
|
|
206
|
-
image_path = tmp_path / "images/
|
|
206
|
+
image_path = tmp_path / "images/page_3_table_0.jpg"
|
|
207
207
|
with pytest.raises(FileExistsError):
|
|
208
208
|
export_middle_json(second, tmp_path)
|
|
209
209
|
assert image_path.read_bytes() == first_payload
|
|
@@ -227,7 +227,7 @@ def test_export_conflicting_json_rolls_back_before_any_image_write(tmp_path: Pat
|
|
|
227
227
|
with pytest.raises(FileExistsError):
|
|
228
228
|
export_middle_json(middle_json, tmp_path)
|
|
229
229
|
|
|
230
|
-
assert not (tmp_path / "images/
|
|
230
|
+
assert not (tmp_path / "images/page_3_table_9.jpg").exists()
|
|
231
231
|
assert (tmp_path / "middle_json.json").read_text() == "occupied"
|
|
232
232
|
|
|
233
233
|
|
|
@@ -236,7 +236,7 @@ def test_export_restores_existing_files_after_commit_failure(
|
|
|
236
236
|
monkeypatch: pytest.MonkeyPatch,
|
|
237
237
|
) -> None:
|
|
238
238
|
"""验证提交中途失败时会恢复已覆盖文件,并清理全部临时文件。"""
|
|
239
|
-
image_path = tmp_path / "images/
|
|
239
|
+
image_path = tmp_path / "images/page_3_table_0.jpg"
|
|
240
240
|
image_path.parent.mkdir()
|
|
241
241
|
image_path.write_bytes(b"old-image")
|
|
242
242
|
json_path = tmp_path / "middle_json.json"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|