docvortex 0.4.12__tar.gz → 0.4.13__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 (677) hide show
  1. {docvortex-0.4.12/src/docvortex.egg-info → docvortex-0.4.13}/PKG-INFO +1 -1
  2. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/converters.py +29 -1
  3. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/table.py +60 -27
  4. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +109 -317
  5. docvortex-0.4.13/src/docvortex/analyzers/native/office/spreadsheet/region_discovery.py +338 -0
  6. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/version.py +1 -1
  7. {docvortex-0.4.12 → docvortex-0.4.13/src/docvortex.egg-info}/PKG-INFO +1 -1
  8. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/SOURCES.txt +1 -0
  9. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_odf.py +119 -2
  10. {docvortex-0.4.12 → docvortex-0.4.13}/LICENSE.md +0 -0
  11. {docvortex-0.4.12 → docvortex-0.4.13}/MANIFEST.in +0 -0
  12. {docvortex-0.4.12 → docvortex-0.4.13}/README.md +0 -0
  13. {docvortex-0.4.12 → docvortex-0.4.13}/demo/README.md +0 -0
  14. {docvortex-0.4.12 → docvortex-0.4.13}/demo/demo.py +0 -0
  15. {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/README.md +0 -0
  16. {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/docx_01.doc +0 -0
  17. {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/docx_01.docx +0 -0
  18. {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/pptx_01.ppt +0 -0
  19. {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/pptx_01.pptx +0 -0
  20. {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/rtf_01.rtf +0 -0
  21. {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/xlsx_01.xls +0 -0
  22. {docvortex-0.4.12 → docvortex-0.4.13}/demo/office_docs/xlsx_01.xlsx +0 -0
  23. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
  24. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
  25. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/caibao1.pdf +0 -0
  26. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo1.pdf +0 -0
  27. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo2.pdf +0 -0
  28. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo3.pdf +0 -0
  29. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo4.pdf +0 -0
  30. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/demo6.pdf +0 -0
  31. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
  32. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
  33. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
  34. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
  35. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs/small_ocr.pdf +0 -0
  36. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
  37. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
  38. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
  39. {docvortex-0.4.12 → docvortex-0.4.13}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
  40. {docvortex-0.4.12 → docvortex-0.4.13}/docs/HTML_PROTOCOL.md +0 -0
  41. {docvortex-0.4.12 → docvortex-0.4.13}/docs/JSON_PROTOCOL.md +0 -0
  42. {docvortex-0.4.12 → docvortex-0.4.13}/docs/METADATA.md +0 -0
  43. {docvortex-0.4.12 → docvortex-0.4.13}/docs/PDF_FONTS.md +0 -0
  44. {docvortex-0.4.12 → docvortex-0.4.13}/docs/RENDER_OWNERSHIP.md +0 -0
  45. {docvortex-0.4.12 → docvortex-0.4.13}/docs/USAGE.md +0 -0
  46. {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-manual-annotations-2026-09-15.md +0 -0
  47. {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-round2-annotations-2026-09-15.md +0 -0
  48. {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-rule-generalization-2026-09-15.md +0 -0
  49. {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
  50. {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
  51. {docvortex-0.4.12 → docvortex-0.4.13}/docs/flash-title-coverage-2026-09-16.md +0 -0
  52. {docvortex-0.4.12 → docvortex-0.4.13}/docs/sdk-0.4.md +0 -0
  53. {docvortex-0.4.12 → docvortex-0.4.13}/pyproject.toml +0 -0
  54. {docvortex-0.4.12 → docvortex-0.4.13}/schemas/middle-2.0.json +0 -0
  55. {docvortex-0.4.12 → docvortex-0.4.13}/schemas/model-2.0.json +0 -0
  56. {docvortex-0.4.12 → docvortex-0.4.13}/setup.cfg +0 -0
  57. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/__init__.py +0 -0
  58. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/__init__.py +0 -0
  59. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/__init__.py +0 -0
  60. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
  61. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
  62. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/image.py +0 -0
  63. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
  64. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
  65. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
  66. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
  67. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
  68. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
  69. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/names.py +0 -0
  70. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
  71. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/contracts.py +0 -0
  72. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/csv.py +0 -0
  73. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
  74. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/constants.py +0 -0
  75. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/converter.py +0 -0
  76. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/errors.py +0 -0
  77. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
  78. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/package.py +0 -0
  79. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/properties.py +0 -0
  80. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
  81. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/__init__.py +0 -0
  82. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/anchors.py +0 -0
  83. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/constants.py +0 -0
  84. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/converter.py +0 -0
  85. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/document.py +0 -0
  86. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/errors.py +0 -0
  87. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/metadata.py +0 -0
  88. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/resources.py +0 -0
  89. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/html/selector.py +0 -0
  90. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/models.py +0 -0
  91. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
  92. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
  93. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
  94. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
  95. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
  96. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
  97. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/images.py +0 -0
  98. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
  99. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/models.py +0 -0
  100. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/package.py +0 -0
  101. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/path.py +0 -0
  102. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
  103. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
  104. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
  105. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/table.py +0 -0
  106. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/text.py +0 -0
  107. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
  108. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/__init__.py +0 -0
  109. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
  110. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
  111. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
  112. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
  113. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
  114. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
  115. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
  116. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
  117. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
  118. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
  119. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
  120. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
  121. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
  122. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
  123. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
  124. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
  125. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
  126. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
  127. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
  128. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
  129. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
  130. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
  131. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
  132. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
  133. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
  134. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
  135. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
  136. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
  137. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
  138. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
  139. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
  140. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
  141. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
  142. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
  143. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/errors.py +0 -0
  144. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/image.py +0 -0
  145. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
  146. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
  147. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
  148. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
  149. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/limits.py +0 -0
  150. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/metadata.py +0 -0
  151. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
  152. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
  153. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
  154. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
  155. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
  156. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
  157. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
  158. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
  159. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
  160. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
  161. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/opc.py +0 -0
  162. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
  163. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
  164. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
  165. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
  166. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
  167. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
  168. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
  169. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
  170. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
  171. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
  172. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
  173. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
  174. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
  175. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
  176. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
  177. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
  178. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
  179. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
  180. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
  181. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
  182. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
  183. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
  184. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
  185. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
  186. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
  187. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
  188. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
  189. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/streams.py +0 -0
  190. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
  191. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
  192. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
  193. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
  194. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
  195. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
  196. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
  197. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
  198. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
  199. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
  200. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
  201. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
  202. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
  203. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
  204. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
  205. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
  206. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
  207. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
  208. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
  209. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
  210. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
  211. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
  212. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
  213. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
  214. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
  215. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
  216. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
  217. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
  218. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
  219. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
  220. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
  221. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
  222. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
  223. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
  224. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
  225. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
  226. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
  227. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
  228. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
  229. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
  230. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
  231. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
  232. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
  233. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
  234. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
  235. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
  236. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/models.py +0 -0
  237. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
  238. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
  239. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
  240. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
  241. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
  242. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
  243. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
  244. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
  245. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
  246. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
  247. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
  248. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
  249. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
  250. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
  251. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
  252. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
  253. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
  254. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
  255. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
  256. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
  257. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
  258. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
  259. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
  260. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
  261. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
  262. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
  263. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
  264. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
  265. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
  266. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
  267. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
  268. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
  269. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
  270. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
  271. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
  272. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/analyzers/pdf.py +0 -0
  273. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/api.py +0 -0
  274. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/assets/__init__.py +0 -0
  275. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/assets/images.py +0 -0
  276. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/assets/store.py +0 -0
  277. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/cli.py +0 -0
  278. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/__init__.py +0 -0
  279. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/__init__.py +0 -0
  280. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/contracts.py +0 -0
  281. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/materializer.py +0 -0
  282. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/parser.py +0 -0
  283. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/html/resources.py +0 -0
  284. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/codecs/json.py +0 -0
  285. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/__init__.py +0 -0
  286. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/inline.py +0 -0
  287. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/links.py +0 -0
  288. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/__init__.py +0 -0
  289. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/anchors.py +0 -0
  290. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/formula.py +0 -0
  291. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/projector.py +0 -0
  292. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/markup/styles.py +0 -0
  293. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/mathml.py +0 -0
  294. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/normalization.py +0 -0
  295. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/spans.py +0 -0
  296. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/__init__.py +0 -0
  297. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/blocks.py +0 -0
  298. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/content.py +0 -0
  299. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/document.py +0 -0
  300. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/html.py +0 -0
  301. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/models.py +0 -0
  302. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/rules.py +0 -0
  303. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/table/structure.py +0 -0
  304. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/text.py +0 -0
  305. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/content/tree.py +0 -0
  306. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/__init__.py +0 -0
  307. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/contracts.py +0 -0
  308. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/detection.py +0 -0
  309. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/filetypes.py +0 -0
  310. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/page_range.py +0 -0
  311. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/__init__.py +0 -0
  312. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/_document.py +0 -0
  313. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/classify.py +0 -0
  314. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/constants.py +0 -0
  315. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/font_runtime.py +0 -0
  316. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/images.py +0 -0
  317. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/layout.py +0 -0
  318. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/metadata.py +0 -0
  319. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_annotations.py +0 -0
  320. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_contracts.py +0 -0
  321. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_coordinates.py +0 -0
  322. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
  323. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_objects.py +0 -0
  324. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
  325. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/pdfium.py +0 -0
  326. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/raster.py +0 -0
  327. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/__init__.py +0 -0
  328. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/_contracts.py +0 -0
  329. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/dedup.py +0 -0
  330. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/extract.py +0 -0
  331. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/geometry.py +0 -0
  332. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/text/groups.py +0 -0
  333. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/pdf/visuals.py +0 -0
  334. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/properties.py +0 -0
  335. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/document/source.py +0 -0
  336. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/errors.py +0 -0
  337. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/export/__init__.py +0 -0
  338. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/export/bundle.py +0 -0
  339. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/export/files.py +0 -0
  340. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/export/middle.py +0 -0
  341. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/__init__.py +0 -0
  342. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_coordinates.py +0 -0
  343. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_geometry.py +0 -0
  344. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_hyperlink.py +0 -0
  345. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_image.py +0 -0
  346. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_image_operations.py +0 -0
  347. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_image_payload.py +0 -0
  348. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_svg_raster.py +0 -0
  349. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/_text.py +0 -0
  350. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/image_encoding.py +0 -0
  351. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/language.py +0 -0
  352. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/type_identity.py +0 -0
  353. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/foundation/xml_names.py +0 -0
  354. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/geometry.py +0 -0
  355. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/metadata.py +0 -0
  356. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/options.py +0 -0
  357. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/__init__.py +0 -0
  358. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/content.py +0 -0
  359. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/document.py +0 -0
  360. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/lists.py +0 -0
  361. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/page_blocks.py +0 -0
  362. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/pages.py +0 -0
  363. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/paragraphs.py +0 -0
  364. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/postprocess/visual.py +0 -0
  365. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/public_api.py +0 -0
  366. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/__init__.py +0 -0
  367. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/__init__.py +0 -0
  368. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/__init__.py +0 -0
  369. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/context.py +0 -0
  370. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/html_table.py +0 -0
  371. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/index.py +0 -0
  372. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/list_items.py +0 -0
  373. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/common/planner.py +0 -0
  374. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/__init__.py +0 -0
  375. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/assets.py +0 -0
  376. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/inline.py +0 -0
  377. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/math.py +0 -0
  378. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/renderer.py +0 -0
  379. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/styles.py +0 -0
  380. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/docx/table.py +0 -0
  381. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/epub/__init__.py +0 -0
  382. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/epub/assets.py +0 -0
  383. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/epub/package.py +0 -0
  384. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/epub/renderer.py +0 -0
  385. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/__init__.py +0 -0
  386. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/inline.py +0 -0
  387. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/renderer.py +0 -0
  388. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
  389. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/html/table.py +0 -0
  390. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/__init__.py +0 -0
  391. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/assets.py +0 -0
  392. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/inline.py +0 -0
  393. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/renderer.py +0 -0
  394. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/latex/table.py +0 -0
  395. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
  396. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/assets.py +0 -0
  397. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
  398. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
  399. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/inline.py +0 -0
  400. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
  401. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/markdown/table.py +0 -0
  402. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
  403. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/assets.py +0 -0
  404. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
  405. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
  406. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/formula.py +0 -0
  407. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
  408. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/inline.py +0 -0
  409. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/original.py +0 -0
  410. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
  411. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
  412. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
  413. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/styles.py +0 -0
  414. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/table.py +0 -0
  415. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
  416. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
  417. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
  418. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
  419. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
  420. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/api.py +0 -0
  421. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/contracts.py +0 -0
  422. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/docx.py +0 -0
  423. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/epub.py +0 -0
  424. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/fragments.py +0 -0
  425. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/html.py +0 -0
  426. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/latex.py +0 -0
  427. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/markdown.py +0 -0
  428. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/pdf.py +0 -0
  429. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/render/structured_content.py +0 -0
  430. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/epub/docvortex.css +0 -0
  431. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
  432. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/fonts/NOTICE +0 -0
  433. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/fonts/manifest.json +0 -0
  434. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/html/docvortex.css +0 -0
  435. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/html/docvortex.min.css +0 -0
  436. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
  437. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/result.py +0 -0
  438. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/schema.py +0 -0
  439. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex/visualization.py +0 -0
  440. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/dependency_links.txt +0 -0
  441. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/entry_points.txt +0 -0
  442. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/requires.txt +0 -0
  443. {docvortex-0.4.12 → docvortex-0.4.13}/src/docvortex.egg-info/top_level.txt +0 -0
  444. {docvortex-0.4.12 → docvortex-0.4.13}/tests/benchmarks/flash_pdf.py +0 -0
  445. {docvortex-0.4.12 → docvortex-0.4.13}/tests/benchmarks/native_pdf_table.py +0 -0
  446. {docvortex-0.4.12 → docvortex-0.4.13}/tests/benchmarks/pdf_render.py +0 -0
  447. {docvortex-0.4.12 → docvortex-0.4.13}/tests/benchmarks/pipeline.py +0 -0
  448. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
  449. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_layout_block_expectations.json +0 -0
  450. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
  451. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
  452. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_manual_annotations.json +0 -0
  453. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_manual_review_decisions.json +0 -0
  454. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_reviewed_history.json +0 -0
  455. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round2_annotations.json +0 -0
  456. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round2_review_decisions.json +0 -0
  457. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round3_annotations.json +0 -0
  458. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
  459. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_round3_review_decisions.json +0 -0
  460. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
  461. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
  462. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
  463. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
  464. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
  465. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
  466. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/pdf_char_dedup.json +0 -0
  467. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
  468. {docvortex-0.4.12 → docvortex-0.4.13}/tests/fixtures/rtf/semantic.rtf +0 -0
  469. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_architecture.py +0 -0
  470. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_benchmark_entrypoint.py +0 -0
  471. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_brand_protocol.py +0 -0
  472. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_cli_logging.py +0 -0
  473. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_complete_pipeline.py +0 -0
  474. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_converter_lifecycle.py +0 -0
  475. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_document_envelope.py +0 -0
  476. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_document_metadata.py +0 -0
  477. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_format_matrix.py +0 -0
  478. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_geometry_api.py +0 -0
  479. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_history_geometry_tools.py +0 -0
  480. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_html_namespace.py +0 -0
  481. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_mixed_font_script_reference.py +0 -0
  482. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_analysis_api.py +0 -0
  483. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_font_geometry.py +0 -0
  484. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_font_runtime.py +0 -0
  485. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_model_text_normalization.py +0 -0
  486. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_output_text.py +0 -0
  487. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_render_pool.py +0 -0
  488. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_source_row_merging.py +0 -0
  489. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_pdf_symbol_normalization.py +0 -0
  490. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_public_export_api.py +0 -0
  491. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_public_image_api.py +0 -0
  492. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_public_pipeline.py +0 -0
  493. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_refactor_raster.py +0 -0
  494. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_refactor_rendering.py +0 -0
  495. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_refactor_resources.py +0 -0
  496. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_release_ci_gate.py +0 -0
  497. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_render_ownership.py +0 -0
  498. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_renderer_branding.py +0 -0
  499. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_shared_boundaries.py +0 -0
  500. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_system_font_pdf_pipeline.py +0 -0
  501. {docvortex-0.4.12 → docvortex-0.4.13}/tests/test_validated_geometry.py +0 -0
  502. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
  503. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_epub_test_utils.py +0 -0
  504. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_flash_pdf_test_utils.py +0 -0
  505. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_image_mtef_test_utils.py +0 -0
  506. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_legacy_doc_test_utils.py +0 -0
  507. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
  508. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_legacy_xls_test_utils.py +0 -0
  509. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_metafile_test_utils.py +0 -0
  510. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_mtef_test_utils.py +0 -0
  511. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_mtef_v5_test_utils.py +0 -0
  512. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_native_test_utils.py +0 -0
  513. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_odf_test_utils.py +0 -0
  514. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_ofd_test_utils.py +0 -0
  515. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
  516. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
  517. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/_span_test_utils.py +0 -0
  518. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
  519. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
  520. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
  521. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
  522. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
  523. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
  524. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
  525. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
  526. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
  527. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
  528. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
  529. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
  530. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
  531. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
  532. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
  533. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
  534. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
  535. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
  536. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
  537. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
  538. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
  539. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
  540. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
  541. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
  542. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
  543. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
  544. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
  545. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
  546. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
  547. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/pdfs/test.pdf +0 -0
  548. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_backend_architecture.py +0 -0
  549. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_backend_block_object_regressions.py +0 -0
  550. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_assets.py +0 -0
  551. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_complex_fields.py +0 -0
  552. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_math.py +0 -0
  553. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_render.py +0 -0
  554. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_special_char_tables.py +0 -0
  555. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_docx_table.py +0 -0
  556. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_emfplus_integration.py +0 -0
  557. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_epub_backlinks.py +0 -0
  558. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_epub_quoted_note_types.py +0 -0
  559. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_epub_render.py +0 -0
  560. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
  561. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_csv.py +0 -0
  562. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_docx_equationxml.py +0 -0
  563. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_epub.py +0 -0
  564. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_html.py +0 -0
  565. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_image_mtef.py +0 -0
  566. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
  567. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_doc.py +0 -0
  568. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
  569. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_ppt.py +0 -0
  570. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_xls.py +0 -0
  571. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
  572. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_manual_annotations.py +0 -0
  573. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_markup_anchors.py +0 -0
  574. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_model.py +0 -0
  575. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_mtef_v5.py +0 -0
  576. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_ofd.py +0 -0
  577. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_image_mtef.py +0 -0
  578. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_metafile.py +0 -0
  579. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_models.py +0 -0
  580. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
  581. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
  582. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_office_title_types.py +0 -0
  583. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
  584. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
  585. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
  586. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
  587. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
  588. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
  589. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_extractor.py +0 -0
  590. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_formulas.py +0 -0
  591. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_graphics.py +0 -0
  592. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
  593. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
  594. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
  595. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_native_text.py +0 -0
  596. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
  597. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
  598. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_samples.py +0 -0
  599. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_scripts.py +0 -0
  600. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_semantics.py +0 -0
  601. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_tables.py +0 -0
  602. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
  603. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
  604. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_titles.py +0 -0
  605. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
  606. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_round2_annotations.py +0 -0
  607. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_round3_annotations.py +0 -0
  608. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_rtf.py +0 -0
  609. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_rule_generalization.py +0 -0
  610. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_shared_helpers.py +0 -0
  611. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_spatial_evidence.py +0 -0
  612. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
  613. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_guess_suffix_ole2.py +0 -0
  614. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_html_css_build.py +0 -0
  615. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_html_render.py +0 -0
  616. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_html_security.py +0 -0
  617. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
  618. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_latex_render.py +0 -0
  619. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_markdown_render.py +0 -0
  620. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_middle_json_block_models.py +0 -0
  621. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_middle_json_export.py +0 -0
  622. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_middle_json_validator.py +0 -0
  623. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_model_json.py +0 -0
  624. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table.py +0 -0
  625. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
  626. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
  627. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
  628. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
  629. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
  630. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_ofd_assembly.py +0 -0
  631. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_ofd_vector_tables.py +0 -0
  632. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_office_demo_exports.py +0 -0
  633. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_office_demo_pages.py +0 -0
  634. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_office_parser_regressions.py +0 -0
  635. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_cjk_style.py +0 -0
  636. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
  637. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_classify.py +0 -0
  638. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_demo_links.py +0 -0
  639. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
  640. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_document.py +0 -0
  641. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_formula_layout.py +0 -0
  642. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_object_clipping.py +0 -0
  643. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_original_layout.py +0 -0
  644. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_pagination.py +0 -0
  645. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
  646. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_render.py +0 -0
  647. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
  648. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_structured_tables.py +0 -0
  649. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_table_cache.py +0 -0
  650. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_table_round2.py +0 -0
  651. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_text_dedup.py +0 -0
  652. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_text_styles.py +0 -0
  653. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_title_font_plan.py +0 -0
  654. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_title_space.py +0 -0
  655. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_pdf_visualization.py +0 -0
  656. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_postprocess_page_blocks.py +0 -0
  657. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_postprocess_pages.py +0 -0
  658. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_postprocess_paragraphs.py +0 -0
  659. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_postprocess_visual.py +0 -0
  660. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_render_api.py +0 -0
  661. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_render_html_table.py +0 -0
  662. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_render_image_renderer.py +0 -0
  663. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_render_list_index_utils.py +0 -0
  664. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_structured_content_render.py +0 -0
  665. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_svg_raster.py +0 -0
  666. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_table_merge.py +0 -0
  667. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_table_merge_cell_merge.py +0 -0
  668. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_text_block_anchor.py +0 -0
  669. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_text_boundary_rules.py +0 -0
  670. {docvortex-0.4.12 → docvortex-0.4.13}/tests/unittest/test_text_utils.py +0 -0
  671. {docvortex-0.4.12 → docvortex-0.4.13}/tools/__init__.py +0 -0
  672. {docvortex-0.4.12 → docvortex-0.4.13}/tools/build_html_css.py +0 -0
  673. {docvortex-0.4.12 → docvortex-0.4.13}/tools/calibrate_pdf_geometry.py +0 -0
  674. {docvortex-0.4.12 → docvortex-0.4.13}/tools/capture_baseline.py +0 -0
  675. {docvortex-0.4.12 → docvortex-0.4.13}/tools/capture_platform_layout.py +0 -0
  676. {docvortex-0.4.12 → docvortex-0.4.13}/tools/compare_font_platforms.py +0 -0
  677. {docvortex-0.4.12 → docvortex-0.4.13}/tools/font_geometry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docvortex
3
- Version: 0.4.12
3
+ Version: 0.4.13
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
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import html
5
6
  import re
6
7
  from dataclasses import dataclass
7
8
  from typing import Any, BinaryIO, Iterator
@@ -14,7 +15,7 @@ from .constants import OdfSuffix, qname
14
15
  from .models import InlineNote
15
16
  from .package import OdfPackage
16
17
  from .styles import OdfStyles
17
- from .table import OdfTableExpansionBudget, parse_table_grid, split_table_regions, table_grid_to_html
18
+ from .table import OdfTableExpansionBudget, TableGrid, parse_table_grid, split_table_regions, table_grid_to_html
18
19
  from .text import (
19
20
  OdfBlockParser,
20
21
  OdfMasterPageChange,
@@ -27,6 +28,29 @@ from .text import (
27
28
  _LENGTH_RE = re.compile(r"^\s*(?P<value>[+-]?(?:\d+(?:\.\d*)?|\.\d+))(?P<unit>cm|mm|in|pt|pc|px)?\s*$")
28
29
  _LENGTH_TO_PT = {"": 1.0, "pt": 1.0, "pc": 12.0, "in": 72.0, "cm": 72.0 / 2.54, "mm": 72.0 / 25.4, "px": 0.75}
29
30
 
31
+ _PARAGRAPH_JOIN_RE = re.compile(r"\s*</p>\s*<p>\s*")
32
+ _BREAK_TAG_RE = re.compile(r"<br\s*/?>")
33
+ _PARAGRAPH_TAG_RE = re.compile(r"</?p>")
34
+
35
+
36
+ def _singleton_region_plain_text(region: TableGrid) -> str | None:
37
+ """把无结构的单格区域还原为可降级的纯文本。
38
+
39
+ 对齐 Excel 投影的单格降级条件:1x1、无合并跨度、无媒体公式等结构化
40
+ HTML;仅由段落包装与换行组成的单元格才视为普通文本。
41
+ """
42
+ if len(region.rows) != 1 or region.width != 1 or (0, 0) in region.covered:
43
+ return None
44
+ cell = region.rows[0][0] if region.rows[0] else None
45
+ if cell is None or cell.row_span > 1 or cell.col_span > 1:
46
+ return None
47
+ normalized = _BREAK_TAG_RE.sub("\n", _PARAGRAPH_JOIN_RE.sub("\n", cell.html))
48
+ normalized = _PARAGRAPH_TAG_RE.sub("", normalized)
49
+ if "<" in normalized:
50
+ return None
51
+ plain = html.unescape(normalized).strip()
52
+ return plain or None
53
+
30
54
 
31
55
  @dataclass(frozen=True, slots=True)
32
56
  class _OdfContext:
@@ -319,6 +343,10 @@ def _sheet_blocks(sheet: etree._Element, parser: OdfBlockParser) -> list[dict[st
319
343
  grid = parse_table_grid(sheet, parser.render_cell_html, expansion_budget=parser.table_expansion_budget)
320
344
  blocks: list[dict[str, Any]] = []
321
345
  for region in split_table_regions(grid):
346
+ plain_text = _singleton_region_plain_text(region)
347
+ if plain_text is not None:
348
+ blocks.append({"type": BlockType.TEXT, "content": text_spans(plain_text)})
349
+ continue
322
350
  content = table_grid_to_html(region)
323
351
  if content:
324
352
  blocks.append({"type": BlockType.TABLE, "content": content})
@@ -10,6 +10,12 @@ from dataclasses import dataclass
10
10
  from lxml import etree # type: ignore[reportMissingImports]
11
11
 
12
12
  from ..limits import MAX_GRID_SLOTS
13
+ from ..spreadsheet.region_discovery import (
14
+ discover_connected_regions,
15
+ keep_maximal_by_semantic_sets,
16
+ region_semantic_positions,
17
+ select_best_gap_candidate,
18
+ )
13
19
  from .constants import MAX_EXPANSION_TEXT_BYTES, qname
14
20
  from .errors import OdfResourceLimitError
15
21
  from .models import GridCell, TableGrid
@@ -326,37 +332,64 @@ def crop_table_grid(grid: TableGrid, bounds: tuple[int, int, int, int]) -> Table
326
332
  return trim_table_grid(TableGrid(rows=rows, header_rows=header_rows, covered=covered))
327
333
 
328
334
 
335
+ def _grid_cell_at(grid: TableGrid, row: int, col: int) -> GridCell | None:
336
+ """安全返回网格坐标上的原点单元格,越界或未物化位置返回 None。"""
337
+ cells = grid.rows[row] if 0 <= row < len(grid.rows) else []
338
+ return cells[col] if 0 <= col < len(cells) else None
339
+
340
+
329
341
  def split_table_regions(grid: TableGrid) -> list[TableGrid]:
330
- """按至少两条全空行列分隔电子表格中的离散数据区域。"""
331
- nonempty = [
332
- (row_index, col_index)
333
- for row_index, row in enumerate(grid.rows)
334
- for col_index, cell in enumerate(row)
342
+ """洪水填充发现离散数据区域,并按 gap 候选评分选择稳定分割。
343
+
344
+ 与 XLS/XLSX 投影器共用区域发现算法:连通性掩码把可见内容、合并跨度和
345
+ covered 占位都视为内容格,BFS 四向连通并在容忍距离内跨越空白;对候选
346
+ tolerance 按惩罚指标选优后,逐区域裁剪出包围盒网格。
347
+ """
348
+ max_row = len(grid.rows) - 1
349
+ max_col = grid.width - 1
350
+ if max_row < 0 or max_col < 0:
351
+ return []
352
+
353
+ def has_content(row: int, col: int) -> bool:
354
+ """判断坐标是否有可见内容或属于合并占位(对齐 Excel 投影语义)。"""
355
+ if (row, col) in grid.covered:
356
+ return True
357
+ cell = _grid_cell_at(grid, row, col)
358
+ return cell is not None and (cell.has_content or cell.row_span > 1 or cell.col_span > 1)
359
+
360
+ # 仅从有可见内容的坐标出发,对齐 Excel 投影只以有值格为起点的行为。
361
+ starts = [
362
+ (row, col)
363
+ for row, cells in enumerate(grid.rows)
364
+ for col, cell in enumerate(cells)
335
365
  if cell is not None and cell.has_content
336
366
  ]
337
- if not nonempty:
367
+ if not starts:
338
368
  return []
339
- row_values = sorted({row for row, _ in nonempty})
340
- row_bands: list[tuple[int, int]] = []
341
- start = previous = row_values[0]
342
- for current in row_values[1:]:
343
- if current - previous > 2:
344
- row_bands.append((start, previous))
345
- start = current
346
- previous = current
347
- row_bands.append((start, previous))
348
- result: list[TableGrid] = []
349
- for row_start, row_end in row_bands:
350
- cols = sorted({col for row, col in nonempty if row_start <= row <= row_end})
351
- col_start = col_previous = cols[0]
352
- for current in cols[1:] + [cols[-1] + 3]:
353
- if current - col_previous > 2:
354
- region = crop_table_grid(grid, (row_start, row_end, col_start, col_previous))
355
- if region.rows:
356
- result.append(region)
357
- col_start = current
358
- col_previous = current
359
- return result
369
+
370
+ def has_semantic_content(row: int, col: int) -> bool:
371
+ """判断坐标是否包含可见或结构化 HTML 语义。"""
372
+ cell = _grid_cell_at(grid, row, col)
373
+ return cell is not None and cell.has_content
374
+
375
+ def span_at(row: int, col: int) -> tuple[int, int]:
376
+ """返回原点单元格的合并跨度,非原点或空位返回 1x1。"""
377
+ cell = _grid_cell_at(grid, row, col)
378
+ return (cell.row_span, cell.col_span) if cell is not None else (1, 1)
379
+
380
+ _, _, best_regions = select_best_gap_candidate(
381
+ lambda tolerance: discover_connected_regions(has_content, starts, max_row, max_col, tolerance),
382
+ has_semantic_content,
383
+ span_at,
384
+ )
385
+ semantic_sets = [region_semantic_positions(region, has_semantic_content) for region in best_regions]
386
+ regions: list[TableGrid] = []
387
+ for index in keep_maximal_by_semantic_sets(semantic_sets):
388
+ region = best_regions[index]
389
+ cropped = crop_table_grid(grid, (region.row_start, region.row_end, region.col_start, region.col_end))
390
+ if cropped.rows:
391
+ regions.append(cropped)
392
+ return regions
360
393
 
361
394
 
362
395
  def _render_html_row(grid: TableGrid, row_index: int, *, header: bool) -> str:
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import collections
6
6
  import html
7
- from collections.abc import Iterator
7
+ from collections.abc import Callable, Iterator
8
8
  from typing import Any
9
9
 
10
10
  from loguru import logger
@@ -17,10 +17,12 @@ from ..._shared.hyperlink import OFFICE_EXTERNAL_HYPERLINK_SCHEMES, sanitize_hyp
17
17
  from .....content.spans import text_spans
18
18
  from .html import EQUATION_BOOKENDS, render_spreadsheet_table
19
19
  from .models import AnchoredBlock, DataRegion, ExcelCell, ExcelTable, FormulaMap, SheetImage
20
-
21
- AUTO_GAP_TOLERANCE_CANDIDATES = (0, 1, 2)
22
- AUTO_GAP_TOLERANCE_PREFERENCE = {1: 0, 0: 1, 2: 2}
23
- AUTO_GAP_TOLERANCE_PREFERENCE_MARGIN = 0.15
20
+ from .region_discovery import (
21
+ ConnectedRegion,
22
+ discover_connected_regions,
23
+ keep_maximal_by_semantic_sets,
24
+ select_best_gap_candidate,
25
+ )
24
26
 
25
27
 
26
28
  class _MergedCellLookup:
@@ -365,176 +367,50 @@ class SpreadsheetProjector:
365
367
 
366
368
  def _filter_semantic_subset_tables(self, tables: list[ExcelTable]) -> list[ExcelTable]:
367
369
  """删除语义坐标严格包含于其它候选的重复表格。"""
368
- semantic_positions = [self._get_table_semantic_positions(table) for table in tables]
369
- filtered_tables = []
370
-
371
- for table_idx, table in enumerate(tables):
372
- if any(
373
- semantic_positions[table_idx] < semantic_positions[other_idx]
374
- for other_idx in range(len(tables))
375
- if other_idx != table_idx
376
- ):
377
- continue
378
- filtered_tables.append(table)
379
-
380
- return filtered_tables
381
-
382
- def _build_table_content_mask(self, excel_table: ExcelTable) -> list[list[bool]]:
383
- """构造包含合并跨度的表格语义内容掩码。"""
384
- mask = [[False for _ in range(excel_table.num_cols)] for _ in range(excel_table.num_rows)]
385
- for cell in excel_table.data:
386
- if not self._cell_has_semantic_content(excel_table, cell):
387
- continue
388
- for row_idx in range(cell.row, min(cell.row + cell.row_span, excel_table.num_rows)):
389
- for col_idx in range(cell.col, min(cell.col + cell.col_span, excel_table.num_cols)):
390
- mask[row_idx][col_idx] = True
391
- return mask
370
+ semantic_sets = [self._get_table_semantic_positions(table) for table in tables]
371
+ return [tables[index] for index in keep_maximal_by_semantic_sets(semantic_sets)]
392
372
 
393
- @staticmethod
394
- def _count_max_consecutive_true(flags: list[bool]) -> int:
395
- """返回布尔序列中最长连续真值长度。"""
396
- max_count = 0
397
- current = 0
398
- for flag in flags:
399
- if flag:
400
- current += 1
401
- max_count = max(max_count, current)
402
- else:
403
- current = 0
404
- return max_count
405
-
406
- @staticmethod
407
- def _is_real_singleton_table(excel_table: ExcelTable) -> bool:
408
- """判断候选是否是单格且不可进一步拆分的真实表格。"""
409
- if excel_table.num_rows != 1 or excel_table.num_cols != 1 or len(excel_table.data) != 1:
410
- return False
411
- cell = excel_table.data[0]
412
- return cell.row_span == 1 and cell.col_span == 1
413
-
414
- def _summarize_table_for_gap_selection(self, excel_table: ExcelTable) -> dict[str, float | int | bool]:
415
- """计算 gap 候选评分使用的单表形态指标。"""
416
- table_area = excel_table.num_rows * excel_table.num_cols
417
- content_mask = self._build_table_content_mask(excel_table)
418
- content_area = sum(sum(1 for flag in row if flag) for row in content_mask)
419
- blank_ratio = 1.0 - (content_area / max(table_area, 1))
420
-
421
- interior_blank_rows = [not any(content_mask[row_idx]) for row_idx in range(1, max(excel_table.num_rows - 1, 1))]
422
- interior_blank_cols = [
423
- not any(content_mask[row_idx][col_idx] for row_idx in range(excel_table.num_rows))
424
- for col_idx in range(1, max(excel_table.num_cols - 1, 1))
425
- ]
426
- if excel_table.num_rows <= 2:
427
- interior_blank_rows = []
428
- if excel_table.num_cols <= 2:
429
- interior_blank_cols = []
430
-
431
- interior_blank_row_count = sum(interior_blank_rows)
432
- interior_blank_col_count = sum(interior_blank_cols)
433
- max_consecutive_interior_blank_lines = max(
434
- self._count_max_consecutive_true(interior_blank_rows),
435
- self._count_max_consecutive_true(interior_blank_cols),
436
- )
373
+ def _sheet_semantic_predicates(
374
+ self, sheet: Worksheet
375
+ ) -> tuple[Callable[[int, int], bool], Callable[[int, int], tuple[int, int]]]:
376
+ """构造 gap 评分使用的语义内容与合并跨度查询。
437
377
 
438
- return {
439
- "table_area": table_area,
440
- "content_area": content_area,
441
- "blank_ratio": blank_ratio,
442
- "interior_blank_row_count": interior_blank_row_count,
443
- "interior_blank_col_count": interior_blank_col_count,
444
- "max_consecutive_interior_blank_lines": max_consecutive_interior_blank_lines,
445
- "real_singleton": self._is_real_singleton_table(excel_table),
446
- }
378
+ 语义判断与 _build_excel_cell 物化结果保持一致:普通值取非空白文本,
379
+ DISPIMG 公式仅在解析出媒体时算内容,另叠加锚定图片与公式映射。
380
+ """
381
+ merged_lookup = self._get_merged_cell_lookup(sheet)
447
382
 
448
- def _summarize_candidate_tables(self, tables: list[ExcelTable]) -> dict[str, float | int]:
449
- """汇总一组 gap 候选表格的惩罚指标。"""
450
- table_count = len(tables)
451
- real_singleton_count = 0
452
- severe_separator_count = 0
453
- sparse_large_table_count = 0
454
- total_area = 0
455
- weighted_blank_numerator = 0.0
456
- total_interior_blank_lines = 0
457
- total_possible_interior_lines = 0
458
- row_cover_count = collections.Counter()
459
-
460
- for table in tables:
461
- table_summary = self._summarize_table_for_gap_selection(table)
462
- table_area = int(table_summary["table_area"])
463
- blank_ratio = float(table_summary["blank_ratio"])
464
- interior_blank_row_count = int(table_summary["interior_blank_row_count"])
465
- interior_blank_col_count = int(table_summary["interior_blank_col_count"])
466
- max_consecutive_interior_blank_lines = int(table_summary["max_consecutive_interior_blank_lines"])
467
-
468
- total_area += table_area
469
- weighted_blank_numerator += table_area * blank_ratio
470
- total_interior_blank_lines += interior_blank_row_count + interior_blank_col_count
471
- total_possible_interior_lines += max(table.num_rows - 2, 0) + max(table.num_cols - 2, 0)
472
- for row_idx in range(table.anchor[1], table.anchor[1] + table.num_rows):
473
- row_cover_count[row_idx] += 1
474
-
475
- if bool(table_summary["real_singleton"]):
476
- real_singleton_count += 1
477
- if table_area >= 6 and blank_ratio > 0.35:
478
- sparse_large_table_count += 1
479
- if max_consecutive_interior_blank_lines >= 2:
480
- severe_separator_count += 1
481
-
482
- occupied_row_count = max(len(row_cover_count), 1)
483
- row_overlap_excess_ratio = sum(max(0, count - 1) for count in row_cover_count.values()) / occupied_row_count
383
+ def has_semantic_content(row: int, col: int) -> bool:
384
+ """判断源坐标是否含文本、媒体或公式语义。"""
385
+ cell = sheet._cells.get((row + 1, col + 1))
386
+ if cell is not None and cell.value is not None:
387
+ raw_text = str(cell.value)
388
+ if "DISPIMG" in raw_text:
389
+ resolved_image = self._resolve_cell_image(raw_text)
390
+ if resolved_image and resolved_image.strip():
391
+ return True
392
+ elif raw_text.strip():
393
+ return True
394
+ if any(media.strip() for media in self.table_image_map.get((row, col), [])):
395
+ return True
396
+ return bool(self.math_map.get((row, col)))
484
397
 
485
- return {
486
- "real_singleton_ratio": real_singleton_count / max(table_count, 1),
487
- "weighted_blank_ratio": weighted_blank_numerator / max(total_area, 1),
488
- "interior_blank_line_ratio": total_interior_blank_lines / max(total_possible_interior_lines, 1),
489
- "sparse_large_table_ratio": sparse_large_table_count / max(table_count, 1),
490
- "severe_separator_count": severe_separator_count,
491
- "row_overlap_excess_ratio": row_overlap_excess_ratio,
492
- }
398
+ return has_semantic_content, merged_lookup.get_anchor_span
493
399
 
494
400
  def _select_best_gap_candidate(self, sheet: Worksheet) -> tuple[int, float, list[ExcelTable]]:
495
401
  """按固定候选与偏好顺序选择最稳定的 gap tolerance。"""
496
- candidates = []
497
- for gap_tolerance in AUTO_GAP_TOLERANCE_CANDIDATES:
498
- raw_tables = self._find_data_tables_with_gap_raw(sheet, gap_tolerance)
499
- summary = self._summarize_candidate_tables(raw_tables)
500
- penalty = (
501
- 6.0 * int(summary["severe_separator_count"])
502
- + 2.5 * float(summary["interior_blank_line_ratio"])
503
- + 1.5 * float(summary["sparse_large_table_ratio"])
504
- + 1.0 * float(summary["real_singleton_ratio"])
505
- + 0.5 * float(summary["weighted_blank_ratio"])
506
- + 1.0 * float(summary["row_overlap_excess_ratio"])
507
- )
508
- candidates.append(
509
- {
510
- "gap_tolerance": gap_tolerance,
511
- "penalty": penalty,
512
- "tables": self._filter_semantic_subset_tables(raw_tables),
513
- **summary,
514
- }
515
- )
516
-
517
- min_penalty = min(float(candidate["penalty"]) for candidate in candidates)
518
- near_best_candidates = [
519
- candidate
520
- for candidate in candidates
521
- if float(candidate["penalty"]) <= (min_penalty + AUTO_GAP_TOLERANCE_PREFERENCE_MARGIN)
522
- ]
523
-
524
- best_candidate = min(
525
- near_best_candidates,
526
- key=lambda candidate: (
527
- int(candidate["severe_separator_count"]),
528
- AUTO_GAP_TOLERANCE_PREFERENCE[int(candidate["gap_tolerance"])],
529
- float(candidate["interior_blank_line_ratio"]),
530
- float(candidate["penalty"]),
531
- ),
402
+ bounds: DataRegion = self._find_true_data_bounds(sheet)
403
+ has_semantic_content, span_at = self._sheet_semantic_predicates(sheet)
404
+ gap_tolerance, penalty, best_regions = select_best_gap_candidate(
405
+ lambda tolerance: self._discover_sheet_regions(sheet, bounds, tolerance),
406
+ has_semantic_content,
407
+ span_at,
532
408
  )
533
- return (
534
- int(best_candidate["gap_tolerance"]),
535
- float(best_candidate["penalty"]),
536
- best_candidate["tables"],
409
+ merged_lookup = self._get_merged_cell_lookup(sheet)
410
+ tables = self._filter_semantic_subset_tables(
411
+ [self._materialize_region(sheet, region, merged_lookup) for region in best_regions]
537
412
  )
413
+ return gap_tolerance, penalty, tables
538
414
 
539
415
  def _select_best_tables(self, sheet: Worksheet) -> list[ExcelTable]:
540
416
  """选择并记录当前工作表的最佳表格候选集合。"""
@@ -585,28 +461,77 @@ class SpreadsheetProjector:
585
461
  def _find_data_tables_with_gap_raw(self, sheet: Worksheet, gap_tolerance: int) -> list[ExcelTable]:
586
462
  """在固定 gap_tolerance 下查找工作表中的所有数据表格。"""
587
463
  bounds: DataRegion = self._find_true_data_bounds(sheet) # 获取真实数据边界
588
- tables: list[ExcelTable] = [] # 存储已发现的表格
589
- visited: set[tuple[int, int]] = set() # 记录已访问的单元格
464
+ merged_lookup = self._get_merged_cell_lookup(sheet)
465
+ return [
466
+ self._materialize_region(sheet, region, merged_lookup)
467
+ for region in self._discover_sheet_regions(sheet, bounds, gap_tolerance)
468
+ ]
469
+
470
+ def _discover_sheet_regions(
471
+ self,
472
+ sheet: Worksheet,
473
+ bounds: DataRegion,
474
+ gap_tolerance: int,
475
+ ) -> list[ConnectedRegion]:
476
+ """对当前工作表按 gap_tolerance 洪水填充发现连通数据区域。"""
477
+ merged_lookup = self._get_merged_cell_lookup(sheet)
478
+ max_row, max_col = bounds.max_row - 1, bounds.max_col - 1
479
+
480
+ def has_content(row: int, col: int) -> bool:
481
+ """检查指定单元格(0-based索引)是否有内容(有值或属于合并区域)。"""
482
+ cell = sheet._cells.get((row + 1, col + 1))
483
+ if cell is not None and cell.value is not None:
484
+ return True
485
+ return merged_lookup.contains_merged_cell(row, col)
590
486
 
591
487
  # 仅遍历已存在且有值的单元格,避免 iter_rows 在稀疏大表上创建大量空单元格。
592
- for ri, rj in self._get_non_empty_cell_positions(sheet, bounds):
593
- # 跳过已访问的单元格
594
- if (ri, rj) in visited:
595
- continue
488
+ return discover_connected_regions(
489
+ has_content,
490
+ self._get_non_empty_cell_positions(sheet, bounds),
491
+ max_row,
492
+ max_col,
493
+ gap_tolerance,
494
+ )
596
495
 
597
- # 从当前单元格出发,通过洪水填充算法确定所属表格的边界
598
- table_bounds, visited_cells = self._find_table_bounds(
599
- sheet,
600
- ri,
601
- rj,
602
- bounds.max_row,
603
- bounds.max_col,
604
- gap_tolerance,
605
- )
606
- visited.update(visited_cells) # 将已访问单元格加入全局记录
607
- tables.append(table_bounds)
496
+ def _materialize_region(
497
+ self,
498
+ sheet: Worksheet,
499
+ region: ConnectedRegion,
500
+ merged_lookup: _MergedCellLookup,
501
+ ) -> ExcelTable:
502
+ """把连通区域包围盒物化为紧凑的表格 IR,正确处理合并单元格。
608
503
 
609
- return tables
504
+ 遍历发现区域的边界框(bbox 内部的空格作为空单元格保留,维持矩形布局),
505
+ 跳过被合并单元格遮蔽的坐标并把跨度挂到合并锚点上。
506
+ """
507
+ data: list[ExcelCell] = []
508
+ for source_row in range(region.row_start, region.row_end + 1):
509
+ for source_col in range(region.col_start, region.col_end + 1):
510
+ # 跳过被合并单元格遮蔽的单元格(非左上角)。
511
+ if merged_lookup.is_hidden_merged_cell(source_row, source_col):
512
+ continue
513
+
514
+ # 计算合并跨度(默认为 1x1)。
515
+ row_span, col_span = merged_lookup.get_anchor_span(source_row, source_col)
516
+
517
+ data.append(
518
+ self._build_excel_cell(
519
+ sheet,
520
+ source_row - region.row_start,
521
+ source_col - region.col_start,
522
+ source_row,
523
+ source_col,
524
+ row_span=row_span,
525
+ col_span=col_span,
526
+ )
527
+ )
528
+
529
+ return ExcelTable(
530
+ anchor=(region.col_start, region.row_start),
531
+ num_rows=region.num_rows,
532
+ num_cols=region.num_cols,
533
+ data=data,
534
+ )
610
535
 
611
536
  def _get_non_empty_cell_positions(
612
537
  self,
@@ -661,139 +586,6 @@ class SpreadsheetProjector:
661
586
 
662
587
  return DataRegion(min_row, max_row, min_col, max_col)
663
588
 
664
- def _find_table_bounds(
665
- self,
666
- sheet: Worksheet,
667
- start_row: int,
668
- start_col: int,
669
- max_row: int,
670
- max_col: int,
671
- gap_tolerance: int,
672
- ) -> tuple[ExcelTable, set[tuple[int, int]]]:
673
- """使用洪水填充(BFS)策略确定表格边界。
674
-
675
- 该方法通过广度优先搜索(BFS)算法识别 Excel 工作表中连续的非空单元格区域,
676
- 能够准确检测非矩形表格(如 L 形、错位列等),并支持通过间隔容忍度
677
- 连接相邻但不直接相连的单元格。
678
-
679
- 算法分两个阶段执行:
680
- 1. 洪水填充阶段:使用 BFS 从给定位置出发,找出所有相连的单元格。
681
- 2. 数据提取阶段:构建矩形边界框并提取单元格数据,正确处理合并单元格。
682
-
683
- 参数:
684
- sheet: 待分析的 Excel 工作表。
685
- start_row: 洪水填充起始行索引(从0开始)。
686
- start_col: 洪水填充起始列索引(从0开始)。
687
- max_row: 工作表中可考虑的最大行索引(从0开始)。
688
- max_col: 工作表中可考虑的最大列索引(从0开始)。
689
- gap_tolerance: 允许跨越空白单元格查找邻居的最大间隔。
690
-
691
- 返回:
692
- 一个元组,包含:
693
- - ExcelTable:表示检测到的表格对象,含锚点位置、尺寸和单元格数据。
694
- - set[tuple[int, int]]:洪水填充期间访问的所有 (行, 列) 元组集合,
695
- 用于防止重复扫描。
696
-
697
- 说明:
698
- 该方法遵循 GAP_TOLERANCE 选项,允许在容忍距离内将被空单元格隔开的
699
- 单元格视为同一表格的一部分。
700
- """
701
-
702
- # BFS 队列,存储待处理的 (行, 列) 坐标
703
- queue = collections.deque([(start_row, start_col)])
704
-
705
- # 记录当前表格内已访问的单元格(避免重复加入队列)
706
- # 调用方维护全局 visited 集合,防止重复启动新表格
707
- table_cells: set[tuple[int, int]] = set()
708
- table_cells.add((start_row, start_col))
709
-
710
- # 动态记录当前表格的行列边界
711
- min_r, max_r = start_row, start_row
712
- min_c, max_c = start_col, start_col
713
- merged_lookup = self._get_merged_cell_lookup(sheet)
714
-
715
- def has_content(r: int, c: int) -> bool:
716
- """检查指定单元格(0-based索引)是否有内容(有值或属于合并区域)。"""
717
- if r < 0 or c < 0 or r > max_row or c > max_col:
718
- return False
719
-
720
- # 1. 检查单元格直接值
721
- cell = sheet._cells.get((r + 1, c + 1))
722
- if cell is not None and cell.value is not None:
723
- return True
724
-
725
- # 2. 检查是否属于某个合并单元格区域
726
- return merged_lookup.contains_merged_cell(r, c)
727
-
728
- # --- 第一阶段:洪水填充(连通性检测)---
729
- while queue:
730
- curr_r, curr_c = queue.popleft()
731
-
732
- # 动态更新表格边界
733
- min_r = min(min_r, curr_r)
734
- max_r = max(max_r, curr_r)
735
- min_c = min(min_c, curr_c)
736
- max_c = max(max_c, curr_c)
737
-
738
- # 四个方向(上、下、左、右)的邻居检测
739
- directions = [
740
- (0, 1), # 右
741
- (0, -1), # 左
742
- (1, 0), # 下
743
- (-1, 0), # 上
744
- ]
745
-
746
- for dr, dc in directions:
747
- # 在容忍距离范围内逐步检查邻居(优先检查最近的)
748
- for step in range(1, gap_tolerance + 2):
749
- nr, nc = curr_r + (dr * step), curr_c + (dc * step)
750
-
751
- if (nr, nc) in table_cells:
752
- break # 已属于当前表格,不跨越继续查找
753
-
754
- if has_content(nr, nc):
755
- table_cells.add((nr, nc))
756
- queue.append((nr, nc))
757
- # 在该方向找到连接点,停止扩展间隔
758
- break
759
-
760
- # --- 第二阶段:数据提取(语义网格构建)---
761
- data = []
762
-
763
- # 遍历发现区域的边界框(bbox内部的空格作为空单元格保留,维持矩形布局)
764
- for ri in range(min_r, max_r + 1):
765
- for rj in range(min_c, max_c + 1):
766
- # 跳过被合并单元格遮蔽的单元格(非左上角)
767
- if merged_lookup.is_hidden_merged_cell(ri, rj):
768
- continue
769
-
770
- # 计算合并跨度(默认为 1x1)
771
- row_span, col_span = merged_lookup.get_anchor_span(ri, rj)
772
-
773
- data.append(
774
- self._build_excel_cell(
775
- sheet,
776
- ri - min_r, # 相对于表格起始行的偏移
777
- rj - min_c, # 相对于表格起始列的偏移
778
- ri,
779
- rj,
780
- row_span=row_span,
781
- col_span=col_span,
782
- )
783
- )
784
-
785
- # 返回给调用方的 visited_cells 严格为包含数据/合并的单元格,
786
- # 使主循环不会重复扫描已处理的单元格。
787
- return (
788
- ExcelTable(
789
- anchor=(min_c, min_r),
790
- num_rows=max_r + 1 - min_r,
791
- num_cols=max_c + 1 - min_c,
792
- data=data,
793
- ),
794
- table_cells,
795
- )
796
-
797
589
  def _get_merged_cell_lookup(self, sheet: Worksheet) -> _MergedCellLookup:
798
590
  """获取工作表合并单元格缓存,同一轮转换内每个 sheet 只构建一次。"""
799
591
  cache_key = id(sheet)