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.
- brewdoc-0.2.0/.gitattributes +1 -0
- brewdoc-0.2.0/.github/dependabot.yml +6 -0
- brewdoc-0.2.0/.github/workflows/ci.yml +27 -0
- brewdoc-0.2.0/.github/workflows/release.yml +57 -0
- brewdoc-0.2.0/.gitignore +8 -0
- brewdoc-0.2.0/.python-version +1 -0
- brewdoc-0.2.0/FORMATS.md +189 -0
- brewdoc-0.2.0/LICENSE +21 -0
- brewdoc-0.2.0/PKG-INFO +232 -0
- brewdoc-0.2.0/README.md +206 -0
- brewdoc-0.2.0/RELEASING.md +31 -0
- brewdoc-0.2.0/benchmarks/CATALOG.md +135 -0
- brewdoc-0.2.0/benchmarks/LICENSES/apache-httpd-LICENSE.txt +537 -0
- brewdoc-0.2.0/benchmarks/LICENSES/apache-httpd-NOTICE.txt +18 -0
- brewdoc-0.2.0/benchmarks/LICENSES/calamine-MIT.txt +24 -0
- brewdoc-0.2.0/benchmarks/METHODOLOGY.md +244 -0
- brewdoc-0.2.0/benchmarks/README.md +140 -0
- brewdoc-0.2.0/benchmarks/annotations/README.md +151 -0
- brewdoc-0.2.0/benchmarks/annotations/docx-libreoffice-negative-cell-margin-twips.json +71 -0
- brewdoc-0.2.0/benchmarks/annotations/docx-poi-deep-table-cell.json +62 -0
- brewdoc-0.2.0/benchmarks/annotations/docx-poi-table-alignment.json +74 -0
- brewdoc-0.2.0/benchmarks/annotations/docx-poi-three-col-head.json +91 -0
- brewdoc-0.2.0/benchmarks/annotations/docx-tika-testword-various.json +131 -0
- brewdoc-0.2.0/benchmarks/annotations/docx-tika-testword.json +108 -0
- brewdoc-0.2.0/benchmarks/annotations/html-apache-httpd-allowmethods.json +361 -0
- brewdoc-0.2.0/benchmarks/annotations/html-mdn-document-structure.json +166 -0
- brewdoc-0.2.0/benchmarks/annotations/html-mdn-first-form-styled.json +134 -0
- brewdoc-0.2.0/benchmarks/annotations/html-mdn-items-sold-headers.json +534 -0
- brewdoc-0.2.0/benchmarks/annotations/html-mdn-planets-data.json +488 -0
- brewdoc-0.2.0/benchmarks/annotations/html-mdn-timetable-caption.json +151 -0
- brewdoc-0.2.0/benchmarks/annotations/ods-calamine-any-sheets.json +268 -0
- brewdoc-0.2.0/benchmarks/annotations/ods-calamine-date.json +112 -0
- brewdoc-0.2.0/benchmarks/annotations/ods-calamine-issues.json +428 -0
- brewdoc-0.2.0/benchmarks/annotations/ods-calamine-merged-cells.json +83 -0
- brewdoc-0.2.0/benchmarks/annotations/ods-calamine-special-cells.json +122 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-arxiv-2302.13971v1.json +1088 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-arxiv-2305.18290v3.json +1452 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-arxiv-2402.00838v4.json +1194 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-eia-steo-table1.json +104 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-fbi-nics-background-checks-2015-11.json +100 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-federal-register-2020-17221.json +670 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-nist-sp800-145.json +474 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-us-patent-223898-scan.json +358 -0
- brewdoc-0.2.0/benchmarks/annotations/pdf-us-senate-expenditures.json +80 -0
- brewdoc-0.2.0/benchmarks/annotations/pptx-poi-table-test.json +70 -0
- brewdoc-0.2.0/benchmarks/annotations/pptx-poi-testppt.json +145 -0
- brewdoc-0.2.0/benchmarks/annotations/pptx-python-pptx-test.json +69 -0
- brewdoc-0.2.0/benchmarks/annotations/pptx-tika-testppt-various2.json +330 -0
- brewdoc-0.2.0/benchmarks/annotations/xls-calamine-any-sheets.json +387 -0
- brewdoc-0.2.0/benchmarks/annotations/xls-calamine-date.json +207 -0
- brewdoc-0.2.0/benchmarks/annotations/xls-calamine-merge-cells.json +141 -0
- brewdoc-0.2.0/benchmarks/annotations/xls-calamine-xls-formula.json +232 -0
- brewdoc-0.2.0/benchmarks/annotations/xls-census-st-est00int-01.json +244 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsb-calamine-date.json +126 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsb-calamine-issue127.json +521 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsb-calamine-issues.json +603 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsm-calamine-issue221.json +71 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsm-calamine-issue3.json +163 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsm-calamine-vba.json +155 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-any-sheets.json +270 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-date.json +102 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-inventory-table.json +91 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-merge-cells.json +99 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsx-calamine-temperature-table.json +177 -0
- brewdoc-0.2.0/benchmarks/annotations/xlsx-census-nst-est2024-pop.json +171 -0
- brewdoc-0.2.0/benchmarks/capture_results.py +159 -0
- brewdoc-0.2.0/benchmarks/corpus.json +1928 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/README.md +128 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-any-sheets.json +268 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-date.json +112 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-issues.json +428 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-merged-cells.json +83 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/ods-calamine-special-cells.json +122 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-arxiv-2302.13971v1.json +1088 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-arxiv-2305.18290v3.json +1452 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-arxiv-2402.00838v4.json +1194 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-eia-steo-table1.json +104 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-fbi-nics-background-checks-2015-11.json +100 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-federal-register-2020-17221.json +670 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-nist-sp800-145.json +474 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-us-patent-223898-scan.json +358 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/pdf-us-senate-expenditures.json +80 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-calamine-any-sheets.json +387 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-calamine-date.json +207 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-calamine-merge-cells.json +141 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-calamine-xls-formula.json +232 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xls-census-st-est00int-01.json +244 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsb-calamine-date.json +126 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsb-calamine-issue127.json +521 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsb-calamine-issues.json +603 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsm-calamine-issue221.json +71 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsm-calamine-issue3.json +163 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsm-calamine-vba.json +155 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-any-sheets.json +270 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-date.json +102 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-inventory-table.json +91 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-merge-cells.json +99 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-calamine-temperature-table.json +177 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/annotations/xlsx-census-nst-est2024-pop.json +171 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/context.json +337 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/corpus-v1.json +596 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/corpus.json +1259 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/markdown-integrity.json +487 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-any-sheets/artifacts/document.md +18 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-any-sheets/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-any-sheets/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-date/artifacts/document.md +11 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-date/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-date/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-issues/artifacts/document.md +51 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-issues/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-issues/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-merged-cells/artifacts/document.md +10 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-merged-cells/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-merged-cells/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-special-cells/artifacts/document.md +12 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-special-cells/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/ods-calamine-special-cells/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2302.13971v1/artifacts/document.md +2021 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2302.13971v1/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2302.13971v1/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2305.18290v3/artifacts/document.md +1539 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2305.18290v3/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2305.18290v3/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2402.00838v4/artifacts/document.md +2007 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2402.00838v4/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-arxiv-2402.00838v4/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-eia-steo-table1/artifacts/document.md +20 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-eia-steo-table1/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-eia-steo-table1/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-fbi-nics-background-checks-2015-11/artifacts/document.md +24 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-fbi-nics-background-checks-2015-11/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-fbi-nics-background-checks-2015-11/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-federal-register-2020-17221/artifacts/document.md +926 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-federal-register-2020-17221/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-federal-register-2020-17221/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-nist-sp800-145/artifacts/document.md +205 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-nist-sp800-145/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-nist-sp800-145/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-patent-223898-scan/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-patent-223898-scan/result.json +57 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-senate-expenditures/artifacts/document.md +11 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-senate-expenditures/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/pdf-us-senate-expenditures/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-any-sheets/artifacts/document.md +23 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-any-sheets/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-any-sheets/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-date/artifacts/document.md +10 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-date/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-date/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-merge-cells/artifacts/document.md +9 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-merge-cells/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-merge-cells/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-xls-formula/artifacts/document.md +16 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-xls-formula/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-calamine-xls-formula/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-census-st-est00int-01/artifacts/document.md +77 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-census-st-est00int-01/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xls-census-st-est00int-01/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-date/artifacts/document.md +10 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-date/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-date/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issue127/artifacts/document.md +19 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issue127/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issue127/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issues/artifacts/document.md +51 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issues/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsb-calamine-issues/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue221/artifacts/document.md +9 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue221/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue221/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue3/artifacts/document.md +12 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue3/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-issue3/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-vba/artifacts/document.md +9 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-vba/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsm-calamine-vba/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-any-sheets/artifacts/document.md +18 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-any-sheets/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-any-sheets/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-date/artifacts/document.md +10 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-date/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-date/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-inventory-table/artifacts/document.md +12 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-inventory-table/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-inventory-table/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-merge-cells/artifacts/document.md +9 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-merge-cells/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-merge-cells/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-temperature-table/artifacts/document.md +17 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-temperature-table/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-calamine-temperature-table/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-census-nst-est2024-pop/artifacts/document.md +75 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-census-nst-est2024-pop/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-1/xlsx-census-nst-est2024-pop/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-any-sheets/artifacts/document.md +18 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-any-sheets/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-any-sheets/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-date/artifacts/document.md +11 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-date/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-date/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-issues/artifacts/document.md +51 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-issues/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-issues/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-merged-cells/artifacts/document.md +10 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-merged-cells/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-merged-cells/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-special-cells/artifacts/document.md +12 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-special-cells/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/ods-calamine-special-cells/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2302.13971v1/artifacts/document.md +2021 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2302.13971v1/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2302.13971v1/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2305.18290v3/artifacts/document.md +1539 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2305.18290v3/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2305.18290v3/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2402.00838v4/artifacts/document.md +2007 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2402.00838v4/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-arxiv-2402.00838v4/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-eia-steo-table1/artifacts/document.md +20 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-eia-steo-table1/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-eia-steo-table1/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-fbi-nics-background-checks-2015-11/artifacts/document.md +24 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-fbi-nics-background-checks-2015-11/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-fbi-nics-background-checks-2015-11/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-federal-register-2020-17221/artifacts/document.md +926 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-federal-register-2020-17221/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-federal-register-2020-17221/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-nist-sp800-145/artifacts/document.md +205 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-nist-sp800-145/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-nist-sp800-145/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-patent-223898-scan/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-patent-223898-scan/result.json +57 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-senate-expenditures/artifacts/document.md +11 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-senate-expenditures/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/pdf-us-senate-expenditures/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-any-sheets/artifacts/document.md +23 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-any-sheets/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-any-sheets/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-date/artifacts/document.md +10 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-date/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-date/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-merge-cells/artifacts/document.md +9 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-merge-cells/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-merge-cells/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-xls-formula/artifacts/document.md +16 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-xls-formula/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-calamine-xls-formula/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-census-st-est00int-01/artifacts/document.md +77 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-census-st-est00int-01/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xls-census-st-est00int-01/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-date/artifacts/document.md +10 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-date/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-date/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issue127/artifacts/document.md +19 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issue127/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issue127/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issues/artifacts/document.md +51 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issues/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsb-calamine-issues/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue221/artifacts/document.md +9 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue221/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue221/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue3/artifacts/document.md +12 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue3/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-issue3/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-vba/artifacts/document.md +9 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-vba/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsm-calamine-vba/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-any-sheets/artifacts/document.md +18 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-any-sheets/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-any-sheets/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-date/artifacts/document.md +10 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-date/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-date/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-inventory-table/artifacts/document.md +12 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-inventory-table/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-inventory-table/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-merge-cells/artifacts/document.md +9 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-merge-cells/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-merge-cells/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-temperature-table/artifacts/document.md +17 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-temperature-table/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-calamine-temperature-table/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-census-nst-est2024-pop/artifacts/document.md +75 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-census-nst-est2024-pop/receipt.json +29 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/pass-2/xlsx-census-nst-est2024-pop/result.json +61 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/quality.json +197 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/results.json +1137 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-any-sheets.json +107 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-date.json +76 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-issues.json +216 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-merged-cells.json +68 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/ods-calamine-special-cells.json +104 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-arxiv-2302.13971v1.json +295 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-arxiv-2305.18290v3.json +549 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-arxiv-2402.00838v4.json +120 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-eia-steo-table1.json +37 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-fbi-nics-background-checks-2015-11.json +43 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-federal-register-2020-17221.json +78 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-nist-sp800-145.json +43 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-us-patent-223898-scan.json +27 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/pdf-us-senate-expenditures.json +36 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-calamine-any-sheets.json +120 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-calamine-date.json +68 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-calamine-merge-cells.json +99 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-calamine-xls-formula.json +88 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xls-census-st-est00int-01.json +241 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsb-calamine-date.json +68 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsb-calamine-issue127.json +146 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsb-calamine-issues.json +208 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsm-calamine-issue221.json +68 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsm-calamine-issue3.json +94 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsm-calamine-vba.json +81 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-any-sheets.json +107 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-date.json +68 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-inventory-table.json +68 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-merge-cells.json +99 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-calamine-temperature-table.json +94 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/reviews/xlsx-census-nst-est2024-pop.json +194 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/selection.json +250 -0
- brewdoc-0.2.0/benchmarks/results/20260913-133006/validation.json +26 -0
- brewdoc-0.2.0/benchmarks/results/README.md +38 -0
- brewdoc-0.2.0/pyproject.toml +76 -0
- brewdoc-0.2.0/src/brewdoc/__init__.py +16 -0
- brewdoc-0.2.0/src/brewdoc/cli.py +97 -0
- brewdoc-0.2.0/src/brewdoc/common.py +405 -0
- brewdoc-0.2.0/src/brewdoc/docx.py +131 -0
- brewdoc-0.2.0/src/brewdoc/htmltext.py +812 -0
- brewdoc-0.2.0/src/brewdoc/output.py +93 -0
- brewdoc-0.2.0/src/brewdoc/pdf.py +1185 -0
- brewdoc-0.2.0/src/brewdoc/pptx.py +362 -0
- brewdoc-0.2.0/src/brewdoc/selfcheck.py +383 -0
- brewdoc-0.2.0/src/brewdoc/service.py +116 -0
- brewdoc-0.2.0/src/brewdoc/sheets.py +341 -0
- brewdoc-0.2.0/tests/fixtures/SOURCES.md +78 -0
- brewdoc-0.2.0/tests/fixtures/csv/vega-global-temp.csv +145 -0
- brewdoc-0.2.0/tests/fixtures/csv/vega-iowa-electricity.csv +52 -0
- brewdoc-0.2.0/tests/fixtures/csv/vega-seattle-weather.csv +1462 -0
- brewdoc-0.2.0/tests/fixtures/csv/vega-us-employment.csv +121 -0
- brewdoc-0.2.0/tests/fixtures/docx/libreoffice-negative-cell-margin-twips.docx +0 -0
- brewdoc-0.2.0/tests/fixtures/docx/poi-ThreeColHead.docx +0 -0
- brewdoc-0.2.0/tests/fixtures/docx/poi-deep-table-cell.docx +0 -0
- brewdoc-0.2.0/tests/fixtures/docx/poi-table-alignment.docx +0 -0
- brewdoc-0.2.0/tests/fixtures/docx/tika-testWORD.docx +0 -0
- brewdoc-0.2.0/tests/fixtures/docx/tika-testWORD_various.docx +0 -0
- brewdoc-0.2.0/tests/fixtures/eml/tika-testGroupWiseEml.eml +58 -0
- brewdoc-0.2.0/tests/fixtures/eml/tika-testRFC822_dkim.eml +22 -0
- brewdoc-0.2.0/tests/fixtures/eml/tika-testRFC822_multipart_attachments.eml +47 -0
- brewdoc-0.2.0/tests/fixtures/epub/epubcheck-minimal.epub +0 -0
- brewdoc-0.2.0/tests/fixtures/epub/standardebooks-herland.epub +0 -0
- brewdoc-0.2.0/tests/fixtures/html/apache-httpd-allowmethods.html +118 -0
- brewdoc-0.2.0/tests/fixtures/html/mdn-document-structure.html +108 -0
- brewdoc-0.2.0/tests/fixtures/html/mdn-first-form-styled.html +89 -0
- brewdoc-0.2.0/tests/fixtures/html/mdn-items-sold-headers.html +77 -0
- brewdoc-0.2.0/tests/fixtures/html/mdn-planets-data.html +153 -0
- brewdoc-0.2.0/tests/fixtures/html/mdn-timetable-caption.html +100 -0
- brewdoc-0.2.0/tests/fixtures/md/calamine-README.md +419 -0
- brewdoc-0.2.0/tests/fixtures/md/pdfplumber-README.md +585 -0
- brewdoc-0.2.0/tests/fixtures/odp/tika-testMasterFooter.odp +0 -0
- brewdoc-0.2.0/tests/fixtures/odp/tika-testODPMacro.odp +0 -0
- brewdoc-0.2.0/tests/fixtures/ods/calamine-any_sheets.ods +0 -0
- brewdoc-0.2.0/tests/fixtures/ods/calamine-date.ods +0 -0
- brewdoc-0.2.0/tests/fixtures/ods/calamine-issues.ods +0 -0
- brewdoc-0.2.0/tests/fixtures/ods/calamine-merged_cells.ods +0 -0
- brewdoc-0.2.0/tests/fixtures/ods/calamine-special_cells.ods +0 -0
- brewdoc-0.2.0/tests/fixtures/odt/tika-testODFwithOOo3.odt +0 -0
- brewdoc-0.2.0/tests/fixtures/odt/tika-testODTStyles2.odt +0 -0
- brewdoc-0.2.0/tests/fixtures/odt/tika-testOpenOffice2.odt +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/arxiv-2302.13971v1.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/arxiv-2305.18290v3.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/arxiv-2402.00838v4.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/eia-steo-table1.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/fbi-nics-background-checks-2015-11.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/federal-register-2020-17221.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/nist-sp800-145.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/us-patent-223898-scan.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pdf/us-senate-expenditures.pdf +0 -0
- brewdoc-0.2.0/tests/fixtures/pptx/poi-table_test.pptx +0 -0
- brewdoc-0.2.0/tests/fixtures/pptx/poi-testPPT.pptx +0 -0
- brewdoc-0.2.0/tests/fixtures/pptx/python-pptx-test.pptx +0 -0
- brewdoc-0.2.0/tests/fixtures/pptx/tika-testPPT_various2.pptx +0 -0
- brewdoc-0.2.0/tests/fixtures/receipts.json +865 -0
- brewdoc-0.2.0/tests/fixtures/tsv/miller-abixy.tsv +11 -0
- brewdoc-0.2.0/tests/fixtures/tsv/vega-unemployment.tsv +3219 -0
- brewdoc-0.2.0/tests/fixtures/txt/nasa-giss-global-temperature-index.txt +176 -0
- brewdoc-0.2.0/tests/fixtures/txt/noaa-ghcn-daily-readme.txt +633 -0
- brewdoc-0.2.0/tests/fixtures/xls/calamine-any_sheets.xls +0 -0
- brewdoc-0.2.0/tests/fixtures/xls/calamine-date.xls +0 -0
- brewdoc-0.2.0/tests/fixtures/xls/calamine-merge_cells.xls +0 -0
- brewdoc-0.2.0/tests/fixtures/xls/calamine-xls_formula.xls +0 -0
- brewdoc-0.2.0/tests/fixtures/xls/census-st-est00int-01.xls +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsb/calamine-date.xlsb +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsb/calamine-issue127.xlsb +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsb/calamine-issues.xlsb +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsm/calamine-issue221.xlsm +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsm/calamine-issue3.xlsm +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsm/calamine-vba.xlsm +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsx/calamine-any_sheets.xlsx +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsx/calamine-date.xlsx +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsx/calamine-inventory-table.xlsx +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsx/calamine-merge_cells.xlsx +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsx/calamine-temperature-table.xlsx +0 -0
- brewdoc-0.2.0/tests/fixtures/xlsx/census-NST-EST2024-POP.xlsx +0 -0
- brewdoc-0.2.0/tests/test_benchmark_metadata.py +119 -0
- brewdoc-0.2.0/tests/test_capture_results.py +238 -0
- brewdoc-0.2.0/tests/test_contract.py +680 -0
- brewdoc-0.2.0/tests/test_documents.py +228 -0
- brewdoc-0.2.0/tests/test_fixtures.py +170 -0
- brewdoc-0.2.0/tests/test_html.py +1210 -0
- brewdoc-0.2.0/tests/test_output.py +301 -0
- brewdoc-0.2.0/tests/test_pdf_regressions.py +644 -0
- brewdoc-0.2.0/tests/test_presentations.py +658 -0
- brewdoc-0.2.0/tests/test_spreadsheets.py +874 -0
- brewdoc-0.2.0/uv.lock +648 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
tests/fixtures/** -text
|
|
@@ -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/*
|
brewdoc-0.2.0/.gitignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
brewdoc-0.2.0/FORMATS.md
ADDED
|
@@ -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 ` `, `	` and ` ` 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`.
|