brewdoc 0.2.0__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 (415) hide show
  1. brewdoc-0.2.0/.gitattributes +1 -0
  2. brewdoc-0.2.0/.github/dependabot.yml +6 -0
  3. brewdoc-0.2.0/.github/workflows/ci.yml +27 -0
  4. brewdoc-0.2.0/.github/workflows/release.yml +57 -0
  5. brewdoc-0.2.0/.gitignore +8 -0
  6. brewdoc-0.2.0/.python-version +1 -0
  7. brewdoc-0.2.0/FORMATS.md +189 -0
  8. brewdoc-0.2.0/LICENSE +21 -0
  9. brewdoc-0.2.0/PKG-INFO +232 -0
  10. brewdoc-0.2.0/README.md +206 -0
  11. brewdoc-0.2.0/RELEASING.md +31 -0
  12. brewdoc-0.2.0/benchmarks/CATALOG.md +135 -0
  13. brewdoc-0.2.0/benchmarks/LICENSES/apache-httpd-LICENSE.txt +537 -0
  14. brewdoc-0.2.0/benchmarks/LICENSES/apache-httpd-NOTICE.txt +18 -0
  15. brewdoc-0.2.0/benchmarks/LICENSES/calamine-MIT.txt +24 -0
  16. brewdoc-0.2.0/benchmarks/METHODOLOGY.md +244 -0
  17. brewdoc-0.2.0/benchmarks/README.md +140 -0
  18. brewdoc-0.2.0/benchmarks/annotations/README.md +151 -0
  19. brewdoc-0.2.0/benchmarks/annotations/docx-libreoffice-negative-cell-margin-twips.json +71 -0
  20. brewdoc-0.2.0/benchmarks/annotations/docx-poi-deep-table-cell.json +62 -0
  21. brewdoc-0.2.0/benchmarks/annotations/docx-poi-table-alignment.json +74 -0
  22. brewdoc-0.2.0/benchmarks/annotations/docx-poi-three-col-head.json +91 -0
  23. brewdoc-0.2.0/benchmarks/annotations/docx-tika-testword-various.json +131 -0
  24. brewdoc-0.2.0/benchmarks/annotations/docx-tika-testword.json +108 -0
  25. brewdoc-0.2.0/benchmarks/annotations/html-apache-httpd-allowmethods.json +361 -0
  26. brewdoc-0.2.0/benchmarks/annotations/html-mdn-document-structure.json +166 -0
  27. brewdoc-0.2.0/benchmarks/annotations/html-mdn-first-form-styled.json +134 -0
  28. brewdoc-0.2.0/benchmarks/annotations/html-mdn-items-sold-headers.json +534 -0
  29. brewdoc-0.2.0/benchmarks/annotations/html-mdn-planets-data.json +488 -0
  30. brewdoc-0.2.0/benchmarks/annotations/html-mdn-timetable-caption.json +151 -0
  31. brewdoc-0.2.0/benchmarks/annotations/ods-calamine-any-sheets.json +268 -0
  32. brewdoc-0.2.0/benchmarks/annotations/ods-calamine-date.json +112 -0
  33. brewdoc-0.2.0/benchmarks/annotations/ods-calamine-issues.json +428 -0
  34. brewdoc-0.2.0/benchmarks/annotations/ods-calamine-merged-cells.json +83 -0
  35. brewdoc-0.2.0/benchmarks/annotations/ods-calamine-special-cells.json +122 -0
  36. brewdoc-0.2.0/benchmarks/annotations/pdf-arxiv-2302.13971v1.json +1088 -0
  37. brewdoc-0.2.0/benchmarks/annotations/pdf-arxiv-2305.18290v3.json +1452 -0
  38. brewdoc-0.2.0/benchmarks/annotations/pdf-arxiv-2402.00838v4.json +1194 -0
  39. brewdoc-0.2.0/benchmarks/annotations/pdf-eia-steo-table1.json +104 -0
  40. brewdoc-0.2.0/benchmarks/annotations/pdf-fbi-nics-background-checks-2015-11.json +100 -0
  41. brewdoc-0.2.0/benchmarks/annotations/pdf-federal-register-2020-17221.json +670 -0
  42. brewdoc-0.2.0/benchmarks/annotations/pdf-nist-sp800-145.json +474 -0
  43. brewdoc-0.2.0/benchmarks/annotations/pdf-us-patent-223898-scan.json +358 -0
  44. brewdoc-0.2.0/benchmarks/annotations/pdf-us-senate-expenditures.json +80 -0
  45. brewdoc-0.2.0/benchmarks/annotations/pptx-poi-table-test.json +70 -0
  46. brewdoc-0.2.0/benchmarks/annotations/pptx-poi-testppt.json +145 -0
  47. brewdoc-0.2.0/benchmarks/annotations/pptx-python-pptx-test.json +69 -0
  48. brewdoc-0.2.0/benchmarks/annotations/pptx-tika-testppt-various2.json +330 -0
  49. brewdoc-0.2.0/benchmarks/annotations/xls-calamine-any-sheets.json +387 -0
  50. brewdoc-0.2.0/benchmarks/annotations/xls-calamine-date.json +207 -0
  51. brewdoc-0.2.0/benchmarks/annotations/xls-calamine-merge-cells.json +141 -0
  52. brewdoc-0.2.0/benchmarks/annotations/xls-calamine-xls-formula.json +232 -0
  53. brewdoc-0.2.0/benchmarks/annotations/xls-census-st-est00int-01.json +244 -0
  54. brewdoc-0.2.0/benchmarks/annotations/xlsb-calamine-date.json +126 -0
  55. brewdoc-0.2.0/benchmarks/annotations/xlsb-calamine-issue127.json +521 -0
  56. brewdoc-0.2.0/benchmarks/annotations/xlsb-calamine-issues.json +603 -0
  57. brewdoc-0.2.0/benchmarks/annotations/xlsm-calamine-issue221.json +71 -0
  58. brewdoc-0.2.0/benchmarks/annotations/xlsm-calamine-issue3.json +163 -0
  59. brewdoc-0.2.0/benchmarks/annotations/xlsm-calamine-vba.json +155 -0
  60. brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-any-sheets.json +270 -0
  61. brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-date.json +102 -0
  62. brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-inventory-table.json +91 -0
  63. brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-merge-cells.json +99 -0
  64. brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-temperature-table.json +177 -0
  65. brewdoc-0.2.0/benchmarks/annotations/xlsx-census-nst-est2024-pop.json +171 -0
  66. brewdoc-0.2.0/benchmarks/capture_results.py +159 -0
  67. brewdoc-0.2.0/benchmarks/corpus.json +1928 -0
  68. brewdoc-0.2.0/benchmarks/results/20260913-133006/README.md +128 -0
  69. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-any-sheets.json +268 -0
  70. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-date.json +112 -0
  71. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-issues.json +428 -0
  72. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-merged-cells.json +83 -0
  73. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-special-cells.json +122 -0
  74. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-arxiv-2302.13971v1.json +1088 -0
  75. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-arxiv-2305.18290v3.json +1452 -0
  76. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-arxiv-2402.00838v4.json +1194 -0
  77. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-eia-steo-table1.json +104 -0
  78. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-fbi-nics-background-checks-2015-11.json +100 -0
  79. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-federal-register-2020-17221.json +670 -0
  80. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-nist-sp800-145.json +474 -0
  81. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-us-patent-223898-scan.json +358 -0
  82. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-us-senate-expenditures.json +80 -0
  83. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-calamine-any-sheets.json +387 -0
  84. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-calamine-date.json +207 -0
  85. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-calamine-merge-cells.json +141 -0
  86. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-calamine-xls-formula.json +232 -0
  87. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-census-st-est00int-01.json +244 -0
  88. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsb-calamine-date.json +126 -0
  89. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsb-calamine-issue127.json +521 -0
  90. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsb-calamine-issues.json +603 -0
  91. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsm-calamine-issue221.json +71 -0
  92. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsm-calamine-issue3.json +163 -0
  93. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsm-calamine-vba.json +155 -0
  94. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-any-sheets.json +270 -0
  95. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-date.json +102 -0
  96. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-inventory-table.json +91 -0
  97. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-merge-cells.json +99 -0
  98. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-temperature-table.json +177 -0
  99. brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-census-nst-est2024-pop.json +171 -0
  100. brewdoc-0.2.0/benchmarks/results/20260913-133006/context.json +337 -0
  101. brewdoc-0.2.0/benchmarks/results/20260913-133006/corpus-v1.json +596 -0
  102. brewdoc-0.2.0/benchmarks/results/20260913-133006/corpus.json +1259 -0
  103. brewdoc-0.2.0/benchmarks/results/20260913-133006/markdown-integrity.json +487 -0
  104. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-any-sheets/artifacts/document.md +18 -0
  105. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-any-sheets/receipt.json +29 -0
  106. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-any-sheets/result.json +61 -0
  107. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-date/artifacts/document.md +11 -0
  108. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-date/receipt.json +29 -0
  109. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-date/result.json +61 -0
  110. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-issues/artifacts/document.md +51 -0
  111. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-issues/receipt.json +29 -0
  112. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-issues/result.json +61 -0
  113. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-merged-cells/artifacts/document.md +10 -0
  114. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-merged-cells/receipt.json +29 -0
  115. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-merged-cells/result.json +61 -0
  116. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-special-cells/artifacts/document.md +12 -0
  117. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-special-cells/receipt.json +29 -0
  118. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-special-cells/result.json +61 -0
  119. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2302.13971v1/artifacts/document.md +2021 -0
  120. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2302.13971v1/receipt.json +29 -0
  121. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2302.13971v1/result.json +61 -0
  122. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2305.18290v3/artifacts/document.md +1539 -0
  123. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2305.18290v3/receipt.json +29 -0
  124. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2305.18290v3/result.json +61 -0
  125. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2402.00838v4/artifacts/document.md +2007 -0
  126. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2402.00838v4/receipt.json +29 -0
  127. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2402.00838v4/result.json +61 -0
  128. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-eia-steo-table1/artifacts/document.md +20 -0
  129. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-eia-steo-table1/receipt.json +29 -0
  130. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-eia-steo-table1/result.json +61 -0
  131. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-fbi-nics-background-checks-2015-11/artifacts/document.md +24 -0
  132. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-fbi-nics-background-checks-2015-11/receipt.json +29 -0
  133. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-fbi-nics-background-checks-2015-11/result.json +61 -0
  134. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-federal-register-2020-17221/artifacts/document.md +926 -0
  135. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-federal-register-2020-17221/receipt.json +29 -0
  136. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-federal-register-2020-17221/result.json +61 -0
  137. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-nist-sp800-145/artifacts/document.md +205 -0
  138. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-nist-sp800-145/receipt.json +29 -0
  139. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-nist-sp800-145/result.json +61 -0
  140. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-patent-223898-scan/receipt.json +29 -0
  141. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-patent-223898-scan/result.json +57 -0
  142. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-senate-expenditures/artifacts/document.md +11 -0
  143. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-senate-expenditures/receipt.json +29 -0
  144. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-senate-expenditures/result.json +61 -0
  145. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-any-sheets/artifacts/document.md +23 -0
  146. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-any-sheets/receipt.json +29 -0
  147. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-any-sheets/result.json +61 -0
  148. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-date/artifacts/document.md +10 -0
  149. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-date/receipt.json +29 -0
  150. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-date/result.json +61 -0
  151. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-merge-cells/artifacts/document.md +9 -0
  152. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-merge-cells/receipt.json +29 -0
  153. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-merge-cells/result.json +61 -0
  154. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-xls-formula/artifacts/document.md +16 -0
  155. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-xls-formula/receipt.json +29 -0
  156. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-xls-formula/result.json +61 -0
  157. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-census-st-est00int-01/artifacts/document.md +77 -0
  158. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-census-st-est00int-01/receipt.json +29 -0
  159. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-census-st-est00int-01/result.json +61 -0
  160. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-date/artifacts/document.md +10 -0
  161. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-date/receipt.json +29 -0
  162. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-date/result.json +61 -0
  163. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issue127/artifacts/document.md +19 -0
  164. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issue127/receipt.json +29 -0
  165. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issue127/result.json +61 -0
  166. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issues/artifacts/document.md +51 -0
  167. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issues/receipt.json +29 -0
  168. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issues/result.json +61 -0
  169. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue221/artifacts/document.md +9 -0
  170. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue221/receipt.json +29 -0
  171. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue221/result.json +61 -0
  172. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue3/artifacts/document.md +12 -0
  173. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue3/receipt.json +29 -0
  174. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue3/result.json +61 -0
  175. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-vba/artifacts/document.md +9 -0
  176. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-vba/receipt.json +29 -0
  177. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-vba/result.json +61 -0
  178. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-any-sheets/artifacts/document.md +18 -0
  179. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-any-sheets/receipt.json +29 -0
  180. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-any-sheets/result.json +61 -0
  181. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-date/artifacts/document.md +10 -0
  182. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-date/receipt.json +29 -0
  183. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-date/result.json +61 -0
  184. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-inventory-table/artifacts/document.md +12 -0
  185. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-inventory-table/receipt.json +29 -0
  186. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-inventory-table/result.json +61 -0
  187. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-merge-cells/artifacts/document.md +9 -0
  188. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-merge-cells/receipt.json +29 -0
  189. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-merge-cells/result.json +61 -0
  190. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-temperature-table/artifacts/document.md +17 -0
  191. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-temperature-table/receipt.json +29 -0
  192. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-temperature-table/result.json +61 -0
  193. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-census-nst-est2024-pop/artifacts/document.md +75 -0
  194. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-census-nst-est2024-pop/receipt.json +29 -0
  195. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-census-nst-est2024-pop/result.json +61 -0
  196. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-any-sheets/artifacts/document.md +18 -0
  197. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-any-sheets/receipt.json +29 -0
  198. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-any-sheets/result.json +61 -0
  199. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-date/artifacts/document.md +11 -0
  200. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-date/receipt.json +29 -0
  201. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-date/result.json +61 -0
  202. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-issues/artifacts/document.md +51 -0
  203. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-issues/receipt.json +29 -0
  204. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-issues/result.json +61 -0
  205. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-merged-cells/artifacts/document.md +10 -0
  206. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-merged-cells/receipt.json +29 -0
  207. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-merged-cells/result.json +61 -0
  208. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-special-cells/artifacts/document.md +12 -0
  209. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-special-cells/receipt.json +29 -0
  210. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-special-cells/result.json +61 -0
  211. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2302.13971v1/artifacts/document.md +2021 -0
  212. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2302.13971v1/receipt.json +29 -0
  213. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2302.13971v1/result.json +61 -0
  214. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2305.18290v3/artifacts/document.md +1539 -0
  215. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2305.18290v3/receipt.json +29 -0
  216. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2305.18290v3/result.json +61 -0
  217. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2402.00838v4/artifacts/document.md +2007 -0
  218. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2402.00838v4/receipt.json +29 -0
  219. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2402.00838v4/result.json +61 -0
  220. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-eia-steo-table1/artifacts/document.md +20 -0
  221. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-eia-steo-table1/receipt.json +29 -0
  222. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-eia-steo-table1/result.json +61 -0
  223. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-fbi-nics-background-checks-2015-11/artifacts/document.md +24 -0
  224. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-fbi-nics-background-checks-2015-11/receipt.json +29 -0
  225. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-fbi-nics-background-checks-2015-11/result.json +61 -0
  226. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-federal-register-2020-17221/artifacts/document.md +926 -0
  227. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-federal-register-2020-17221/receipt.json +29 -0
  228. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-federal-register-2020-17221/result.json +61 -0
  229. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-nist-sp800-145/artifacts/document.md +205 -0
  230. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-nist-sp800-145/receipt.json +29 -0
  231. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-nist-sp800-145/result.json +61 -0
  232. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-patent-223898-scan/receipt.json +29 -0
  233. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-patent-223898-scan/result.json +57 -0
  234. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-senate-expenditures/artifacts/document.md +11 -0
  235. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-senate-expenditures/receipt.json +29 -0
  236. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-senate-expenditures/result.json +61 -0
  237. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-any-sheets/artifacts/document.md +23 -0
  238. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-any-sheets/receipt.json +29 -0
  239. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-any-sheets/result.json +61 -0
  240. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-date/artifacts/document.md +10 -0
  241. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-date/receipt.json +29 -0
  242. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-date/result.json +61 -0
  243. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-merge-cells/artifacts/document.md +9 -0
  244. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-merge-cells/receipt.json +29 -0
  245. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-merge-cells/result.json +61 -0
  246. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-xls-formula/artifacts/document.md +16 -0
  247. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-xls-formula/receipt.json +29 -0
  248. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-xls-formula/result.json +61 -0
  249. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-census-st-est00int-01/artifacts/document.md +77 -0
  250. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-census-st-est00int-01/receipt.json +29 -0
  251. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-census-st-est00int-01/result.json +61 -0
  252. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-date/artifacts/document.md +10 -0
  253. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-date/receipt.json +29 -0
  254. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-date/result.json +61 -0
  255. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issue127/artifacts/document.md +19 -0
  256. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issue127/receipt.json +29 -0
  257. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issue127/result.json +61 -0
  258. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issues/artifacts/document.md +51 -0
  259. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issues/receipt.json +29 -0
  260. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issues/result.json +61 -0
  261. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue221/artifacts/document.md +9 -0
  262. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue221/receipt.json +29 -0
  263. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue221/result.json +61 -0
  264. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue3/artifacts/document.md +12 -0
  265. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue3/receipt.json +29 -0
  266. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue3/result.json +61 -0
  267. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-vba/artifacts/document.md +9 -0
  268. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-vba/receipt.json +29 -0
  269. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-vba/result.json +61 -0
  270. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-any-sheets/artifacts/document.md +18 -0
  271. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-any-sheets/receipt.json +29 -0
  272. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-any-sheets/result.json +61 -0
  273. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-date/artifacts/document.md +10 -0
  274. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-date/receipt.json +29 -0
  275. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-date/result.json +61 -0
  276. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-inventory-table/artifacts/document.md +12 -0
  277. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-inventory-table/receipt.json +29 -0
  278. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-inventory-table/result.json +61 -0
  279. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-merge-cells/artifacts/document.md +9 -0
  280. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-merge-cells/receipt.json +29 -0
  281. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-merge-cells/result.json +61 -0
  282. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-temperature-table/artifacts/document.md +17 -0
  283. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-temperature-table/receipt.json +29 -0
  284. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-temperature-table/result.json +61 -0
  285. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-census-nst-est2024-pop/artifacts/document.md +75 -0
  286. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-census-nst-est2024-pop/receipt.json +29 -0
  287. brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-census-nst-est2024-pop/result.json +61 -0
  288. brewdoc-0.2.0/benchmarks/results/20260913-133006/quality.json +197 -0
  289. brewdoc-0.2.0/benchmarks/results/20260913-133006/results.json +1137 -0
  290. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-any-sheets.json +107 -0
  291. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-date.json +76 -0
  292. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-issues.json +216 -0
  293. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-merged-cells.json +68 -0
  294. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-special-cells.json +104 -0
  295. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-arxiv-2302.13971v1.json +295 -0
  296. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-arxiv-2305.18290v3.json +549 -0
  297. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-arxiv-2402.00838v4.json +120 -0
  298. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-eia-steo-table1.json +37 -0
  299. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-fbi-nics-background-checks-2015-11.json +43 -0
  300. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-federal-register-2020-17221.json +78 -0
  301. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-nist-sp800-145.json +43 -0
  302. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-us-patent-223898-scan.json +27 -0
  303. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-us-senate-expenditures.json +36 -0
  304. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-calamine-any-sheets.json +120 -0
  305. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-calamine-date.json +68 -0
  306. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-calamine-merge-cells.json +99 -0
  307. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-calamine-xls-formula.json +88 -0
  308. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-census-st-est00int-01.json +241 -0
  309. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsb-calamine-date.json +68 -0
  310. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsb-calamine-issue127.json +146 -0
  311. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsb-calamine-issues.json +208 -0
  312. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsm-calamine-issue221.json +68 -0
  313. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsm-calamine-issue3.json +94 -0
  314. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsm-calamine-vba.json +81 -0
  315. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-any-sheets.json +107 -0
  316. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-date.json +68 -0
  317. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-inventory-table.json +68 -0
  318. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-merge-cells.json +99 -0
  319. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-temperature-table.json +94 -0
  320. brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-census-nst-est2024-pop.json +194 -0
  321. brewdoc-0.2.0/benchmarks/results/20260913-133006/selection.json +250 -0
  322. brewdoc-0.2.0/benchmarks/results/20260913-133006/validation.json +26 -0
  323. brewdoc-0.2.0/benchmarks/results/README.md +38 -0
  324. brewdoc-0.2.0/pyproject.toml +76 -0
  325. brewdoc-0.2.0/src/brewdoc/__init__.py +16 -0
  326. brewdoc-0.2.0/src/brewdoc/cli.py +97 -0
  327. brewdoc-0.2.0/src/brewdoc/common.py +405 -0
  328. brewdoc-0.2.0/src/brewdoc/docx.py +131 -0
  329. brewdoc-0.2.0/src/brewdoc/htmltext.py +812 -0
  330. brewdoc-0.2.0/src/brewdoc/output.py +93 -0
  331. brewdoc-0.2.0/src/brewdoc/pdf.py +1185 -0
  332. brewdoc-0.2.0/src/brewdoc/pptx.py +362 -0
  333. brewdoc-0.2.0/src/brewdoc/selfcheck.py +383 -0
  334. brewdoc-0.2.0/src/brewdoc/service.py +116 -0
  335. brewdoc-0.2.0/src/brewdoc/sheets.py +341 -0
  336. brewdoc-0.2.0/tests/fixtures/SOURCES.md +78 -0
  337. brewdoc-0.2.0/tests/fixtures/csv/vega-global-temp.csv +145 -0
  338. brewdoc-0.2.0/tests/fixtures/csv/vega-iowa-electricity.csv +52 -0
  339. brewdoc-0.2.0/tests/fixtures/csv/vega-seattle-weather.csv +1462 -0
  340. brewdoc-0.2.0/tests/fixtures/csv/vega-us-employment.csv +121 -0
  341. brewdoc-0.2.0/tests/fixtures/docx/libreoffice-negative-cell-margin-twips.docx +0 -0
  342. brewdoc-0.2.0/tests/fixtures/docx/poi-ThreeColHead.docx +0 -0
  343. brewdoc-0.2.0/tests/fixtures/docx/poi-deep-table-cell.docx +0 -0
  344. brewdoc-0.2.0/tests/fixtures/docx/poi-table-alignment.docx +0 -0
  345. brewdoc-0.2.0/tests/fixtures/docx/tika-testWORD.docx +0 -0
  346. brewdoc-0.2.0/tests/fixtures/docx/tika-testWORD_various.docx +0 -0
  347. brewdoc-0.2.0/tests/fixtures/eml/tika-testGroupWiseEml.eml +58 -0
  348. brewdoc-0.2.0/tests/fixtures/eml/tika-testRFC822_dkim.eml +22 -0
  349. brewdoc-0.2.0/tests/fixtures/eml/tika-testRFC822_multipart_attachments.eml +47 -0
  350. brewdoc-0.2.0/tests/fixtures/epub/epubcheck-minimal.epub +0 -0
  351. brewdoc-0.2.0/tests/fixtures/epub/standardebooks-herland.epub +0 -0
  352. brewdoc-0.2.0/tests/fixtures/html/apache-httpd-allowmethods.html +118 -0
  353. brewdoc-0.2.0/tests/fixtures/html/mdn-document-structure.html +108 -0
  354. brewdoc-0.2.0/tests/fixtures/html/mdn-first-form-styled.html +89 -0
  355. brewdoc-0.2.0/tests/fixtures/html/mdn-items-sold-headers.html +77 -0
  356. brewdoc-0.2.0/tests/fixtures/html/mdn-planets-data.html +153 -0
  357. brewdoc-0.2.0/tests/fixtures/html/mdn-timetable-caption.html +100 -0
  358. brewdoc-0.2.0/tests/fixtures/md/calamine-README.md +419 -0
  359. brewdoc-0.2.0/tests/fixtures/md/pdfplumber-README.md +585 -0
  360. brewdoc-0.2.0/tests/fixtures/odp/tika-testMasterFooter.odp +0 -0
  361. brewdoc-0.2.0/tests/fixtures/odp/tika-testODPMacro.odp +0 -0
  362. brewdoc-0.2.0/tests/fixtures/ods/calamine-any_sheets.ods +0 -0
  363. brewdoc-0.2.0/tests/fixtures/ods/calamine-date.ods +0 -0
  364. brewdoc-0.2.0/tests/fixtures/ods/calamine-issues.ods +0 -0
  365. brewdoc-0.2.0/tests/fixtures/ods/calamine-merged_cells.ods +0 -0
  366. brewdoc-0.2.0/tests/fixtures/ods/calamine-special_cells.ods +0 -0
  367. brewdoc-0.2.0/tests/fixtures/odt/tika-testODFwithOOo3.odt +0 -0
  368. brewdoc-0.2.0/tests/fixtures/odt/tika-testODTStyles2.odt +0 -0
  369. brewdoc-0.2.0/tests/fixtures/odt/tika-testOpenOffice2.odt +0 -0
  370. brewdoc-0.2.0/tests/fixtures/pdf/arxiv-2302.13971v1.pdf +0 -0
  371. brewdoc-0.2.0/tests/fixtures/pdf/arxiv-2305.18290v3.pdf +0 -0
  372. brewdoc-0.2.0/tests/fixtures/pdf/arxiv-2402.00838v4.pdf +0 -0
  373. brewdoc-0.2.0/tests/fixtures/pdf/eia-steo-table1.pdf +0 -0
  374. brewdoc-0.2.0/tests/fixtures/pdf/fbi-nics-background-checks-2015-11.pdf +0 -0
  375. brewdoc-0.2.0/tests/fixtures/pdf/federal-register-2020-17221.pdf +0 -0
  376. brewdoc-0.2.0/tests/fixtures/pdf/nist-sp800-145.pdf +0 -0
  377. brewdoc-0.2.0/tests/fixtures/pdf/us-patent-223898-scan.pdf +0 -0
  378. brewdoc-0.2.0/tests/fixtures/pdf/us-senate-expenditures.pdf +0 -0
  379. brewdoc-0.2.0/tests/fixtures/pptx/poi-table_test.pptx +0 -0
  380. brewdoc-0.2.0/tests/fixtures/pptx/poi-testPPT.pptx +0 -0
  381. brewdoc-0.2.0/tests/fixtures/pptx/python-pptx-test.pptx +0 -0
  382. brewdoc-0.2.0/tests/fixtures/pptx/tika-testPPT_various2.pptx +0 -0
  383. brewdoc-0.2.0/tests/fixtures/receipts.json +865 -0
  384. brewdoc-0.2.0/tests/fixtures/tsv/miller-abixy.tsv +11 -0
  385. brewdoc-0.2.0/tests/fixtures/tsv/vega-unemployment.tsv +3219 -0
  386. brewdoc-0.2.0/tests/fixtures/txt/nasa-giss-global-temperature-index.txt +176 -0
  387. brewdoc-0.2.0/tests/fixtures/txt/noaa-ghcn-daily-readme.txt +633 -0
  388. brewdoc-0.2.0/tests/fixtures/xls/calamine-any_sheets.xls +0 -0
  389. brewdoc-0.2.0/tests/fixtures/xls/calamine-date.xls +0 -0
  390. brewdoc-0.2.0/tests/fixtures/xls/calamine-merge_cells.xls +0 -0
  391. brewdoc-0.2.0/tests/fixtures/xls/calamine-xls_formula.xls +0 -0
  392. brewdoc-0.2.0/tests/fixtures/xls/census-st-est00int-01.xls +0 -0
  393. brewdoc-0.2.0/tests/fixtures/xlsb/calamine-date.xlsb +0 -0
  394. brewdoc-0.2.0/tests/fixtures/xlsb/calamine-issue127.xlsb +0 -0
  395. brewdoc-0.2.0/tests/fixtures/xlsb/calamine-issues.xlsb +0 -0
  396. brewdoc-0.2.0/tests/fixtures/xlsm/calamine-issue221.xlsm +0 -0
  397. brewdoc-0.2.0/tests/fixtures/xlsm/calamine-issue3.xlsm +0 -0
  398. brewdoc-0.2.0/tests/fixtures/xlsm/calamine-vba.xlsm +0 -0
  399. brewdoc-0.2.0/tests/fixtures/xlsx/calamine-any_sheets.xlsx +0 -0
  400. brewdoc-0.2.0/tests/fixtures/xlsx/calamine-date.xlsx +0 -0
  401. brewdoc-0.2.0/tests/fixtures/xlsx/calamine-inventory-table.xlsx +0 -0
  402. brewdoc-0.2.0/tests/fixtures/xlsx/calamine-merge_cells.xlsx +0 -0
  403. brewdoc-0.2.0/tests/fixtures/xlsx/calamine-temperature-table.xlsx +0 -0
  404. brewdoc-0.2.0/tests/fixtures/xlsx/census-NST-EST2024-POP.xlsx +0 -0
  405. brewdoc-0.2.0/tests/test_benchmark_metadata.py +119 -0
  406. brewdoc-0.2.0/tests/test_capture_results.py +238 -0
  407. brewdoc-0.2.0/tests/test_contract.py +680 -0
  408. brewdoc-0.2.0/tests/test_documents.py +228 -0
  409. brewdoc-0.2.0/tests/test_fixtures.py +170 -0
  410. brewdoc-0.2.0/tests/test_html.py +1210 -0
  411. brewdoc-0.2.0/tests/test_output.py +301 -0
  412. brewdoc-0.2.0/tests/test_pdf_regressions.py +644 -0
  413. brewdoc-0.2.0/tests/test_presentations.py +658 -0
  414. brewdoc-0.2.0/tests/test_spreadsheets.py +874 -0
  415. brewdoc-0.2.0/uv.lock +648 -0
@@ -0,0 +1 @@
1
+ tests/fixtures/** -text
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
@@ -0,0 +1,27 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ test:
14
+ runs-on: ${{ matrix.os }}
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ os: [ubuntu-24.04, macos-26, windows-2025]
19
+ python: ["3.12"]
20
+ steps:
21
+ - uses: actions/checkout@v7.0.1
22
+ - uses: astral-sh/setup-uv@v10.1.0
23
+ with:
24
+ version: "0.12.13"
25
+ python-version: ${{ matrix.python }}
26
+ - run: uv sync --locked --group dev
27
+ - run: uv run --locked pytest -q --strict-markers -m "not corpus"
@@ -0,0 +1,57 @@
1
+ name: release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*.*.*"]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-24.04
13
+ steps:
14
+ - uses: actions/checkout@v7.0.1
15
+ - uses: astral-sh/setup-uv@v10.1.0
16
+ with:
17
+ version: "0.12.13"
18
+ python-version: "3.12"
19
+ - name: tag must equal v + project.version
20
+ run: |
21
+ VERSION=$(uv run --no-project python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')
22
+ [ "$GITHUB_REF_NAME" = "v$VERSION" ] || { echo "tag $GITHUB_REF_NAME != v$VERSION"; exit 1; }
23
+ - run: uv lock --check
24
+ - run: uv build
25
+ - uses: actions/upload-artifact@v7.0.1
26
+ with:
27
+ name: dist
28
+ path: dist/
29
+ if-no-files-found: error
30
+
31
+ publish:
32
+ needs: build
33
+ runs-on: ubuntu-24.04
34
+ environment: pypi
35
+ permissions:
36
+ id-token: write
37
+ steps:
38
+ - uses: actions/download-artifact@v8.0.1
39
+ with:
40
+ name: dist
41
+ path: dist/
42
+ # trusted publishing: OIDC token exchange, no stored PyPI token
43
+ - uses: pypa/gh-action-pypi-publish@v1.14.2
44
+
45
+ github-release:
46
+ needs: [build, publish]
47
+ runs-on: ubuntu-24.04
48
+ permissions:
49
+ contents: write
50
+ steps:
51
+ - uses: actions/download-artifact@v8.0.1
52
+ with:
53
+ name: dist
54
+ path: dist/
55
+ - uses: softprops/action-gh-release@v3.0.3
56
+ with:
57
+ files: dist/*
@@ -0,0 +1,8 @@
1
+ .venv/
2
+ venv/
3
+ dist/
4
+ build/
5
+ *.egg-info/
6
+ __pycache__/
7
+ *.pyc
8
+ .pytest_cache/
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,189 @@
1
+ # Formats
2
+
3
+ What brewdoc reads today, what is planned, what is deferred and what it will never do. Base runtime
4
+ dependencies are `pdfplumber` and `python-calamine`. Static HTML adds one conditional native parser;
5
+ other formats retain the two-dependency policy.
6
+
7
+ ## Supported
8
+
9
+ | in | reader | mechanism |
10
+ |---|---|---|
11
+ | `.pdf` | pdfplumber | text layer required; anchored page units; each region routed by its own ruling |
12
+ | `.docx` | stdlib `zipfile` + `xml.etree` | paragraphs and tables in reading order; anchored chapters retain duplicate and empty headings |
13
+ | `.pptx` | stdlib `zipfile` + `xml.etree` | slides in declared order; text, tables, speaker notes and picture metadata placeholders |
14
+ | `.xlsx` `.xlsm` `.xls` `.xlsb` `.ods` | python-calamine | exact sheet selection in caller order with full-source ordinal keys; cached values in Markdown |
15
+ | `.html` | selectolax Lexbor | local static body or fragment in DOM order; one anchored chapter; CPython 3.12-3.14 only |
16
+
17
+ All supported routes emit `brewdoc.markdown/2`: quoted source title, deterministic metadata,
18
+ artifact inventory, known omissions, linked contents, then anchored content units. Empty physical
19
+ PDF pages, selected empty sheets, heading-created empty DOCX chapters, and declared empty or hidden
20
+ PPTX slides remain navigable.
21
+
22
+ Every receipt line uses `brewdoc.receipt/1`, which names the route (`pdf`, `doc`, `presentation`,
23
+ `sheet`, `html`), its unit kind (`page`, `chapter`, `slide`, `sheet`) and how many units were rendered. The
24
+ unit kind decides the content keys: `page/000001`, `chapter/000001`, `slide/000001`,
25
+ `sheet/000001`. A suffix brewdoc does not read is refused with route `none` and unit kind `none`;
26
+ every other refusal keeps its route's own name and unit kind, with zero units.
27
+
28
+ ## Static HTML
29
+
30
+ HTML requires CPython 3.12-3.14 and this exact marked dependency:
31
+
32
+ ```text
33
+ selectolax==0.4.13; python_version < '3.15' and platform_python_implementation == 'CPython'
34
+ ```
35
+
36
+ Brewdoc's overall Python requirement remains `>=3.12`. The `.html` suffix and `render_html`
37
+ API remain registered on other runtimes and explicitly refuse with route `html`, kind `chapter`,
38
+ zero units, empty Markdown and no output writes. Self-check verifies this refusal and all old
39
+ formats. A missing or broken native parser on supported CPython is an environment failure:
40
+ HTML refuses and self-check exits 1. There is no alternate parser.
41
+
42
+ Read the full recovered body or fragment, including navigation, main content, sidebars and footer.
43
+ The first nonempty recovered head title labels `chapter/000001`; otherwise use `Untitled`.
44
+ Only `.html` is accepted. Input must be strict UTF-8, optionally prefixed by a UTF-8 BOM.
45
+ Charset declarations in the first 1,024 bytes after the BOM must name `utf-8` or `utf8`;
46
+ malformed, unknown, conflicting or non-UTF-8 declarations refuse. Invalid bytes are not repaired.
47
+ HTML preserves meaningful Unicode and emits UTF-8 without BOM, with LF newlines. Other routes
48
+ retain ASCII output. HTML has no artifacts.
49
+
50
+ Headings, prose, lists and emphasis retain recovered DOM order. Preformatted code preserves
51
+ literal angle brackets, ampersands, newlines, tabs and repeated spaces in a fence longer than
52
+ any source backtick run. Inline code outside tables uses the same fenced-block fallback at its
53
+ reading-order position, omitting inline layout. Table-cell code uses `Code: text="..."` with
54
+ escaped literal data, omitting monospace layout. Literal LF, tab and CR in cell code and quoted
55
+ control metadata become `&#10;`, `&#9;` and `&#13;` after escaping source ampersands.
56
+ Emphasis and safe links balance separately around each nonempty text segment across a fence.
57
+ Code-only emphasis adds no delimiter paragraphs. A safe anchor enclosing only literal code or
58
+ image placeholders retains its destination once as `[Link target](destination)` after that content.
59
+ Ordinary text links and existing cell links around code/images get no duplicate fallback.
60
+ Safe anchors consumed inside code/pre retain labelled records after the literal representation:
61
+ `[Link target](destination); text="..."`. Records keep recovered source order in body paragraphs
62
+ or the same table cell. Labels preserve Unicode, repeated spaces and decoded characters with
63
+ the quoted literal escaping above, including escaped source quotes. Retained literal whitespace
64
+ is data; an anchor without retained characters is empty. Hidden/excluded, unsafe/missing-target
65
+ or empty anchors add no record.
66
+ Each body target paragraph counts once in `text_regions`; cell target fragments add no regions
67
+ or tables. Each consumed source anchor adds one record; separate anchors with identical URLs
68
+ stay distinct. Nested code/pre do not duplicate those records.
69
+ Quotes use matching `Quote (level N):` and `End quote (level N).` paragraphs around their
70
+ children, preserving nested scopes and order without Markdown blockquote layout.
71
+
72
+ Plain list items emit their marker once; later paragraphs use blank lines and continuation
73
+ indentation. Items containing a standalone fence, table/caption, control record, image placeholder
74
+ or quote use `List item (level N, marker "-"):` and `End list item (level N).` boundaries.
75
+ Ordered markers retain their number. Affected ancestor items use the same scopes so all child
76
+ blocks stay enclosed in DOM order. Plain nested items inside a labelled scope use indentation
77
+ relative to that scope; unaffected lists keep normal Markdown layout. Each emitted paragraph,
78
+ literal block, control or link-target record counts once, including list continuations.
79
+ List/quote boundary labels and empty or delimiter-only fragments add no text regions.
80
+
81
+ Tables keep captions and recovered row/cell order across head, body and foot sections. Spans
82
+ expand into a rectangular grid with origin content once and empty continuations. Nested tables
83
+ stay inside their parent cell as labelled row/column records with origin coordinates and spans.
84
+ Controls preserve source-declared fields, values and boolean attribute presence in fixed-order
85
+ records. Forms, labels, fieldsets, buttons, inputs, textarea/output, every select option and
86
+ datalist suggestion, progress/meter and details/summary stay in source order. Closed details,
87
+ unselected options and disabled controls remain present. Missing attributes are `unspecified`;
88
+ supplied empty strings remain empty. Browser defaults and current user values are not inferred.
89
+ Supplied password/file input values are redacted; hidden inputs are omitted explicitly.
90
+
91
+ Only HTTP, HTTPS, mailto, relative and fragment link targets become links after normalized scheme
92
+ checks. Other targets are inert text; form actions and overrides always remain inert metadata.
93
+ Images preserve supplied alt/title and source category in a placeholder without pixels or fetching.
94
+ Data, unsupported and missing image targets are omitted. Source Markdown/HTML is escaped;
95
+ source IDs never become output anchors.
96
+
97
+ Comments, head content, scripts, styles, templates and active embeds are excluded. Direct `hidden`,
98
+ `aria-hidden="true"`, effective inline `display:none` or `visibility:hidden` exclude whole
99
+ subtrees. Inline declarations respect supported values, order and `!important`; external and
100
+ embedded stylesheets are not evaluated. Unknown nonexcluded elements retain useful children.
101
+ SVG title/description/text, canvas fallback and body noscript text remain available. Omissions
102
+ name graphical SVG, canvas pixels, MathML semantics, active media and dynamic browser content.
103
+ This is static source conversion, not browser-complete extraction.
104
+
105
+ Limits are inclusive; exceeding one refuses before writing output. MiB is 1,048,576 bytes:
106
+ 8 MiB raw input, depth 256 (recovered root at 1), 200,000 recovered elements including excluded
107
+ subtrees, 1 MiB UTF-8 per decoded attribute, 32 MiB included decoded text before whitespace
108
+ reduction, 100,000 total span-expanded table positions including nested tables, and 64 MiB final
109
+ UTF-8 Markdown including the envelope. Postparse checks do not guarantee native-parser memory safety.
110
+
111
+ ## Container documents
112
+
113
+ DOCX accepts Transitional and Strict WordprocessingML. Main-story paragraphs and tables stay in
114
+ document order. `Title` and `Heading1` through `Heading9` start chapters. Tabs become spaces and
115
+ line breaks are retained. Nested table text is flattened into its parent cell, and invalid or
116
+ non-positive table spans fall back to one column. Images, headers, footers, footnotes, comments,
117
+ tracked-change reconstruction, list formatting, style inheritance and vertical merge reconstruction
118
+ are omitted.
119
+
120
+ PPTX follows the presentation relationships and declared slide list instead of ZIP member names.
121
+ It reads every declared slide, including hidden and empty slides. Title placeholders label units;
122
+ slides without one use `Untitled`. Headings are `## Slide N: "<title>"`, with ordered keys such as
123
+ `slide/000001`. The public `render_presentation` tally reports `slides`; there is no Slides metadata
124
+ row. Shape and grouped-shape XML order controls reading order. Text keeps paragraph and run order,
125
+ DrawingML tables keep row and cell order, and merge continuation cells stay empty. Body speaker
126
+ notes follow slide content. Other notes placeholders are omitted.
127
+
128
+ PPTX pictures use this exact metadata placeholder and never include pixels:
129
+
130
+ ```text
131
+ Image: name="<name>"; size=<cx>x<cy> EMU; alt="<descr|none>"; caption="<title|none>"; source=<embedded|external>; bytes=<n|unknown>
132
+ ```
133
+
134
+ Embedded picture byte counts come from the related package member. External pictures are never
135
+ fetched. Charts, SmartArt, audio, video, embedded objects, animations, transitions,
136
+ layout/master-only text, styling and visual positioning are omitted. Required package, presentation
137
+ and slide relationships or XML must resolve inside the archive; malformed or missing required parts
138
+ refuse the document. A slide may have no picture or notes relationship, but a referenced part must
139
+ be valid. PPTX is the only supported container that promises image placeholders. DOCX images
140
+ remain omitted.
141
+
142
+ ## Workbook artifacts
143
+
144
+ | input | formulas | VBA project | limit |
145
+ |---|---|---|---|
146
+ | `.xlsx` | `brewdoc.formulas/1` JSON per selected formula-bearing sheet | unavailable | formulas are copied without evaluation, rewriting, or dependency inference |
147
+ | `.xlsm` | same as `.xlsx` | one related `vbaProject.bin`, when present | exact opaque bytes only |
148
+ | `.xlsb` | unavailable through the pinned Python binding | one related `vbaProject.bin`, when present | exact opaque bytes only |
149
+ | `.xls` `.ods` | unavailable through the pinned Python binding | unavailable | cached values still render |
150
+
151
+ Readable VBA source modules are unavailable for every format. Module and script counts are unknown,
152
+ and brewdoc never executes a project. Generic formula and VBA artifact output uses explicit stable
153
+ keys; the typed Python formula API can also enumerate selected formula sheets. Artifact requests do
154
+ not change Markdown bytes.
155
+
156
+ ## Planned
157
+
158
+ Planned means not readable today: every suffix below is refused by name, and the receipt says so.
159
+ No further parser dependency is planned. Each format requires its own acceptance task.
160
+ Order = implementation order, by value for agents.
161
+
162
+ | # | in | mechanism | output |
163
+ |---|---|---|---|
164
+ | 1 | `.csv` `.tsv` | `csv` | one Markdown table |
165
+ | 2 | `.odt` `.odp` | `zipfile` + `content.xml` | paragraphs, tables; one chapter per slide for `.odp` |
166
+ | 3 | `.epub` | `zipfile` + XHTML chapters; parser reuse requires separate acceptance | one chapter per spine item |
167
+ | 4 | `.md` `.txt` | pass-through | bytes unchanged, receipt still emitted |
168
+ | 5 | `.eml` | `email` | headers, text body, attachment names |
169
+
170
+ Image behavior for planned containers is not accepted yet. Never OCR.
171
+
172
+ Eight planned suffixes share five adapter modules: `.csv` with `.tsv`, `.odt` with `.odp`, and
173
+ `.md` with `.txt` each pair into one module, the other two rows take one each. Eleven source
174
+ modules including HTML, sixteen at all planned formats. Each format is its own task and follows the ordered
175
+ checklist in [`docs/architecture.md`](docs/architecture.md); a new source module needs explicit
176
+ user approval.
177
+
178
+ ## Deferred
179
+
180
+ Not in any current plan.
181
+
182
+ | in | reason |
183
+ |---|---|
184
+ | `.doc` `.ppt` (legacy binary) | OLE2 container, Word 97 piece table; needs `olefile` or an own CFB reader; text only, tables lossy |
185
+ | `.rtf` | own parser required |
186
+
187
+ ## Never
188
+
189
+ OCR, ML layout models, network. A page without a text layer is reported in the receipt, not guessed.
brewdoc-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Maksim Kochetkov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
brewdoc-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,232 @@
1
+ Metadata-Version: 2.5
2
+ Name: brewdoc
3
+ Version: 0.2.0
4
+ Summary: Brew any document into LLM-ready Markdown: PDF tables, spreadsheets, docx - no ML, deterministic, with a JSON receipt
5
+ Project-URL: Homepage, https://github.com/kochetkov-ma/brewdoc
6
+ Project-URL: Repository, https://github.com/kochetkov-ma/brewdoc
7
+ Project-URL: Issues, https://github.com/kochetkov-ma/brewdoc/issues
8
+ Author-email: Maksim Kochetkov <apmatypa88@gmail.com>
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: docx,llm,markdown,pdf,rag,table-extraction,xlsx
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
21
+ Requires-Python: >=3.12
22
+ Requires-Dist: pdfplumber==0.11.10
23
+ Requires-Dist: python-calamine==0.8.2
24
+ Requires-Dist: selectolax==0.4.13; python_version < '3.15' and platform_python_implementation == 'CPython'
25
+ Description-Content-Type: text/markdown
26
+
27
+ # brewdoc
28
+
29
+ Document to Markdown for agent systems: PDF, Word, PPTX presentations, spreadsheets and static
30
+ HTML in, one Markdown file plus a JSON receipt out. No models, no OCR, no network,
31
+ deterministic (same file, same bytes). The receipt says what was rendered,
32
+ what was dropped and what the route structurally cannot carry, so an agent never mistakes a
33
+ silent gap for "the document does not say so".
34
+
35
+ ## Install
36
+
37
+ | channel | command |
38
+ |---|---|
39
+ | pip | `pip install brewdoc==0.2.0` |
40
+ | uvx | `uvx brewdoc==0.2.0 file.pdf` |
41
+ | uv tool | `uv tool install brewdoc==0.2.0` |
42
+ | Docker | `RUN pip install brewdoc==0.2.0` |
43
+
44
+ Alternative, straight from git (no PyPI round-trip):
45
+
46
+ ```
47
+ uvx --from git+https://github.com/kochetkov-ma/brewdoc@v0.2.0 brewdoc file.pdf
48
+ ```
49
+
50
+ Requires Python >= 3.12. Base runtime dependencies: `pdfplumber` (pulls pypdfium2, Pillow,
51
+ cryptography) and `python-calamine`. HTML requires CPython 3.12-3.14 and the native Lexbor
52
+ parser from this exact conditional dependency:
53
+
54
+ ```text
55
+ selectolax==0.4.13; python_version < '3.15' and platform_python_implementation == 'CPython'
56
+ ```
57
+
58
+ Other runtimes retain the `.html` route and Python API but explicitly refuse HTML. On supported
59
+ CPython, a missing or broken parser is an environment failure and `--self-check` exits 1.
60
+ On an unsupported HTML runtime, self-check verifies HTML refusal and checks all other formats.
61
+
62
+ ## Usage
63
+
64
+ ```
65
+ brewdoc file.pdf --out file.md
66
+ brewdoc slides.pptx --out slides.md
67
+ brewdoc page.html --out page.md
68
+ brewdoc file.xlsx # no --out: receipt line, then the Markdown, on stdout
69
+ brewdoc file.xlsx --sheet Calc --sheet Inputs
70
+ brewdoc file.xlsm --artifact formula/sheet/000002=formulas.json
71
+ brewdoc file.xlsm --artifact vba/project/000001=vbaProject.bin
72
+ brewdoc --self-check # renders synthetic fixtures twice, compares sha256, exit 0 when green
73
+ ```
74
+
75
+ `--sheet` is repeatable. Names are exact and case-sensitive. Output follows caller order while
76
+ keeping each sheet's full-workbook ordinal. `--artifact` is also repeatable. Use keys listed in the
77
+ Markdown artifact table. Both options are workbook-only. brewdoc validates every request and
78
+ output collision before writing.
79
+
80
+ Every successful document uses `brewdoc.markdown/2`. A quoted source title is followed by Metadata,
81
+ Artifacts, Known omissions, Contents, then anchored content units. PDF keys are `page/000001`,
82
+ workbook keys are `sheet/000001`, DOCX keys are `chapter/000001`, PPTX keys are `slide/000001`,
83
+ and HTML has one `chapter/000001`.
84
+ Metadata contains deterministic source identity, selection, content hashes, conversion tallies, and
85
+ artifact capabilities. It excludes paths, timestamps, permissions, host data, and unsupported author
86
+ metadata.
87
+
88
+ One JSON receipt line always goes to stdout first (wrapped here, `unit_keys` omitted):
89
+
90
+ ```json
91
+ {"artifacts": [], "broken_ligature_words": 0, "columns_split": 1,
92
+ "dropped": {"cid_survivors": 0, "control_chars": 0, "ligatures": 0, "nbsp": 0,
93
+ "non_ascii_replaced": 0, "page_numbers": 3, "pua_glyphs": 0,
94
+ "running_heads": 0, "soft_hyphens": 0},
95
+ "file_ok": true, "markdown_schema": "brewdoc.markdown/2",
96
+ "not_carried": ["images, figures and the text drawn inside them",
97
+ "a table that spans a page break",
98
+ "text rotated out of the horizontal reading order"],
99
+ "out": "file.md",
100
+ "reason": "pdf rendered: 7 pages, 1 tables, 26 text regions, 1 column splits",
101
+ "receipt_schema": "brewdoc.receipt/1",
102
+ "route": "pdf", "source": "nist-sp800-145.pdf", "tables": 1,
103
+ "text_regions": 26, "unit_kind": "page", "units": 7}
104
+ ```
105
+
106
+ | key | meaning |
107
+ |---|---|
108
+ | `file_ok`, `reason` | `false` when the file was refused (no text layer, unreadable, unsupported suffix); `reason` names why, or summarises what was rendered |
109
+ | `route` | which reader ran: `pdf`, `doc`, `presentation`, `sheet` or `html` |
110
+ | `source` | the input file name, without its directory |
111
+ | `unit_kind`, `units` | the route's content unit and how many were rendered; one pair for every format. `page` for PDF, `chapter` for DOCX and HTML, `slide` for PPTX, `sheet` for a workbook, and `none` on a suffix brewdoc does not read |
112
+ | `tables`, `text_regions`, `columns_split` | what else was rendered |
113
+ | `receipt_schema` | the receipt key contract; `brewdoc.receipt/1` replaced the per-format `pages` and `sheets` counters |
114
+ | `broken_ligature_words` | words with a ligature the font mapped to a stray code point, folded to ASCII, not repaired |
115
+ | `dropped` | sanitised items removed on purpose, counted by kind (running heads, page numbers, ...) |
116
+ | `not_carried` | what this route structurally cannot represent - read it before concluding a fact is absent |
117
+ | `out` | the Markdown path, or `null` when it went to stdout |
118
+ | `markdown_schema`, `unit_keys` | the contract and ordered full-source content keys; success only |
119
+ | `artifacts` | available keyed formula or opaque VBA outputs and requested output paths; success only |
120
+ | `selected_sheets` | the `--sheet` names in caller order; present only when sheets were selected |
121
+
122
+ Paths resolve against the current working directory; `--out` creates parent directories.
123
+ Exit code is non-zero on refusal; the receipt line is still printed.
124
+
125
+ ## Formats
126
+
127
+ | in | reader | notes |
128
+ |---|---|---|
129
+ | `.pdf` | pdfplumber | needs a text layer; route chosen per region, never per page |
130
+ | `.docx` | stdlib zip + XML | paragraphs and tables |
131
+ | `.pptx` | stdlib zip + XML | slides in declared order; text, tables, notes and picture metadata |
132
+ | `.xlsx` `.xlsm` `.xls` `.xlsb` `.ods` | python-calamine | selected sheets keep full-source ordinals; numbers as stored (`85.0`), dates as ISO days |
133
+ | `.html` | selectolax Lexbor | full static body or fragment, complete tables and source-declared controls; CPython 3.12-3.14 |
134
+
135
+ `.xlsx` and `.xlsm` expose original OOXML formulas as one deterministic JSON artifact per
136
+ formula-bearing selected sheet. Markdown still contains cached values. `.xlsm` and `.xlsb` can expose
137
+ one complete related `vbaProject.bin` as opaque bytes. brewdoc does not execute macros, decompile VBA,
138
+ report source-module counts, evaluate formulas, or infer dependency graphs.
139
+
140
+ HTML reads local strict UTF-8, with an optional BOM. It preserves meaningful Unicode, navigation,
141
+ main content, sidebars and footers in recovered DOM order. It never fetches links or resources,
142
+ executes scripts, submits forms or infers interactive values. Links use a restricted scheme policy;
143
+ form actions remain inert metadata. Inline code outside tables becomes a literal fenced block;
144
+ surrounding emphasis and links remain balanced. Safe links in literal code and around code/images
145
+ retain destination records without changing the source literals. Table-cell code uses labelled
146
+ escaped text. Quotes and list items containing standalone child blocks use explicit nesting
147
+ boundaries in place of visual Markdown
148
+ containers. Plain list paragraphs retain their item marker and continuation indentation.
149
+ See [HTML scope and limits](FORMATS.md#static-html).
150
+
151
+ The public Python API exposes HTML and presentation rendering and generic workbook artifact access:
152
+
153
+ ```python
154
+ import brewdoc
155
+
156
+ markdown, tally = brewdoc.render_html("page.html")
157
+ code, receipt, markdown = brewdoc.run("page.html", out="page.md")
158
+ markdown, tally = brewdoc.render_presentation("slides.pptx")
159
+ refs = brewdoc.list_book_artifacts("book.xlsm", sheets=("Calc",))
160
+ payload = brewdoc.read_book_artifact("book.xlsm", refs[0].key, sheets=("Calc",))
161
+ code, receipt, markdown = brewdoc.run(
162
+ "book.xlsm", out="book.md", sheets=("Calc",),
163
+ artifact_outputs={refs[0].key: "formulas.json"},
164
+ )
165
+ ```
166
+
167
+ `artifact_outputs` maps artifact keys to paths. The CLI builds it from repeated `--artifact KEY=PATH`.
168
+
169
+ Planned formats, deferred ones and the never-list: `FORMATS.md`.
170
+ A planned format is refused by name today. The adapter contract and the ordered checklist for
171
+ adding one are in [`docs/architecture.md`](docs/architecture.md).
172
+
173
+ PDF regions, in the order tried:
174
+
175
+ | region looks like | rendered as |
176
+ |---|---|
177
+ | ruled on all sides | Markdown table from the drawn ruling |
178
+ | ruling unfinished (cells never closed) | re-read on the grid the ruling implies, kept only when it carries more text than the drawn ruling did |
179
+ | ruled across only (head and foot rules) | column grid from the rule segment ends |
180
+ | unruled, tabular band | layout-preserved text |
181
+ | unruled, captioned `Table N` | the band is bounded first (caption to next blank band), then read as a table |
182
+ | two-column prose | split at the gutter (relative density on the character x-histogram), left then right |
183
+ | plain prose | lines |
184
+
185
+ ## What it does not do
186
+
187
+ | gap | behaviour |
188
+ |---|---|
189
+ | OCR | a PDF with no text layer is refused by name, never rendered empty |
190
+ | PDF and DOCX images, figures, text drawn inside them | not carried; listed in `not_carried` |
191
+ | PPTX pictures | represented by deterministic name, size, alt text, caption, source and byte-count placeholders; pixels are never emitted |
192
+ | PPTX charts, SmartArt, audio, video and embedded objects | not carried; listed in `not_carried` |
193
+ | a table spanning a page break | columns recovered, wrapped rows stay separate rows |
194
+ | text rotated out of horizontal reading order | not carried |
195
+ | sub/superscripts | folded back into their line (`NH4H2PO4`, not `NHHPO` over `4 2 4`) |
196
+ | broken font CMaps (ligatures mapped to wrong code points) | counted (`broken_ligature_words`), folded to ASCII, never guessed back |
197
+ | formula calculation | cached values in Markdown; passive source formulas only for `.xlsx` and `.xlsm` |
198
+ | readable VBA source | unavailable; `.xlsm` and `.xlsb` preserve a related project only as opaque bytes |
199
+
200
+ ## Determinism
201
+
202
+ No timestamps or unordered iteration. Two renders of one file have the same sha256;
203
+ `--self-check` pins it. PDF, DOCX, PPTX and workbook output remains ASCII. HTML Markdown uses
204
+ UTF-8 without BOM and LF newlines, with the same bytes in the API, file output and CLI stdout.
205
+ Receipt JSON keeps ASCII escaping.
206
+
207
+ ## Size and speed
208
+
209
+ These measurements cover the existing PDF/workbook baseline before the HTML parser addition.
210
+ They do not measure HTML conversion or the new installed footprint.
211
+
212
+ | measure | value |
213
+ |---|---|
214
+ | installed footprint | ~45 MB (pdfplumber, pypdfium2, Pillow, cryptography, python-calamine) |
215
+ | import | 0.08 s |
216
+ | 130-page PDF | ~5.5 s |
217
+ | 14-sheet xlsx | ~0.9 s |
218
+
219
+ ## Benchmarks
220
+
221
+ Browse the [corpus catalog](benchmarks/CATALOG.md), follow the
222
+ [measurement method](benchmarks/METHODOLOGY.md), and inspect the
223
+ [full-run results](benchmarks/results/README.md). Completed runs include actual
224
+ outputs and known failures; capture completion does not mean content quality passed.
225
+
226
+ ## Releasing
227
+
228
+ Tag-triggered, see `RELEASING.md`.
229
+
230
+ ## License
231
+
232
+ MIT, see `LICENSE`.