docvortex 0.2.2__tar.gz → 0.2.4__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.2.2/src/docvortex.egg-info → docvortex-0.2.4}/PKG-INFO +6 -29
- {docvortex-0.2.2 → docvortex-0.2.4}/README.md +4 -28
- {docvortex-0.2.2 → docvortex-0.2.4}/pyproject.toml +1 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/converter.py +1 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/xhtml.py +91 -7
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/models.py +7 -1
- docvortex-0.2.4/src/docvortex/analyzers/native/ofd/assembly.py +192 -0
- docvortex-0.2.4/src/docvortex/analyzers/native/ofd/converter.py +69 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/models.py +10 -1
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/package.py +6 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/path.py +91 -65
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/reading_order.py +13 -82
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/resources.py +29 -2
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/scene.py +47 -10
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/table.py +192 -20
- docvortex-0.2.4/src/docvortex/analyzers/native/ofd/vector.py +271 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/api.py +8 -2
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/anchors.py +23 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/projector.py +153 -40
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/inline.py +15 -4
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/renderer.py +14 -9
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/version.py +1 -1
- {docvortex-0.2.2 → docvortex-0.2.4/src/docvortex.egg-info}/PKG-INFO +6 -29
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/SOURCES.txt +6 -24
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/requires.txt +1 -0
- docvortex-0.2.4/tests/unittest/test_epub_backlinks.py +212 -0
- docvortex-0.2.4/tests/unittest/test_epub_quoted_note_types.py +125 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_epub.py +4 -2
- docvortex-0.2.4/tests/unittest/test_ofd_assembly.py +242 -0
- docvortex-0.2.4/tests/unittest/test_ofd_vector_tables.py +323 -0
- docvortex-0.2.2/docs/COMPATIBILITY.md +0 -89
- docvortex-0.2.2/docs/DOCVORTEX_UPGRADE.md +0 -154
- docvortex-0.2.2/docs/PDF_SCRIPT_REPAIR.md +0 -50
- docvortex-0.2.2/docs/PDF_TEXT_NORMALIZATION.md +0 -43
- docvortex-0.2.2/docs/REFACTOR_PROGRESS.md +0 -117
- docvortex-0.2.2/docs/architecture.md +0 -41
- docvortex-0.2.2/docs/migration.md +0 -20
- docvortex-0.2.2/docs/validation/content-list-ownership.json +0 -338
- docvortex-0.2.2/docs/validation/docvortex-text-baseline.json +0 -1505
- docvortex-0.2.2/docs/validation/docvortex-upgrade.json +0 -288
- docvortex-0.2.2/docs/validation/droid-cjk-v1.json +0 -1579
- docvortex-0.2.2/docs/validation/droid-platform-comparison.json +0 -65
- docvortex-0.2.2/docs/validation/html-namespace.json +0 -96
- docvortex-0.2.2/docs/validation/json-envelope-v2-baselines.json +0 -78
- docvortex-0.2.2/docs/validation/json-envelope-v2.md +0 -72
- docvortex-0.2.2/docs/validation/pdf-geometry-calibration.json +0 -5505
- docvortex-0.2.2/docs/validation/pdf-geometry-calibration.md +0 -74
- docvortex-0.2.2/docs/validation/pdf-script-repair.json +0 -378
- docvortex-0.2.2/docs/validation/pdf-text-normalization.json +0 -121
- docvortex-0.2.2/docs/validation/pdf-text-output-baseline.json +0 -1296
- docvortex-0.2.2/docs/validation/progressive-refactor.json +0 -700
- docvortex-0.2.2/docs/validation/test-migration.json +0 -16180
- docvortex-0.2.2/docs/validation/test-migration.md +0 -152
- docvortex-0.2.2/docs/validation.md +0 -415
- docvortex-0.2.2/src/docvortex/analyzers/native/ofd/converter.py +0 -31
- {docvortex-0.2.2 → docvortex-0.2.4}/LICENSE.md +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/MANIFEST.in +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/README.md +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/demo.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/README.md +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/schemas/middle-2.0.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/schemas/model-2.0.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/setup.cfg +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/contracts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/script_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/shared.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/candidate.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/contracts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/engine.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_common.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/text_grid.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/vector.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/cli.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/document.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/contracts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/visual_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/source.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/errors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/export/files.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/hyperlink.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/image.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/image_payload.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/platform.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/options.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/api.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/html.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/result.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/schema.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/visualization.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_architecture.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_document_envelope.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_format_matrix.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_html_namespace.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_render_ownership.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tools/__init__.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tools/build_html_css.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tools/capture_baseline.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.2.2 → docvortex-0.2.4}/tools/font_geometry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: docvortex
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
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
|
|
@@ -35,6 +35,7 @@ Requires-Dist: olefile<1,>=0.47
|
|
|
35
35
|
Requires-Dist: pylatexenc<3,>=2.10
|
|
36
36
|
Requires-Dist: latex2mathml<4,>=3.81.0
|
|
37
37
|
Requires-Dist: mathml2omml==0.0.2
|
|
38
|
+
Requires-Dist: resvg_py<0.6,>=0.5.0
|
|
38
39
|
Requires-Dist: reportlab
|
|
39
40
|
Requires-Dist: ziamath<0.14,>=0.13
|
|
40
41
|
Requires-Dist: fast-langdetect<0.3.0,>=0.2.3
|
|
@@ -52,7 +53,7 @@ Requires-Dist: twine; extra == "dev"
|
|
|
52
53
|
Dynamic: license-file
|
|
53
54
|
|
|
54
55
|
|
|
55
|
-

|
|
56
57
|
|
|
57
58
|
# DocVortex
|
|
58
59
|
|
|
@@ -61,12 +62,12 @@ A fast, multi-format document parsing and conversion engine.
|
|
|
61
62
|
DocVortex provides a complete, standalone document pipeline:
|
|
62
63
|
|
|
63
64
|
```text
|
|
64
|
-
Document ->
|
|
65
|
+
Document -> Unified Intermediate Representation -> Render / Export
|
|
65
66
|
```
|
|
66
67
|
|
|
67
68
|
Native inputs include text PDFs, DOC/DOCX, PPT/PPTX, XLS/XLSX, RTF, ODT/ODS/ODP,
|
|
68
69
|
EPUB, HTML, OFD and CSV. Output formats include Markdown, HTML, LaTeX, DOCX,
|
|
69
|
-
EPUB, PDF and structured content.
|
|
70
|
+
EPUB, PDF and structured content.
|
|
70
71
|
|
|
71
72
|
Native parsing runs without OCR or VLM inference services.
|
|
72
73
|
PDF classification is an explicit document operation; native analysis does not
|
|
@@ -81,8 +82,7 @@ docvortex classify report.pdf
|
|
|
81
82
|
```
|
|
82
83
|
|
|
83
84
|
Python 3.10–3.14 is supported. Native parsing does not require OCR/VLM inference
|
|
84
|
-
services.
|
|
85
|
-
compatibility matrix also exercises 5.13.0.
|
|
85
|
+
services.
|
|
86
86
|
|
|
87
87
|
## Parse once, export many times
|
|
88
88
|
|
|
@@ -166,28 +166,5 @@ uv build
|
|
|
166
166
|
|
|
167
167
|
DocVortex project code is licensed under the [MIT License](LICENSE.md).
|
|
168
168
|
|
|
169
|
-
Dependencies include `pydantic>=2.12.5,<3` and `numpy>=1.21.6`; the
|
|
170
|
-
installer selects versions compatible with the active Python interpreter.
|
|
171
|
-
On Apple Silicon, Python 3.14 installation requires macOS 14 or newer because
|
|
172
|
-
of the ONNX Runtime dependency used by file-type detection.
|
|
173
|
-
|
|
174
|
-
See [the standalone example](demo/README.md) for native parsing and portable
|
|
175
|
-
result bundles, and [the validation record](docs/validation.md) for test coverage.
|
|
176
|
-
|
|
177
|
-
PDFium uses a bundled, pinned CJK fallback font for non-embedded CJK fonts;
|
|
178
|
-
no system font installation is required. See [PDF font policy](docs/PDF_FONTS.md)
|
|
179
|
-
for initialization, diagnostics and replacement boundaries.
|
|
180
|
-
|
|
181
|
-
PDF output normalizes fullwidth Latin letters, digits and selected technical
|
|
182
|
-
symbols in natural-language text and table cells, preserving Chinese punctuation,
|
|
183
|
-
formulas, code and link targets. See
|
|
184
|
-
[PDF text normalization](docs/PDF_TEXT_NORMALIZATION.md) for scope and API usage.
|
|
185
|
-
|
|
186
|
-
See [the DocVortex upgrade guide](docs/DOCVORTEX_UPGRADE.md) for package, protocol,
|
|
187
|
-
PDF text rules and publishing configuration changes.
|
|
188
|
-
|
|
189
169
|
See [rendering ownership](docs/RENDER_OWNERSHIP.md) for the seven engine targets,
|
|
190
170
|
MinerU Content List integration and public fragment helpers.
|
|
191
|
-
|
|
192
|
-
See [refactor validation](docs/REFACTOR_PROGRESS.md) for the staged internal
|
|
193
|
-
refactoring, compatibility checks, corpus comparisons and measured performance.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-

|
|
3
3
|
|
|
4
4
|
# DocVortex
|
|
5
5
|
|
|
@@ -8,12 +8,12 @@ A fast, multi-format document parsing and conversion engine.
|
|
|
8
8
|
DocVortex provides a complete, standalone document pipeline:
|
|
9
9
|
|
|
10
10
|
```text
|
|
11
|
-
Document ->
|
|
11
|
+
Document -> Unified Intermediate Representation -> Render / Export
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
Native inputs include text PDFs, DOC/DOCX, PPT/PPTX, XLS/XLSX, RTF, ODT/ODS/ODP,
|
|
15
15
|
EPUB, HTML, OFD and CSV. Output formats include Markdown, HTML, LaTeX, DOCX,
|
|
16
|
-
EPUB, PDF and structured content.
|
|
16
|
+
EPUB, PDF and structured content.
|
|
17
17
|
|
|
18
18
|
Native parsing runs without OCR or VLM inference services.
|
|
19
19
|
PDF classification is an explicit document operation; native analysis does not
|
|
@@ -28,8 +28,7 @@ docvortex classify report.pdf
|
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
Python 3.10–3.14 is supported. Native parsing does not require OCR/VLM inference
|
|
31
|
-
services.
|
|
32
|
-
compatibility matrix also exercises 5.13.0.
|
|
31
|
+
services.
|
|
33
32
|
|
|
34
33
|
## Parse once, export many times
|
|
35
34
|
|
|
@@ -113,28 +112,5 @@ uv build
|
|
|
113
112
|
|
|
114
113
|
DocVortex project code is licensed under the [MIT License](LICENSE.md).
|
|
115
114
|
|
|
116
|
-
Dependencies include `pydantic>=2.12.5,<3` and `numpy>=1.21.6`; the
|
|
117
|
-
installer selects versions compatible with the active Python interpreter.
|
|
118
|
-
On Apple Silicon, Python 3.14 installation requires macOS 14 or newer because
|
|
119
|
-
of the ONNX Runtime dependency used by file-type detection.
|
|
120
|
-
|
|
121
|
-
See [the standalone example](demo/README.md) for native parsing and portable
|
|
122
|
-
result bundles, and [the validation record](docs/validation.md) for test coverage.
|
|
123
|
-
|
|
124
|
-
PDFium uses a bundled, pinned CJK fallback font for non-embedded CJK fonts;
|
|
125
|
-
no system font installation is required. See [PDF font policy](docs/PDF_FONTS.md)
|
|
126
|
-
for initialization, diagnostics and replacement boundaries.
|
|
127
|
-
|
|
128
|
-
PDF output normalizes fullwidth Latin letters, digits and selected technical
|
|
129
|
-
symbols in natural-language text and table cells, preserving Chinese punctuation,
|
|
130
|
-
formulas, code and link targets. See
|
|
131
|
-
[PDF text normalization](docs/PDF_TEXT_NORMALIZATION.md) for scope and API usage.
|
|
132
|
-
|
|
133
|
-
See [the DocVortex upgrade guide](docs/DOCVORTEX_UPGRADE.md) for package, protocol,
|
|
134
|
-
PDF text rules and publishing configuration changes.
|
|
135
|
-
|
|
136
115
|
See [rendering ownership](docs/RENDER_OWNERSHIP.md) for the seven engine targets,
|
|
137
116
|
MinerU Content List integration and public fragment helpers.
|
|
138
|
-
|
|
139
|
-
See [refactor validation](docs/REFACTOR_PROGRESS.md) for the staged internal
|
|
140
|
-
refactoring, compatibility checks, corpus comparisons and measured performance.
|
|
@@ -26,6 +26,7 @@ dependencies = [
|
|
|
26
26
|
"python-docx>=1.2.0,<2", "pypptx-with-oxml>=1.0.3,<2",
|
|
27
27
|
"mammoth>=1.11.0,<2", "openpyxl>=3.1.5,<4", "olefile>=0.47,<1",
|
|
28
28
|
"pylatexenc>=2.10,<3", "latex2mathml>=3.81.0,<4", "mathml2omml==0.0.2",
|
|
29
|
+
"resvg_py>=0.5.0,<0.6",
|
|
29
30
|
"reportlab", "ziamath>=0.13,<0.14", "fast-langdetect>=0.2.3,<0.3.0",
|
|
30
31
|
"magika>=0.6.2,<1.1.0", "opencv-python>=4.11.0.86",
|
|
31
32
|
]
|
|
@@ -5,8 +5,10 @@ from __future__ import annotations
|
|
|
5
5
|
import base64
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
|
|
8
|
+
from lxml import html as lxml_html
|
|
8
9
|
from lxml import etree # type: ignore[reportMissingImports]
|
|
9
10
|
|
|
11
|
+
from ....content.spans import normalize_span_dicts
|
|
10
12
|
from ....foundation.image_payload import parse_image_data_uri_strict
|
|
11
13
|
from .._shared.hyperlink import sanitize_hyperlink_target
|
|
12
14
|
from docvortex.content.markup import (
|
|
@@ -52,13 +54,25 @@ _NOTE_NON_TEXT_SUBTREES = frozenset(
|
|
|
52
54
|
)
|
|
53
55
|
|
|
54
56
|
|
|
57
|
+
def _unwrap_epub_type_quotes(value: str) -> str:
|
|
58
|
+
"""移除单层成对外围引号,避免把多个各自带引号的 token 当作一个整体。"""
|
|
59
|
+
normalized = value.strip()
|
|
60
|
+
quote_pairs = {'"': '"', "'": "'", "“": "”", "‘": "’"}
|
|
61
|
+
if len(normalized) < 2 or quote_pairs.get(normalized[0]) != normalized[-1]:
|
|
62
|
+
return normalized
|
|
63
|
+
inner = normalized[1:-1]
|
|
64
|
+
if normalized[0] in inner or normalized[-1] in inner:
|
|
65
|
+
return normalized
|
|
66
|
+
return inner.strip()
|
|
67
|
+
|
|
68
|
+
|
|
55
69
|
def _epub_types(element: etree._Element) -> frozenset[str]:
|
|
56
70
|
"""读取 EPUB 命名空间或未命名 type 属性中的结构语义 token。"""
|
|
57
71
|
values: list[str] = []
|
|
58
72
|
for name, value in element.attrib.items():
|
|
59
73
|
local_name = etree.QName(name).localname if name.startswith("{") else name.split(":", 1)[-1]
|
|
60
74
|
if local_name == "type":
|
|
61
|
-
values.extend(value.casefold().split())
|
|
75
|
+
values.extend(_unwrap_epub_type_quotes(token) for token in _unwrap_epub_type_quotes(value).casefold().split())
|
|
62
76
|
return frozenset(values)
|
|
63
77
|
|
|
64
78
|
|
|
@@ -149,11 +163,12 @@ class _EpubAnchorPolicy:
|
|
|
149
163
|
|
|
150
164
|
|
|
151
165
|
class EpubAnchorRegistry:
|
|
152
|
-
"""
|
|
166
|
+
"""建立章节路径、正文、标题与 note fragment 到实际 canonical anchor 的别名表。"""
|
|
153
167
|
|
|
154
168
|
def __init__(self, chapters: list[tuple[str, etree._Element]], package: EpubPackage) -> None:
|
|
155
169
|
"""预扫描全部选中 XHTML 章节,建立标题、note 与章节起点映射。"""
|
|
156
170
|
self._package = package
|
|
171
|
+
self._pending_links: dict[str, tuple[str, str | None]] = {}
|
|
157
172
|
documents = [
|
|
158
173
|
MarkupAnchorDocument(
|
|
159
174
|
key=chapter_path,
|
|
@@ -166,6 +181,35 @@ class EpubAnchorRegistry:
|
|
|
166
181
|
]
|
|
167
182
|
self._registry = MarkupAnchorRegistry(documents, _EpubAnchorPolicy())
|
|
168
183
|
|
|
184
|
+
def register_text_targets(
|
|
185
|
+
self,
|
|
186
|
+
chapter_path: str,
|
|
187
|
+
root: etree._Element,
|
|
188
|
+
sources: list[tuple[etree._Element, dict[str, object]]],
|
|
189
|
+
) -> None:
|
|
190
|
+
"""在章节投影完成后登记真实正文目标,不修改已有标题和脚注身份。"""
|
|
191
|
+
self._registry.register_text_targets(chapter_path, root, sources)
|
|
192
|
+
|
|
193
|
+
def defer_link(self, href: str, *, base_part: str) -> str | None:
|
|
194
|
+
"""暂存尚未物化的包内目标,跨章节投影完成后统一兑现或降级。"""
|
|
195
|
+
normalized = sanitize_hyperlink_target(href, allowed_schemes=(), allow_relative=True, allow_fragment=True)
|
|
196
|
+
target = self._package.resolve_reference(normalized, base_part=base_part) if normalized is not None else None
|
|
197
|
+
if target is None:
|
|
198
|
+
return None
|
|
199
|
+
placeholder = f"#epub-pending-{len(self._pending_links)}"
|
|
200
|
+
self._pending_links[placeholder] = (target.path, target.fragment)
|
|
201
|
+
return placeholder
|
|
202
|
+
|
|
203
|
+
def finalize_links(self, pages: list[list[dict[str, object]]]) -> None:
|
|
204
|
+
"""消除所有解析期链接占位,保留无效链接的文字与样式。"""
|
|
205
|
+
targets = {
|
|
206
|
+
placeholder: (f"#{anchor}" if (anchor := self._registry.resolve_target(path, fragment)) else None)
|
|
207
|
+
for placeholder, (path, fragment) in self._pending_links.items()
|
|
208
|
+
}
|
|
209
|
+
for page in pages:
|
|
210
|
+
_finalize_pending_content(page, targets)
|
|
211
|
+
self._pending_links.clear()
|
|
212
|
+
|
|
169
213
|
def heading_anchor(self, heading: etree._Element) -> str | None:
|
|
170
214
|
"""返回一个已预扫描 EPUB 标题的规范 anchor。"""
|
|
171
215
|
return self._registry.heading_anchor(heading)
|
|
@@ -179,7 +223,7 @@ class EpubAnchorRegistry:
|
|
|
179
223
|
return self._registry.note_anchor(note)
|
|
180
224
|
|
|
181
225
|
def resolve_anchor(self, href: str, *, base_part: str) -> str | None:
|
|
182
|
-
"""
|
|
226
|
+
"""解析指向已登记正文、标题或 note 的包内链接,返回不带井号的 anchor。"""
|
|
183
227
|
normalized = sanitize_hyperlink_target(
|
|
184
228
|
href,
|
|
185
229
|
allowed_schemes=(),
|
|
@@ -194,7 +238,7 @@ class EpubAnchorRegistry:
|
|
|
194
238
|
return self._registry.resolve_target(target.path, target.fragment)
|
|
195
239
|
|
|
196
240
|
def resolve_link(self, href: str, *, base_part: str) -> str | None:
|
|
197
|
-
"""
|
|
241
|
+
"""解析安全外部链接或指向已登记输出块的 EPUB 内部链接。"""
|
|
198
242
|
external = sanitize_hyperlink_target(href)
|
|
199
243
|
if external is not None:
|
|
200
244
|
return external
|
|
@@ -217,7 +261,9 @@ class _EpubMarkupContext:
|
|
|
217
261
|
|
|
218
262
|
def resolve_link(self, href: str) -> str | None:
|
|
219
263
|
"""解析安全外部链接或实际存在的 EPUB 包内 anchor。"""
|
|
220
|
-
return self.anchors.resolve_link(href, base_part=self.chapter_path)
|
|
264
|
+
return self.anchors.resolve_link(href, base_part=self.chapter_path) or self.anchors.defer_link(
|
|
265
|
+
href, base_part=self.chapter_path
|
|
266
|
+
)
|
|
221
267
|
|
|
222
268
|
def resolve_image(self, source: str, *, alt: str = "") -> ResolvedMarkupImage | None:
|
|
223
269
|
"""读取并严格校验一个 EPUB 包内栅格图片引用。"""
|
|
@@ -278,12 +324,50 @@ class EpubChapterConverter:
|
|
|
278
324
|
if body is None:
|
|
279
325
|
return []
|
|
280
326
|
context = _EpubMarkupContext(self.package, self.chapter_path, self.anchors)
|
|
281
|
-
|
|
327
|
+
projector = MarkupProjector(
|
|
282
328
|
body,
|
|
283
329
|
context,
|
|
284
330
|
self.stylesheet,
|
|
285
331
|
single_document_title=False,
|
|
286
|
-
|
|
332
|
+
track_text_sources=True,
|
|
333
|
+
)
|
|
334
|
+
blocks = projector.convert()
|
|
335
|
+
self.anchors.register_text_targets(self.chapter_path, self.root, projector.text_sources)
|
|
336
|
+
return blocks
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def _finalize_pending_content(items: list[dict[str, object]], targets: dict[str, str | None]) -> None:
|
|
340
|
+
"""递归处理 raw block 和行内 Span,表格 HTML 同步替换或解包失效链接。"""
|
|
341
|
+
output: list[dict[str, object]] = []
|
|
342
|
+
flattened = False
|
|
343
|
+
for item in items:
|
|
344
|
+
content = item.get("content")
|
|
345
|
+
if isinstance(content, list):
|
|
346
|
+
_finalize_pending_content(content, targets)
|
|
347
|
+
elif item.get("type") == "table" and isinstance(content, str) and "#epub-pending-" in content:
|
|
348
|
+
root = lxml_html.fragment_fromstring(content, create_parent="div")
|
|
349
|
+
for link in root.iter("a"):
|
|
350
|
+
href = link.get("href")
|
|
351
|
+
if href in targets:
|
|
352
|
+
if target := targets[href]:
|
|
353
|
+
link.set("href", target)
|
|
354
|
+
else:
|
|
355
|
+
link.drop_tag()
|
|
356
|
+
item["content"] = (root.text or "") + "".join(lxml_html.tostring(child, encoding="unicode") for child in root)
|
|
357
|
+
url = item.get("url")
|
|
358
|
+
if item.get("type") == "hyperlink" and isinstance(url, str) and url in targets:
|
|
359
|
+
if target := targets[url]:
|
|
360
|
+
item["url"] = target
|
|
361
|
+
else:
|
|
362
|
+
if isinstance(content, list):
|
|
363
|
+
output.extend(content)
|
|
364
|
+
flattened = True
|
|
365
|
+
continue
|
|
366
|
+
output.append(item)
|
|
367
|
+
if flattened:
|
|
368
|
+
# 只有失效链接被解包的 Span 列表需要重新合并,避免重复校验整本正文。
|
|
369
|
+
output = normalize_span_dicts(output)
|
|
370
|
+
items[:] = output
|
|
287
371
|
|
|
288
372
|
|
|
289
373
|
def convert_svg_spine(
|
|
@@ -66,14 +66,20 @@ class HtmlModel:
|
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
class OfdModel:
|
|
69
|
-
"""
|
|
69
|
+
"""包装 OFD 固定版式解析,保留最近一次调用的非致命诊断。"""
|
|
70
|
+
|
|
71
|
+
def __init__(self) -> None:
|
|
72
|
+
"""初始化实例级诊断,避免不同文档间串用结果。"""
|
|
73
|
+
self.diagnostics: list[dict[str, Any]] = []
|
|
70
74
|
|
|
71
75
|
def predict(self, file_binary: BinaryIO) -> list[list[dict[str, Any]]]:
|
|
72
76
|
"""转换调用方持有的整份 OFD 流,并返回逐物理页 model-list。"""
|
|
73
77
|
from .ofd.converter import OfdConverter
|
|
74
78
|
|
|
79
|
+
self.diagnostics = []
|
|
75
80
|
converter = OfdConverter()
|
|
76
81
|
converter.convert(file_binary)
|
|
82
|
+
self.diagnostics = converter.diagnostics
|
|
77
83
|
return converter.pages
|
|
78
84
|
|
|
79
85
|
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""在 OFD 所属区域内恢复视觉行、样式片段和保守段落。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
import re
|
|
7
|
+
import statistics
|
|
8
|
+
from dataclasses import replace
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from ....schema import BBox, BlockType
|
|
12
|
+
from .geometry import bbox_union
|
|
13
|
+
from .models import TextLine
|
|
14
|
+
from .text import format_line_html, format_line_spans
|
|
15
|
+
|
|
16
|
+
_LIST_START = re.compile(r"^\s*(?:[•●▪◆]|[-*]\s|\d+[.)、]\s*|[一二三四五六七八九十]+[、)])")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upright_point(x: float, y: float, angle: int) -> tuple[float, float]:
|
|
20
|
+
"""将页面点旋转到文字阅读方向,统一横排与直角旋转的几何计算。"""
|
|
21
|
+
radians = math.radians(angle)
|
|
22
|
+
cosine, sine = round(math.cos(radians), 12), round(math.sin(radians), 12)
|
|
23
|
+
return cosine * x + sine * y, -sine * x + cosine * y
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def upright_box(bbox: BBox, angle: int) -> BBox:
|
|
27
|
+
"""在文字方向坐标内计算矩形外接框。"""
|
|
28
|
+
points = [upright_point(x, y, angle) for x in (bbox[0], bbox[2]) for y in (bbox[1], bbox[3])]
|
|
29
|
+
return min(p[0] for p in points), min(p[1] for p in points), max(p[0] for p in points), max(p[1] for p in points)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def line_baseline(line: TextLine) -> float:
|
|
33
|
+
"""优先读取真实字形基线,缺少字形时才退回视觉框中心。"""
|
|
34
|
+
if line.glyphs:
|
|
35
|
+
return statistics.median(upright_point(*glyph.origin, line.angle)[1] for glyph in line.glyphs)
|
|
36
|
+
box = upright_box(line.bbox, line.angle)
|
|
37
|
+
return (box[1] + box[3]) / 2
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def line_runs(line: TextLine) -> tuple[tuple[str, tuple[str, ...]], ...]:
|
|
41
|
+
"""读取已组装行的样式片段,原始行按其自身样式返回单个片段。"""
|
|
42
|
+
return line.runs or ((line.text, line.styles),)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def line_spans(line: TextLine) -> list[dict[str, object]]:
|
|
46
|
+
"""将视觉行的各样式片段投影为既有结构化 Span。"""
|
|
47
|
+
return [span for text, styles in line_runs(line) for span in format_line_spans(text, styles)]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def line_html(line: TextLine) -> str:
|
|
51
|
+
"""按片段样式序列化单元格文字,不把首片段样式扩散到整行。"""
|
|
52
|
+
return "".join(format_line_html(text, styles) for text, styles in line_runs(line))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _fragment_separator(first: TextLine, second: TextLine) -> str:
|
|
56
|
+
"""仅在英文单词片段之间存在可见词间距时补空格。"""
|
|
57
|
+
if not first.text or not second.text:
|
|
58
|
+
return ""
|
|
59
|
+
if not (first.text[-1].isascii() and second.text[0].isascii() and first.text[-1].isalnum() and second.text[0].isalnum()):
|
|
60
|
+
return ""
|
|
61
|
+
first_box = upright_box(first.glyphs[-1].bbox if first.glyphs else first.bbox, first.angle)
|
|
62
|
+
second_box = upright_box(second.glyphs[0].bbox if second.glyphs else second.bbox, second.angle)
|
|
63
|
+
widths = [box[2] - box[0] for box in (first_box, second_box)]
|
|
64
|
+
threshold = 0.2 * max(min(first.font_size, second.font_size), statistics.median(widths), 0.5)
|
|
65
|
+
return " " if second_box[0] - first_box[2] >= threshold else ""
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def merge_same_baseline_lines(lines: list[TextLine]) -> list[TextLine]:
|
|
69
|
+
"""按真实基线聚行并沿阅读方向拼接,保留样式及层和模板隔离。"""
|
|
70
|
+
metrics = {id(line): (line_baseline(line), upright_box(line.bbox, line.angle)) for line in lines}
|
|
71
|
+
ordered = sorted(lines, key=lambda line: (line.angle, line.layer_type, line.template_id or -1, metrics[id(line)][0]))
|
|
72
|
+
rows: list[list[TextLine]] = []
|
|
73
|
+
for line in ordered:
|
|
74
|
+
previous = rows[-1][0] if rows else None
|
|
75
|
+
if (
|
|
76
|
+
previous is not None
|
|
77
|
+
and (line.angle, line.layer_type, line.template_id) == (previous.angle, previous.layer_type, previous.template_id)
|
|
78
|
+
and abs(metrics[id(line)][0] - metrics[id(previous)][0]) <= 0.2 * min(line.font_size, previous.font_size)
|
|
79
|
+
):
|
|
80
|
+
rows[-1].append(line)
|
|
81
|
+
else:
|
|
82
|
+
rows.append([line])
|
|
83
|
+
output: list[TextLine] = []
|
|
84
|
+
for row in rows:
|
|
85
|
+
fragments = sorted(row, key=lambda line: (metrics[id(line)][1][0], line.paint_order))
|
|
86
|
+
assembled: list[TextLine] = []
|
|
87
|
+
for line in fragments:
|
|
88
|
+
previous = assembled[-1] if assembled else None
|
|
89
|
+
if previous is not None:
|
|
90
|
+
first_box, second_box = upright_box(previous.bbox, line.angle), metrics[id(line)][1]
|
|
91
|
+
size = min(previous.font_size, line.font_size)
|
|
92
|
+
gap = second_box[0] - first_box[2]
|
|
93
|
+
if size > 0 and max(previous.font_size, line.font_size) <= 1.35 * size and -0.25 * size <= gap <= 0.8 * size:
|
|
94
|
+
separator = _fragment_separator(previous, line)
|
|
95
|
+
runs = line_runs(previous) + (((separator, ()),) if separator else ()) + line_runs(line)
|
|
96
|
+
assembled[-1] = replace(
|
|
97
|
+
previous,
|
|
98
|
+
text=previous.text + separator + line.text,
|
|
99
|
+
bbox=bbox_union((previous.bbox, line.bbox)) or previous.bbox,
|
|
100
|
+
glyphs=previous.glyphs + line.glyphs,
|
|
101
|
+
paint_order=min(previous.paint_order, line.paint_order),
|
|
102
|
+
runs=runs,
|
|
103
|
+
)
|
|
104
|
+
continue
|
|
105
|
+
assembled.append(line)
|
|
106
|
+
output.extend(assembled)
|
|
107
|
+
return output
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _block_text(block: dict[str, Any]) -> str:
|
|
111
|
+
"""读取 OFD 私有视觉行文本,避免依赖公共 Span 的序列化细节。"""
|
|
112
|
+
return block.get("text_line", "")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _paragraph_separator(previous: str, current: str) -> str:
|
|
116
|
+
"""中文换行直接续接,英文词和句末标点后的换行补空格,保留已有空白与连字符。"""
|
|
117
|
+
last, first = previous[-1:], current[:1]
|
|
118
|
+
if not last or not first or not (last.isascii() and first.isascii()):
|
|
119
|
+
return ""
|
|
120
|
+
return " " if (last.isalnum() or last in '.,;:!?)]}"') and (first.isalnum() or first in '(["') else ""
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def merge_paragraph_blocks(blocks: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
124
|
+
"""在阅读顺序内按局部栏宽、行距及缩进合段,视觉块和辅助块作为屏障。"""
|
|
125
|
+
output: list[dict[str, Any]] = []
|
|
126
|
+
for index, block in enumerate(blocks):
|
|
127
|
+
if block["type"] != BlockType.TEXT:
|
|
128
|
+
output.append(block)
|
|
129
|
+
continue
|
|
130
|
+
angle = block["angle"]
|
|
131
|
+
current_box = upright_box(block["bbox_mm"], angle)
|
|
132
|
+
size = block["font_size_mm"]
|
|
133
|
+
# 只观察邻近且横向重叠的正文,防止另一栏或远处区域影响本栏尺度。
|
|
134
|
+
neighbors: list[dict[str, Any]] = []
|
|
135
|
+
for direction in (-1, 1):
|
|
136
|
+
for offset in range(1, 9):
|
|
137
|
+
position = index + direction * offset
|
|
138
|
+
if not 0 <= position < len(blocks):
|
|
139
|
+
break
|
|
140
|
+
candidate = blocks[position]
|
|
141
|
+
if (
|
|
142
|
+
candidate["type"] != BlockType.TEXT
|
|
143
|
+
or candidate["angle"] != angle
|
|
144
|
+
or candidate["text_scope"] != block["text_scope"]
|
|
145
|
+
):
|
|
146
|
+
break
|
|
147
|
+
box = upright_box(candidate["bbox_mm"], angle)
|
|
148
|
+
if abs(box[1] - current_box[1]) > 20 * size or min(box[2], current_box[2]) <= max(box[0], current_box[0]):
|
|
149
|
+
break
|
|
150
|
+
if abs(box[0] - current_box[0]) <= 3 * size:
|
|
151
|
+
neighbors.append(candidate)
|
|
152
|
+
context = neighbors + [block]
|
|
153
|
+
boxes = [upright_box(item["bbox_mm"], angle) for item in context]
|
|
154
|
+
right = max(box[2] for box in boxes)
|
|
155
|
+
baselines = sorted({item["baseline_mm"] for item in context})
|
|
156
|
+
gaps = [b - a for a, b in zip(baselines[:-1], baselines[1:], strict=True) if b - a >= 0.5 * size]
|
|
157
|
+
pitch = statistics.median(gaps) if gaps else 1.5 * size
|
|
158
|
+
previous = output[-1] if output else None
|
|
159
|
+
can_merge = (
|
|
160
|
+
previous is not None
|
|
161
|
+
and previous["type"] == BlockType.TEXT
|
|
162
|
+
and previous["angle"] == angle
|
|
163
|
+
and previous["text_scope"] == block["text_scope"]
|
|
164
|
+
)
|
|
165
|
+
if can_merge:
|
|
166
|
+
last_box = upright_box(previous["line_bboxes_mm"][-1], angle)
|
|
167
|
+
previous_size = previous["font_size_mm"]
|
|
168
|
+
delta = block["baseline_mm"] - previous["baseline_mm"]
|
|
169
|
+
previous_text, current_text = _block_text(previous).strip(), _block_text(block).strip()
|
|
170
|
+
can_merge = (
|
|
171
|
+
min(size, previous_size) > 0
|
|
172
|
+
and max(size, previous_size) <= 1.25 * min(size, previous_size)
|
|
173
|
+
and 0.5 * size <= delta <= min(1.4 * pitch, 3 * size)
|
|
174
|
+
and -2.5 * size <= current_box[0] - last_box[0] <= 0.8 * size
|
|
175
|
+
and right - last_box[2] <= 1.5 * size
|
|
176
|
+
and min(last_box[2], current_box[2]) > max(last_box[0], current_box[0])
|
|
177
|
+
and not _LIST_START.match(current_text)
|
|
178
|
+
and not (len(previous_text) <= 4 or len(current_text) <= 4)
|
|
179
|
+
)
|
|
180
|
+
if can_merge:
|
|
181
|
+
previous_text, current_text = _block_text(previous), _block_text(block)
|
|
182
|
+
separator = _paragraph_separator(previous_text, current_text)
|
|
183
|
+
previous["content"].extend(format_line_spans(separator, ()))
|
|
184
|
+
previous["content"].extend(block["content"])
|
|
185
|
+
previous["bbox_mm"] = bbox_union((previous["bbox_mm"], block["bbox_mm"]))
|
|
186
|
+
previous["line_bboxes_mm"].extend(block["line_bboxes_mm"])
|
|
187
|
+
previous["baseline_mm"] = block["baseline_mm"]
|
|
188
|
+
previous["text_line"] = current_text
|
|
189
|
+
else:
|
|
190
|
+
# 复制将被追加的列表,确保组段不会修改调用方的原始视觉行。
|
|
191
|
+
output.append({**block, "content": list(block["content"]), "line_bboxes_mm": list(block["line_bboxes_mm"])})
|
|
192
|
+
return output
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""OFD 二进制流到分页 raw model-list 的转换入口。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import BinaryIO
|
|
6
|
+
import base64
|
|
7
|
+
|
|
8
|
+
from .constants import MAX_TOTAL_BYTES
|
|
9
|
+
from .errors import OfdResourceLimitError
|
|
10
|
+
from .package import OfdPackage
|
|
11
|
+
from .reading_order import OfdReadingOrderProjector
|
|
12
|
+
from .scene import OfdSceneBuilder
|
|
13
|
+
from .models import ImageItem
|
|
14
|
+
from .vector import render_vector_page, UnsupportedVector
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class OfdConverter:
|
|
18
|
+
"""编排 OFD 包读取、场景构建和阅读顺序投影。"""
|
|
19
|
+
|
|
20
|
+
def __init__(self) -> None:
|
|
21
|
+
"""初始化空的分页输出。"""
|
|
22
|
+
self.pages: list[list[dict[str, object]]] = []
|
|
23
|
+
self.diagnostics: list[dict[str, object]] = []
|
|
24
|
+
|
|
25
|
+
def convert(self, file_binary: BinaryIO) -> None:
|
|
26
|
+
"""读取整份 OFD 并更新分页 model-list。"""
|
|
27
|
+
self.pages = []
|
|
28
|
+
self.diagnostics = []
|
|
29
|
+
file_bytes = file_binary.read(MAX_TOTAL_BYTES + 1)
|
|
30
|
+
if len(file_bytes) > MAX_TOTAL_BYTES:
|
|
31
|
+
raise OfdResourceLimitError(f"OFD resource limit exceeded: max_total_bytes={MAX_TOTAL_BYTES}")
|
|
32
|
+
with OfdPackage(file_bytes) as package:
|
|
33
|
+
scenes = OfdSceneBuilder(package).build()
|
|
34
|
+
for scene in scenes:
|
|
35
|
+
if (
|
|
36
|
+
not scene.text_object_count
|
|
37
|
+
and not scene.image_object_count
|
|
38
|
+
and scene.vector_paths
|
|
39
|
+
and not scene.vector_unsupported
|
|
40
|
+
):
|
|
41
|
+
try:
|
|
42
|
+
payload = render_vector_page(scene, package)
|
|
43
|
+
except OfdResourceLimitError:
|
|
44
|
+
raise
|
|
45
|
+
except (UnsupportedVector, ValueError, RuntimeError, OSError) as exc:
|
|
46
|
+
scene.diagnostics.append({"code": "ofd_vector_render_failed", "message": str(exc)})
|
|
47
|
+
else:
|
|
48
|
+
if payload is not None:
|
|
49
|
+
scene.images.append(
|
|
50
|
+
ImageItem(
|
|
51
|
+
scene.physical_box,
|
|
52
|
+
"data:image/png;base64," + base64.b64encode(payload).decode("ascii"),
|
|
53
|
+
0,
|
|
54
|
+
None,
|
|
55
|
+
"Body",
|
|
56
|
+
None,
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
scene.diagnostics.append(
|
|
60
|
+
{
|
|
61
|
+
"code": "ofd_vector_rasterized",
|
|
62
|
+
"message": "Vector-only page preserved as an image; no text recognition was performed",
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
self.diagnostics.extend({**item, "page_index": scene.page_idx} for item in scene.diagnostics)
|
|
66
|
+
self.pages = OfdReadingOrderProjector(scenes).project()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
__all__ = ["OfdConverter"]
|
|
@@ -3,13 +3,16 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any, TYPE_CHECKING
|
|
7
7
|
|
|
8
8
|
from lxml import etree # type: ignore[reportMissingImports]
|
|
9
9
|
|
|
10
10
|
from ....schema import BBox
|
|
11
11
|
from .geometry import Affine, Point, Quad
|
|
12
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from .vector import VectorPath, ClipPath
|
|
15
|
+
|
|
13
16
|
|
|
14
17
|
@dataclass(frozen=True, slots=True)
|
|
15
18
|
class FontResource:
|
|
@@ -78,6 +81,7 @@ class TextLine:
|
|
|
78
81
|
layer_type: str
|
|
79
82
|
template_id: int | None
|
|
80
83
|
styles: tuple[str, ...] = ()
|
|
84
|
+
runs: tuple[tuple[str, tuple[str, ...]], ...] = ()
|
|
81
85
|
|
|
82
86
|
|
|
83
87
|
@dataclass(frozen=True, slots=True)
|
|
@@ -115,6 +119,10 @@ class OfdPageScene:
|
|
|
115
119
|
axis_lines: list[AxisLine] = field(default_factory=list)
|
|
116
120
|
images: list[ImageItem] = field(default_factory=list)
|
|
117
121
|
diagnostics: list[dict[str, Any]] = field(default_factory=list)
|
|
122
|
+
vector_paths: list[VectorPath] = field(default_factory=list)
|
|
123
|
+
text_object_count: int = 0
|
|
124
|
+
image_object_count: int = 0
|
|
125
|
+
vector_unsupported: bool = False
|
|
118
126
|
|
|
119
127
|
|
|
120
128
|
@dataclass(frozen=True, slots=True)
|
|
@@ -151,6 +159,7 @@ class PageBuildContext:
|
|
|
151
159
|
layer_type: str
|
|
152
160
|
template_id: int | None
|
|
153
161
|
draw_style: dict[str, str] = field(default_factory=dict)
|
|
162
|
+
vector_clips: tuple[tuple[ClipPath, ...], ...] = ()
|
|
154
163
|
|
|
155
164
|
|
|
156
165
|
__all__ = [
|
|
@@ -101,6 +101,12 @@ class OfdPackage:
|
|
|
101
101
|
self._asset_bytes = 0
|
|
102
102
|
self._root: etree._Element | None = None
|
|
103
103
|
|
|
104
|
+
def charge_generated_asset(self, size: int) -> None:
|
|
105
|
+
"""将生成的 PNG 与包内读取素材累计到同一文档资产预算。"""
|
|
106
|
+
if self._asset_bytes + size > MAX_ASSET_TOTAL_BYTES:
|
|
107
|
+
raise OfdResourceLimitError(f"OFD resource limit exceeded: max_asset_total_bytes={MAX_ASSET_TOTAL_BYTES}")
|
|
108
|
+
self._asset_bytes += size
|
|
109
|
+
|
|
104
110
|
@staticmethod
|
|
105
111
|
def _is_safe_member_name(name: str) -> bool:
|
|
106
112
|
"""判断 ZIP 成员是否为包内安全 POSIX 路径。"""
|