7.7 KiB
Format support
Version 0.2.1 support matrix
| Input or feature | Status | Tested evidence and boundary |
|---|---|---|
Desktop revision-store .one |
Supported subset | Real 34,904-byte Joplin golden; three pages and rich content |
FSSHTTPB package-store .one |
Supported subset | Licensed 17,197-byte Joplin golden; one page; unfragmented data elements |
Unknown/legacy .one variants |
Unsupported | File type and format GUIDs are validated before traversal |
.onepkg, one CAB |
Supported subset | Real Joplin LZX package; generated/pinned none, MSZIP, Quantum, and LZX codec fixtures |
.onepkg, complete CAB set |
Supported extraction | Licensed five-part libmspack set plus split-block, spanning-file, ordering, and malformed-set tests |
| Missing/inconsistent CAB parts | Rejected | Set ID, indexes, previous/next names, compression, split blocks, and spanning records must agree |
| CAB without compression | Supported extraction | Byte-for-byte rust-cab fixture |
| CAB MSZIP | Supported extraction | rust-cab single block plus generated two-block dictionary-chain fixture |
| CAB Quantum | Supported extraction | Pinned compcol payloads and generated CAB integration fixture |
| CAB LZX | Supported extraction | Real OneNote 0x1203 package and rust-cab 0x1303 fixture |
.onetoc2 inside a package |
Supported subset | Desktop golden/hierarchy tests; FSSHTTPB dispatch uses a mocked shared-store seam, not a real golden |
Standalone .onetoc2 in the app |
Not selectable | The picker accepts .one, or .onepkg together with .cab companions |
| Rich text and layout hints | Supported subset | Run formatting, paragraph properties, safe links, and bounded layout metadata |
| Tables | Supported subset | Rows, cells, nested blocks, column widths, locks, borders, and cell backgrounds |
| Images | Supported subset | Lazy, signature/header-validated PNG and JPEG resources; unsafe images stay downloadable only |
| Ink | Supported subset | Bounded delta decoding, strokes, colors, width/height, transparency, and SVG display/export |
| Embedded attachments | Supported subset | ATTACHMENT_DECLARATION/file-data resources remain inert until explicit download |
| Export | Supported subset | JSON, text, Markdown, inert HTML, and deterministic static notebook ZIP |
“Supported subset” is intentionally narrower than “all files with this extension.” A successful open requires the tested desktop or FSSHTTPB OneStore structures and content graph nodes. Malformed offsets, counts, references, CAB checksums, paths, compressed data, and unsupported variants produce bounded diagnostics or a controlled failure.
OneStore and package boundaries
FSSHTTPB support covers the OneStore packaging envelope, Storage Index and
Storage Manifest, header/data-root cells, bounded revision chains, Object Group
partitions, resolved object/page-space references, and available Object Data
BLOB references. Data Element Fragment records are recognized and bounded by
the low-level parser, but fragmented-element reconstruction is not implemented;
the store adapter rejects packages containing fragment records with a
controlled UNSUPPORTED_FORMAT error. Excluded object data cannot be
reconstructed from a standalone file and is likewise unsupported.
For a split package, the browser must receive the .onepkg and every linked
.cab companion in one selection. The extractor validates a complete,
uniquely indexed cabinet chain before decoding. It reassembles split CFDATA
blocks, preserves codec state across cabinets, and reconciles the CAB
continued from previous, continued to next, and continued both file
records. Partial sets are not opened heuristically.
The default LZX limit accepts CAB window sizes through 8 MiB, but compatibility
claims are fixture-backed only for window bits 18 (0x1203) and 19 (0x1303).
MSZIP validates the CK prefix, limits each compressed block to 32 KiB + 12,
decodes into a fixed-size output buffer, requires the declared output length,
and carries at most 32 KiB of history between blocks in one logical folder.
Quantum validates level/window metadata, bounds its window to 2 MiB by default,
requires full 32 KiB intermediate frames, preserves its arithmetic models and
LZ window across frames/cabinets, and injects exactly one 0xFF CAB block
sentinel. Trailer, match, frame, output, operation, and cancellation bounds are
enforced.
Trailing CAB data is ignored with a warning. Reserved CAB areas are bounded and skipped. CAB names are decoded as strict UTF-8; unmarked valid UTF-8 receives a warning, while invalid non-ASCII legacy-code-page names are rejected rather than guessed.
Notebook and page model
Supported .onetoc2 stores provide authored section order, nested section
groups, display names, identities, and colors. Exact normalized paths take
precedence; same-directory file identity is a guarded fallback. Recycle-bin
entries are omitted, duplicate/cyclic references are diagnosed, and readable
sections not reachable from a TOC are appended deterministically. Page levels
are interpreted as a page/subpage tree.
The supported section path returns:
- section/page identities, names, timestamps, page levels, and diagnostics;
- outlines and recursively nested content blocks;
- rich-text runs with bold, italic, underline, strikeout, super/subscript,
font, size, foreground/highlight color, paragraph alignment/spacing, and
allow-listed
http,https, andmailtolinks; - tables, lazy PNG/JPEG images, embedded-file declarations, and decoded ink;
- bounded layout hints such as offsets, maximum dimensions, and alignment.
This is not a pixel-perfect OneNote renderer. Equations, audio/video, page versions/conflicts, and producer-specific structures outside the golden corpus are not represented. Encountered unsupported object kinds remain visible as diagnostics. Active notebook HTML/SVG is never injected.
Export
All exports are created inside the existing local parser worker. They include a versioned parser/support manifest, the readable page hierarchy, diagnostics, and unsupported-content summaries. The static ZIP contains inert semantic HTML plus JSON, text, Markdown, warnings, and bounded resources. Resource names are normalized, potentially active attachment suffixes are neutralized, and only validated image types may be embedded for automatic display.
Export is a representation of the parser-supported subset, not a round trip:
it neither emits .one/.onepkg nor promises full OneNote visual fidelity.
Test fixtures
The exact hashes, source revisions, licences, expected content, and CAB
structures are recorded in
tests/fixtures/README.md. Tests use no private
notebooks and do not treat a synthetic archive as proof of Microsoft OneNote
export compatibility.