@@ -7,14 +7,15 @@ phased plan is kept at the end as history.)
77
88> ** Status: the format migration is essentially complete.** Every document
99> format in docling's pipeline except ** audio/ASR** is supported, plus Markdown
10- > (legacy + a Rust-only * strict* mode), docling-native ** JSON** output, and
11- > ** image extraction** . The declarative formats are pure-Rust and checked
12- > byte-for-byte against * live* docling; the PDF/image/METS ML path lives in
13- > ` fleischwolf-pdf ` (a pure-Rust PDF text parser + pdfium rasterization + ONNX
10+ > (legacy + a Rust-only * strict* mode), docling-native ** JSON** output, ** image
11+ > extraction** , and ** MHTML** (a fleischwolf-only extension docling doesn't
12+ > have). The declarative formats are pure-Rust and checked byte-for-byte
13+ > against * live* docling; the PDF/image/METS ML path lives in ` fleischwolf-pdf `
14+ > (a pure-Rust PDF text parser + pdfium rasterization + ONNX
1415> layout/TableFormer/OCR + a port of docling-parse's line sanitizer) and is also
1516> measured byte-for-byte against live docling — ** 6 / 14 PDF fixtures exact, 7 / 14
1617> whitespace-normalized** (see ` PDF_CONFORMANCE.md ` ), with a snapshot baseline
17- > guarding against regressions. ` cargo test ` is green (unit tests + a 131 -source
18+ > guarding against regressions. ` cargo test ` is green (unit tests + a 133 -source
1819> output-regression suite).
1920
2021---
@@ -36,7 +37,8 @@ crates/
3637├── fleischwolf-core/ # DoclingDocument, Node model, markdown.rs, json.rs, base64.rs, labels.rs
3738├── fleischwolf/ # DocumentConverter, source/format detection, backend/*.rs, ooxml.rs
3839├── fleischwolf-pdf/ # pdfium_backend, layout (RT-DETR/ONNX), ocr (PP-OCRv3/ONNX), assemble, mets
39- └── fleischwolf-cli/ # `--strict`, `--to md|json`, `--images placeholder|embedded|referenced`
40+ ├── fleischwolf-cli/ # `--strict`, `--to md|json`, `--images placeholder|embedded|referenced`
41+ └── fleischwolf-node/ # Node.js/Bun N-API bindings (napi-rs), published to npm as `fleischwolf`
4042```
4143
4244The public API is unchanged from day one:
@@ -73,12 +75,13 @@ PyPI; run via `scripts/conformance.sh <fmt>`), not the committed groundtruth
7375| WebVTT | ` webvtt.rs ` | ** 4/4 exact** |
7476| Email (.eml) | ` email.rs ` (mail-parser) | ** 2/2 exact** |
7577| EPUB | ` epub.rs ` → HTML backend | core exact (shares HTML residual) |
76- | ODF (odt/ods/odp) | ` odf.rs ` | core; residual in §5 |
77- | JATS | ` jats.rs ` (roxmltree) | core ~ 60% (metadata + sections + paragraphs ) |
78+ | ODF (odt/ods/odp) | ` odf.rs ` | core + list continuation + rich table cells + ODS table regions ; residual in §5 |
79+ | JATS | ` jats.rs ` (roxmltree) | metadata + full ` <body> ` / ` <back> ` (tables, figures, references, lists, footnotes, formulas ) |
7880| USPTO | ` uspto.rs ` | modern ` us-patent-*-v4x ` core; residual in §5 |
7981| XBRL | ` xbrl.rs ` | arelle-free core (dei facts → title, ` *TextBlock ` → HTML) |
8082| JSON-docling | ` docling_json.rs ` (serde_json) | reads docling's native JSON; ~ 51/145 round-trip exact |
8183| LaTeX | ` latex.rs ` (scanner) | simple ` .tex ` ≈ live; multi-file arxiv out of scope |
84+ | MHTML (.mhtml/.mht) | ` mhtml.rs ` (mail-parser) → HTML backend | ** fleischwolf extension — no docling backend to compare against** ; embedded images resolved by ` Content-Location ` /` cid: ` |
8285
8386Shared OOXML infrastructure (` ooxml.rs ` ): a ` zip ` reader, ` .rels ` parsing, part
8487content-type resolution, and image extraction — reused by DOCX/PPTX/XLSX/EPUB.
@@ -208,15 +211,23 @@ when the TableFormer graphs aren't present.)
208211- ** Older patent schemas.** USPTO covers the modern ` v4x ` XML only; the
209212 ` pap-v1 ` / 2001-era ` pa ` /` pg ` schemas and the legacy ** APS text** (` pftaps ` )
210213 format are not handled (two files even use HTML entities roxmltree rejects).
211- - ** JATS article-body machinery** — tables, figures, references/citations, lists
212- and formula rendering inside ` <body> ` (metadata + sections + paragraphs are
213- done).
214- - ** ODF deep quirks** — mixed-style list continuation, empty-list-item level
215- collapse, ODS sheet→table region detection with numeric alignment, rich table
216- cells.
217- - ** DOCX long tail** — full Word multilevel list/heading * shared* numbering,
218- position-sorted textbox/shape-text layout, advanced OMML + inline-equation
219- spacing.
214+ - ** ODF presentation title/shape/notes** — slide-title heading detection, free
215+ shape-text extraction and the drop of speaker-notes on ` .odp ` slides. The
216+ mixed-style ** list continuation** , empty-list-item level collapse,
217+ ** ODS sheet→table region detection with numeric alignment** , and ** rich table
218+ cells** are now done (a flood-fill splits a sheet into its disconnected data
219+ regions; ` <text:list> ` siblings continue numbering across an empty nested item;
220+ a cell holding lists/nested tables/images/multiple paragraphs renders its full
221+ block content flattened into the cell while a plain cell stays unformatted, and
222+ merged cells leave their covered columns blank). What remains on ` .odt ` is
223+ charts/embedded-object frames (` text_document_02 ` ).
224+ - ** DOCX grouped/anchored drawings** — position-sorted layout of grouped shapes
225+ and ` <mc:AlternateContent> ` image de-duplication (` drawingml ` fixture). The
226+ Word multilevel list/heading * shared* numbering and ** advanced OMML +
227+ inline-equation spacing** are now done (inline equations reproduce docling's
228+ inline-group spacing and stay attached to their list item; ` \operatorname `
229+ functions, limit-label space escaping and the two-space symbol padding match
230+ pylatexenc byte-for-byte).
220231- ** HTML browser-render subsystem** — nav/visibility suppression (` wiki_duck ` ),
221232 form key-value-pair regions (` kvp_data_example ` ), deep nested-table cell padding
222233 from rendered bounding boxes. ~ 4 HTML fixtures + KVP.
@@ -226,9 +237,7 @@ when the TableFormer graphs aren't present.)
226237
227238## 6. Extensions
228239
229- - Support ** MHTML** format, check if https://crates.io/crates/mail-parser has support for it.
230240- ** PyO3 bindings** (` fleischwolf-py ` ) for a strangler-fig drop-in.
231- - ** nodejs/bun TypeScript** bindings
232241- ** C++** bindings
233242- ` fleischwolf-rag ` - basic documents processing/chunking/vectorization/semantic-search system with pluggable DB support, PostgreSQL/SQLite, embedding with small ONNX local model (test options, dimensions >= 1024).
234243
@@ -238,7 +247,7 @@ when the TableFormer graphs aren't present.)
238247 regression suite** (` crates/fleischwolf/tests/regression.rs ` ): every
239248 declarative source under ` crates/fleischwolf/tests/data/<fmt>/sources/ ` is
240249 converted to legacy Markdown, strict Markdown and docling JSON and compared to
241- committed fixtures (131 sources × 3). ` FLEISCHWOLF_REGEN=1 ` refreshes them.
250+ committed fixtures (133 sources × 3). ` FLEISCHWOLF_REGEN=1 ` refreshes them.
242251 The JSON fixtures double as a docling-core load check.
243252- ** Snapshot harness** — ` scripts/pdf_conformance.sh ` regenerates and diffs the
244253 PDF/image/METS baseline (needs pdfium + the ONNX models; ** 91/91 exact** ).
0 commit comments