docvortex 0.2.2__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. {docvortex-0.2.2/src/docvortex.egg-info → docvortex-0.2.4}/PKG-INFO +6 -29
  2. {docvortex-0.2.2 → docvortex-0.2.4}/README.md +4 -28
  3. {docvortex-0.2.2 → docvortex-0.2.4}/pyproject.toml +1 -0
  4. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/converter.py +1 -0
  5. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/xhtml.py +91 -7
  6. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/models.py +7 -1
  7. docvortex-0.2.4/src/docvortex/analyzers/native/ofd/assembly.py +192 -0
  8. docvortex-0.2.4/src/docvortex/analyzers/native/ofd/converter.py +69 -0
  9. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/models.py +10 -1
  10. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/package.py +6 -0
  11. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/path.py +91 -65
  12. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/reading_order.py +13 -82
  13. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/resources.py +29 -2
  14. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/scene.py +47 -10
  15. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/table.py +192 -20
  16. docvortex-0.2.4/src/docvortex/analyzers/native/ofd/vector.py +271 -0
  17. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/api.py +8 -2
  18. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/anchors.py +23 -0
  19. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/projector.py +153 -40
  20. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/inline.py +15 -4
  21. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/renderer.py +14 -9
  22. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/version.py +1 -1
  23. {docvortex-0.2.2 → docvortex-0.2.4/src/docvortex.egg-info}/PKG-INFO +6 -29
  24. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/SOURCES.txt +6 -24
  25. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/requires.txt +1 -0
  26. docvortex-0.2.4/tests/unittest/test_epub_backlinks.py +212 -0
  27. docvortex-0.2.4/tests/unittest/test_epub_quoted_note_types.py +125 -0
  28. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_epub.py +4 -2
  29. docvortex-0.2.4/tests/unittest/test_ofd_assembly.py +242 -0
  30. docvortex-0.2.4/tests/unittest/test_ofd_vector_tables.py +323 -0
  31. docvortex-0.2.2/docs/COMPATIBILITY.md +0 -89
  32. docvortex-0.2.2/docs/DOCVORTEX_UPGRADE.md +0 -154
  33. docvortex-0.2.2/docs/PDF_SCRIPT_REPAIR.md +0 -50
  34. docvortex-0.2.2/docs/PDF_TEXT_NORMALIZATION.md +0 -43
  35. docvortex-0.2.2/docs/REFACTOR_PROGRESS.md +0 -117
  36. docvortex-0.2.2/docs/architecture.md +0 -41
  37. docvortex-0.2.2/docs/migration.md +0 -20
  38. docvortex-0.2.2/docs/validation/content-list-ownership.json +0 -338
  39. docvortex-0.2.2/docs/validation/docvortex-text-baseline.json +0 -1505
  40. docvortex-0.2.2/docs/validation/docvortex-upgrade.json +0 -288
  41. docvortex-0.2.2/docs/validation/droid-cjk-v1.json +0 -1579
  42. docvortex-0.2.2/docs/validation/droid-platform-comparison.json +0 -65
  43. docvortex-0.2.2/docs/validation/html-namespace.json +0 -96
  44. docvortex-0.2.2/docs/validation/json-envelope-v2-baselines.json +0 -78
  45. docvortex-0.2.2/docs/validation/json-envelope-v2.md +0 -72
  46. docvortex-0.2.2/docs/validation/pdf-geometry-calibration.json +0 -5505
  47. docvortex-0.2.2/docs/validation/pdf-geometry-calibration.md +0 -74
  48. docvortex-0.2.2/docs/validation/pdf-script-repair.json +0 -378
  49. docvortex-0.2.2/docs/validation/pdf-text-normalization.json +0 -121
  50. docvortex-0.2.2/docs/validation/pdf-text-output-baseline.json +0 -1296
  51. docvortex-0.2.2/docs/validation/progressive-refactor.json +0 -700
  52. docvortex-0.2.2/docs/validation/test-migration.json +0 -16180
  53. docvortex-0.2.2/docs/validation/test-migration.md +0 -152
  54. docvortex-0.2.2/docs/validation.md +0 -415
  55. docvortex-0.2.2/src/docvortex/analyzers/native/ofd/converter.py +0 -31
  56. {docvortex-0.2.2 → docvortex-0.2.4}/LICENSE.md +0 -0
  57. {docvortex-0.2.2 → docvortex-0.2.4}/MANIFEST.in +0 -0
  58. {docvortex-0.2.2 → docvortex-0.2.4}/demo/README.md +0 -0
  59. {docvortex-0.2.2 → docvortex-0.2.4}/demo/demo.py +0 -0
  60. {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/README.md +0 -0
  61. {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/docx_01.doc +0 -0
  62. {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/docx_01.docx +0 -0
  63. {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/pptx_01.ppt +0 -0
  64. {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/pptx_01.pptx +0 -0
  65. {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/rtf_01.rtf +0 -0
  66. {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/xlsx_01.xls +0 -0
  67. {docvortex-0.2.2 → docvortex-0.2.4}/demo/office_docs/xlsx_01.xlsx +0 -0
  68. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
  69. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
  70. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/caibao1.pdf +0 -0
  71. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo1.pdf +0 -0
  72. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo2.pdf +0 -0
  73. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo3.pdf +0 -0
  74. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo4.pdf +0 -0
  75. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/demo6.pdf +0 -0
  76. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
  77. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
  78. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
  79. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
  80. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs/small_ocr.pdf +0 -0
  81. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
  82. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
  83. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
  84. {docvortex-0.2.2 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
  85. {docvortex-0.2.2 → docvortex-0.2.4}/docs/HTML_PROTOCOL.md +0 -0
  86. {docvortex-0.2.2 → docvortex-0.2.4}/docs/JSON_PROTOCOL.md +0 -0
  87. {docvortex-0.2.2 → docvortex-0.2.4}/docs/PDF_FONTS.md +0 -0
  88. {docvortex-0.2.2 → docvortex-0.2.4}/docs/RENDER_OWNERSHIP.md +0 -0
  89. {docvortex-0.2.2 → docvortex-0.2.4}/schemas/middle-2.0.json +0 -0
  90. {docvortex-0.2.2 → docvortex-0.2.4}/schemas/model-2.0.json +0 -0
  91. {docvortex-0.2.2 → docvortex-0.2.4}/setup.cfg +0 -0
  92. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/__init__.py +0 -0
  93. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/__init__.py +0 -0
  94. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/__init__.py +0 -0
  95. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
  96. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
  97. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/image.py +0 -0
  98. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
  99. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
  100. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
  101. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
  102. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
  103. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
  104. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/names.py +0 -0
  105. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
  106. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/contracts.py +0 -0
  107. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/csv.py +0 -0
  108. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
  109. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/constants.py +0 -0
  110. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/errors.py +0 -0
  111. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
  112. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/package.py +0 -0
  113. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/__init__.py +0 -0
  114. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/anchors.py +0 -0
  115. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/constants.py +0 -0
  116. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/contracts.py +0 -0
  117. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/converter.py +0 -0
  118. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/document.py +0 -0
  119. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/errors.py +0 -0
  120. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/resources.py +0 -0
  121. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/selector.py +0 -0
  122. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
  123. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
  124. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
  125. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
  126. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/images.py +0 -0
  127. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
  128. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/text.py +0 -0
  129. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/__init__.py +0 -0
  130. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
  131. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
  132. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
  133. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
  134. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
  135. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
  136. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
  137. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
  138. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
  139. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
  140. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
  141. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
  142. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
  143. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
  144. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
  145. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
  146. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
  147. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
  148. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
  149. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
  150. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
  151. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
  152. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
  153. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
  154. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
  155. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
  156. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
  157. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
  158. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
  159. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
  160. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
  161. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
  162. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
  163. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
  164. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/errors.py +0 -0
  165. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/image.py +0 -0
  166. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
  167. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
  168. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
  169. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
  170. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/limits.py +0 -0
  171. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
  172. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
  173. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
  174. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
  175. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
  176. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
  177. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
  178. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
  179. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
  180. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
  181. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
  182. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
  183. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/opc.py +0 -0
  184. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
  185. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
  186. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
  187. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
  188. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
  189. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
  190. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
  191. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
  192. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
  193. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
  194. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
  195. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
  196. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
  197. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
  198. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
  199. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
  200. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
  201. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
  202. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
  203. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
  204. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
  205. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
  206. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
  207. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
  208. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
  209. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
  210. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
  211. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/streams.py +0 -0
  212. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
  213. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
  214. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
  215. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
  216. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
  217. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
  218. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
  219. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
  220. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
  221. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
  222. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
  223. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
  224. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
  225. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
  226. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
  227. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
  228. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
  229. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
  230. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
  231. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
  232. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
  233. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
  234. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
  235. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
  236. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
  237. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
  238. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
  239. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
  240. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
  241. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
  242. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
  243. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/models.py +0 -0
  244. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
  245. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
  246. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/script_geometry.py +0 -0
  247. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/shared.py +0 -0
  248. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
  249. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
  250. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
  251. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
  252. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
  253. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
  254. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
  255. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/__init__.py +0 -0
  256. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/candidate.py +0 -0
  257. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/contracts.py +0 -0
  258. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/engine.py +0 -0
  259. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/geometry.py +0 -0
  260. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_common.py +0 -0
  261. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_hybrid.py +0 -0
  262. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_multiline.py +0 -0
  263. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/text.py +0 -0
  264. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/text_grid.py +0 -0
  265. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/vector.py +0 -0
  266. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
  267. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
  268. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
  269. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
  270. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
  271. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
  272. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
  273. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
  274. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
  275. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
  276. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
  277. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
  278. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_styles.py +0 -0
  279. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
  280. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
  281. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
  282. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
  283. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
  284. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
  285. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
  286. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
  287. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
  288. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
  289. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
  290. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/assets/__init__.py +0 -0
  291. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/assets/store.py +0 -0
  292. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/cli.py +0 -0
  293. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/__init__.py +0 -0
  294. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/__init__.py +0 -0
  295. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/contracts.py +0 -0
  296. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/materializer.py +0 -0
  297. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/parser.py +0 -0
  298. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/html/resources.py +0 -0
  299. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/codecs/json.py +0 -0
  300. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/__init__.py +0 -0
  301. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/inline.py +0 -0
  302. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/__init__.py +0 -0
  303. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/formula.py +0 -0
  304. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/markup/styles.py +0 -0
  305. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/mathml.py +0 -0
  306. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/normalization.py +0 -0
  307. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/spans.py +0 -0
  308. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/__init__.py +0 -0
  309. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/blocks.py +0 -0
  310. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/content.py +0 -0
  311. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/document.py +0 -0
  312. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/html.py +0 -0
  313. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/models.py +0 -0
  314. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/rules.py +0 -0
  315. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/table/structure.py +0 -0
  316. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/content/tree.py +0 -0
  317. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/__init__.py +0 -0
  318. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/contracts.py +0 -0
  319. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/detection.py +0 -0
  320. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/filetypes.py +0 -0
  321. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/page_range.py +0 -0
  322. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/__init__.py +0 -0
  323. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/classify.py +0 -0
  324. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/constants.py +0 -0
  325. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/document.py +0 -0
  326. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/font_runtime.py +0 -0
  327. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/geometry.py +0 -0
  328. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/images.py +0 -0
  329. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_annotations.py +0 -0
  330. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_contracts.py +0 -0
  331. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_coordinates.py +0 -0
  332. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
  333. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_objects.py +0 -0
  334. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
  335. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/pdfium.py +0 -0
  336. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/raster.py +0 -0
  337. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/__init__.py +0 -0
  338. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/contracts.py +0 -0
  339. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/extract.py +0 -0
  340. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/geometry.py +0 -0
  341. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/text/groups.py +0 -0
  342. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/visual_geometry.py +0 -0
  343. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/pdf/visuals.py +0 -0
  344. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/document/source.py +0 -0
  345. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/errors.py +0 -0
  346. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/export/__init__.py +0 -0
  347. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/export/bundle.py +0 -0
  348. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/export/files.py +0 -0
  349. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/export/middle.py +0 -0
  350. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/__init__.py +0 -0
  351. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/geometry.py +0 -0
  352. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/hyperlink.py +0 -0
  353. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/image.py +0 -0
  354. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/image_encoding.py +0 -0
  355. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/image_payload.py +0 -0
  356. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/language.py +0 -0
  357. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/platform.py +0 -0
  358. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/text.py +0 -0
  359. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/type_identity.py +0 -0
  360. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/foundation/xml_names.py +0 -0
  361. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/options.py +0 -0
  362. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/__init__.py +0 -0
  363. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/content.py +0 -0
  364. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/document.py +0 -0
  365. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/lists.py +0 -0
  366. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/page_blocks.py +0 -0
  367. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/pages.py +0 -0
  368. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/paragraphs.py +0 -0
  369. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/postprocess/visual.py +0 -0
  370. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/__init__.py +0 -0
  371. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/__init__.py +0 -0
  372. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/__init__.py +0 -0
  373. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/context.py +0 -0
  374. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/html_table.py +0 -0
  375. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/index.py +0 -0
  376. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/list_items.py +0 -0
  377. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/common/planner.py +0 -0
  378. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/__init__.py +0 -0
  379. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/assets.py +0 -0
  380. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/inline.py +0 -0
  381. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/math.py +0 -0
  382. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/renderer.py +0 -0
  383. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/styles.py +0 -0
  384. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/table.py +0 -0
  385. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/__init__.py +0 -0
  386. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/assets.py +0 -0
  387. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/package.py +0 -0
  388. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/renderer.py +0 -0
  389. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/__init__.py +0 -0
  390. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
  391. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/html/table.py +0 -0
  392. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/__init__.py +0 -0
  393. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/assets.py +0 -0
  394. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/inline.py +0 -0
  395. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/renderer.py +0 -0
  396. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/table.py +0 -0
  397. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
  398. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/assets.py +0 -0
  399. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
  400. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
  401. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/inline.py +0 -0
  402. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
  403. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/table.py +0 -0
  404. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
  405. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/assets.py +0 -0
  406. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/formula.py +0 -0
  407. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/inline.py +0 -0
  408. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
  409. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/styles.py +0 -0
  410. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/table.py +0 -0
  411. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
  412. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
  413. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/api.py +0 -0
  414. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/contracts.py +0 -0
  415. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/docx.py +0 -0
  416. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/epub.py +0 -0
  417. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/fragments.py +0 -0
  418. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/html.py +0 -0
  419. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/latex.py +0 -0
  420. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/markdown.py +0 -0
  421. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/pdf.py +0 -0
  422. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/render/structured_content.py +0 -0
  423. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/epub/docvortex.css +0 -0
  424. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
  425. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
  426. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/fonts/NOTICE +0 -0
  427. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/fonts/manifest.json +0 -0
  428. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/html/docvortex.css +0 -0
  429. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/resources/html/docvortex.min.css +0 -0
  430. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/result.py +0 -0
  431. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/schema.py +0 -0
  432. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex/visualization.py +0 -0
  433. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/dependency_links.txt +0 -0
  434. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/entry_points.txt +0 -0
  435. {docvortex-0.2.2 → docvortex-0.2.4}/src/docvortex.egg-info/top_level.txt +0 -0
  436. {docvortex-0.2.2 → docvortex-0.2.4}/tests/benchmarks/flash_pdf.py +0 -0
  437. {docvortex-0.2.2 → docvortex-0.2.4}/tests/benchmarks/pipeline.py +0 -0
  438. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
  439. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/flash_layout_block_expectations.json +0 -0
  440. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
  441. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
  442. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
  443. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
  444. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
  445. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
  446. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
  447. {docvortex-0.2.2 → docvortex-0.2.4}/tests/fixtures/rtf/semantic.rtf +0 -0
  448. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_architecture.py +0 -0
  449. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_benchmark_entrypoint.py +0 -0
  450. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_brand_protocol.py +0 -0
  451. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_complete_pipeline.py +0 -0
  452. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_converter_lifecycle.py +0 -0
  453. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_document_envelope.py +0 -0
  454. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_format_matrix.py +0 -0
  455. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_html_namespace.py +0 -0
  456. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_mixed_font_script_reference.py +0 -0
  457. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_font_geometry.py +0 -0
  458. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_font_runtime.py +0 -0
  459. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_model_text_normalization.py +0 -0
  460. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_output_text.py +0 -0
  461. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_render_pool.py +0 -0
  462. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_source_row_merging.py +0 -0
  463. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_pdf_symbol_normalization.py +0 -0
  464. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_public_pipeline.py +0 -0
  465. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_refactor_raster.py +0 -0
  466. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_refactor_rendering.py +0 -0
  467. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_refactor_resources.py +0 -0
  468. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_render_ownership.py +0 -0
  469. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_renderer_branding.py +0 -0
  470. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_shared_boundaries.py +0 -0
  471. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_system_font_pdf_pipeline.py +0 -0
  472. {docvortex-0.2.2 → docvortex-0.2.4}/tests/test_validated_geometry.py +0 -0
  473. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
  474. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_epub_test_utils.py +0 -0
  475. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_flash_pdf_test_utils.py +0 -0
  476. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_image_mtef_test_utils.py +0 -0
  477. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_legacy_doc_test_utils.py +0 -0
  478. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
  479. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_legacy_xls_test_utils.py +0 -0
  480. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_metafile_test_utils.py +0 -0
  481. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_mtef_test_utils.py +0 -0
  482. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_mtef_v5_test_utils.py +0 -0
  483. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_native_test_utils.py +0 -0
  484. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_odf_test_utils.py +0 -0
  485. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_ofd_test_utils.py +0 -0
  486. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
  487. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
  488. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/_span_test_utils.py +0 -0
  489. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
  490. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
  491. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
  492. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
  493. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
  494. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
  495. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
  496. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
  497. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
  498. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
  499. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
  500. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
  501. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
  502. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
  503. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
  504. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
  505. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/pdfs/test.pdf +0 -0
  506. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_backend_architecture.py +0 -0
  507. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_backend_block_object_regressions.py +0 -0
  508. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_assets.py +0 -0
  509. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_complex_fields.py +0 -0
  510. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_math.py +0 -0
  511. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_render.py +0 -0
  512. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_special_char_tables.py +0 -0
  513. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_docx_table.py +0 -0
  514. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_emfplus_integration.py +0 -0
  515. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_epub_render.py +0 -0
  516. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_csv.py +0 -0
  517. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_docx_equationxml.py +0 -0
  518. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_html.py +0 -0
  519. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_image_mtef.py +0 -0
  520. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
  521. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_doc.py +0 -0
  522. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
  523. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_ppt.py +0 -0
  524. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_xls.py +0 -0
  525. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
  526. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_markup_anchors.py +0 -0
  527. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_model.py +0 -0
  528. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_mtef_v5.py +0 -0
  529. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_odf.py +0 -0
  530. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_ofd.py +0 -0
  531. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_image_mtef.py +0 -0
  532. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_metafile.py +0 -0
  533. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_models.py +0 -0
  534. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
  535. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
  536. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_office_title_types.py +0 -0
  537. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
  538. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
  539. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
  540. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
  541. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
  542. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_extractor.py +0 -0
  543. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_formulas.py +0 -0
  544. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_graphics.py +0 -0
  545. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
  546. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
  547. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_native_text.py +0 -0
  548. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
  549. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_samples.py +0 -0
  550. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_scripts.py +0 -0
  551. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_semantics.py +0 -0
  552. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_tables.py +0 -0
  553. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
  554. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_titles.py +0 -0
  555. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
  556. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_rtf.py +0 -0
  557. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_shared_helpers.py +0 -0
  558. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
  559. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_guess_suffix_ole2.py +0 -0
  560. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_html_css_build.py +0 -0
  561. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_html_render.py +0 -0
  562. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_html_security.py +0 -0
  563. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
  564. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_latex_render.py +0 -0
  565. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_markdown_render.py +0 -0
  566. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_middle_json_block_models.py +0 -0
  567. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_middle_json_export.py +0 -0
  568. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_middle_json_validator.py +0 -0
  569. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_model_json.py +0 -0
  570. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table.py +0 -0
  571. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
  572. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
  573. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
  574. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
  575. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_office_demo_exports.py +0 -0
  576. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_office_demo_pages.py +0 -0
  577. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_office_parser_regressions.py +0 -0
  578. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_classify.py +0 -0
  579. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_demo_links.py +0 -0
  580. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_document.py +0 -0
  581. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_render.py +0 -0
  582. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
  583. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_text_styles.py +0 -0
  584. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_pdf_visualization.py +0 -0
  585. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_postprocess_page_blocks.py +0 -0
  586. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_postprocess_pages.py +0 -0
  587. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_postprocess_paragraphs.py +0 -0
  588. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_postprocess_visual.py +0 -0
  589. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_render_api.py +0 -0
  590. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_render_html_table.py +0 -0
  591. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_render_image_renderer.py +0 -0
  592. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_render_list_index_utils.py +0 -0
  593. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_structured_content_render.py +0 -0
  594. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_table_merge.py +0 -0
  595. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_table_merge_cell_merge.py +0 -0
  596. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_text_block_anchor.py +0 -0
  597. {docvortex-0.2.2 → docvortex-0.2.4}/tests/unittest/test_text_utils.py +0 -0
  598. {docvortex-0.2.2 → docvortex-0.2.4}/tools/__init__.py +0 -0
  599. {docvortex-0.2.2 → docvortex-0.2.4}/tools/build_html_css.py +0 -0
  600. {docvortex-0.2.2 → docvortex-0.2.4}/tools/calibrate_pdf_geometry.py +0 -0
  601. {docvortex-0.2.2 → docvortex-0.2.4}/tools/capture_baseline.py +0 -0
  602. {docvortex-0.2.2 → docvortex-0.2.4}/tools/capture_platform_layout.py +0 -0
  603. {docvortex-0.2.2 → docvortex-0.2.4}/tools/compare_font_platforms.py +0 -0
  604. {docvortex-0.2.2 → docvortex-0.2.4}/tools/font_geometry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docvortex
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: A fast, multi-format document parsing and conversion engine
5
5
  License-Expression: MIT
6
6
  Project-URL: Repository, https://github.com/myhloli/DocVortex
@@ -35,6 +35,7 @@ Requires-Dist: olefile<1,>=0.47
35
35
  Requires-Dist: pylatexenc<3,>=2.10
36
36
  Requires-Dist: latex2mathml<4,>=3.81.0
37
37
  Requires-Dist: mathml2omml==0.0.2
38
+ Requires-Dist: resvg_py<0.6,>=0.5.0
38
39
  Requires-Dist: reportlab
39
40
  Requires-Dist: ziamath<0.14,>=0.13
40
41
  Requires-Dist: fast-langdetect<0.3.0,>=0.2.3
@@ -52,7 +53,7 @@ Requires-Dist: twine; extra == "dev"
52
53
  Dynamic: license-file
53
54
 
54
55
 
55
- ![DocVortex overview: native document inputs flow through a unified document model to Markdown, HTML, LaTeX, DOCX, EPUB, PDF and structured content.](https://raw.githubusercontent.com/myhloli/DocVortex/main/docs/images/docvortex-overview.jpg)
56
+ ![DocVortex overview: native document inputs flow through a unified document model to Markdown, HTML, LaTeX, DOCX, EPUB, PDF and structured content.](https://gcore.jsdelivr.net/gh/myhloli/DocVortex@main/docs/images/docvortex-overview.jpg)
56
57
 
57
58
  # DocVortex
58
59
 
@@ -61,12 +62,12 @@ A fast, multi-format document parsing and conversion engine.
61
62
  DocVortex provides a complete, standalone document pipeline:
62
63
 
63
64
  ```text
64
- Document -> ModelJson + Assets -> MiddleJson + Assets -> Render / Export
65
+ Document -> Unified Intermediate Representation -> Render / Export
65
66
  ```
66
67
 
67
68
  Native inputs include text PDFs, DOC/DOCX, PPT/PPTX, XLS/XLSX, RTF, ODT/ODS/ODP,
68
69
  EPUB, HTML, OFD and CSV. Output formats include Markdown, HTML, LaTeX, DOCX,
69
- EPUB, PDF and structured content. Content List V1/V2 are provided by MinerU.
70
+ EPUB, PDF and structured content.
70
71
 
71
72
  Native parsing runs without OCR or VLM inference services.
72
73
  PDF classification is an explicit document operation; native analysis does not
@@ -81,8 +82,7 @@ docvortex classify report.pdf
81
82
  ```
82
83
 
83
84
  Python 3.10–3.14 is supported. Native parsing does not require OCR/VLM inference
84
- services. PDF access uses `pypdfium2>=5.10.1,<6`; the
85
- compatibility matrix also exercises 5.13.0.
85
+ services.
86
86
 
87
87
  ## Parse once, export many times
88
88
 
@@ -166,28 +166,5 @@ uv build
166
166
 
167
167
  DocVortex project code is licensed under the [MIT License](LICENSE.md).
168
168
 
169
- Dependencies include `pydantic>=2.12.5,<3` and `numpy>=1.21.6`; the
170
- installer selects versions compatible with the active Python interpreter.
171
- On Apple Silicon, Python 3.14 installation requires macOS 14 or newer because
172
- of the ONNX Runtime dependency used by file-type detection.
173
-
174
- See [the standalone example](demo/README.md) for native parsing and portable
175
- result bundles, and [the validation record](docs/validation.md) for test coverage.
176
-
177
- PDFium uses a bundled, pinned CJK fallback font for non-embedded CJK fonts;
178
- no system font installation is required. See [PDF font policy](docs/PDF_FONTS.md)
179
- for initialization, diagnostics and replacement boundaries.
180
-
181
- PDF output normalizes fullwidth Latin letters, digits and selected technical
182
- symbols in natural-language text and table cells, preserving Chinese punctuation,
183
- formulas, code and link targets. See
184
- [PDF text normalization](docs/PDF_TEXT_NORMALIZATION.md) for scope and API usage.
185
-
186
- See [the DocVortex upgrade guide](docs/DOCVORTEX_UPGRADE.md) for package, protocol,
187
- PDF text rules and publishing configuration changes.
188
-
189
169
  See [rendering ownership](docs/RENDER_OWNERSHIP.md) for the seven engine targets,
190
170
  MinerU Content List integration and public fragment helpers.
191
-
192
- See [refactor validation](docs/REFACTOR_PROGRESS.md) for the staged internal
193
- refactoring, compatibility checks, corpus comparisons and measured performance.
@@ -1,5 +1,5 @@
1
1
 
2
- ![DocVortex overview: native document inputs flow through a unified document model to Markdown, HTML, LaTeX, DOCX, EPUB, PDF and structured content.](https://raw.githubusercontent.com/myhloli/DocVortex/main/docs/images/docvortex-overview.jpg)
2
+ ![DocVortex overview: native document inputs flow through a unified document model to Markdown, HTML, LaTeX, DOCX, EPUB, PDF and structured content.](https://gcore.jsdelivr.net/gh/myhloli/DocVortex@main/docs/images/docvortex-overview.jpg)
3
3
 
4
4
  # DocVortex
5
5
 
@@ -8,12 +8,12 @@ A fast, multi-format document parsing and conversion engine.
8
8
  DocVortex provides a complete, standalone document pipeline:
9
9
 
10
10
  ```text
11
- Document -> ModelJson + Assets -> MiddleJson + Assets -> Render / Export
11
+ Document -> Unified Intermediate Representation -> Render / Export
12
12
  ```
13
13
 
14
14
  Native inputs include text PDFs, DOC/DOCX, PPT/PPTX, XLS/XLSX, RTF, ODT/ODS/ODP,
15
15
  EPUB, HTML, OFD and CSV. Output formats include Markdown, HTML, LaTeX, DOCX,
16
- EPUB, PDF and structured content. Content List V1/V2 are provided by MinerU.
16
+ EPUB, PDF and structured content.
17
17
 
18
18
  Native parsing runs without OCR or VLM inference services.
19
19
  PDF classification is an explicit document operation; native analysis does not
@@ -28,8 +28,7 @@ docvortex classify report.pdf
28
28
  ```
29
29
 
30
30
  Python 3.10–3.14 is supported. Native parsing does not require OCR/VLM inference
31
- services. PDF access uses `pypdfium2>=5.10.1,<6`; the
32
- compatibility matrix also exercises 5.13.0.
31
+ services.
33
32
 
34
33
  ## Parse once, export many times
35
34
 
@@ -113,28 +112,5 @@ uv build
113
112
 
114
113
  DocVortex project code is licensed under the [MIT License](LICENSE.md).
115
114
 
116
- Dependencies include `pydantic>=2.12.5,<3` and `numpy>=1.21.6`; the
117
- installer selects versions compatible with the active Python interpreter.
118
- On Apple Silicon, Python 3.14 installation requires macOS 14 or newer because
119
- of the ONNX Runtime dependency used by file-type detection.
120
-
121
- See [the standalone example](demo/README.md) for native parsing and portable
122
- result bundles, and [the validation record](docs/validation.md) for test coverage.
123
-
124
- PDFium uses a bundled, pinned CJK fallback font for non-embedded CJK fonts;
125
- no system font installation is required. See [PDF font policy](docs/PDF_FONTS.md)
126
- for initialization, diagnostics and replacement boundaries.
127
-
128
- PDF output normalizes fullwidth Latin letters, digits and selected technical
129
- symbols in natural-language text and table cells, preserving Chinese punctuation,
130
- formulas, code and link targets. See
131
- [PDF text normalization](docs/PDF_TEXT_NORMALIZATION.md) for scope and API usage.
132
-
133
- See [the DocVortex upgrade guide](docs/DOCVORTEX_UPGRADE.md) for package, protocol,
134
- PDF text rules and publishing configuration changes.
135
-
136
115
  See [rendering ownership](docs/RENDER_OWNERSHIP.md) for the seven engine targets,
137
116
  MinerU Content List integration and public fragment helpers.
138
-
139
- See [refactor validation](docs/REFACTOR_PROGRESS.md) for the staged internal
140
- refactoring, compatibility checks, corpus comparisons and measured performance.
@@ -26,6 +26,7 @@ dependencies = [
26
26
  "python-docx>=1.2.0,<2", "pypptx-with-oxml>=1.0.3,<2",
27
27
  "mammoth>=1.11.0,<2", "openpyxl>=3.1.5,<4", "olefile>=0.47,<1",
28
28
  "pylatexenc>=2.10,<3", "latex2mathml>=3.81.0,<4", "mathml2omml==0.0.2",
29
+ "resvg_py>=0.5.0,<0.6",
29
30
  "reportlab", "ziamath>=0.13,<0.14", "fast-langdetect>=0.2.3,<0.3.0",
30
31
  "magika>=0.6.2,<1.1.0", "opencv-python>=4.11.0.86",
31
32
  ]
@@ -72,6 +72,7 @@ class EpubConverter:
72
72
  logger.warning("Skipping unusable EPUB spine item index={} path={!r}: {}", index, path, exc)
73
73
  blocks = []
74
74
  pages.append(blocks)
75
+ anchors.finalize_links(pages)
75
76
  self.pages = pages
76
77
  finally:
77
78
  package.close()
@@ -5,8 +5,10 @@ from __future__ import annotations
5
5
  import base64
6
6
  from dataclasses import dataclass
7
7
 
8
+ from lxml import html as lxml_html
8
9
  from lxml import etree # type: ignore[reportMissingImports]
9
10
 
11
+ from ....content.spans import normalize_span_dicts
10
12
  from ....foundation.image_payload import parse_image_data_uri_strict
11
13
  from .._shared.hyperlink import sanitize_hyperlink_target
12
14
  from docvortex.content.markup import (
@@ -52,13 +54,25 @@ _NOTE_NON_TEXT_SUBTREES = frozenset(
52
54
  )
53
55
 
54
56
 
57
+ def _unwrap_epub_type_quotes(value: str) -> str:
58
+ """移除单层成对外围引号,避免把多个各自带引号的 token 当作一个整体。"""
59
+ normalized = value.strip()
60
+ quote_pairs = {'"': '"', "'": "'", "“": "”", "‘": "’"}
61
+ if len(normalized) < 2 or quote_pairs.get(normalized[0]) != normalized[-1]:
62
+ return normalized
63
+ inner = normalized[1:-1]
64
+ if normalized[0] in inner or normalized[-1] in inner:
65
+ return normalized
66
+ return inner.strip()
67
+
68
+
55
69
  def _epub_types(element: etree._Element) -> frozenset[str]:
56
70
  """读取 EPUB 命名空间或未命名 type 属性中的结构语义 token。"""
57
71
  values: list[str] = []
58
72
  for name, value in element.attrib.items():
59
73
  local_name = etree.QName(name).localname if name.startswith("{") else name.split(":", 1)[-1]
60
74
  if local_name == "type":
61
- values.extend(value.casefold().split())
75
+ values.extend(_unwrap_epub_type_quotes(token) for token in _unwrap_epub_type_quotes(value).casefold().split())
62
76
  return frozenset(values)
63
77
 
64
78
 
@@ -149,11 +163,12 @@ class _EpubAnchorPolicy:
149
163
 
150
164
 
151
165
  class EpubAnchorRegistry:
152
- """建立章节路径、标题与 note fragment 到实际 canonical anchor 的别名表。"""
166
+ """建立章节路径、正文、标题与 note fragment 到实际 canonical anchor 的别名表。"""
153
167
 
154
168
  def __init__(self, chapters: list[tuple[str, etree._Element]], package: EpubPackage) -> None:
155
169
  """预扫描全部选中 XHTML 章节,建立标题、note 与章节起点映射。"""
156
170
  self._package = package
171
+ self._pending_links: dict[str, tuple[str, str | None]] = {}
157
172
  documents = [
158
173
  MarkupAnchorDocument(
159
174
  key=chapter_path,
@@ -166,6 +181,35 @@ class EpubAnchorRegistry:
166
181
  ]
167
182
  self._registry = MarkupAnchorRegistry(documents, _EpubAnchorPolicy())
168
183
 
184
+ def register_text_targets(
185
+ self,
186
+ chapter_path: str,
187
+ root: etree._Element,
188
+ sources: list[tuple[etree._Element, dict[str, object]]],
189
+ ) -> None:
190
+ """在章节投影完成后登记真实正文目标,不修改已有标题和脚注身份。"""
191
+ self._registry.register_text_targets(chapter_path, root, sources)
192
+
193
+ def defer_link(self, href: str, *, base_part: str) -> str | None:
194
+ """暂存尚未物化的包内目标,跨章节投影完成后统一兑现或降级。"""
195
+ normalized = sanitize_hyperlink_target(href, allowed_schemes=(), allow_relative=True, allow_fragment=True)
196
+ target = self._package.resolve_reference(normalized, base_part=base_part) if normalized is not None else None
197
+ if target is None:
198
+ return None
199
+ placeholder = f"#epub-pending-{len(self._pending_links)}"
200
+ self._pending_links[placeholder] = (target.path, target.fragment)
201
+ return placeholder
202
+
203
+ def finalize_links(self, pages: list[list[dict[str, object]]]) -> None:
204
+ """消除所有解析期链接占位,保留无效链接的文字与样式。"""
205
+ targets = {
206
+ placeholder: (f"#{anchor}" if (anchor := self._registry.resolve_target(path, fragment)) else None)
207
+ for placeholder, (path, fragment) in self._pending_links.items()
208
+ }
209
+ for page in pages:
210
+ _finalize_pending_content(page, targets)
211
+ self._pending_links.clear()
212
+
169
213
  def heading_anchor(self, heading: etree._Element) -> str | None:
170
214
  """返回一个已预扫描 EPUB 标题的规范 anchor。"""
171
215
  return self._registry.heading_anchor(heading)
@@ -179,7 +223,7 @@ class EpubAnchorRegistry:
179
223
  return self._registry.note_anchor(note)
180
224
 
181
225
  def resolve_anchor(self, href: str, *, base_part: str) -> str | None:
182
- """解析指向正文标题或 note 的 EPUB 包内链接,并返回不带井号的 anchor。"""
226
+ """解析指向已登记正文、标题或 note 的包内链接,返回不带井号的 anchor。"""
183
227
  normalized = sanitize_hyperlink_target(
184
228
  href,
185
229
  allowed_schemes=(),
@@ -194,7 +238,7 @@ class EpubAnchorRegistry:
194
238
  return self._registry.resolve_target(target.path, target.fragment)
195
239
 
196
240
  def resolve_link(self, href: str, *, base_part: str) -> str | None:
197
- """解析安全外部链接或指向已输出标题/note 的 EPUB 内部链接。"""
241
+ """解析安全外部链接或指向已登记输出块的 EPUB 内部链接。"""
198
242
  external = sanitize_hyperlink_target(href)
199
243
  if external is not None:
200
244
  return external
@@ -217,7 +261,9 @@ class _EpubMarkupContext:
217
261
 
218
262
  def resolve_link(self, href: str) -> str | None:
219
263
  """解析安全外部链接或实际存在的 EPUB 包内 anchor。"""
220
- return self.anchors.resolve_link(href, base_part=self.chapter_path)
264
+ return self.anchors.resolve_link(href, base_part=self.chapter_path) or self.anchors.defer_link(
265
+ href, base_part=self.chapter_path
266
+ )
221
267
 
222
268
  def resolve_image(self, source: str, *, alt: str = "") -> ResolvedMarkupImage | None:
223
269
  """读取并严格校验一个 EPUB 包内栅格图片引用。"""
@@ -278,12 +324,50 @@ class EpubChapterConverter:
278
324
  if body is None:
279
325
  return []
280
326
  context = _EpubMarkupContext(self.package, self.chapter_path, self.anchors)
281
- return MarkupProjector(
327
+ projector = MarkupProjector(
282
328
  body,
283
329
  context,
284
330
  self.stylesheet,
285
331
  single_document_title=False,
286
- ).convert()
332
+ track_text_sources=True,
333
+ )
334
+ blocks = projector.convert()
335
+ self.anchors.register_text_targets(self.chapter_path, self.root, projector.text_sources)
336
+ return blocks
337
+
338
+
339
+ def _finalize_pending_content(items: list[dict[str, object]], targets: dict[str, str | None]) -> None:
340
+ """递归处理 raw block 和行内 Span,表格 HTML 同步替换或解包失效链接。"""
341
+ output: list[dict[str, object]] = []
342
+ flattened = False
343
+ for item in items:
344
+ content = item.get("content")
345
+ if isinstance(content, list):
346
+ _finalize_pending_content(content, targets)
347
+ elif item.get("type") == "table" and isinstance(content, str) and "#epub-pending-" in content:
348
+ root = lxml_html.fragment_fromstring(content, create_parent="div")
349
+ for link in root.iter("a"):
350
+ href = link.get("href")
351
+ if href in targets:
352
+ if target := targets[href]:
353
+ link.set("href", target)
354
+ else:
355
+ link.drop_tag()
356
+ item["content"] = (root.text or "") + "".join(lxml_html.tostring(child, encoding="unicode") for child in root)
357
+ url = item.get("url")
358
+ if item.get("type") == "hyperlink" and isinstance(url, str) and url in targets:
359
+ if target := targets[url]:
360
+ item["url"] = target
361
+ else:
362
+ if isinstance(content, list):
363
+ output.extend(content)
364
+ flattened = True
365
+ continue
366
+ output.append(item)
367
+ if flattened:
368
+ # 只有失效链接被解包的 Span 列表需要重新合并,避免重复校验整本正文。
369
+ output = normalize_span_dicts(output)
370
+ items[:] = output
287
371
 
288
372
 
289
373
  def convert_svg_spine(
@@ -66,14 +66,20 @@ class HtmlModel:
66
66
 
67
67
 
68
68
  class OfdModel:
69
- """将 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 路径。"""