docvortex 0.2.3__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. {docvortex-0.2.3/src/docvortex.egg-info → docvortex-0.2.4}/PKG-INFO +2 -1
  2. {docvortex-0.2.3 → docvortex-0.2.4}/pyproject.toml +1 -0
  3. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/models.py +7 -1
  4. docvortex-0.2.4/src/docvortex/analyzers/native/ofd/assembly.py +192 -0
  5. docvortex-0.2.4/src/docvortex/analyzers/native/ofd/converter.py +69 -0
  6. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/models.py +10 -1
  7. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/package.py +6 -0
  8. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/path.py +91 -65
  9. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/reading_order.py +13 -82
  10. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/resources.py +29 -2
  11. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/scene.py +47 -10
  12. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/table.py +192 -20
  13. docvortex-0.2.4/src/docvortex/analyzers/native/ofd/vector.py +271 -0
  14. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/api.py +8 -2
  15. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/version.py +1 -1
  16. {docvortex-0.2.3 → docvortex-0.2.4/src/docvortex.egg-info}/PKG-INFO +2 -1
  17. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/SOURCES.txt +4 -0
  18. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/requires.txt +1 -0
  19. docvortex-0.2.4/tests/unittest/test_ofd_assembly.py +242 -0
  20. docvortex-0.2.4/tests/unittest/test_ofd_vector_tables.py +323 -0
  21. docvortex-0.2.3/src/docvortex/analyzers/native/ofd/converter.py +0 -31
  22. {docvortex-0.2.3 → docvortex-0.2.4}/LICENSE.md +0 -0
  23. {docvortex-0.2.3 → docvortex-0.2.4}/MANIFEST.in +0 -0
  24. {docvortex-0.2.3 → docvortex-0.2.4}/README.md +0 -0
  25. {docvortex-0.2.3 → docvortex-0.2.4}/demo/README.md +0 -0
  26. {docvortex-0.2.3 → docvortex-0.2.4}/demo/demo.py +0 -0
  27. {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/README.md +0 -0
  28. {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/docx_01.doc +0 -0
  29. {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/docx_01.docx +0 -0
  30. {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/pptx_01.ppt +0 -0
  31. {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/pptx_01.pptx +0 -0
  32. {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/rtf_01.rtf +0 -0
  33. {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/xlsx_01.xls +0 -0
  34. {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/xlsx_01.xlsx +0 -0
  35. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
  36. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
  37. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/caibao1.pdf +0 -0
  38. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo1.pdf +0 -0
  39. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo2.pdf +0 -0
  40. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo3.pdf +0 -0
  41. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo4.pdf +0 -0
  42. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo6.pdf +0 -0
  43. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
  44. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
  45. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
  46. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
  47. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/small_ocr.pdf +0 -0
  48. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
  49. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
  50. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
  51. {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
  52. {docvortex-0.2.3 → docvortex-0.2.4}/docs/HTML_PROTOCOL.md +0 -0
  53. {docvortex-0.2.3 → docvortex-0.2.4}/docs/JSON_PROTOCOL.md +0 -0
  54. {docvortex-0.2.3 → docvortex-0.2.4}/docs/PDF_FONTS.md +0 -0
  55. {docvortex-0.2.3 → docvortex-0.2.4}/docs/RENDER_OWNERSHIP.md +0 -0
  56. {docvortex-0.2.3 → docvortex-0.2.4}/schemas/middle-2.0.json +0 -0
  57. {docvortex-0.2.3 → docvortex-0.2.4}/schemas/model-2.0.json +0 -0
  58. {docvortex-0.2.3 → docvortex-0.2.4}/setup.cfg +0 -0
  59. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/__init__.py +0 -0
  60. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/__init__.py +0 -0
  61. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/__init__.py +0 -0
  62. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
  63. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
  64. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/image.py +0 -0
  65. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
  66. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
  67. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
  68. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
  69. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
  70. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
  71. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/names.py +0 -0
  72. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
  73. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/contracts.py +0 -0
  74. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/csv.py +0 -0
  75. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
  76. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/constants.py +0 -0
  77. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/converter.py +0 -0
  78. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/errors.py +0 -0
  79. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
  80. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/package.py +0 -0
  81. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
  82. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/__init__.py +0 -0
  83. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/anchors.py +0 -0
  84. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/constants.py +0 -0
  85. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/contracts.py +0 -0
  86. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/converter.py +0 -0
  87. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/document.py +0 -0
  88. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/errors.py +0 -0
  89. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/resources.py +0 -0
  90. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/selector.py +0 -0
  91. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
  92. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
  93. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
  94. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
  95. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/images.py +0 -0
  96. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
  97. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/text.py +0 -0
  98. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/__init__.py +0 -0
  99. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
  100. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
  101. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
  102. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
  103. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
  104. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
  105. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
  106. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
  107. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
  108. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
  109. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
  110. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
  111. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
  112. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
  113. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
  114. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
  115. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
  116. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
  117. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
  118. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
  119. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
  120. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
  121. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
  122. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
  123. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
  124. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
  125. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
  126. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
  127. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
  128. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
  129. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
  130. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
  131. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
  132. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
  133. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/errors.py +0 -0
  134. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/image.py +0 -0
  135. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
  136. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
  137. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
  138. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
  139. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/limits.py +0 -0
  140. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
  141. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
  142. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
  143. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
  144. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
  145. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
  146. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
  147. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
  148. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
  149. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
  150. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
  151. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
  152. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/opc.py +0 -0
  153. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
  154. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
  155. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
  156. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
  157. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
  158. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
  159. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
  160. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
  161. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
  162. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
  163. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
  164. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
  165. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
  166. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
  167. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
  168. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
  169. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
  170. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
  171. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
  172. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
  173. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
  174. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
  175. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
  176. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
  177. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
  178. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
  179. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
  180. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/streams.py +0 -0
  181. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
  182. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
  183. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
  184. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
  185. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
  186. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
  187. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
  188. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
  189. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
  190. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
  191. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
  192. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
  193. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
  194. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
  195. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
  196. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
  197. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
  198. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
  199. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
  200. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
  201. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
  202. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
  203. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
  204. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
  205. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
  206. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
  207. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
  208. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
  209. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
  210. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
  211. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
  212. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/models.py +0 -0
  213. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
  214. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
  215. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/script_geometry.py +0 -0
  216. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/shared.py +0 -0
  217. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
  218. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
  219. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
  220. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
  221. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
  222. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
  223. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
  224. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/__init__.py +0 -0
  225. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/candidate.py +0 -0
  226. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/contracts.py +0 -0
  227. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/engine.py +0 -0
  228. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/geometry.py +0 -0
  229. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_common.py +0 -0
  230. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_hybrid.py +0 -0
  231. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_multiline.py +0 -0
  232. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/text.py +0 -0
  233. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/text_grid.py +0 -0
  234. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/vector.py +0 -0
  235. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
  236. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
  237. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
  238. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
  239. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
  240. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
  241. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
  242. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
  243. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
  244. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
  245. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
  246. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
  247. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_styles.py +0 -0
  248. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
  249. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
  250. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
  251. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
  252. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
  253. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
  254. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
  255. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
  256. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
  257. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
  258. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
  259. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/assets/__init__.py +0 -0
  260. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/assets/store.py +0 -0
  261. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/cli.py +0 -0
  262. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/__init__.py +0 -0
  263. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/__init__.py +0 -0
  264. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/contracts.py +0 -0
  265. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/materializer.py +0 -0
  266. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/parser.py +0 -0
  267. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/resources.py +0 -0
  268. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/json.py +0 -0
  269. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/__init__.py +0 -0
  270. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/inline.py +0 -0
  271. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/__init__.py +0 -0
  272. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/anchors.py +0 -0
  273. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/formula.py +0 -0
  274. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/projector.py +0 -0
  275. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/styles.py +0 -0
  276. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/mathml.py +0 -0
  277. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/normalization.py +0 -0
  278. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/spans.py +0 -0
  279. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/__init__.py +0 -0
  280. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/blocks.py +0 -0
  281. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/content.py +0 -0
  282. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/document.py +0 -0
  283. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/html.py +0 -0
  284. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/models.py +0 -0
  285. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/rules.py +0 -0
  286. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/structure.py +0 -0
  287. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/tree.py +0 -0
  288. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/__init__.py +0 -0
  289. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/contracts.py +0 -0
  290. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/detection.py +0 -0
  291. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/filetypes.py +0 -0
  292. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/page_range.py +0 -0
  293. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/__init__.py +0 -0
  294. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/classify.py +0 -0
  295. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/constants.py +0 -0
  296. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/document.py +0 -0
  297. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/font_runtime.py +0 -0
  298. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/geometry.py +0 -0
  299. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/images.py +0 -0
  300. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_annotations.py +0 -0
  301. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_contracts.py +0 -0
  302. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_coordinates.py +0 -0
  303. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
  304. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_objects.py +0 -0
  305. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
  306. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/pdfium.py +0 -0
  307. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/raster.py +0 -0
  308. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/__init__.py +0 -0
  309. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/contracts.py +0 -0
  310. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/extract.py +0 -0
  311. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/geometry.py +0 -0
  312. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/groups.py +0 -0
  313. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/visual_geometry.py +0 -0
  314. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/visuals.py +0 -0
  315. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/source.py +0 -0
  316. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/errors.py +0 -0
  317. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/export/__init__.py +0 -0
  318. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/export/bundle.py +0 -0
  319. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/export/files.py +0 -0
  320. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/export/middle.py +0 -0
  321. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/__init__.py +0 -0
  322. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/geometry.py +0 -0
  323. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/hyperlink.py +0 -0
  324. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/image.py +0 -0
  325. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/image_encoding.py +0 -0
  326. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/image_payload.py +0 -0
  327. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/language.py +0 -0
  328. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/platform.py +0 -0
  329. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/text.py +0 -0
  330. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/type_identity.py +0 -0
  331. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/xml_names.py +0 -0
  332. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/options.py +0 -0
  333. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/__init__.py +0 -0
  334. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/content.py +0 -0
  335. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/document.py +0 -0
  336. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/lists.py +0 -0
  337. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/page_blocks.py +0 -0
  338. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/pages.py +0 -0
  339. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/paragraphs.py +0 -0
  340. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/visual.py +0 -0
  341. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/__init__.py +0 -0
  342. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/__init__.py +0 -0
  343. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/__init__.py +0 -0
  344. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/context.py +0 -0
  345. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/html_table.py +0 -0
  346. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/index.py +0 -0
  347. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/list_items.py +0 -0
  348. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/planner.py +0 -0
  349. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/__init__.py +0 -0
  350. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/assets.py +0 -0
  351. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/inline.py +0 -0
  352. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/math.py +0 -0
  353. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/renderer.py +0 -0
  354. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/styles.py +0 -0
  355. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/table.py +0 -0
  356. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/__init__.py +0 -0
  357. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/assets.py +0 -0
  358. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/package.py +0 -0
  359. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/renderer.py +0 -0
  360. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/__init__.py +0 -0
  361. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/inline.py +0 -0
  362. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/renderer.py +0 -0
  363. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
  364. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/table.py +0 -0
  365. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/__init__.py +0 -0
  366. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/assets.py +0 -0
  367. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/inline.py +0 -0
  368. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/renderer.py +0 -0
  369. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/table.py +0 -0
  370. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
  371. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/assets.py +0 -0
  372. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
  373. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
  374. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/inline.py +0 -0
  375. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
  376. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/table.py +0 -0
  377. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
  378. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/assets.py +0 -0
  379. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/formula.py +0 -0
  380. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/inline.py +0 -0
  381. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
  382. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/styles.py +0 -0
  383. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/table.py +0 -0
  384. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
  385. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
  386. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/api.py +0 -0
  387. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/contracts.py +0 -0
  388. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/docx.py +0 -0
  389. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/epub.py +0 -0
  390. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/fragments.py +0 -0
  391. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/html.py +0 -0
  392. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/latex.py +0 -0
  393. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/markdown.py +0 -0
  394. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/pdf.py +0 -0
  395. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/structured_content.py +0 -0
  396. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/epub/docvortex.css +0 -0
  397. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
  398. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
  399. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/fonts/NOTICE +0 -0
  400. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/fonts/manifest.json +0 -0
  401. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/html/docvortex.css +0 -0
  402. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/html/docvortex.min.css +0 -0
  403. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/result.py +0 -0
  404. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/schema.py +0 -0
  405. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/visualization.py +0 -0
  406. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/dependency_links.txt +0 -0
  407. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/entry_points.txt +0 -0
  408. {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/top_level.txt +0 -0
  409. {docvortex-0.2.3 → docvortex-0.2.4}/tests/benchmarks/flash_pdf.py +0 -0
  410. {docvortex-0.2.3 → docvortex-0.2.4}/tests/benchmarks/pipeline.py +0 -0
  411. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
  412. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/flash_layout_block_expectations.json +0 -0
  413. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
  414. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
  415. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
  416. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
  417. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
  418. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
  419. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
  420. {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/rtf/semantic.rtf +0 -0
  421. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_architecture.py +0 -0
  422. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_benchmark_entrypoint.py +0 -0
  423. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_brand_protocol.py +0 -0
  424. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_complete_pipeline.py +0 -0
  425. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_converter_lifecycle.py +0 -0
  426. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_document_envelope.py +0 -0
  427. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_format_matrix.py +0 -0
  428. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_html_namespace.py +0 -0
  429. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_mixed_font_script_reference.py +0 -0
  430. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_font_geometry.py +0 -0
  431. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_font_runtime.py +0 -0
  432. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_model_text_normalization.py +0 -0
  433. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_output_text.py +0 -0
  434. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_render_pool.py +0 -0
  435. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_source_row_merging.py +0 -0
  436. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_symbol_normalization.py +0 -0
  437. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_public_pipeline.py +0 -0
  438. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_refactor_raster.py +0 -0
  439. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_refactor_rendering.py +0 -0
  440. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_refactor_resources.py +0 -0
  441. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_render_ownership.py +0 -0
  442. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_renderer_branding.py +0 -0
  443. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_shared_boundaries.py +0 -0
  444. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_system_font_pdf_pipeline.py +0 -0
  445. {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_validated_geometry.py +0 -0
  446. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
  447. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_epub_test_utils.py +0 -0
  448. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_flash_pdf_test_utils.py +0 -0
  449. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_image_mtef_test_utils.py +0 -0
  450. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_legacy_doc_test_utils.py +0 -0
  451. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
  452. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_legacy_xls_test_utils.py +0 -0
  453. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_metafile_test_utils.py +0 -0
  454. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_mtef_test_utils.py +0 -0
  455. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_mtef_v5_test_utils.py +0 -0
  456. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_native_test_utils.py +0 -0
  457. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_odf_test_utils.py +0 -0
  458. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_ofd_test_utils.py +0 -0
  459. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
  460. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
  461. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_span_test_utils.py +0 -0
  462. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
  463. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
  464. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
  465. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
  466. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
  467. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
  468. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
  469. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
  470. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
  471. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
  472. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
  473. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
  474. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
  475. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
  476. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
  477. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
  478. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/test.pdf +0 -0
  479. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_backend_architecture.py +0 -0
  480. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_backend_block_object_regressions.py +0 -0
  481. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_assets.py +0 -0
  482. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_complex_fields.py +0 -0
  483. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_math.py +0 -0
  484. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_render.py +0 -0
  485. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_special_char_tables.py +0 -0
  486. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_table.py +0 -0
  487. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_emfplus_integration.py +0 -0
  488. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_epub_backlinks.py +0 -0
  489. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_epub_quoted_note_types.py +0 -0
  490. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_epub_render.py +0 -0
  491. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_csv.py +0 -0
  492. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_docx_equationxml.py +0 -0
  493. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_epub.py +0 -0
  494. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_html.py +0 -0
  495. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_image_mtef.py +0 -0
  496. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
  497. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_doc.py +0 -0
  498. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
  499. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_ppt.py +0 -0
  500. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_xls.py +0 -0
  501. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
  502. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_markup_anchors.py +0 -0
  503. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_model.py +0 -0
  504. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_mtef_v5.py +0 -0
  505. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_odf.py +0 -0
  506. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_ofd.py +0 -0
  507. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_image_mtef.py +0 -0
  508. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_metafile.py +0 -0
  509. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_models.py +0 -0
  510. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
  511. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
  512. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_title_types.py +0 -0
  513. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
  514. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
  515. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
  516. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
  517. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
  518. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_extractor.py +0 -0
  519. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_formulas.py +0 -0
  520. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_graphics.py +0 -0
  521. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
  522. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
  523. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_native_text.py +0 -0
  524. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
  525. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_samples.py +0 -0
  526. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_scripts.py +0 -0
  527. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_semantics.py +0 -0
  528. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_tables.py +0 -0
  529. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
  530. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_titles.py +0 -0
  531. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
  532. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_rtf.py +0 -0
  533. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_shared_helpers.py +0 -0
  534. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
  535. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_guess_suffix_ole2.py +0 -0
  536. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_html_css_build.py +0 -0
  537. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_html_render.py +0 -0
  538. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_html_security.py +0 -0
  539. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
  540. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_latex_render.py +0 -0
  541. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_markdown_render.py +0 -0
  542. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_middle_json_block_models.py +0 -0
  543. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_middle_json_export.py +0 -0
  544. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_middle_json_validator.py +0 -0
  545. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_model_json.py +0 -0
  546. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table.py +0 -0
  547. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
  548. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
  549. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
  550. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
  551. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_office_demo_exports.py +0 -0
  552. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_office_demo_pages.py +0 -0
  553. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_office_parser_regressions.py +0 -0
  554. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_classify.py +0 -0
  555. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_demo_links.py +0 -0
  556. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_document.py +0 -0
  557. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_render.py +0 -0
  558. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
  559. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_text_styles.py +0 -0
  560. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_visualization.py +0 -0
  561. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_postprocess_page_blocks.py +0 -0
  562. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_postprocess_pages.py +0 -0
  563. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_postprocess_paragraphs.py +0 -0
  564. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_postprocess_visual.py +0 -0
  565. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_render_api.py +0 -0
  566. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_render_html_table.py +0 -0
  567. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_render_image_renderer.py +0 -0
  568. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_render_list_index_utils.py +0 -0
  569. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_structured_content_render.py +0 -0
  570. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_table_merge.py +0 -0
  571. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_table_merge_cell_merge.py +0 -0
  572. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_text_block_anchor.py +0 -0
  573. {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_text_utils.py +0 -0
  574. {docvortex-0.2.3 → docvortex-0.2.4}/tools/__init__.py +0 -0
  575. {docvortex-0.2.3 → docvortex-0.2.4}/tools/build_html_css.py +0 -0
  576. {docvortex-0.2.3 → docvortex-0.2.4}/tools/calibrate_pdf_geometry.py +0 -0
  577. {docvortex-0.2.3 → docvortex-0.2.4}/tools/capture_baseline.py +0 -0
  578. {docvortex-0.2.3 → docvortex-0.2.4}/tools/capture_platform_layout.py +0 -0
  579. {docvortex-0.2.3 → docvortex-0.2.4}/tools/compare_font_platforms.py +0 -0
  580. {docvortex-0.2.3 → docvortex-0.2.4}/tools/font_geometry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docvortex
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: A fast, multi-format document parsing and conversion engine
5
5
  License-Expression: MIT
6
6
  Project-URL: Repository, https://github.com/myhloli/DocVortex
@@ -35,6 +35,7 @@ Requires-Dist: olefile<1,>=0.47
35
35
  Requires-Dist: pylatexenc<3,>=2.10
36
36
  Requires-Dist: latex2mathml<4,>=3.81.0
37
37
  Requires-Dist: mathml2omml==0.0.2
38
+ Requires-Dist: resvg_py<0.6,>=0.5.0
38
39
  Requires-Dist: reportlab
39
40
  Requires-Dist: ziamath<0.14,>=0.13
40
41
  Requires-Dist: fast-langdetect<0.3.0,>=0.2.3
@@ -26,6 +26,7 @@ dependencies = [
26
26
  "python-docx>=1.2.0,<2", "pypptx-with-oxml>=1.0.3,<2",
27
27
  "mammoth>=1.11.0,<2", "openpyxl>=3.1.5,<4", "olefile>=0.47,<1",
28
28
  "pylatexenc>=2.10,<3", "latex2mathml>=3.81.0,<4", "mathml2omml==0.0.2",
29
+ "resvg_py>=0.5.0,<0.6",
29
30
  "reportlab", "ziamath>=0.13,<0.14", "fast-langdetect>=0.2.3,<0.3.0",
30
31
  "magika>=0.6.2,<1.1.0", "opencv-python>=4.11.0.86",
31
32
  ]
@@ -66,14 +66,20 @@ class HtmlModel:
66
66
 
67
67
 
68
68
  class OfdModel:
69
- """将 OFD 固定版式文档包装为无状态 Flash 模型。"""
69
+ """包装 OFD 固定版式解析,保留最近一次调用的非致命诊断。"""
70
+
71
+ def __init__(self) -> None:
72
+ """初始化实例级诊断,避免不同文档间串用结果。"""
73
+ self.diagnostics: list[dict[str, Any]] = []
70
74
 
71
75
  def predict(self, file_binary: BinaryIO) -> list[list[dict[str, Any]]]:
72
76
  """转换调用方持有的整份 OFD 流,并返回逐物理页 model-list。"""
73
77
  from .ofd.converter import OfdConverter
74
78
 
79
+ self.diagnostics = []
75
80
  converter = OfdConverter()
76
81
  converter.convert(file_binary)
82
+ self.diagnostics = converter.diagnostics
77
83
  return converter.pages
78
84
 
79
85
 
@@ -0,0 +1,192 @@
1
+ """在 OFD 所属区域内恢复视觉行、样式片段和保守段落。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ import re
7
+ import statistics
8
+ from dataclasses import replace
9
+ from typing import Any
10
+
11
+ from ....schema import BBox, BlockType
12
+ from .geometry import bbox_union
13
+ from .models import TextLine
14
+ from .text import format_line_html, format_line_spans
15
+
16
+ _LIST_START = re.compile(r"^\s*(?:[•●▪◆]|[-*]\s|\d+[.)、]\s*|[一二三四五六七八九十]+[、)])")
17
+
18
+
19
+ def upright_point(x: float, y: float, angle: int) -> tuple[float, float]:
20
+ """将页面点旋转到文字阅读方向,统一横排与直角旋转的几何计算。"""
21
+ radians = math.radians(angle)
22
+ cosine, sine = round(math.cos(radians), 12), round(math.sin(radians), 12)
23
+ return cosine * x + sine * y, -sine * x + cosine * y
24
+
25
+
26
+ def upright_box(bbox: BBox, angle: int) -> BBox:
27
+ """在文字方向坐标内计算矩形外接框。"""
28
+ points = [upright_point(x, y, angle) for x in (bbox[0], bbox[2]) for y in (bbox[1], bbox[3])]
29
+ return min(p[0] for p in points), min(p[1] for p in points), max(p[0] for p in points), max(p[1] for p in points)
30
+
31
+
32
+ def line_baseline(line: TextLine) -> float:
33
+ """优先读取真实字形基线,缺少字形时才退回视觉框中心。"""
34
+ if line.glyphs:
35
+ return statistics.median(upright_point(*glyph.origin, line.angle)[1] for glyph in line.glyphs)
36
+ box = upright_box(line.bbox, line.angle)
37
+ return (box[1] + box[3]) / 2
38
+
39
+
40
+ def line_runs(line: TextLine) -> tuple[tuple[str, tuple[str, ...]], ...]:
41
+ """读取已组装行的样式片段,原始行按其自身样式返回单个片段。"""
42
+ return line.runs or ((line.text, line.styles),)
43
+
44
+
45
+ def line_spans(line: TextLine) -> list[dict[str, object]]:
46
+ """将视觉行的各样式片段投影为既有结构化 Span。"""
47
+ return [span for text, styles in line_runs(line) for span in format_line_spans(text, styles)]
48
+
49
+
50
+ def line_html(line: TextLine) -> str:
51
+ """按片段样式序列化单元格文字,不把首片段样式扩散到整行。"""
52
+ return "".join(format_line_html(text, styles) for text, styles in line_runs(line))
53
+
54
+
55
+ def _fragment_separator(first: TextLine, second: TextLine) -> str:
56
+ """仅在英文单词片段之间存在可见词间距时补空格。"""
57
+ if not first.text or not second.text:
58
+ return ""
59
+ if not (first.text[-1].isascii() and second.text[0].isascii() and first.text[-1].isalnum() and second.text[0].isalnum()):
60
+ return ""
61
+ first_box = upright_box(first.glyphs[-1].bbox if first.glyphs else first.bbox, first.angle)
62
+ second_box = upright_box(second.glyphs[0].bbox if second.glyphs else second.bbox, second.angle)
63
+ widths = [box[2] - box[0] for box in (first_box, second_box)]
64
+ threshold = 0.2 * max(min(first.font_size, second.font_size), statistics.median(widths), 0.5)
65
+ return " " if second_box[0] - first_box[2] >= threshold else ""
66
+
67
+
68
+ def merge_same_baseline_lines(lines: list[TextLine]) -> list[TextLine]:
69
+ """按真实基线聚行并沿阅读方向拼接,保留样式及层和模板隔离。"""
70
+ metrics = {id(line): (line_baseline(line), upright_box(line.bbox, line.angle)) for line in lines}
71
+ ordered = sorted(lines, key=lambda line: (line.angle, line.layer_type, line.template_id or -1, metrics[id(line)][0]))
72
+ rows: list[list[TextLine]] = []
73
+ for line in ordered:
74
+ previous = rows[-1][0] if rows else None
75
+ if (
76
+ previous is not None
77
+ and (line.angle, line.layer_type, line.template_id) == (previous.angle, previous.layer_type, previous.template_id)
78
+ and abs(metrics[id(line)][0] - metrics[id(previous)][0]) <= 0.2 * min(line.font_size, previous.font_size)
79
+ ):
80
+ rows[-1].append(line)
81
+ else:
82
+ rows.append([line])
83
+ output: list[TextLine] = []
84
+ for row in rows:
85
+ fragments = sorted(row, key=lambda line: (metrics[id(line)][1][0], line.paint_order))
86
+ assembled: list[TextLine] = []
87
+ for line in fragments:
88
+ previous = assembled[-1] if assembled else None
89
+ if previous is not None:
90
+ first_box, second_box = upright_box(previous.bbox, line.angle), metrics[id(line)][1]
91
+ size = min(previous.font_size, line.font_size)
92
+ gap = second_box[0] - first_box[2]
93
+ if size > 0 and max(previous.font_size, line.font_size) <= 1.35 * size and -0.25 * size <= gap <= 0.8 * size:
94
+ separator = _fragment_separator(previous, line)
95
+ runs = line_runs(previous) + (((separator, ()),) if separator else ()) + line_runs(line)
96
+ assembled[-1] = replace(
97
+ previous,
98
+ text=previous.text + separator + line.text,
99
+ bbox=bbox_union((previous.bbox, line.bbox)) or previous.bbox,
100
+ glyphs=previous.glyphs + line.glyphs,
101
+ paint_order=min(previous.paint_order, line.paint_order),
102
+ runs=runs,
103
+ )
104
+ continue
105
+ assembled.append(line)
106
+ output.extend(assembled)
107
+ return output
108
+
109
+
110
+ def _block_text(block: dict[str, Any]) -> str:
111
+ """读取 OFD 私有视觉行文本,避免依赖公共 Span 的序列化细节。"""
112
+ return block.get("text_line", "")
113
+
114
+
115
+ def _paragraph_separator(previous: str, current: str) -> str:
116
+ """中文换行直接续接,英文词和句末标点后的换行补空格,保留已有空白与连字符。"""
117
+ last, first = previous[-1:], current[:1]
118
+ if not last or not first or not (last.isascii() and first.isascii()):
119
+ return ""
120
+ return " " if (last.isalnum() or last in '.,;:!?)]}"') and (first.isalnum() or first in '(["') else ""
121
+
122
+
123
+ def merge_paragraph_blocks(blocks: list[dict[str, Any]]) -> list[dict[str, Any]]:
124
+ """在阅读顺序内按局部栏宽、行距及缩进合段,视觉块和辅助块作为屏障。"""
125
+ output: list[dict[str, Any]] = []
126
+ for index, block in enumerate(blocks):
127
+ if block["type"] != BlockType.TEXT:
128
+ output.append(block)
129
+ continue
130
+ angle = block["angle"]
131
+ current_box = upright_box(block["bbox_mm"], angle)
132
+ size = block["font_size_mm"]
133
+ # 只观察邻近且横向重叠的正文,防止另一栏或远处区域影响本栏尺度。
134
+ neighbors: list[dict[str, Any]] = []
135
+ for direction in (-1, 1):
136
+ for offset in range(1, 9):
137
+ position = index + direction * offset
138
+ if not 0 <= position < len(blocks):
139
+ break
140
+ candidate = blocks[position]
141
+ if (
142
+ candidate["type"] != BlockType.TEXT
143
+ or candidate["angle"] != angle
144
+ or candidate["text_scope"] != block["text_scope"]
145
+ ):
146
+ break
147
+ box = upright_box(candidate["bbox_mm"], angle)
148
+ if abs(box[1] - current_box[1]) > 20 * size or min(box[2], current_box[2]) <= max(box[0], current_box[0]):
149
+ break
150
+ if abs(box[0] - current_box[0]) <= 3 * size:
151
+ neighbors.append(candidate)
152
+ context = neighbors + [block]
153
+ boxes = [upright_box(item["bbox_mm"], angle) for item in context]
154
+ right = max(box[2] for box in boxes)
155
+ baselines = sorted({item["baseline_mm"] for item in context})
156
+ gaps = [b - a for a, b in zip(baselines[:-1], baselines[1:], strict=True) if b - a >= 0.5 * size]
157
+ pitch = statistics.median(gaps) if gaps else 1.5 * size
158
+ previous = output[-1] if output else None
159
+ can_merge = (
160
+ previous is not None
161
+ and previous["type"] == BlockType.TEXT
162
+ and previous["angle"] == angle
163
+ and previous["text_scope"] == block["text_scope"]
164
+ )
165
+ if can_merge:
166
+ last_box = upright_box(previous["line_bboxes_mm"][-1], angle)
167
+ previous_size = previous["font_size_mm"]
168
+ delta = block["baseline_mm"] - previous["baseline_mm"]
169
+ previous_text, current_text = _block_text(previous).strip(), _block_text(block).strip()
170
+ can_merge = (
171
+ min(size, previous_size) > 0
172
+ and max(size, previous_size) <= 1.25 * min(size, previous_size)
173
+ and 0.5 * size <= delta <= min(1.4 * pitch, 3 * size)
174
+ and -2.5 * size <= current_box[0] - last_box[0] <= 0.8 * size
175
+ and right - last_box[2] <= 1.5 * size
176
+ and min(last_box[2], current_box[2]) > max(last_box[0], current_box[0])
177
+ and not _LIST_START.match(current_text)
178
+ and not (len(previous_text) <= 4 or len(current_text) <= 4)
179
+ )
180
+ if can_merge:
181
+ previous_text, current_text = _block_text(previous), _block_text(block)
182
+ separator = _paragraph_separator(previous_text, current_text)
183
+ previous["content"].extend(format_line_spans(separator, ()))
184
+ previous["content"].extend(block["content"])
185
+ previous["bbox_mm"] = bbox_union((previous["bbox_mm"], block["bbox_mm"]))
186
+ previous["line_bboxes_mm"].extend(block["line_bboxes_mm"])
187
+ previous["baseline_mm"] = block["baseline_mm"]
188
+ previous["text_line"] = current_text
189
+ else:
190
+ # 复制将被追加的列表,确保组段不会修改调用方的原始视觉行。
191
+ output.append({**block, "content": list(block["content"]), "line_bboxes_mm": list(block["line_bboxes_mm"])})
192
+ return output
@@ -0,0 +1,69 @@
1
+ """OFD 二进制流到分页 raw model-list 的转换入口。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import BinaryIO
6
+ import base64
7
+
8
+ from .constants import MAX_TOTAL_BYTES
9
+ from .errors import OfdResourceLimitError
10
+ from .package import OfdPackage
11
+ from .reading_order import OfdReadingOrderProjector
12
+ from .scene import OfdSceneBuilder
13
+ from .models import ImageItem
14
+ from .vector import render_vector_page, UnsupportedVector
15
+
16
+
17
+ class OfdConverter:
18
+ """编排 OFD 包读取、场景构建和阅读顺序投影。"""
19
+
20
+ def __init__(self) -> None:
21
+ """初始化空的分页输出。"""
22
+ self.pages: list[list[dict[str, object]]] = []
23
+ self.diagnostics: list[dict[str, object]] = []
24
+
25
+ def convert(self, file_binary: BinaryIO) -> None:
26
+ """读取整份 OFD 并更新分页 model-list。"""
27
+ self.pages = []
28
+ self.diagnostics = []
29
+ file_bytes = file_binary.read(MAX_TOTAL_BYTES + 1)
30
+ if len(file_bytes) > MAX_TOTAL_BYTES:
31
+ raise OfdResourceLimitError(f"OFD resource limit exceeded: max_total_bytes={MAX_TOTAL_BYTES}")
32
+ with OfdPackage(file_bytes) as package:
33
+ scenes = OfdSceneBuilder(package).build()
34
+ for scene in scenes:
35
+ if (
36
+ not scene.text_object_count
37
+ and not scene.image_object_count
38
+ and scene.vector_paths
39
+ and not scene.vector_unsupported
40
+ ):
41
+ try:
42
+ payload = render_vector_page(scene, package)
43
+ except OfdResourceLimitError:
44
+ raise
45
+ except (UnsupportedVector, ValueError, RuntimeError, OSError) as exc:
46
+ scene.diagnostics.append({"code": "ofd_vector_render_failed", "message": str(exc)})
47
+ else:
48
+ if payload is not None:
49
+ scene.images.append(
50
+ ImageItem(
51
+ scene.physical_box,
52
+ "data:image/png;base64," + base64.b64encode(payload).decode("ascii"),
53
+ 0,
54
+ None,
55
+ "Body",
56
+ None,
57
+ )
58
+ )
59
+ scene.diagnostics.append(
60
+ {
61
+ "code": "ofd_vector_rasterized",
62
+ "message": "Vector-only page preserved as an image; no text recognition was performed",
63
+ }
64
+ )
65
+ self.diagnostics.extend({**item, "page_index": scene.page_idx} for item in scene.diagnostics)
66
+ self.pages = OfdReadingOrderProjector(scenes).project()
67
+
68
+
69
+ __all__ = ["OfdConverter"]
@@ -3,13 +3,16 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from dataclasses import dataclass, field
6
- from typing import Any
6
+ from typing import Any, TYPE_CHECKING
7
7
 
8
8
  from lxml import etree # type: ignore[reportMissingImports]
9
9
 
10
10
  from ....schema import BBox
11
11
  from .geometry import Affine, Point, Quad
12
12
 
13
+ if TYPE_CHECKING:
14
+ from .vector import VectorPath, ClipPath
15
+
13
16
 
14
17
  @dataclass(frozen=True, slots=True)
15
18
  class FontResource:
@@ -78,6 +81,7 @@ class TextLine:
78
81
  layer_type: str
79
82
  template_id: int | None
80
83
  styles: tuple[str, ...] = ()
84
+ runs: tuple[tuple[str, tuple[str, ...]], ...] = ()
81
85
 
82
86
 
83
87
  @dataclass(frozen=True, slots=True)
@@ -115,6 +119,10 @@ class OfdPageScene:
115
119
  axis_lines: list[AxisLine] = field(default_factory=list)
116
120
  images: list[ImageItem] = field(default_factory=list)
117
121
  diagnostics: list[dict[str, Any]] = field(default_factory=list)
122
+ vector_paths: list[VectorPath] = field(default_factory=list)
123
+ text_object_count: int = 0
124
+ image_object_count: int = 0
125
+ vector_unsupported: bool = False
118
126
 
119
127
 
120
128
  @dataclass(frozen=True, slots=True)
@@ -151,6 +159,7 @@ class PageBuildContext:
151
159
  layer_type: str
152
160
  template_id: int | None
153
161
  draw_style: dict[str, str] = field(default_factory=dict)
162
+ vector_clips: tuple[tuple[ClipPath, ...], ...] = ()
154
163
 
155
164
 
156
165
  __all__ = [
@@ -101,6 +101,12 @@ class OfdPackage:
101
101
  self._asset_bytes = 0
102
102
  self._root: etree._Element | None = None
103
103
 
104
+ def charge_generated_asset(self, size: int) -> None:
105
+ """将生成的 PNG 与包内读取素材累计到同一文档资产预算。"""
106
+ if self._asset_bytes + size > MAX_ASSET_TOTAL_BYTES:
107
+ raise OfdResourceLimitError(f"OFD resource limit exceeded: max_asset_total_bytes={MAX_ASSET_TOTAL_BYTES}")
108
+ self._asset_bytes += size
109
+
104
110
  @staticmethod
105
111
  def _is_safe_member_name(name: str) -> bool:
106
112
  """判断 ZIP 成员是否为包内安全 POSIX 路径。"""
@@ -80,49 +80,75 @@ def _line_bbox(first: tuple[float, float], second: tuple[float, float], width: f
80
80
  return None
81
81
 
82
82
 
83
- def _segments(value: str, transform: Affine, budget: OfdPathBudget) -> list[tuple[tuple[float, float], tuple[float, float]]]:
84
- """流式提取 S/M/L/CM 直线段,曲线命令只推进当前位置。"""
85
- result: list[tuple[tuple[float, float], tuple[float, float]]] = []
86
- current: tuple[float, float] | None = None
87
- subpath_start: tuple[float, float] | None = None
88
- command: str | None = None
83
+ PathCommand = tuple[str, tuple[float, ...]]
84
+
85
+
86
+ def parse_path_commands(value: str, budget: OfdPathBudget) -> tuple[PathCommand, ...]:
87
+ """只扫描一次完整路径命令,绘制与表格检测共用同一份受限数值结果。"""
88
+ commands: list[PathCommand] = []
89
+ operator: str | None = None
89
90
  parameters: list[float] = []
90
- commands = {"S", "M", "L", "Q", "B", "A", "C", "CM"}
91
91
  arity = {"S": 2, "M": 2, "L": 2, "Q": 4, "B": 6, "A": 7, "CM": 2}
92
+ cursor = 0
93
+ pending = False
92
94
  for match in _TOKEN_RE.finditer(value):
93
95
  budget.charge_token()
96
+ if value[cursor : match.start()].strip(" \t\r\n,"):
97
+ return ()
98
+ cursor = match.end()
94
99
  token = match.group()
95
- if token in commands:
100
+ if token in {*arity, "C"}:
96
101
  if parameters:
97
- return []
102
+ return ()
98
103
  budget.charge_command()
99
- command = token
100
- if command == "C":
101
- if current is not None and subpath_start is not None and current != subpath_start:
102
- result.append((transform.apply(current), transform.apply(subpath_start)))
103
- current = subpath_start
104
- command = None
104
+ operator = token
105
+ pending = operator != "C"
106
+ if operator == "C":
107
+ commands.append((operator, ()))
108
+ operator = None
105
109
  continue
106
- if command is None or command == "C":
107
- return []
108
- parsed = _finite_float(token)
109
- if parsed is None:
110
- return []
111
- parameters.append(parsed)
112
- if len(parameters) < arity[command]:
110
+ if operator is None:
111
+ return ()
112
+ number = _finite_float(token)
113
+ if number is None:
114
+ return ()
115
+ parameters.append(number)
116
+ if len(parameters) == arity[operator]:
117
+ if operator == "A" and (
118
+ parameters[0] < 0 or parameters[1] < 0 or parameters[3] not in (0, 1) or parameters[4] not in (0, 1)
119
+ ):
120
+ return ()
121
+ commands.append((operator, tuple(parameters)))
122
+ parameters.clear()
123
+ pending = False
124
+ return () if pending or parameters or value[cursor:].strip() else tuple(commands)
125
+
126
+
127
+ def command_segments(
128
+ commands: tuple[PathCommand, ...], transform: Affine
129
+ ) -> list[tuple[tuple[float, float], tuple[float, float]]]:
130
+ """从已解析路径读取直线段,曲线只更新端点而不把控制线当表格边框。"""
131
+ result = []
132
+ current = start = None
133
+ for operator, values in commands:
134
+ if operator == "C":
135
+ if current is not None and start is not None and current != start:
136
+ result.append((transform.apply(current), transform.apply(start)))
137
+ current = start
113
138
  continue
114
- endpoint = (parameters[-2], parameters[-1])
115
- if command in {"S", "M"}:
116
- current = endpoint
117
- subpath_start = endpoint
118
- elif command in {"L", "CM"}:
119
- if current is not None:
120
- result.append((transform.apply(current), transform.apply(endpoint)))
121
- current = endpoint
139
+ endpoint = values[-2:]
140
+ if operator in {"S", "M"}:
141
+ current = start = endpoint
122
142
  else:
143
+ if operator in {"L", "CM"} and current is not None:
144
+ result.append((transform.apply(current), transform.apply(endpoint)))
123
145
  current = endpoint
124
- parameters.clear()
125
- return [] if parameters else result
146
+ return result
147
+
148
+
149
+ def _segments(value: str, transform: Affine, budget: OfdPathBudget) -> list[tuple[tuple[float, float], tuple[float, float]]]:
150
+ """保留既有内部入口,复用完整命令解析提取直线段。"""
151
+ return command_segments(parse_path_commands(value, budget), transform)
126
152
 
127
153
 
128
154
  def build_axis_lines(
@@ -134,6 +160,7 @@ def build_axis_lines(
134
160
  template_id: int | None,
135
161
  budget: OfdPathBudget,
136
162
  resolved_style: dict[str, str] | None = None,
163
+ commands: tuple[PathCommand, ...] | None = None,
137
164
  ) -> list[AxisLine]:
138
165
  """从一个 PathObject 提取可见轴向线段。"""
139
166
  style = resolved_style or {}
@@ -157,42 +184,41 @@ def build_axis_lines(
157
184
  object_transform = parent_transform.compose(Affine.translation(boundary[0], boundary[1])).compose(
158
185
  parse_affine(path_object.get("CTM"))
159
186
  )
160
- extracted: list[AxisLine] = []
161
187
  data = first_descendant(path_object, "AbbreviatedData")
162
- segments = _segments(element_text(data), object_transform, budget) if data is not None else []
188
+ if commands is None:
189
+ commands = parse_path_commands(element_text(data), budget) if data is not None else ()
190
+ if any(operator in {"Q", "B", "A"} for operator, _ in commands):
191
+ return []
192
+ segments = command_segments(commands, object_transform)
193
+ stroke = style.get("Stroke", path_object.get("Stroke", "true")).casefold() not in {"false", "0"}
194
+ fill = style.get("Fill", path_object.get("Fill", "false")).casefold() in {"true", "1"}
195
+ extracted: list[AxisLine] = []
196
+ if fill and not stroke:
197
+ # 只把单个细长矩形归约为中心线,字形轮廓、背景和角点填充均不能提供边框证据。
198
+ if len(segments) != 4 or not commands or commands[-1][0] != "C":
199
+ return []
200
+ points = {point for segment in segments for point in segment}
201
+ xs, ys = sorted({p[0] for p in points}), sorted({p[1] for p in points})
202
+ if len(points) != 4 or len(xs) != 2 or len(ys) != 2:
203
+ return []
204
+ if any(first[0] != second[0] and first[1] != second[1] for first, second in segments):
205
+ return []
206
+ dx, dy = xs[-1] - xs[0], ys[-1] - ys[0]
207
+ if min(dx, dy) <= 0 or max(dx, dy) < 5 * min(dx, dy):
208
+ return []
209
+ orientation = "horizontal" if dx >= dy else "vertical"
210
+ clipped = bbox_intersection((xs[0], ys[0], xs[-1], ys[-1]), object_clip)
211
+ return [AxisLine(clipped, orientation, min(dx, dy), paint_order, template_id)] if clipped else []
212
+ if not stroke:
213
+ return []
214
+ width *= max(math.hypot(object_transform.a, object_transform.b), math.hypot(object_transform.c, object_transform.d))
163
215
  for first, second in segments:
164
216
  line = _line_bbox(first, second, width)
165
- if line is None:
166
- continue
167
- line_bbox, orientation = line
168
- clipped = bbox_intersection(line_bbox, object_clip)
169
- if clipped is not None:
170
- extracted.append(
171
- AxisLine(
172
- bbox=clipped,
173
- orientation=orientation,
174
- width=width,
175
- paint_order=paint_order,
176
- template_id=template_id,
177
- )
178
- )
179
- boundary_width = boundary_page[2] - boundary_page[0]
180
- boundary_height = boundary_page[3] - boundary_page[1]
181
- if (
182
- not extracted
183
- and not segments
184
- and max(boundary_width, boundary_height) >= 5 * max(min(boundary_width, boundary_height), 0.01)
185
- ):
186
- orientation = "horizontal" if boundary_width >= boundary_height else "vertical"
187
- extracted.append(
188
- AxisLine(
189
- bbox=object_clip,
190
- orientation=orientation,
191
- width=width,
192
- paint_order=paint_order,
193
- template_id=template_id,
194
- )
195
- )
217
+ if line is not None:
218
+ line_bbox, orientation = line
219
+ clipped = bbox_intersection(line_bbox, object_clip)
220
+ if clipped is not None:
221
+ extracted.append(AxisLine(clipped, orientation, width, paint_order, template_id))
196
222
  if not extracted and parse_int(path_object.get("ID")) is None:
197
223
  logger.debug("OFD_PATH_SKIPPED: path without stable ID produced no axis lines")
198
224
  return extracted