docvortex 0.4.21__tar.gz → 0.4.23__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (691) hide show
  1. {docvortex-0.4.21/src/docvortex.egg-info → docvortex-0.4.23}/PKG-INFO +12 -10
  2. {docvortex-0.4.21 → docvortex-0.4.23}/README.md +11 -9
  3. {docvortex-0.4.21 → docvortex-0.4.23}/schemas/middle-2.0.json +1 -0
  4. {docvortex-0.4.21 → docvortex-0.4.23}/schemas/model-2.0.json +1 -0
  5. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/converter.py +4 -0
  6. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/selector.py +31 -0
  7. docvortex-0.4.23/src/docvortex/analyzers/native/mhtml/__init__.py +3 -0
  8. docvortex-0.4.23/src/docvortex/analyzers/native/mhtml/converter.py +73 -0
  9. docvortex-0.4.23/src/docvortex/analyzers/native/mhtml/resources.py +80 -0
  10. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/tables.py +18 -2
  11. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/image.py +52 -18
  12. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/limits.py +2 -0
  13. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/metadata.py +7 -5
  14. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/models.py +98 -1
  15. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/native_text.py +48 -1
  16. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_annotations.py +221 -66
  17. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_detection.py +9 -0
  18. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_rules.py +526 -180
  19. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/api.py +9 -1
  20. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/detection.py +10 -1
  21. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/filetypes.py +19 -1
  22. docvortex-0.4.23/src/docvortex/document/mhtml.py +258 -0
  23. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/metadata.py +33 -12
  24. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/schema.py +1 -0
  25. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/version.py +1 -1
  26. {docvortex-0.4.21 → docvortex-0.4.23/src/docvortex.egg-info}/PKG-INFO +12 -10
  27. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/SOURCES.txt +6 -0
  28. {docvortex-0.4.21 → docvortex-0.4.23}/tests/benchmarks/flash_pdf.py +53 -3
  29. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_document_metadata.py +29 -0
  30. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_format_matrix.py +23 -2
  31. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_image_mtef_test_utils.py +14 -0
  32. docvortex-0.4.23/tests/unittest/_mhtml_test_utils.py +67 -0
  33. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_special_char_tables.py +39 -0
  34. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_image_mtef.py +54 -4
  35. docvortex-0.4.23/tests/unittest/test_flash_mhtml.py +299 -0
  36. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_tables.py +249 -1
  37. {docvortex-0.4.21 → docvortex-0.4.23}/LICENSE.md +0 -0
  38. {docvortex-0.4.21 → docvortex-0.4.23}/MANIFEST.in +0 -0
  39. {docvortex-0.4.21 → docvortex-0.4.23}/demo/README.md +0 -0
  40. {docvortex-0.4.21 → docvortex-0.4.23}/demo/demo.py +0 -0
  41. {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/README.md +0 -0
  42. {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/docx_01.doc +0 -0
  43. {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/docx_01.docx +0 -0
  44. {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/pptx_01.ppt +0 -0
  45. {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/pptx_01.pptx +0 -0
  46. {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/rtf_01.rtf +0 -0
  47. {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/xlsx_01.xls +0 -0
  48. {docvortex-0.4.21 → docvortex-0.4.23}/demo/office_docs/xlsx_01.xlsx +0 -0
  49. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
  50. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
  51. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/caibao1.pdf +0 -0
  52. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo1.pdf +0 -0
  53. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo2.pdf +0 -0
  54. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo3.pdf +0 -0
  55. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo4.pdf +0 -0
  56. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/demo6.pdf +0 -0
  57. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
  58. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
  59. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
  60. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
  61. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs/small_ocr.pdf +0 -0
  62. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
  63. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
  64. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
  65. {docvortex-0.4.21 → docvortex-0.4.23}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
  66. {docvortex-0.4.21 → docvortex-0.4.23}/docs/HTML_PROTOCOL.md +0 -0
  67. {docvortex-0.4.21 → docvortex-0.4.23}/docs/JSON_PROTOCOL.md +0 -0
  68. {docvortex-0.4.21 → docvortex-0.4.23}/docs/METADATA.md +0 -0
  69. {docvortex-0.4.21 → docvortex-0.4.23}/docs/PDF_FONTS.md +0 -0
  70. {docvortex-0.4.21 → docvortex-0.4.23}/docs/RENDER_OWNERSHIP.md +0 -0
  71. {docvortex-0.4.21 → docvortex-0.4.23}/docs/USAGE.md +0 -0
  72. {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-manual-annotations-2026-09-15.md +0 -0
  73. {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-round2-annotations-2026-09-15.md +0 -0
  74. {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-rule-generalization-2026-09-15.md +0 -0
  75. {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
  76. {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
  77. {docvortex-0.4.21 → docvortex-0.4.23}/docs/flash-title-coverage-2026-09-16.md +0 -0
  78. {docvortex-0.4.21 → docvortex-0.4.23}/docs/sdk-0.4.md +0 -0
  79. {docvortex-0.4.21 → docvortex-0.4.23}/pyproject.toml +0 -0
  80. {docvortex-0.4.21 → docvortex-0.4.23}/setup.cfg +0 -0
  81. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/__init__.py +0 -0
  82. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/__init__.py +0 -0
  83. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/__init__.py +0 -0
  84. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
  85. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
  86. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/image.py +0 -0
  87. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
  88. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
  89. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
  90. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
  91. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
  92. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
  93. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/names.py +0 -0
  94. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
  95. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/contracts.py +0 -0
  96. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/csv.py +0 -0
  97. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
  98. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/constants.py +0 -0
  99. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/converter.py +0 -0
  100. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/errors.py +0 -0
  101. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
  102. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/package.py +0 -0
  103. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/properties.py +0 -0
  104. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
  105. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/__init__.py +0 -0
  106. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/anchors.py +0 -0
  107. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/constants.py +0 -0
  108. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/document.py +0 -0
  109. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/errors.py +0 -0
  110. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/metadata.py +0 -0
  111. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/html/resources.py +0 -0
  112. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/models.py +0 -0
  113. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
  114. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
  115. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
  116. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
  117. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
  118. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
  119. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/images.py +0 -0
  120. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
  121. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/models.py +0 -0
  122. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/package.py +0 -0
  123. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/path.py +0 -0
  124. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
  125. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
  126. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
  127. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/table.py +0 -0
  128. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/text.py +0 -0
  129. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
  130. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/__init__.py +0 -0
  131. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
  132. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
  133. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
  134. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
  135. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
  136. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
  137. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
  138. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
  139. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
  140. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
  141. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
  142. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
  143. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
  144. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
  145. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
  146. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
  147. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
  148. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
  149. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
  150. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
  151. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
  152. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
  153. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
  154. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
  155. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
  156. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
  157. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
  158. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
  159. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
  160. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
  161. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
  162. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
  163. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/errors.py +0 -0
  164. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/image.py +0 -0
  165. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
  166. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
  167. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
  168. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
  169. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
  170. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
  171. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
  172. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
  173. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
  174. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
  175. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
  176. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
  177. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
  178. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
  179. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
  180. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
  181. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/opc.py +0 -0
  182. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
  183. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
  184. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
  185. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
  186. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
  187. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
  188. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
  189. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
  190. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
  191. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
  192. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
  193. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
  194. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
  195. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
  196. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
  197. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
  198. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
  199. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
  200. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
  201. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
  202. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
  203. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
  204. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
  205. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
  206. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
  207. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
  208. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
  209. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
  210. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/spreadsheet/region_discovery.py +0 -0
  211. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/streams.py +0 -0
  212. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
  213. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
  214. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
  215. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
  216. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
  217. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
  218. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
  219. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
  220. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
  221. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
  222. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
  223. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
  224. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
  225. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
  226. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
  227. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
  228. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
  229. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
  230. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
  231. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
  232. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
  233. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
  234. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
  235. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
  236. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
  237. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
  238. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
  239. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
  240. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
  241. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
  242. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
  243. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
  244. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
  245. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
  246. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
  247. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
  248. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
  249. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
  250. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
  251. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
  252. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
  253. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
  254. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
  255. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
  256. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
  257. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
  258. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
  259. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
  260. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
  261. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
  262. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
  263. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
  264. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
  265. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
  266. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
  267. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
  268. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
  269. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
  270. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
  271. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
  272. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
  273. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
  274. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
  275. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
  276. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
  277. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
  278. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
  279. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
  280. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
  281. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
  282. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
  283. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
  284. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
  285. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
  286. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
  287. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
  288. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
  289. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/analyzers/pdf.py +0 -0
  290. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/assets/__init__.py +0 -0
  291. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/assets/images.py +0 -0
  292. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/assets/store.py +0 -0
  293. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/cli.py +0 -0
  294. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/__init__.py +0 -0
  295. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/__init__.py +0 -0
  296. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/contracts.py +0 -0
  297. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/materializer.py +0 -0
  298. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/parser.py +0 -0
  299. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/html/resources.py +0 -0
  300. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/codecs/json.py +0 -0
  301. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/__init__.py +0 -0
  302. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/inline.py +0 -0
  303. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/links.py +0 -0
  304. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/__init__.py +0 -0
  305. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/anchors.py +0 -0
  306. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/formula.py +0 -0
  307. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/projector.py +0 -0
  308. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/markup/styles.py +0 -0
  309. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/mathml.py +0 -0
  310. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/normalization.py +0 -0
  311. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/spans.py +0 -0
  312. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/__init__.py +0 -0
  313. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/blocks.py +0 -0
  314. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/content.py +0 -0
  315. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/document.py +0 -0
  316. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/html.py +0 -0
  317. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/models.py +0 -0
  318. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/rules.py +0 -0
  319. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/table/structure.py +0 -0
  320. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/text.py +0 -0
  321. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/content/tree.py +0 -0
  322. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/__init__.py +0 -0
  323. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/contracts.py +0 -0
  324. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/page_range.py +0 -0
  325. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/__init__.py +0 -0
  326. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/_document.py +0 -0
  327. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/classify.py +0 -0
  328. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/constants.py +0 -0
  329. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/font_runtime.py +0 -0
  330. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/images.py +0 -0
  331. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/layout.py +0 -0
  332. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/metadata.py +0 -0
  333. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_annotations.py +0 -0
  334. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_contracts.py +0 -0
  335. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_coordinates.py +0 -0
  336. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
  337. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_objects.py +0 -0
  338. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
  339. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/pdfium.py +0 -0
  340. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/raster.py +0 -0
  341. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/__init__.py +0 -0
  342. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/_contracts.py +0 -0
  343. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/dedup.py +0 -0
  344. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/extract.py +0 -0
  345. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/geometry.py +0 -0
  346. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/text/groups.py +0 -0
  347. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/pdf/visuals.py +0 -0
  348. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/properties.py +0 -0
  349. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/document/source.py +0 -0
  350. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/errors.py +0 -0
  351. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/__init__.py +0 -0
  352. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/_images.py +0 -0
  353. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/bundle.py +0 -0
  354. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/files.py +0 -0
  355. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/export/middle.py +0 -0
  356. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/__init__.py +0 -0
  357. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_coordinates.py +0 -0
  358. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_geometry.py +0 -0
  359. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_hyperlink.py +0 -0
  360. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_image.py +0 -0
  361. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_image_operations.py +0 -0
  362. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_image_payload.py +0 -0
  363. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_svg_raster.py +0 -0
  364. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/_text.py +0 -0
  365. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/image_encoding.py +0 -0
  366. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/language.py +0 -0
  367. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/type_identity.py +0 -0
  368. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/foundation/xml_names.py +0 -0
  369. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/geometry.py +0 -0
  370. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/options.py +0 -0
  371. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/__init__.py +0 -0
  372. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/content.py +0 -0
  373. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/document.py +0 -0
  374. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/lists.py +0 -0
  375. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/page_blocks.py +0 -0
  376. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/pages.py +0 -0
  377. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/paragraphs.py +0 -0
  378. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/postprocess/visual.py +0 -0
  379. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/public_api.py +0 -0
  380. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/__init__.py +0 -0
  381. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/__init__.py +0 -0
  382. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/__init__.py +0 -0
  383. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/context.py +0 -0
  384. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/html_table.py +0 -0
  385. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/index.py +0 -0
  386. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/list_items.py +0 -0
  387. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/common/planner.py +0 -0
  388. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/__init__.py +0 -0
  389. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/assets.py +0 -0
  390. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/inline.py +0 -0
  391. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/math.py +0 -0
  392. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/renderer.py +0 -0
  393. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/styles.py +0 -0
  394. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/docx/table.py +0 -0
  395. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/epub/__init__.py +0 -0
  396. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/epub/assets.py +0 -0
  397. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/epub/package.py +0 -0
  398. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/epub/renderer.py +0 -0
  399. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/__init__.py +0 -0
  400. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/inline.py +0 -0
  401. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/renderer.py +0 -0
  402. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
  403. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/html/table.py +0 -0
  404. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/__init__.py +0 -0
  405. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/assets.py +0 -0
  406. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/inline.py +0 -0
  407. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/renderer.py +0 -0
  408. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/latex/table.py +0 -0
  409. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
  410. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/assets.py +0 -0
  411. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
  412. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
  413. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/inline.py +0 -0
  414. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
  415. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/markdown/table.py +0 -0
  416. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
  417. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/assets.py +0 -0
  418. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
  419. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
  420. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/formula.py +0 -0
  421. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
  422. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/inline.py +0 -0
  423. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/original.py +0 -0
  424. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
  425. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
  426. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
  427. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/styles.py +0 -0
  428. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/table.py +0 -0
  429. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
  430. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
  431. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
  432. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
  433. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
  434. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/api.py +0 -0
  435. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/contracts.py +0 -0
  436. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/docx.py +0 -0
  437. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/epub.py +0 -0
  438. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/fragments.py +0 -0
  439. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/html.py +0 -0
  440. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/latex.py +0 -0
  441. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/markdown.py +0 -0
  442. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/pdf.py +0 -0
  443. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/render/structured_content.py +0 -0
  444. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/epub/docvortex.css +0 -0
  445. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
  446. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/fonts/NOTICE +0 -0
  447. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/fonts/manifest.json +0 -0
  448. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/html/docvortex.css +0 -0
  449. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/html/docvortex.min.css +0 -0
  450. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
  451. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/result.py +0 -0
  452. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex/visualization.py +0 -0
  453. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/dependency_links.txt +0 -0
  454. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/entry_points.txt +0 -0
  455. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/requires.txt +0 -0
  456. {docvortex-0.4.21 → docvortex-0.4.23}/src/docvortex.egg-info/top_level.txt +0 -0
  457. {docvortex-0.4.21 → docvortex-0.4.23}/tests/benchmarks/native_pdf_table.py +0 -0
  458. {docvortex-0.4.21 → docvortex-0.4.23}/tests/benchmarks/pdf_render.py +0 -0
  459. {docvortex-0.4.21 → docvortex-0.4.23}/tests/benchmarks/pipeline.py +0 -0
  460. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
  461. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_layout_block_expectations.json +0 -0
  462. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
  463. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
  464. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_manual_annotations.json +0 -0
  465. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_manual_review_decisions.json +0 -0
  466. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_reviewed_history.json +0 -0
  467. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round2_annotations.json +0 -0
  468. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round2_review_decisions.json +0 -0
  469. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round3_annotations.json +0 -0
  470. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
  471. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_round3_review_decisions.json +0 -0
  472. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
  473. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
  474. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
  475. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
  476. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
  477. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
  478. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/pdf_char_dedup.json +0 -0
  479. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
  480. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/pdf_numeric_citations_review.json +0 -0
  481. {docvortex-0.4.21 → docvortex-0.4.23}/tests/fixtures/rtf/semantic.rtf +0 -0
  482. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_architecture.py +0 -0
  483. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_benchmark_entrypoint.py +0 -0
  484. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_brand_protocol.py +0 -0
  485. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_cli_logging.py +0 -0
  486. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_complete_pipeline.py +0 -0
  487. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_converter_lifecycle.py +0 -0
  488. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_document_envelope.py +0 -0
  489. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_export_image_names.py +0 -0
  490. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_geometry_api.py +0 -0
  491. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_history_geometry_tools.py +0 -0
  492. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_html_namespace.py +0 -0
  493. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_mixed_font_script_reference.py +0 -0
  494. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_analysis_api.py +0 -0
  495. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_cpu_evidence.py +0 -0
  496. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_font_geometry.py +0 -0
  497. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_font_runtime.py +0 -0
  498. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_model_text_normalization.py +0 -0
  499. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_numeric_citations.py +0 -0
  500. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_output_text.py +0 -0
  501. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_render_pool.py +0 -0
  502. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_source_row_merging.py +0 -0
  503. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_pdf_symbol_normalization.py +0 -0
  504. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_public_export_api.py +0 -0
  505. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_public_image_api.py +0 -0
  506. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_public_pipeline.py +0 -0
  507. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_refactor_raster.py +0 -0
  508. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_refactor_rendering.py +0 -0
  509. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_refactor_resources.py +0 -0
  510. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_release_ci_gate.py +0 -0
  511. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_render_ownership.py +0 -0
  512. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_renderer_branding.py +0 -0
  513. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_shared_boundaries.py +0 -0
  514. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_system_font_pdf_pipeline.py +0 -0
  515. {docvortex-0.4.21 → docvortex-0.4.23}/tests/test_validated_geometry.py +0 -0
  516. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
  517. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_epub_test_utils.py +0 -0
  518. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_flash_pdf_test_utils.py +0 -0
  519. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_legacy_doc_test_utils.py +0 -0
  520. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
  521. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_legacy_xls_test_utils.py +0 -0
  522. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_metafile_test_utils.py +0 -0
  523. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_mtef_test_utils.py +0 -0
  524. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_mtef_v5_test_utils.py +0 -0
  525. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_native_test_utils.py +0 -0
  526. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_odf_test_utils.py +0 -0
  527. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_ofd_test_utils.py +0 -0
  528. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
  529. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
  530. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/_span_test_utils.py +0 -0
  531. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
  532. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
  533. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
  534. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
  535. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
  536. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
  537. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
  538. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
  539. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
  540. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
  541. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
  542. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
  543. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
  544. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
  545. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
  546. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
  547. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
  548. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
  549. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
  550. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
  551. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
  552. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
  553. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
  554. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
  555. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
  556. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
  557. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
  558. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
  559. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
  560. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/numeric_citations_introduction.pdf +0 -0
  561. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/pdfs/test.pdf +0 -0
  562. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_backend_architecture.py +0 -0
  563. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_backend_block_object_regressions.py +0 -0
  564. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_assets.py +0 -0
  565. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_complex_fields.py +0 -0
  566. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_math.py +0 -0
  567. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_render.py +0 -0
  568. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_docx_table.py +0 -0
  569. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_emfplus_integration.py +0 -0
  570. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_epub_backlinks.py +0 -0
  571. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_epub_quoted_note_types.py +0 -0
  572. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_epub_render.py +0 -0
  573. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
  574. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_csv.py +0 -0
  575. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_docx_equationxml.py +0 -0
  576. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_epub.py +0 -0
  577. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_html.py +0 -0
  578. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
  579. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_doc.py +0 -0
  580. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
  581. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_ppt.py +0 -0
  582. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_xls.py +0 -0
  583. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
  584. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_manual_annotations.py +0 -0
  585. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_markup_anchors.py +0 -0
  586. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_model.py +0 -0
  587. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_mtef_v5.py +0 -0
  588. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_odf.py +0 -0
  589. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_ofd.py +0 -0
  590. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_image_mtef.py +0 -0
  591. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_metafile.py +0 -0
  592. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_models.py +0 -0
  593. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
  594. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
  595. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_office_title_types.py +0 -0
  596. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
  597. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
  598. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
  599. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
  600. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
  601. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
  602. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_extractor.py +0 -0
  603. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_formulas.py +0 -0
  604. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_graphics.py +0 -0
  605. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
  606. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
  607. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
  608. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_native_text.py +0 -0
  609. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
  610. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
  611. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_samples.py +0 -0
  612. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_scripts.py +0 -0
  613. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_semantics.py +0 -0
  614. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_short_tails.py +0 -0
  615. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
  616. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
  617. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_titles.py +0 -0
  618. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
  619. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_round2_annotations.py +0 -0
  620. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_round3_annotations.py +0 -0
  621. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_rtf.py +0 -0
  622. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_rule_generalization.py +0 -0
  623. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_shared_helpers.py +0 -0
  624. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_spatial_evidence.py +0 -0
  625. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
  626. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_guess_suffix_ole2.py +0 -0
  627. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_html_css_build.py +0 -0
  628. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_html_render.py +0 -0
  629. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_html_security.py +0 -0
  630. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
  631. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_latex_render.py +0 -0
  632. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_markdown_render.py +0 -0
  633. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_middle_json_block_models.py +0 -0
  634. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_middle_json_export.py +0 -0
  635. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_middle_json_validator.py +0 -0
  636. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_model_json.py +0 -0
  637. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table.py +0 -0
  638. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
  639. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
  640. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
  641. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
  642. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
  643. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_ofd_assembly.py +0 -0
  644. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_ofd_vector_tables.py +0 -0
  645. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_office_demo_exports.py +0 -0
  646. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_office_demo_pages.py +0 -0
  647. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_office_parser_regressions.py +0 -0
  648. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_cjk_objects.py +0 -0
  649. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_cjk_style.py +0 -0
  650. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
  651. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_classify.py +0 -0
  652. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_demo_links.py +0 -0
  653. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
  654. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_document.py +0 -0
  655. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_formula_layout.py +0 -0
  656. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_object_clipping.py +0 -0
  657. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_original_layout.py +0 -0
  658. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_pagination.py +0 -0
  659. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
  660. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_render.py +0 -0
  661. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
  662. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_structured_tables.py +0 -0
  663. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_table_cache.py +0 -0
  664. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_table_round2.py +0 -0
  665. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_text_dedup.py +0 -0
  666. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_text_styles.py +0 -0
  667. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_title_font_plan.py +0 -0
  668. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_title_space.py +0 -0
  669. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_pdf_visualization.py +0 -0
  670. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_postprocess_page_blocks.py +0 -0
  671. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_postprocess_pages.py +0 -0
  672. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_postprocess_paragraphs.py +0 -0
  673. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_postprocess_visual.py +0 -0
  674. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_render_api.py +0 -0
  675. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_render_html_table.py +0 -0
  676. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_render_image_renderer.py +0 -0
  677. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_render_list_index_utils.py +0 -0
  678. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_structured_content_render.py +0 -0
  679. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_svg_raster.py +0 -0
  680. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_table_merge.py +0 -0
  681. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_table_merge_cell_merge.py +0 -0
  682. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_text_block_anchor.py +0 -0
  683. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_text_boundary_rules.py +0 -0
  684. {docvortex-0.4.21 → docvortex-0.4.23}/tests/unittest/test_text_utils.py +0 -0
  685. {docvortex-0.4.21 → docvortex-0.4.23}/tools/__init__.py +0 -0
  686. {docvortex-0.4.21 → docvortex-0.4.23}/tools/build_html_css.py +0 -0
  687. {docvortex-0.4.21 → docvortex-0.4.23}/tools/calibrate_pdf_geometry.py +0 -0
  688. {docvortex-0.4.21 → docvortex-0.4.23}/tools/capture_baseline.py +0 -0
  689. {docvortex-0.4.21 → docvortex-0.4.23}/tools/capture_platform_layout.py +0 -0
  690. {docvortex-0.4.21 → docvortex-0.4.23}/tools/compare_font_platforms.py +0 -0
  691. {docvortex-0.4.21 → docvortex-0.4.23}/tools/font_geometry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docvortex
3
- Version: 0.4.21
3
+ Version: 0.4.23
4
4
  Summary: A fast, multi-format document parsing and conversion engine
5
5
  License-Expression: MIT
6
6
  Project-URL: Repository, https://github.com/myhloli/DocVortex
@@ -127,17 +127,19 @@ use `overwrite=True` in Python or `--overwrite` in the CLI to replace them.
127
127
 
128
128
  ## Supported formats
129
129
 
130
- ### Native inputs · 15 formats
130
+ ### Native inputs · 17 formats
131
131
 
132
- | Document family | Formats |
132
+ | Document family | File extensions |
133
133
  | --- | --- |
134
- | PDF with native text | PDF |
135
- | Word & rich text | DOC, DOCX, RTF |
136
- | Presentations | PPT, PPTX |
137
- | Spreadsheets | XLS, XLSX, CSV, TSV |
138
- | OpenDocument | ODT, ODS, ODP |
139
- | E-books & web documents | EPUB, HTML |
140
- | Open Fixed-layout Document | OFD |
134
+ | PDF with native text | `.pdf` |
135
+ | Word & rich text | `.doc`, `.docx`, `.rtf` |
136
+ | Presentations | `.ppt`, `.pptx` |
137
+ | Spreadsheets | `.xls`, `.xlsx`, `.csv`, `.tsv` |
138
+ | OpenDocument | `.odt`, `.ods`, `.odp` |
139
+ | E-books | `.epub` |
140
+ | Web documents | `.html`, `.htm`, `.shtml` |
141
+ | Web archives | `.mhtml`, `.mht` |
142
+ | Open Fixed-layout Document | `.ofd` |
141
143
 
142
144
  ### Outputs · 7 formats
143
145
 
@@ -73,17 +73,19 @@ use `overwrite=True` in Python or `--overwrite` in the CLI to replace them.
73
73
 
74
74
  ## Supported formats
75
75
 
76
- ### Native inputs · 15 formats
76
+ ### Native inputs · 17 formats
77
77
 
78
- | Document family | Formats |
78
+ | Document family | File extensions |
79
79
  | --- | --- |
80
- | PDF with native text | PDF |
81
- | Word & rich text | DOC, DOCX, RTF |
82
- | Presentations | PPT, PPTX |
83
- | Spreadsheets | XLS, XLSX, CSV, TSV |
84
- | OpenDocument | ODT, ODS, ODP |
85
- | E-books & web documents | EPUB, HTML |
86
- | Open Fixed-layout Document | OFD |
80
+ | PDF with native text | `.pdf` |
81
+ | Word & rich text | `.doc`, `.docx`, `.rtf` |
82
+ | Presentations | `.ppt`, `.pptx` |
83
+ | Spreadsheets | `.xls`, `.xlsx`, `.csv`, `.tsv` |
84
+ | OpenDocument | `.odt`, `.ods`, `.odp` |
85
+ | E-books | `.epub` |
86
+ | Web documents | `.html`, `.htm`, `.shtml` |
87
+ | Web archives | `.mhtml`, `.mht` |
88
+ | Open Fixed-layout Document | `.ofd` |
87
89
 
88
90
  ### Outputs · 7 formats
89
91
 
@@ -765,6 +765,7 @@
765
765
  "tsv",
766
766
  "epub",
767
767
  "html",
768
+ "mhtml",
768
769
  "ofd",
769
770
  "odt",
770
771
  "ods",
@@ -18,6 +18,7 @@
18
18
  "tsv",
19
19
  "epub",
20
20
  "html",
21
+ "mhtml",
21
22
  "ofd",
22
23
  "odt",
23
24
  "ods",
@@ -41,6 +41,10 @@ class HtmlConverter:
41
41
  raise HtmlResourceLimitError(f"HTML resource limit exceeded: max_html_bytes={MAX_HTML_BYTES}")
42
42
  document = parse_html_document(file_bytes, source_context)
43
43
  resources = HtmlResourceContext(document.source_context, base_href=document.base_href)
44
+ self._convert_document(document, resources)
45
+
46
+ def _convert_document(self, document: HtmlDocument, resources: HtmlResourceContext) -> None:
47
+ """复用已解析 DOM 和资源适配器,供 HTML 与网页归档共享正文投影。"""
44
48
  wire_result = decode_docvortex_html_wire(document.body, resources)
45
49
  if wire_result.blocks is not None:
46
50
  blocks = wire_result.blocks
@@ -331,6 +331,7 @@ def _is_containment_equivalent(first: _ScoredCandidate, second: _ScoredCandidate
331
331
 
332
332
  def _soft_prune(root: etree._Element) -> None:
333
333
  """在候选副本中删除确定的导航/表单和高噪声 token 子树。"""
334
+ _prune_article_comments(root)
334
335
  metrics_by_element = _collect_soft_prune_metrics(root)
335
336
  for element in list(root.iterdescendants()):
336
337
  if not isinstance(element.tag, str):
@@ -349,6 +350,36 @@ def _soft_prune(root: etree._Element) -> None:
349
350
  _drop_tree_preserve_tail(element)
350
351
 
351
352
 
353
+ def _is_comment_region(element: etree._Element) -> bool:
354
+ """按完整词与驼峰边界识别评论容器,不匹配正文文本或任意子串。"""
355
+ value = f"{element.get('id') or ''} {element.get('class') or ''}"
356
+ value = re.sub(r"([a-z0-9])([A-Z])", r"\1 \2", value).casefold()
357
+ return bool(frozenset(_TOKEN_RE.split(value)) & {"comment", "comments"})
358
+
359
+
360
+ def _prune_article_comments(root: etree._Element) -> None:
361
+ """仅在单篇独立文章明确存在时移除附属评论,保留论坛及讨论型正文。"""
362
+ articles = [
363
+ element
364
+ for element in root.iter()
365
+ if isinstance(element.tag, str)
366
+ and (local_name(element) == "article" or "articlebody" in (element.get("itemprop") or "").casefold().split())
367
+ and not any(_is_comment_region(parent) for parent in (element, *element.iterancestors()))
368
+ and len(_normalized_text(" ".join(element.itertext()))) >= _MIN_TEXT_CHARS
369
+ ]
370
+ # 嵌套 articleBody 与 article 属于同一正文;多个独立 article 按论坛处理。
371
+ outer_articles = [element for element in articles if not any(parent in articles for parent in element.iterancestors())]
372
+ if len(outer_articles) != 1:
373
+ return
374
+ article = outer_articles[0]
375
+ for element in list(root.iterdescendants()):
376
+ if not isinstance(element.tag, str) or not _is_comment_region(element):
377
+ continue
378
+ if element is article or element in article.iterancestors():
379
+ continue
380
+ _drop_tree_preserve_tail(element)
381
+
382
+
352
383
  def _collect_soft_prune_metrics(root: etree._Element) -> dict[etree._Element, _SoftPruneMetrics]:
353
384
  """单次后序遍历预计算每个元素的完整子树文本、链接和语义对象统计。"""
354
385
  elements = [element for element in root.iter() if isinstance(element.tag, str)]
@@ -0,0 +1,3 @@
1
+ """MHTML 网页归档的 MIME 解包与静态正文解析。"""
2
+
3
+ __all__: list[str] = []
@@ -0,0 +1,73 @@
1
+ """把 MHTML 主文档及归档资源投影为现有 HTML 语义块。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import BinaryIO
6
+
7
+ from docvortex.document.contracts import HtmlSourceContext
8
+ from docvortex.document.mhtml import MAX_ARCHIVE_BYTES, MhtmlArchive
9
+ from docvortex.result import Diagnostic
10
+ from docvortex.schema import DocumentProperties
11
+
12
+ from ..html.converter import HtmlConverter
13
+ from ..html.document import HtmlDocument, parse_html_document
14
+ from ..html.metadata import read_html_properties
15
+ from .resources import MhtmlResourceContext
16
+
17
+
18
+ def read_archive_properties(archive: MhtmlArchive) -> tuple[DocumentProperties, list[str]]:
19
+ """复用 HTML 声明元数据,仅用 MIME Subject 补充缺失标题。"""
20
+ properties, warnings = read_html_properties(archive.html, archive.source_context)
21
+ properties.title = properties.title or archive.subject
22
+ return properties, warnings
23
+
24
+
25
+ class MhtmlConverter(HtmlConverter):
26
+ """通过一次解包生成正文、元数据和可选资源诊断。"""
27
+
28
+ def __init__(self) -> None:
29
+ """初始化与单次转换绑定的元数据及诊断。"""
30
+ super().__init__()
31
+ self.properties = DocumentProperties()
32
+ self.diagnostics: tuple[Diagnostic, ...] = ()
33
+
34
+ def convert(self, file_binary: BinaryIO, *, source_context: HtmlSourceContext | None = None) -> None:
35
+ """加载主 HTML 后调用共享投影,不合并 iframe 或其他 HTML 附件。"""
36
+ archive = MhtmlArchive(file_binary.read(MAX_ARCHIVE_BYTES + 1), source_context)
37
+ self.properties, warnings = read_archive_properties(archive)
38
+ document = parse_html_document(archive.html, archive.source_context)
39
+ if document.title is None and archive.subject:
40
+ from dataclasses import replace
41
+
42
+ document = replace(document, title=archive.subject)
43
+ resources = MhtmlResourceContext(archive, base_href=document.base_href)
44
+ _restore_picture_sources(document, archive)
45
+ self._convert_document(document, resources)
46
+ self.diagnostics = tuple(Diagnostic("read_metadata_failed", warning) for warning in warnings) + tuple(
47
+ archive.diagnostics
48
+ )
49
+
50
+
51
+ def _restore_picture_sources(document: HtmlDocument, archive: MhtmlArchive) -> None:
52
+ """当回退图片未归档时采用已保存的 picture/srcset 候选,不发起外部请求。"""
53
+ for image in document.body.iter("img"):
54
+ if (image.get("src") or "").strip().casefold().startswith("data:"):
55
+ continue
56
+ if archive.find(image.get("src") or "", base_href=document.base_href) is not None:
57
+ continue
58
+ picture = next((parent for parent in image.iterancestors() if parent.tag == "picture"), None)
59
+ sources = list(picture.iter("source")) if picture is not None else []
60
+ for source in [*sources, image]:
61
+ # 浏览器归档中的网络候选按逗号分隔;data URI 无需做归档匹配。
62
+ candidates = (source.get("srcset") or "").split(",")
63
+ selected = next(
64
+ (
65
+ fields[0]
66
+ for candidate in candidates
67
+ if (fields := candidate.split()) and archive.find(fields[0], base_href=document.base_href) is not None
68
+ ),
69
+ None,
70
+ )
71
+ if selected:
72
+ image.set("src", selected)
73
+ break
@@ -0,0 +1,80 @@
1
+ """使用 MIME 内嵌图片和样式的 HTML 资源适配器。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from docvortex.content.markup import ResolvedMarkupImage
6
+ from docvortex.document.mhtml import ArchivePart, MhtmlArchive, MhtmlParseError
7
+ from docvortex.foundation._svg_raster import looks_like_svg_payload, serialize_svg_image
8
+
9
+ from ..html.constants import MAX_HTML_IMAGE_BYTES
10
+ from ..html.errors import HtmlResourceLimitError
11
+ from ..html.resources import HtmlResourceContext, _image_data_uri
12
+
13
+
14
+ class MhtmlResourceContext(HtmlResourceContext):
15
+ """仅从归档读取资源,复用 HTML 的链接、图片校验和字节预算。"""
16
+
17
+ def __init__(self, archive: MhtmlArchive, *, base_href: str | None = None) -> None:
18
+ """绑定归档并初始化以 MIME 部件为键的去重缓存。"""
19
+ super().__init__(archive.source_context, base_href=base_href)
20
+ self.archive = archive
21
+ self._archive_images: dict[ArchivePart, str | None] = {}
22
+ self._archive_stylesheets: dict[ArchivePart, str | None] = {}
23
+
24
+ def _payload(self, part: ArchivePart, reference: str) -> bytes | None:
25
+ """可选部件损坏时记录诊断;资源限额错误仍向调用方传播。"""
26
+ try:
27
+ return self.archive.decode(part)
28
+ except MhtmlParseError:
29
+ self.archive.report("mhtml_resource_invalid", reference)
30
+ return None
31
+
32
+ def resolve_image(self, source: str, *, alt: str = "") -> ResolvedMarkupImage | None:
33
+ """优先恢复归档图片,缺失时沿用安全外链或替代文本降级。"""
34
+ if not source.strip() or source.strip().casefold().startswith("data:"):
35
+ return super().resolve_image(source, alt=alt)
36
+ part = self.archive.find(source, base_href=self.base_href)
37
+ if part is None:
38
+ self.archive.report("mhtml_resource_missing", source)
39
+ return super().resolve_image(source, alt=alt)
40
+ if part not in self._archive_images:
41
+ payload = self._payload(part, source)
42
+ data_uri = None
43
+ if payload is not None:
44
+ if len(payload) > MAX_HTML_IMAGE_BYTES:
45
+ raise HtmlResourceLimitError(f"MHTML image exceeds max_html_image_bytes={MAX_HTML_IMAGE_BYTES}")
46
+ if looks_like_svg_payload(payload):
47
+ data_uri = serialize_svg_image(payload)
48
+ else:
49
+ data_uri = _image_data_uri(payload)
50
+ if data_uri is not None:
51
+ self._charge_image_bytes(len(payload))
52
+ else:
53
+ self.archive.report("mhtml_resource_invalid", source)
54
+ self._archive_images[part] = data_uri
55
+ if data_uri := self._archive_images[part]:
56
+ return ResolvedMarkupImage(image_base64=data_uri, alt=alt)
57
+ return super().resolve_image(source, alt=alt)
58
+
59
+ def load_stylesheet(self, href: str) -> str | None:
60
+ """按 HTML 源顺序读取归档 CSS,仅解释现有静态样式子集。"""
61
+ part = self.archive.find(href, base_href=self.base_href)
62
+ if part is None:
63
+ self.archive.report("mhtml_resource_missing", href)
64
+ return None
65
+ if part in self._archive_stylesheets:
66
+ return self._archive_stylesheets[part]
67
+ payload = self._payload(part, href)
68
+ text = None
69
+ if payload is not None:
70
+ if part.message.get_content_type() != "text/css":
71
+ self.archive.report("mhtml_resource_invalid", href)
72
+ else:
73
+ self._charge_stylesheet_bytes(len(payload))
74
+ try:
75
+ text = payload.decode(part.message.get_content_charset() or "utf-8-sig", errors="replace")
76
+ except LookupError:
77
+ self.archive.report("mhtml_resource_invalid", href)
78
+ text = payload.decode("utf-8-sig", errors="replace")
79
+ self._archive_stylesheets[part] = text
80
+ return text
@@ -185,7 +185,8 @@ class _DocxTables:
185
185
  """提取与 Mammoth 渲染规则一致的 XML 表格轻量签名。
186
186
 
187
187
  按文档顺序收集 w:t 及特殊字符元素,并且只处理 WordprocessingML
188
- 命名空间,以排除 Mammoth 不渲染的 OMML m:t 公式文本。
188
+ 命名空间,以排除 Mammoth 不渲染的 OMML m:t 公式文本。纵向合并的
189
+ continuation 单元格会被 Mammoth 折叠掉,因此其整个子树也不参与文本签名。
189
190
  """
190
191
  w_ns = _DocxConstants._BLIP_NAMESPACES["w"]
191
192
  char_tags = (
@@ -194,7 +195,22 @@ class _DocxTables:
194
195
  f"{{{w_ns}}}softHyphen",
195
196
  f"{{{w_ns}}}sym",
196
197
  )
197
- text = "".join(_DocxTables._xml_table_char_fragment(node) for node in xml_table.iter() if node.tag in char_tags)
198
+ continuation_nodes = set()
199
+ for cell in xml_table.iter(f"{{{w_ns}}}tc"):
200
+ properties = cell.find(f"{{{w_ns}}}tcPr")
201
+ vmerge = properties.find(f"{{{w_ns}}}vMerge") if properties is not None else None
202
+ if vmerge is None:
203
+ continue
204
+ # Mammoth 将缺少 val 或 val=continue 的单元格视为 continuation,
205
+ # 并在计算 rowspan 时丢弃该单元格的全部内容。
206
+ if vmerge.get(f"{{{w_ns}}}val") in (None, "continue"):
207
+ continuation_nodes.update(cell.iter())
208
+
209
+ text = "".join(
210
+ _DocxTables._xml_table_char_fragment(node)
211
+ for node in xml_table.iter()
212
+ if node not in continuation_nodes and node.tag in char_tags
213
+ )
198
214
  return {
199
215
  "row_count": len(xml_table.xpath('.//*[local-name()="tr"]')),
200
216
  "cell_count": len(xml_table.xpath('.//*[local-name()="tc"]')),
@@ -10,7 +10,7 @@ import struct
10
10
  from loguru import logger
11
11
 
12
12
  from ..errors import LegacyOfficeResourceLimitError
13
- from ..limits import MAX_ASSET_TOTAL_BYTES, MAX_ENTRY_BYTES, MAX_PICTURE_RECORDS
13
+ from ..limits import MAX_ENTRY_BYTES, MAX_EQUATION_CANDIDATE_TOTAL_BYTES, MAX_PICTURE_RECORDS, MAX_RECORDS
14
14
  from .mtef import decode_mtef
15
15
 
16
16
  _PLACEABLE_WMF_MAGIC = b"\xd7\xcd\xc6\x9a"
@@ -271,14 +271,18 @@ def _wmf_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
271
271
  def _gif_subblocks(
272
272
  image_data: bytes,
273
273
  cursor: int,
274
- counter: list[int],
275
- ) -> tuple[bytes, int]:
276
- """读取以零长度块终止的 GIF sub-block 序列。"""
274
+ *,
275
+ collect_payload: bool,
276
+ subblock_counter: list[int],
277
+ ) -> tuple[bytes | None, int]:
278
+ """读取 GIF sub-block 序列;仅对已识别的公式扩展保留 payload。"""
277
279
 
278
280
  chunks: list[bytes] = []
279
281
  total = 0
280
282
  while True:
281
- _charge_picture_record(counter)
283
+ subblock_counter[0] += 1
284
+ if subblock_counter[0] > MAX_RECORDS:
285
+ raise LegacyOfficeResourceLimitError(f"GIF sub-block count exceeds max_records={MAX_RECORDS}")
282
286
  if cursor >= len(image_data):
283
287
  raise _ImageEquationError("GIF sub-block length is truncated")
284
288
  size = image_data[cursor]
@@ -290,8 +294,9 @@ def _gif_subblocks(
290
294
  raise _ImageEquationError("GIF sub-block data is truncated")
291
295
  total += size
292
296
  if total > MAX_ENTRY_BYTES:
293
- raise LegacyOfficeResourceLimitError(f"GIF extension exceeds max_entry_bytes={MAX_ENTRY_BYTES}")
294
- chunks.append(image_data[cursor:end])
297
+ raise LegacyOfficeResourceLimitError(f"GIF sub-block payload exceeds max_entry_bytes={MAX_ENTRY_BYTES}")
298
+ if collect_payload:
299
+ chunks.append(image_data[cursor:end])
295
300
  cursor = end
296
301
 
297
302
 
@@ -310,6 +315,7 @@ def _gif_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
310
315
  candidates: list[bytes] = []
311
316
  recognized = False
312
317
  counter = [0]
318
+ subblock_counter = [0]
313
319
  saw_trailer = False
314
320
  while cursor < len(image_data):
315
321
  _charge_picture_record(counter)
@@ -328,7 +334,12 @@ def _gif_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
328
334
  if cursor >= len(image_data):
329
335
  raise _ImageEquationError("GIF image data is truncated")
330
336
  cursor += 1 # LZW minimum code size
331
- _image_payload, cursor = _gif_subblocks(image_data, cursor, counter)
337
+ _image_payload, cursor = _gif_subblocks(
338
+ image_data,
339
+ cursor,
340
+ collect_payload=False,
341
+ subblock_counter=subblock_counter,
342
+ )
332
343
  continue
333
344
  if marker != 0x21:
334
345
  raise _ImageEquationError("GIF block marker is invalid")
@@ -337,7 +348,12 @@ def _gif_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
337
348
  extension_label = image_data[cursor]
338
349
  cursor += 1
339
350
  if extension_label != 0xFF:
340
- _payload, cursor = _gif_subblocks(image_data, cursor, counter)
351
+ _payload, cursor = _gif_subblocks(
352
+ image_data,
353
+ cursor,
354
+ collect_payload=False,
355
+ subblock_counter=subblock_counter,
356
+ )
341
357
  continue
342
358
  if cursor >= len(image_data):
343
359
  raise _ImageEquationError("GIF application block size is truncated")
@@ -348,12 +364,24 @@ def _gif_mtef_candidates(image_data: bytes) -> tuple[list[bytes], bool]:
348
364
  raise _ImageEquationError("GIF application identifier is truncated")
349
365
  application = image_data[cursor:application_end]
350
366
  cursor = application_end
351
- payload, cursor = _gif_subblocks(image_data, cursor, counter)
352
367
  if application_size != 11:
368
+ _payload, cursor = _gif_subblocks(
369
+ image_data,
370
+ cursor,
371
+ collect_payload=False,
372
+ subblock_counter=subblock_counter,
373
+ )
353
374
  continue
354
375
  application_id = application[:8]
355
376
  authentication = application[8:11]
356
- if application_id == b"MathType" and authentication == b"001":
377
+ is_mathtype = application_id == b"MathType" and authentication == b"001"
378
+ payload, cursor = _gif_subblocks(
379
+ image_data,
380
+ cursor,
381
+ collect_payload=is_mathtype,
382
+ subblock_counter=subblock_counter,
383
+ )
384
+ if is_mathtype and payload is not None:
357
385
  recognized = True
358
386
  candidates.append(payload)
359
387
  # MathType/002 是 baseline,必须明确忽略。
@@ -406,6 +434,12 @@ class OfficeImageEquationDecoder:
406
434
  _cache: dict[tuple[str, bytes], str | None] = field(default_factory=dict)
407
435
  _warned: set[tuple[str, bytes]] = field(default_factory=set)
408
436
 
437
+ @property
438
+ def candidate_total_bytes(self) -> int:
439
+ """返回已计入预算的公式 candidate 总字节数。"""
440
+
441
+ return self.total_bytes
442
+
409
443
  def decode(
410
444
  self,
411
445
  image_data: object | None,
@@ -421,23 +455,23 @@ class OfficeImageEquationDecoder:
421
455
  if image_format is None:
422
456
  return None
423
457
  if len(image_data) > MAX_ENTRY_BYTES:
424
- raise LegacyOfficeResourceLimitError(f"image equation payload exceeds max_entry_bytes={MAX_ENTRY_BYTES}")
458
+ raise LegacyOfficeResourceLimitError(f"office image exceeds max_entry_bytes={MAX_ENTRY_BYTES}")
425
459
  digest = hashlib.sha256(image_data).digest()
426
460
  cache_key = (image_format, digest)
427
461
  if cache_key in self._cache:
428
462
  return self._cache[cache_key]
429
- if self.total_bytes + len(image_data) > MAX_ASSET_TOTAL_BYTES:
430
- raise LegacyOfficeResourceLimitError(
431
- f"image equation payloads exceed max_asset_total_bytes={MAX_ASSET_TOTAL_BYTES}"
432
- )
433
- self.total_bytes += len(image_data)
434
-
435
463
  recognized = False
436
464
  try:
437
465
  if image_format == "wmf":
438
466
  candidates, recognized = _wmf_mtef_candidates(image_data)
439
467
  else:
440
468
  candidates, recognized = _gif_mtef_candidates(image_data)
469
+ candidate_bytes = sum(len(candidate) for candidate in candidates)
470
+ if self.total_bytes + candidate_bytes > MAX_EQUATION_CANDIDATE_TOTAL_BYTES:
471
+ raise LegacyOfficeResourceLimitError(
472
+ f"image equation candidates exceed max_equation_candidate_total_bytes={MAX_EQUATION_CANDIDATE_TOTAL_BYTES}"
473
+ )
474
+ self.total_bytes += candidate_bytes
441
475
  latex = _select_candidate_latex(candidates)
442
476
  except LegacyOfficeResourceLimitError:
443
477
  raise
@@ -5,6 +5,8 @@ from typing import Final
5
5
  MAX_ENTRY_BYTES: Final = 128 * 1024 * 1024
6
6
  MAX_TOTAL_BYTES: Final = 512 * 1024 * 1024
7
7
  MAX_ASSET_TOTAL_BYTES: Final = 128 * 1024 * 1024
8
+ # 公式探测单独计费,避免普通图片耗尽嵌入素材预算;初始值与素材预算保持一致。
9
+ MAX_EQUATION_CANDIDATE_TOTAL_BYTES: Final = 128 * 1024 * 1024
8
10
  MAX_GRID_SLOTS: Final = 4_000_000
9
11
  MAX_RECORD_DEPTH: Final = 64
10
12
  MAX_RECORDS: Final = 16_000_000
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  from io import BytesIO
6
6
  from datetime import datetime, timezone
7
7
  import posixpath
8
+ from pathlib import Path
8
9
  from zipfile import ZipFile
9
10
 
10
11
  import lxml.etree as etree
@@ -12,7 +13,7 @@ import lxml.etree as etree
12
13
  from ....document.properties import property_count, property_date, property_text, property_values
13
14
  from ....errors import DocumentError
14
15
  from ....schema import DocumentProperties
15
- from .limits import MAX_ENTRY_BYTES, MAX_TOTAL_BYTES
16
+ from .limits import MAX_ENTRY_BYTES
16
17
 
17
18
  _DC = "{http://purl.org/dc/elements/1.1/}"
18
19
  _DCT = "{http://purl.org/dc/terms/}"
@@ -43,14 +44,15 @@ def _element_value(root: etree._Element | None, tag: str) -> str | None:
43
44
  return None
44
45
 
45
46
 
46
- def read_ooxml_properties(data: bytes, suffix: str) -> tuple[DocumentProperties, list[str]]:
47
+ def read_ooxml_properties(data: bytes | str | Path, suffix: str) -> tuple[DocumentProperties, list[str]]:
47
48
  """读取 OOXML 核心属性和结构计数,坏的可选属性不阻止其他读取。"""
48
49
  properties = DocumentProperties()
49
50
  warnings: list[str] = []
50
- with ZipFile(BytesIO(data)) as package:
51
+ package_source = BytesIO(data) if isinstance(data, bytes) else data
52
+ with ZipFile(package_source) as package:
51
53
  infos = package.infolist()
52
- if len(infos) > 100_000 or sum(info.file_size for info in infos) > MAX_TOTAL_BYTES:
53
- raise DocumentError("resource_limit", "OOXML metadata package exceeds resource limits")
54
+ if len(infos) > 100_000:
55
+ raise DocumentError("resource_limit", "OOXML metadata package has too many members")
54
56
  if len({info.filename for info in infos}) != len(infos):
55
57
  raise DocumentError("open_failed", "Duplicate OOXML package members")
56
58
  if _xml_part(package, "[Content_Types].xml") is None:
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from collections.abc import Iterable, Iterator, MutableSet
5
6
  from dataclasses import dataclass, field
6
7
  from typing import TYPE_CHECKING, Any, Literal
7
8
 
@@ -13,6 +14,102 @@ if TYPE_CHECKING:
13
14
  from .inline.types import PDFTextScriptLine
14
15
 
15
16
 
17
+ class _SharedLineIndexSet(MutableSet[int]):
18
+ """共享只读基底,仅为单个候选记录增删差集,避免复制大型行号集合。"""
19
+
20
+ __slots__ = ("base", "added", "removed")
21
+
22
+ def __init__(
23
+ self,
24
+ base: frozenset[int],
25
+ values: Iterable[int] = (),
26
+ ) -> None:
27
+ """以共享基底和候选已有成员初始化集合。"""
28
+
29
+ self.base = base
30
+ self.removed: set[int] = set()
31
+ if isinstance(values, _SharedLineIndexSet) and values.base is base:
32
+ # 与共享基底求并集时,基底成员天然全部可见,只需保留额外成员。
33
+ self.added = set(values.added)
34
+ elif isinstance(values, (set, frozenset)):
35
+ self.added = values.difference(base)
36
+ else:
37
+ self.added = {value for value in values if value not in base}
38
+
39
+ @classmethod
40
+ def from_exact_values(
41
+ cls,
42
+ base: frozenset[int],
43
+ values: Iterable[int],
44
+ ) -> _SharedLineIndexSet:
45
+ """以共享基底精确表示给定集合,而不是默认并入全部基底成员。"""
46
+
47
+ visible = set(values)
48
+ instance = cls.__new__(cls)
49
+ instance.base = base
50
+ instance.added = visible.difference(base)
51
+ instance.removed = set(base.difference(visible))
52
+ return instance
53
+
54
+ def __contains__(self, value: object) -> bool:
55
+ """按基底、删除集和新增集判断成员是否可见。"""
56
+
57
+ if value in self.added:
58
+ return True
59
+ return value in self.base and value not in self.removed
60
+
61
+ def __iter__(self) -> Iterator[int]:
62
+ """迭代当前可见成员,不展开持久化副本。"""
63
+
64
+ for value in self.base:
65
+ if value not in self.removed:
66
+ yield value
67
+ yield from self.added
68
+
69
+ def __len__(self) -> int:
70
+ """返回当前可见成员数量。"""
71
+
72
+ return len(self.base) - len(self.removed) + len(self.added)
73
+
74
+ def add(self, value: int) -> None:
75
+ """加入成员;基底已有成员只需撤销删除标记。"""
76
+
77
+ if value in self.base:
78
+ self.removed.discard(value)
79
+ return
80
+ self.added.add(value)
81
+
82
+ def discard(self, value: int) -> None:
83
+ """删除成员;基底成员以差集标记表示。"""
84
+
85
+ if value in self.added:
86
+ self.added.discard(value)
87
+ return
88
+ if value in self.base:
89
+ self.removed.add(value)
90
+
91
+ def update(self, values: Iterable[int]) -> None:
92
+ """并入成员;同共享基底的候选直接合并差集。"""
93
+
94
+ if isinstance(values, _SharedLineIndexSet) and values.base is self.base:
95
+ self.removed.intersection_update(values.removed)
96
+ for value in values.added:
97
+ self.add(value)
98
+ return
99
+ for value in values:
100
+ self.add(value)
101
+
102
+ def difference_update(self, values: Iterable[int]) -> None:
103
+ """移除给定成员,并保持共享基底不变。"""
104
+
105
+ if isinstance(values, (set, frozenset)):
106
+ self.added.difference_update(values)
107
+ self.removed.update(self.base.intersection(values))
108
+ return
109
+ for value in values:
110
+ self.discard(value)
111
+
112
+
16
113
  @dataclass(slots=True)
17
114
  class _LineItem:
18
115
  """保存单个可视文本行及其 source/ink/canonical 几何。"""
@@ -122,7 +219,7 @@ class _TableCandidate:
122
219
  angle: int
123
220
  score: float
124
221
  core_bbox: BBox | None = None
125
- line_indices: set[int] = field(default_factory=set)
222
+ line_indices: MutableSet[int] = field(default_factory=set)
126
223
  annotations: list[_TableAnnotation] = field(default_factory=list)
127
224
 
128
225