Introduction
docboss is a DOCX and DOC engine written from scratch in safe Rust against the
specifications: ECMA-376 for Office Open XML WordprocessingML, and Microsoft's
[MS-DOC], [MS-CFB], [MS-OLEPS], [MS-ODRAW] and [MS-OFFCRYPTO] for the Word
97-2003 binary format, its compound-file container and encryption. It has no C
dependencies and no bindings to another engine: the ZIP container, the XML
tokenizer, the compound-file reader, the font parsers, the layout engine and
the rasterizer are its own. One core sits behind every surface: the docboss
command-line tool, an interactive terminal explorer (docboss tui), a set of
Rust library crates, and a native Python extension.
One model for two formats
A .docx file is a ZIP package of XML parts; a .doc file is a compound
file holding a binary stream of text, a piece table and formatting records.
Both readers produce the same document model (docboss-model): sections with
their page setup, paragraphs and tables, runs with their properties, a style
sheet that resolves effective formatting, list definitions that produce the
document's own labels, footnotes, endnotes, comments, headers, footers,
fields, bookmarks and media. Everything after reading (text, Markdown, HTML,
JSON, layout, rendering, DOCX writing) works on that model, so it behaves the
same for both formats. The format is detected from the leading bytes, never
from the file name.
Leniency
Real-world files are damaged: truncated downloads, archivers that write a bad central directory, converters that break FAT chains or leave dangling relationships. docboss reads them anyway:
- A ZIP with a missing or broken central directory is read from its local headers; a damaged deflate stream keeps what inflated before the damage.
- A compound file with a looping or truncated sector chain is followed as far as it goes.
- XML that is not well formed still yields balanced elements.
Leniency never hides what it cost. Every approximated or dropped item is a
Diagnostic on the document: docboss diagnostics lists them, and the
libraries expose them as a value. An empty list means the reader took the
file as written.
Scope
docboss reads, lays out, renders and writes word-processing documents. It does not edit a document in place and does not run macros. The limitations page lists what is missing, and the conformance ledger records the status of every clause of the standards it reads.
Installation
Python
pip install docboss
Wheels are abi3 builds for CPython 3.12 and later, so one wheel covers every later Python version. No Rust toolchain is needed to install one.
Command-line tool
cargo install docboss-cli
This builds the docboss binary from crates.io with a stable Rust toolchain.
From a checkout, make install does the same for the working tree.
Rust crates
Add the crates you need:
cargo add docboss-core docboss-output docboss-layout docboss-render docboss-write
cargo add docboss-aio --features http # async and remote reads
docboss-core re-exports the document model, so most programs start from
docboss_core::open.
Fonts for rendering
Rendering uses the fonts installed on the machine: the macOS, Linux and
Windows font directories, LibreOffice's bundled fonts, and any directory
named in DOCBOSS_FONT_PATH (:-separated). Fonts embedded in a DOCX are
used first. When a document names a font that is not installed, a
metric-compatible substitute is used where one exists (Carlito for Calibri,
Caladea for Cambria, Liberation Sans or Arimo for Arial and Helvetica,
Liberation Serif or Tinos for Times New Roman, Liberation Mono or Cousine for
Courier New), so line breaks and page counts stay close to Word's.
docboss fonts report.docx shows what each font resolved to.
Coding agents
docboss skill install writes a skill document into
./.claude/skills/docboss, or into ~/.claude/skills/docboss with --global,
so coding agents know the CLI and the Python API. docboss skill print
writes it to stdout.
Quickstart
One taste of each surface. report.docx and legacy.doc stand in for any
Word documents of yours; Installation covers getting the
binary, the wheel and the crates.
CLI
docboss info report.docx # format, metadata, page setup, page count, counts
docboss text report.docx # plain text with list labels
docboss text legacy.doc # Word 97-2003 files read the same way
docboss md report.docx # GitHub-flavored Markdown
docboss render report.docx --page 1 -o page.png --scale 2
docboss images report.docx -o images # the document's pictures, as stored
docboss convert legacy.doc -o legacy.docx # DOC to a fresh DOCX
docboss create md notes.md -o notes.docx # Markdown composed into a DOCX
render prints each file it wrote; images writes into the directory it is
given and creates it when missing. Page numbers are 1-based on the command
line.
Python
from pathlib import Path
import docboss
doc = docboss.Document("report.docx")
print(doc.format, doc.page_count(), "pages")
text = doc.extract_text() # one line per paragraph, list labels included
markdown = doc.extract_markdown() # headings, lists, tables, footnotes, links
Path("page.png").write_bytes(doc.render(0, scale=2.0))
for image in doc.images():
print(image.name, image.content_type, len(image.data))
legacy = docboss.Document("legacy.doc")
Path("legacy.docx").write_bytes(legacy.to_docx())
docx = docboss.md.to_docx(Path("notes.md").read_text())
Document also opens from memory (Document(data=raw_bytes)), pages index
0-based with negative indexes from the end, and render returns PNG bytes
unless format= says otherwise.
Rust
With docboss-core, docboss-output, docboss-layout and docboss-render
added:
use docboss_output::{to_markdown, MarkdownOptions};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let doc = docboss_core::open("report.docx")?;
println!("{}", to_markdown(&doc, &MarkdownOptions::default()));
let layout = docboss_layout::layout_document(&doc);
docboss_render::render_page(&layout, 0, 2.0)?.save("page.png")?;
Ok(())
}
Extracting text
docboss text report.docx
docboss text report.docx --headers-footers --comments
docboss text legacy.doc --no-labels -o legacy.txt
Plain text has one line per paragraph. List paragraphs start with the label
the document's numbering gives them (1., a), •), computed from the list
definitions, their start values and overrides, the way Word numbers them.
Table rows become one line each with tab-separated cells. Footnote and
endnote references become [1] and [i], and the notes' text follows the
main text; --no-notes leaves both out. --headers-footers writes each
section's headers before it and its footers after it, and --comments marks
comment anchors [c1] and appends the comments with their authors.
What is left out, as ECMA-376 and [MS-DOC] define it: hidden text (vanish),
deleted revisions (inserted ones are kept), and field instructions; a field
contributes its cached result, so a table of contents or a PAGE field
reads as the file shows it. Text boxes are part of the text, written after
the paragraph that anchors them.
import docboss
doc = docboss.Document("report.docx")
text = doc.extract_text(headers_footers=True, notes=True, comments=False, list_labels=True)
Many files at once
import docboss
texts = docboss.extract_texts(["report.docx", "legacy.doc"], threads=8)
lenient = docboss.extract_texts(["report.docx", "not-a-document.txt"], strict=False)
print(lenient[1]) # None: that file failed, the others still came back
extract_texts reads every file on a Rust thread pool in one call, without
the GIL, and returns the texts in input order. With strict=True (the
default) the first failure raises DocbossError; with strict=False a
failed file gives None. It is the fastest way to feed a pipeline.
Blocks
For retrieval pipelines, the block view keeps each paragraph's role:
docboss json report.docx --blocks
import docboss
for block in docboss.Document("report.docx").blocks():
print(block.kind, block.heading_level, block.list_label, block.text)
kind is paragraph, heading, list_item or table; headings come from
outline levels and heading styles, list items carry their level and label.
Empty paragraphs are left out.
Markdown, HTML and JSON
Markdown
docboss md report.docx
docboss md report.docx --images images -o report.md # export images and link them
docboss md report.docx --embed-images # data: URIs instead
docboss md report.docx --title --page-breaks
The Markdown is GitHub-flavored:
- Headings come from the paragraph's outline level or a
Heading NorTitlestyle. - Bold, italic and strikethrough spans are merged across adjacent runs, with whitespace kept outside the markers. A paragraph set entirely in a monospace font, or in a code style, becomes a fenced code block.
- Lists nest by numbering level; bullets become
-, numbered items1.. - Tables become pipe tables; merged cells, nested tables and multi-paragraph
cells are flattened with
<br>. - Footnotes and endnotes become
[^1]references with definitions at the end; hyperlinks andHYPERLINKfields become links. - Images become
;--images DIRwrites the files and links them there.
import docboss
doc = docboss.Document("report.docx")
markdown = doc.extract_markdown(images="reference", image_prefix="images/")
inline = doc.extract_markdown(images="embed")
bare = doc.extract_markdown(images="omit", title=True, page_breaks=True)
HTML
docboss html report.docx --standalone -o report.html
docboss html report.docx --images images -o fragment.html
HTML output is semantic: h1 to h6, p, strong, em, u, s, sup,
sub, ul and ol with start attributes, tables with colspan and
rowspan from merged cells, links, images and a footnotes section. Without
--standalone it is a body fragment. Images are embedded as data: URIs
unless --images exports them.
import docboss
html = docboss.Document("report.docx").extract_html(standalone=True)
JSON
docboss json report.docx # the whole document model
docboss json report.docx --blocks # one object per block
docboss q report.docx '.sections | length'
docboss q report.docx --blocks -r '.[] | select(.kind == "heading") | .text'
docboss q runs a jq program (through jaq) over the same JSON, so the model
can be queried without writing code. In Python, Document.to_json(pretty=True)
returns the model as a string.
Rendering pages
docboss render report.docx --page 1 -o page.png # one page, 72 dpi
docboss render report.docx --scale 2 -o 'page-%d.png' # every page at 144 dpi
docboss render report.docx --page 1 -o page.jpg --jpeg-quality 85
docboss render legacy.doc -o 'legacy-%d.ppm'
The -o extension picks the format: .png, .ppm, .bmp or .jpg/.jpeg.
%d in the path is replaced by the page number; without --page every page
is rendered, laid out once and painted on all cores. --scale is pixels per
point, so 1.0 is 72 dpi and 2.0 is 144 dpi.
What layout does
docboss lays a document out the way Word does rather than the way a browser would:
- Paragraph and run properties are resolved through document defaults, the style chain, table styles, list levels and direct formatting.
- Lines break at Unicode line-break opportunities with soft hyphens honored, and are aligned or justified; line spacing follows the paragraph's rule (auto, exact, at least) with Word's extra leading on single spacing.
- Tab stops, leaders and default tabs; list labels with their hanging indents.
- Keep with next, keep lines together, widow and orphan control, page breaks before.
- Tables: grid widths, merged cells in both directions, cell margins, borders and shading, rows split across pages, header rows repeated on each page.
- Sections with their own page size, margins and columns; headers and footers
for first, even and default pages, with
PAGEandNUMPAGESfields in the section's number format. - Footnotes at the bottom of the page they are referenced on; inline and floating images.
Fonts come from the machine and from the document; see
Installation for where docboss looks
and which substitutes it uses. docboss fonts report.docx prints each font the
document names and the face it resolved to.
Python
from pathlib import Path
import docboss
doc = docboss.Document("report.docx")
print(doc.page_count(), "pages")
Path("first.png").write_bytes(doc.render(0, scale=2.0))
Path("last.jpg").write_bytes(doc.render(-1, format="jpeg", jpeg_quality=85))
for index, png in enumerate(doc.render_pages(scale=1.5)):
Path(f"page-{index + 1}.png").write_bytes(png)
render_pages renders every page (or the indexes given in pages=) in
parallel and returns the encoded images in page order. Layout is computed once
per document and cached, so rendering pages one by one costs no second layout.
Rust
use docboss_render::Format;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let doc = docboss_core::open("report.docx")?;
let layout = docboss_layout::layout_document(&doc);
for (index, page) in docboss_render::render_pages(&layout, 2.0).into_iter().enumerate() {
std::fs::write(format!("page-{}.png", index + 1), page?.encode(Format::Png)?)?;
}
Ok(())
}
docboss_layout::layout takes an explicit FontDatabase when several
documents should share one; layout_document builds one for the document,
including its embedded fonts. Each laid-out page holds positioned glyph runs,
rectangles, lines and images in points, so a program can inspect geometry
without rasterizing.
What is not drawn
Text boxes, shapes with their preset and custom geometry, groups, canvases,
gradient fills, SmartArt (from its saved drawing), charts (from their cached
values), Office Math, WMF and EMF pictures and page borders are drawn, and
body text wraps around floating images, text frames and floating tables
(square, tight, through and top and bottom); text in table cells, text
frames, headers and footers does not wrap around the floats there. Picture
and pattern fills and shape effects are not drawn, 3-D, radar, stock,
surface, bubble and bar-of-pie charts show an empty frame, and TIFF
pictures draw a placeholder rectangle;
docboss diagnostics report.docx --layout reports them and everything else
layout approximated.
Extracting images
docboss images report.docx -o images
docboss images legacy.doc -o images
images writes every picture the document carries at its stored size and in
its stored format (PNG, JPEG, GIF, BMP, EMF, WMF, TIFF), named after its part
(image1.png). DOC pictures come from the Data stream and the OfficeArt BLIP
store; DIB pictures are written as BMP, and identical DOC pictures are stored
once.
from pathlib import Path
import docboss
for image in docboss.Document("report.docx").images():
Path(image.file_name).write_bytes(image.data)
print(image.name, image.content_type)
name is the part name inside the package (word/media/image1.png),
file_name its last segment, and content_type is detected from the bytes.
The Markdown and HTML writers reference or embed the same images (see
Markdown, HTML and JSON).
Writing DOCX
docboss writes WordprocessingML packages from its document model. Output is deterministic: the same input produces identical bytes, ZIP entries carry a fixed timestamp, and dates appear only when the metadata states them.
Converting
docboss convert legacy.doc -o legacy.docx # DOC to DOCX
docboss convert report.docx -o fresh.docx # a fresh package from the model
docboss convert legacy.doc -o legacy.md # or .html, .txt, .json by extension
import docboss
docboss.Document("legacy.doc").save_docx("legacy.docx")
data = docboss.Document("report.docx").to_docx()
A converted file carries what the model holds: text, styles, lists, tables, sections with headers and footers, notes, comments, fields, bookmarks, revisions and images. Embedded fonts and the theme part are not written.
Markdown to DOCX
docboss create md notes.md -o notes.docx --size a4 --title "Notes"
import docboss
docx = docboss.md.to_docx("# Notes\n\n- one\n- two\n\n| a | b |\n|---|---|\n| 1 | 2 |\n")
CommonMark and GFM map onto Word's built-in vocabulary: headings to
Heading1 through Heading6, emphasis, strong and strikethrough to run
properties, inline code and code blocks to monospace styles, links to
hyperlinks, ordered, bullet, nested and task lists to numbering definitions,
tables to tables with a header row, block quotes to the Quote style,
thematic breaks to a bottom border, footnotes to footnotes. Relative image
paths are read from the Markdown file's directory on the CLI, and from
images_dir= in Python; without it an image becomes its alt text.
Composing from Rust
use docboss_write::{DocumentBuilder, ListKind, Para, TableBuilder};
let mut doc = DocumentBuilder::new();
doc.title("Q3 Report").heading(1, "Summary");
doc.paragraph(Para::new().text("Revenue grew ").bold("12%").text("."));
doc.items(ListKind::Bullet, &["North", "South"]);
let width = doc.text_width();
doc.block(TableBuilder::new(2, width).header(&["Region", "Growth"]).row(&["North", "14%"]));
let bytes = doc.to_bytes()?;
assert!(bytes.starts_with(b"PK"));
Ok::<(), docboss_write::Error>(())
DocumentBuilder covers metadata, page size and margins, styles, headings,
paragraphs, lists, tables, images, footnotes, headers, footers and sections;
docboss_write::to_bytes and save serialize any docboss_model::Document,
and docboss_write::markdown::to_docx is the Markdown path.
Encrypted documents
Every read command takes --password, and Document takes password=:
docboss text locked.docx --password secret
docboss convert locked.docx --password secret -o unlocked.docx
import docboss
doc = docboss.Document("locked.docx", password="secret")
print(doc.extract_text())
What opens:
- DOCX protected with a password to open is an OLE compound file holding
EncryptionInfoandEncryptedPackagestreams ([MS-OFFCRYPTO]). docboss decrypts Agile encryption (AES-128 or AES-256 in CBC mode, SHA-1 or SHA-512 key derivation with the spin count, the data-integrity HMAC checked) and Standard encryption (AES-128 in ECB mode, SHA-1), then reads the package like any other. Word 2007 to 2013 and LibreOffice files open. - DOC with RC4 or RC4 CryptoAPI encryption ([MS-DOC] with the [MS-OFFCRYPTO] key derivations), or with XOR obfuscation (the password verifier and XOR array of [MS-OFFCRYPTO] method 2; the password is tried in the document's code page and by the low byte of each character, as the specification asks).
A wrong password is an error that says so; a tampered Agile package fails its integrity check. Password-protected Word 6 and Word 95 files are refused with an error.
convert writes the decrypted document as a plain, unencrypted DOCX; there
is no way to write an encrypted one yet.
Remote documents over HTTP
Every read command accepts an http(s):// URL:
docboss text https://example.com/report.docx
docboss info https://example.com/legacy.doc
The file is not downloaded whole. For a DOCX, docboss fetches the end of the
file to find the ZIP central directory, then only the entries the reader
needs: content types, relationships, document.xml, styles, numbering,
notes and comments. Images are fetched only when a command needs them. For a
DOC, it fetches the compound-file header, the FAT and directory sectors, and
then only the sectors of the Word streams. Requests are coalesced and cached,
so no byte is fetched twice; a server that ignores Range costs one full
download. On a terminal, a line of coverage shows which parts of the file
were fetched.
On Apache POI's saut_page.docx (2.96 MB, mostly images), extracting the text
fetched 17.9 KB in 3 requests; a DOC reads its Data stream too, so it saves
less.
Rust
docboss-aio with the http feature:
use docboss_aio::{AsyncDocument, ReadOptions};
use docboss_output::{to_text, TextOptions};
async fn run() -> docboss_aio::Result<()> {
let remote = AsyncDocument::open_url("https://example.com/report.docx").await?;
let doc = remote.read(&ReadOptions::default()).await?;
println!("{}", to_text(&doc, &TextOptions::default()));
println!("{} of {} bytes in {} requests", remote.bytes_fetched(), remote.len(), remote.requests().len());
Ok(()) }
ReadOptions { media: true, .. } fetches images too; otherwise
AsyncDocument::load_media fetches them later. AsyncDocument::open and
from_bytes give the same interface over local files and memory, and
from_backend over any byte source that implements Backend.
Python
import asyncio
import docboss
async def main() -> None:
doc = await docboss.AsyncDocument.open_url("https://example.com/report.docx")
print(doc.format, doc.part_names()[:3])
text = await doc.extract_text()
markdown = await doc.extract_markdown(images="omit")
styles = await doc.part("word/styles.xml")
print(doc.bytes_fetched, "bytes in", len(doc.requests), "requests")
asyncio.run(main())
AsyncDocument.open(path), from_bytes(data) and open_url(url) are
coroutines and take password=. The extraction methods mirror Document's
and are awaitable: extract_text, extract_markdown, extract_html,
to_json, blocks, images, and part(name) for one ZIP entry or stream.
bytes_fetched and requests report what was read so far, and
await doc.document() returns a synchronous Document for rendering,
DOCX writing and the rest of its API; images are fetched when a call needs
them.
Exploring document internals
Containers
docboss parts report.docx # ZIP entries with stored and unpacked sizes
docboss parts legacy.doc # compound-file streams
docboss xml report.docx word/styles.xml # one XML part, indented (--raw as stored)
docboss hex legacy.doc WordDocument --length 64 # hexdump of a part
docboss hex legacy.doc SummaryInformation # control characters in names are optional
Compound-file stream names that start with a control character print as
\x05SummaryInformation and can be addressed that way, without the prefix, or
case-insensitively.
The model
docboss json report.docx | head
docboss q report.docx '.styles.styles | map(.id)'
docboss fonts report.docx
docboss diagnostics report.docx
docboss diagnostics report.docx --layout
diagnostics lists everything the reader approximated or dropped, with the
part or stream it came from; --layout adds what layout approximated, such as
fonts that fell back or pictures drawn as placeholders.
The terminal explorer
docboss tui report.docx
The explorer has a tree of the document (sections, paragraphs, tables and runs, plus headers and footers, notes, comments, styles, numbering, media, fonts, the container and diagnostics), an inspector with each node's direct and resolved properties and its style chain, an XML view of the selected part, a Markdown view, a page preview drawn with half-block characters, and a hex pane.
| Keys | Action |
|---|---|
j k h l, arrows | move, collapse, expand |
| Enter | toggle a node, or open a part's XML |
g G PgUp PgDn | jump |
| Tab | cycle focus |
i x m p | inspector, XML, Markdown, page preview |
[ ] | previous and next page |
/ n N | search the whole document, next and previous match |
y | copy menu: text, inspector, a matching docboss command, hexdump |
< > | resize the tree |
? | help |
q, Esc, Ctrl-C | quit |
It needs an interactive terminal and exits with an error otherwise.
docboss CLI reference
Generated from docboss --help and each command's --help. Every command that reads a document detects DOCX or DOC from the bytes and accepts --password; where the help says so, it also takes an http(s):// URL, read with range requests. Errors go to stderr prefixed docboss:; document and I/O errors exit 1, usage errors and invalid jq programs exit 2.
DOCX and DOC parsing, extraction, rendering and conversion
Usage: docboss <COMMAND>
Commands:
info Format, metadata, page setup, page count and content counts
text Extract plain text
md Convert to GitHub-flavored Markdown
html Convert to semantic HTML; images are embedded unless --images is given
json Dump the document model as JSON
q Run a jq program over the JSON form of the document
render Lay out and render pages to PNG, PPM, BMP or JPEG (picked by the -o extension)
images Export the document's images at their stored size and format
parts List the ZIP entries or compound file streams of the container
hex Hexdump the whole file or one part of it
xml Print an XML part of a DOCX, indented
convert Convert to a fresh DOCX, or to .md, .html, .txt or .json, by the -o extension
create Create a new DOCX
fonts The fonts the document names and the faces they resolve to here
diagnostics Everything the lenient reader approximated or dropped
skill Install or print the skill document for coding agents
tui Explore the document interactively in the terminal
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
docboss info
Format, metadata, page setup, page count and content counts
Usage: docboss info [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
-h, --help Print help
docboss text
Extract plain text
Usage: docboss text [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
--headers-footers Include each section's headers and footers
--no-notes Leave out footnotes and endnotes
--comments Include comments
--no-labels Leave list labels (1., a), bullets) out
-o, --out <OUT> Write to a file instead of stdout
-h, --help Print help
docboss md
Convert to GitHub-flavored Markdown
Usage: docboss md [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
--headers-footers Include each section's headers and footers
--no-notes Leave out footnotes and endnotes
--comments Include comments
--images <IMAGES> Export images into this directory and link them from the Markdown
--embed-images Embed images as data: URIs
--title Start with the metadata title as a level-one heading
--page-breaks Write page breaks as thematic breaks (---)
-o, --out <OUT> Write to a file instead of stdout
-h, --help Print help
docboss html
Convert to semantic HTML; images are embedded unless --images is given
Usage: docboss html [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
--headers-footers Include each section's headers and footers
--no-notes Leave out footnotes and endnotes
--comments Include comments
--standalone Write a whole HTML document instead of a body fragment
--images <IMAGES> Export images into this directory and link them instead of embedding
-o, --out <OUT> Write to a file instead of stdout
-h, --help Print help
docboss json
Dump the document model as JSON
Usage: docboss json [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
--blocks The compact per-block view: type, style, heading level, list label, text
--compact One line instead of indented output
-o, --out <OUT> Write to a file instead of stdout
-h, --help Print help
docboss q
Run a jq program over the JSON form of the document
Usage: docboss q [OPTIONS] <FILE> <PROGRAM>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
<PROGRAM> The jq program, e.g. '.metadata.title' or '.sections[].blocks | length'
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
-r, --raw Print strings without quotes
--blocks Query the compact per-block view instead of the full model
-h, --help Print help
docboss render
Lay out and render pages to PNG, PPM, BMP or JPEG (picked by the -o extension)
Usage: docboss render [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
--page <PAGE> Page number (1-based); every page when omitted
--scale <SCALE> Pixels per point: 1.0 is 72 dpi [default: 1]
-o, --out <OUT> Output path; %d is replaced by the page number [default: page-%d.png]
--jpeg-quality <JPEG_QUALITY> JPEG quality, 1 to 100
-h, --help Print help
docboss images
Export the document's images at their stored size and format
Usage: docboss images [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
-o, --out <OUT> Output directory [default: .]
-h, --help Print help
docboss parts
List the ZIP entries or compound file streams of the container
Usage: docboss parts <FILE>
Arguments:
<FILE> Path to the .docx or .doc file
Options:
-h, --help Print help
docboss hex
Hexdump the whole file or one part of it
Usage: docboss hex [OPTIONS] <FILE> [PART]
Arguments:
<FILE> Path to the .docx or .doc file
[PART] A ZIP entry (word/document.xml) or compound file stream (1Table)
Options:
--offset <OFFSET> First byte to dump [default: 0]
--length <LENGTH> Number of bytes to dump; to the end when omitted
--width <WIDTH> Bytes per row [default: 16]
-h, --help Print help
docboss xml
Print an XML part of a DOCX, indented
Usage: docboss xml [OPTIONS] <FILE> [PART]
Arguments:
<FILE> Path to the .docx file
[PART] The part, e.g. word/document.xml [default: word/document.xml]
Options:
--raw Print the part as stored, without re-indenting
-h, --help Print help
docboss convert
Convert to a fresh DOCX, or to .md, .html, .txt or .json, by the -o extension
Usage: docboss convert [OPTIONS] --out <OUT> <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
-o, --out <OUT> Output path
-h, --help Print help
docboss create md
Compose CommonMark + GFM Markdown into a DOCX
Usage: docboss create md [OPTIONS] --out <OUT> <FILE>
Arguments:
<FILE> The Markdown file; relative image paths resolve against its directory
Options:
-o, --out <OUT> Output DOCX path
--size <SIZE> Page size [default: letter] [possible values: letter, a4]
--title <TITLE> Document title; the first heading's text by default
-h, --help Print help
docboss fonts
The fonts the document names and the faces they resolve to here
Usage: docboss fonts [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
-h, --help Print help
docboss diagnostics
Everything the lenient reader approximated or dropped
Usage: docboss diagnostics [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
--layout Also lay the document out and report what layout approximated
-h, --help Print help
docboss tui
Explore the document interactively in the terminal
Usage: docboss tui [OPTIONS] <FILE>
Arguments:
<FILE> Path or http(s):// URL of the .docx or .doc file; the format is detected from its bytes. A URL is read with range requests
Options:
--password <PASSWORD> Password for an encrypted DOC or DOCX
-h, --help Print help
docboss skill install
Install the skill for coding agents: into ./.claude/skills/docboss (this project), or with --global into ~/.claude/skills/docboss
Usage: docboss skill install [OPTIONS]
Options:
-g, --global Install into ~/.claude/skills instead of ./.claude/skills
-h, --help Print help
docboss skill print
Print the skill document to stdout
Usage: docboss skill print
Options:
-h, --help Print help
Python API reference
import docboss exposes the classes and functions below; docboss.md holds
the Markdown-to-DOCX function. Type stubs ship with the package
(_docboss.pyi, py.typed).
docboss.Document
Document(path=None, *, data=None, password=None)
Opens a DOCX or DOC file from a path, or from data (bytes, bytearray or
memoryview); exactly one of the two must be given, otherwise TypeError.
The format is detected from the bytes. password opens an encrypted DOCX or
DOC. Bad input, a missing or wrong password, and unsupported formats raise
DocbossError. Documents are immutable and can be used from any thread;
heavy calls release the GIL.
| Member | Returns |
|---|---|
format | "docx" or "doc" |
metadata | Metadata: title, subject, creator, keywords, description, last_modified_by, revision, created, modified, category, application, company, pages, words, characters (each None when absent) |
diagnostics | list[Diagnostic]: severity ("approximated" or "dropped"), location, message |
fonts | list[FontInfo]: name, alt_name, family, pitch, embedded |
styles | list[StyleInfo]: id, name, kind ("paragraph", "character", "table", "numbering"), based_on, is_default |
extract_text(*, list_labels=True, headers_footers=False, notes=True, comments=False) | str |
extract_markdown(*, title=False, page_breaks=False, images="reference", image_prefix="", headers_footers=False, notes=True, comments=False) | str |
extract_html(*, standalone=False, images="embed", image_prefix="", headers_footers=False, notes=True, comments=False) | str |
to_json(*, pretty=False) | the document model as a JSON string |
blocks() | list[Block]: kind ("paragraph", "heading", "list_item", "table"), section, style, heading_level, list_level, list_label, text |
images() | list[Image]: name, file_name, content_type, data |
page_count() | the number of pages after layout |
render(page=0, *, scale=1.0, format="png", jpeg_quality=90) | encoded image bytes; page is 0-based, negative counts from the end; format is "png", "ppm", "bmp" or "jpeg" |
render_pages(pages=None, *, scale=1.0, format="png", jpeg_quality=90) | list[bytes] in page order, rendered in parallel; None renders every page |
to_docx() | a fresh DOCX as bytes |
save_docx(path) | writes that DOCX |
images in the Markdown and HTML methods is "reference" (link to
image_prefix plus the image's file name), "embed" (data: URIs) or
"omit".
Layout runs once per document and is cached; documents without embedded fonts share one font database for the process.
docboss.AsyncDocument
The asynchronous reader, over files, bytes or http(s):// URLs, fetching only
the byte ranges each call needs.
| Member | |
|---|---|
await AsyncDocument.open(path, *, password=None) | a local file |
await AsyncDocument.from_bytes(data, *, password=None) | a buffer |
await AsyncDocument.open_url(url, *, password=None) | an http(s) URL, read with range requests |
format | "docx", "doc" or "unknown" |
bytes_fetched, requests | bytes read so far, and each (offset, length) request |
part_names() | the ZIP entries or compound-file streams |
await part(name) | one entry or stream as bytes |
await extract_text(...), await extract_markdown(...), await extract_html(...) | as on Document |
await to_json(*, pretty=False), await blocks(), await images() | as on Document |
await document() | the synchronous Document, for rendering and DOCX writing |
Functions
| Function | |
|---|---|
docboss.detect(data) | "docx", "doc", "encrypted_docx", "rtf" or "unknown" from the bytes |
docboss.extract_texts(paths, threads=None, strict=True) | the text of every file, read on a Rust thread pool in one call; with strict=False a failed file gives None instead of raising |
docboss.md.to_docx(markdown, images_dir=None, title=None) | CommonMark + GFM composed into DOCX bytes; relative image paths are read under images_dir |
Exceptions
docboss.DocbossError (a subclass of Exception) is raised for every
document, password and I/O error.
Rust crate reference
The crates split docboss by concern. Most programs need docboss-core to
open a document and one of the consumers after it.
| Crate | Entry points |
|---|---|
docboss-core | open(path), read(bytes), open_with/read_with(&Options { password }), detect(bytes) -> Format; re-exports the whole model |
docboss-model | Document and its parts; Styles::resolve_paragraph and resolve_run for effective formatting; Numbering::counter() for list labels; plain_text |
docboss-output | to_text/write_text with TextOptions, to_markdown/write_markdown with MarkdownOptions, to_html/write_html with HtmlOptions, blocks_view, and with the serde feature to_json and blocks_json |
docboss-layout | layout_document(&Document) -> Layout, layout(&Document, &Arc<FontDatabase>), layout_with_options, fonts_for; Layout { pages, fonts, media, diagnostics } with positioned items in points |
docboss-render | render_page(&Layout, index, scale) -> Pixmap, render_pages (all cores), Renderer; Pixmap::encode(Format) and save; Format::{Png, Ppm, Bmp, Jpeg { quality }} |
docboss-write | to_bytes(&Document), save, DocumentBuilder, Para, TableBuilder, markdown::to_docx |
docboss-aio | AsyncDocument::{open, from_bytes, open_url, open_url_with, from_backend}, read(&ReadOptions), load_media, part, part_names, bytes_fetched, requests; the http feature adds HttpBackend |
docboss-docx | read(bytes), read_with(bytes, Options): the WordprocessingML reader |
docboss-doc | read(bytes), read_with_password, is_doc: the Word binary reader |
docboss-zip | Archive (reader), write (deterministic writer), crc32 |
docboss-xml | the pull tokenizer used by the DOCX reader |
docboss-cfb | CompoundFile and property sets |
docboss-crypt | decrypt(bytes, password) for encrypted DOCX |
docboss-font | Font, FontDatabase with system discovery and substitution |
docboss-metafile | play(bytes) -> Picture for WMF and EMF, text(&Picture), bitmap::{decode, decode_bmp, encode_bmp} |
docboss-mtef | read(stream) -> Option<Math>: the equation of an Equation Editor 3 object's Equation Native stream |
Errors are thiserror enums per crate; docboss_core::Error wraps the
readers' errors and adds Encrypted and Unsupported. No library function
panics on input bytes: damaged input yields an error or a document with
diagnostics.
use docboss_output::{to_html, HtmlOptions};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let options = docboss_core::Options { password: Some("secret".into()) };
let doc = docboss_core::open_with("locked.docx", &options)?;
for diagnostic in &doc.diagnostics {
eprintln!("{:?} {}: {}", diagnostic.severity, diagnostic.location, diagnostic.message);
}
let html = to_html(&doc, &HtmlOptions { standalone: true, ..HtmlOptions::default() });
std::fs::write("locked.html", html)?;
Ok(())
}
Limitations
The reader reports what it could not read: docboss diagnostics lists every
approximated or dropped item. The conformance ledger has a
row for every clause of the standards docboss reads, with a note on what is
missing. The largest gaps:
Reading
- DOCX:
w:altChunkcontent is skipped and reported. ActiveX controls and custom XML data binding are not read as content. Ruby text is ignored. Only the compatibilityMode compatibility setting is read. - DOC: password-protected Word 6 and 95 files are refused. Word 6 and 95 files are read with their formatting, sections, headers, footers, tables, pictures and numbered paragraphs (ANLD), but their comments, endnotes and drawing objects, whose Word 6 records differ from Word 97's, and the equations of their Equation Editor objects are left out and reported; Word 2 files are read as text only. A Word 97 compound file whose directory is lost gives its text only (a Word 6 or 95 one is read in full). Freeforms and WordArt shapes are reported as dropped.
- DOCX and DOC: Equation Editor 3 objects keep their preview picture and give their equation as text and LaTeX; MathType's MTEF 4 and 5 are not read, and the object is reported.
- RTF is detected and refused. Flat OPC XML is not read: it is refused as an unknown format.
Layout and rendering
- Shaping covers Arabic, Hebrew and combining marks; Indic, Thai and other
scripts that reorder or stack glyphs are not shaped, cursive attachment
(GPOS type 3) is not applied, and Latin text gets no discretionary
ligatures. Right-to-left sections (
w:bidiinw:sectPr: column order, gutter side) and vertical sections (tbRl) lay out left to right. - No column balancing. Text wraps around floating images, text frames and
floating tables in the body. Text in a table cell or text frame does not
wrap around a float anchored there (the row grows to hold the float, which
is drawn over the text); floats in headers and footers do not push body
text aside; a table beside a float is not narrowed; text wraps around a
turned drawing as if it were not turned.
docboss diagnostics --layoutreports each of these. - Shapes draw solid and gradient fills; picture and pattern fills and effects (shadows, glow, 3-D) are not drawn. SmartArt without its saved drawing shows an empty frame; 3-D, radar, stock, surface, bubble and bar-of-pie charts show an empty frame too. Office Math stretches delimiters by scaling the glyph rather than with the font's variants.
- Conditional formatting from table styles is not applied.
- CFF2 fonts are refused; TIFF pictures draw a placeholder. WMF and EMF pictures are played (EMF+ records are skipped in favour of the EMF ones); their text is not extracted.
- Tracked changes render as the final text, without revision marks.
Writing
- Embedded fonts are not written (the font table lists names only), and no theme part is written.
- Raw HTML in Markdown is dropped, except
<br>. - Encrypted output is not supported.
Conformance
docboss keeps a ledger of the specifications it implements in ledger/Ledger/Catalogue/, one
row per clause with the status docboss claims: implemented, incomplete, not implemented or out
of scope. The specifications are ECMA-376 Parts 1 to 3 (5th edition), [MS-DOC], [MS-CFB],
[MS-OLEPS], [MS-OSHARED], [MS-ODRAW], [MS-WMF], [MS-EMF] and PKWARE's APPNOTE.TXT;
ledger/Ledger/Scope.lean names the clauses of each that must have a row.
The ledger is checked by Lean 4 on every push (make ledger-gate). Six theorems in
ledger/Ledger/Gate.lean establish that every row sits in its own specification's file and
names one of its chapters, that rows are unique, that every required clause has a row speaking
to it, that every implemented row is cited by both implementation code and a test in the source
tree, that every incomplete row is cited by implementation code and explains what is missing,
that every other row explains itself, and that no citation names a clause its specification does
not have. They are decided by Lean's compiled evaluator (native_decide), so they trust the Lean
compiler as well as its kernel; the theorems of the reference implementations in
ledger/Ledger/Reference/, whose vectors the Rust tests replay, are checked by the kernel alone.
Citation counts below are the number of source comments naming the clause or a sub-clause of it,
in implementation code and in tests.
This page is generated by make ledger-report. Edit the ledger, not the page.
| Specification | Implemented | Incomplete | Not implemented | Out of scope |
|---|---|---|---|---|
| ECMA-376 Part 1 | 130 | 78 | 220 | 74 |
| ECMA-376 Part 2 | 15 | 6 | 3 | 40 |
| ECMA-376 Part 3 | 4 | 0 | 5 | 1 |
| [MS-DOC] | 96 | 31 | 332 | 11 |
| [MS-CFB] | 10 | 0 | 1 | 2 |
| [MS-OLEPS] | 9 | 5 | 26 | 0 |
| [MS-OSHARED] | 0 | 1 | 3 | 0 |
| [MS-ODRAW] | 0 | 3 | 2 | 0 |
| [MS-WMF] | 1 | 8 | 0 | 0 |
| [MS-EMF] | 2 | 11 | 2 | 0 |
| APPNOTE | 13 | 6 | 74 | 24 |
ECMA-376 Part 1: Fundamentals and Markup Language Reference (5th edition, 2016)
11 WordprocessingML
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 11.3 | Part Summary | incomplete | 11 | 9 | The main document, styles, numbering, settings, font table, header, footer, footnote, endnote and comment parts are read; the glossary document and web settings parts are not, and alternative format import parts are reported as dropped. |
| 11.3.1 | Alternative Format Import Part | not implemented | 0 | 0 | Alternative format import parts (w:altChunk targets) are not imported; each is reported as dropped (see 17.17.2). |
| 11.3.2 | Comments Part | implemented | 1 | 1 | The comments part is read into Document::comments (test structure.rs notes_and_comments). |
| 11.3.3 | Document Settings Part | implemented | 1 | 1 | The settings part is read for the default tab stop and even/odd headers (test structure.rs columns_footers_and_even_odd_settings). |
| 11.3.4 | Endnotes Part | implemented | 1 | 1 | The endnotes part is read into Document::endnotes (test structure.rs notes_and_comments). |
| 11.3.5 | Font Table Part | incomplete | 2 | 0 | The font table part is read with its embedded fonts (parts.rs fonts); no DOCX test checks the entries. |
| 11.3.6 | Footer Part | implemented | 1 | 1 | Footer parts related to the main document are read and referenced by section properties (test structure.rs columns_footers_and_even_odd_settings). |
| 11.3.7 | Footnotes Part | implemented | 1 | 1 | The footnotes part is read into Document::footnotes, separators skipped (test structure.rs notes_and_comments). |
| 11.3.8 | Glossary Document Part | out of scope | 0 | 0 | The glossary document holds building blocks, not document content; it is not read. |
| 11.3.9 | Header Part | implemented | 1 | 1 | Header parts related to the main document are read and referenced by section properties (test structure.rs sections_split_at_paragraph_section_properties). |
| 11.3.10 | Main Document Part | implemented | 1 | 1 | The main document part is found through the package's officeDocument relationship, falling back to word/document.xml with a diagnostic (lib.rs main_part, tests structure.rs part_names_compare_case_insensitively and bare_package_falls_back_to_the_default_part_name). |
| 11.3.11 | Numbering Definitions Part | implemented | 1 | 1 | The numbering part is read into Document::numbering (test structure.rs numbering_definitions). |
| 11.3.12 | Style Definitions Part | implemented | 1 | 1 | The styles part is read into Document::styles (test structure.rs styles_and_defaults). |
| 11.3.13 | Web Settings Part | out of scope | 0 | 0 | Web settings affect HTML saving only; the part is not read. |
15 Shared
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 15.2 | Part Summary | incomplete | 4 | 2 | Image, font and file property parts are read, and embedded OLE objects for their Equation Editor equations; audio, video, other embedded objects and packages, custom XML, signatures, thumbnails and printer settings are not. |
| 15.2.1 | Additional Characteristics Part | not implemented | 0 | 0 | Additional characteristics parts are not read. |
| 15.2.2 | Audio Part | not implemented | 0 | 0 | Audio parts are not read. |
| 15.2.3 | Bibliography Part | not implemented | 0 | 0 | Bibliography parts are not read; citations keep their field results. |
| 15.2.4 | Content Part | not implemented | 0 | 0 | Content parts (w14 ink and similar) are not read. |
| 15.2.5 | Custom XML Data Storage Part | not implemented | 0 | 0 | Custom XML data storage parts are not read; data-bound content controls keep their cached text. |
| 15.2.6 | Custom XML Data Storage Properties Part | not implemented | 0 | 0 | Custom XML data storage properties parts are not read. |
| 15.2.7 | Digital Signature Origin Part | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 15.2.8 | Digital Signature XML Signature Part | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 15.2.9 | Embedded Control Persistence Part | out of scope | 0 | 0 | ActiveX control persistence is not read: controls are not document text. |
| 15.2.10 | Embedded Object Part | incomplete | 1 | 0 | An embedded OLE object with an Equation ProgID is read for the MTEF equation of its Equation Native stream (story.rs equation, tests fixtures.rs equation_editor_objects_give_their_equation, aio range.rs equations_read_without_media); other embedded objects are not read, and their preview image is, through w:object and v:imagedata. |
| 15.2.11 | Embedded Package Part | not implemented | 0 | 0 | Embedded packages (such as spreadsheets) are not read; their preview image is. |
| 15.2.12 | File Properties | implemented | 1 | 1 | Core and extended file properties are read into Document::metadata (parts.rs properties, test structure.rs document_properties). |
| 15.2.13 | Font Part | incomplete | 1 | 0 | Embedded font parts are loaded and deobfuscated through the font table's relationships (parts.rs fonts); no test builds a package with one. |
| 15.2.14 | Image Part | implemented | 1 | 1 | Image parts referenced by drawings are loaded into Document::media with their MIME type sniffed from the bytes (lib.rs load_media, test structure.rs drawings_and_media). |
| 15.2.15 | Printer Settings Part | out of scope | 0 | 0 | Printer settings do not affect text or layout; the part is not read. |
| 15.2.16 | Thumbnail Part | not implemented | 0 | 0 | The package thumbnail is not read. |
| 15.2.17 | Video Part | not implemented | 0 | 0 | Video parts are not read. |
17 WordprocessingML Reference Material
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 17.1 | Table of Contents | out of scope | 0 | 0 | Table of contents fields are read like any other field (see 17.16); the clause describes their use. |
| 17.2 | Main Document Story | incomplete | 5 | 3 | The document and its body are read; the page background is not. |
| 17.2.1 | background (Document Background) | not implemented | 0 | 0 | w:background is not read; pages render on white. |
| 17.2.2 | body (Document Body) | implemented | 3 | 1 | The body's block content is read into sections split at paragraph section properties (story.rs body, test structure.rs sections_split_at_paragraph_section_properties). |
| 17.2.3 | document (Document) | implemented | 1 | 1 | The main part's w:document root is read and its body becomes the main story (lib.rs parse_story, test structure.rs paragraphs_runs_and_breaks). |
| 17.3 | Paragraphs and Rich Formatting | incomplete | 38 | 35 | Paragraphs, runs and run content are read with most of their properties; the sub-clause rows say what is missing. |
| 17.3.1 | Paragraphs | incomplete | 16 | 15 | Justification, indentation, spacing, keep and widow controls, page break before, contextual spacing, numbering, outline level, tabs, borders, shading, bidi and frame properties are read (props.rs paragraph_properties); text direction, hyphenation suppression and East Asian typography settings are not. |
| 17.3.2 | Run | incomplete | 12 | 12 | Bold, italic, underline, strike, double strike, caps, small caps, hidden, fonts (theme fonts resolved), size, color, highlight, shading, vertical alignment, spacing, position, language, right-to-left and the complex script bold, italic, size and formatting flag (bCs, iCs, szCs, cs) are read (props.rs run_properties); emphasis marks, text effects, run borders, fit text and East Asian layout are not. |
| 17.3.3 | Run Content | incomplete | 6 | 6 | Text, tabs, breaks, carriage returns, hyphens, symbols, field characters and codes, note and comment references and marks, DrawingML and VML pictures are read (story.rs run_content), diagrams from their saved drawing and data model text (story/diagram.rs, test structure.rs diagrams_draw_their_saved_drawing), charts from their cached values (story/chart.rs, test structure.rs charts_read_their_cached_values), and Office Math zones as math trees (story/math.rs, test structure.rs office_math_reads_into_trees); ruby is ignored, positional tabs read as plain tabs, and embedded object data other than Equation Editor equations is not read. |
| 17.3.4 | Border Properties (CT_Border) | implemented | 1 | 1 | A border's style, width, spacing and color are read; styles other than single, thick, double, dotted and dashed read as BorderStyle::Other (props.rs border, test structure.rs table_row_and_cell_properties). |
| 17.3.5 | Shading Properties (CT_Shd) | incomplete | 1 | 1 | The fill color is read, or the pattern color for a solid pattern; other patterns reduce to their fill (props.rs shading). |
| 17.4 | Tables | incomplete | 55 | 41 | Tables, grids and row and cell properties and floating table positions are read; conditional formatting, cell spacing, property exceptions, diagonal borders and row grid offsets are not. |
| 17.4.1 | bidiVisual (Visually Right to Left Table) | implemented | 2 | 2 | bidiVisual is read (props.rs table_properties, test structure.rs complex_script_runs_and_right_to_left_tables) and lays the cells out from the right with their left and right borders and margins swapped, the indent from the right margin and the alignment reversed (table.rs, test layout.rs visually_right_to_left_tables_start_at_the_right). |
| 17.4.2 | bottom (Table Cell Bottom Margin Exception) | not implemented | 0 | 0 | Cell margin exceptions live in tblPrEx, which is not read. |
| 17.4.3 | bottom (Table Cell Bottom Border) | implemented | 1 | 1 | A cell's bottom border is read (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.4 | bottom (Table Bottom Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.5 | bottom (Table Cell Bottom Margin Default) | incomplete | 1 | 0 | Read by the same code as the other default cell margins (props.rs margins); no test covers this side. |
| 17.4.6 | cantSplit (Table Row Cannot Break Across Pages) | implemented | 1 | 1 | cantSplit is read into TableRowProperties::cant_split (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.7 | cnfStyle (Table Row Conditional Formatting) | not implemented | 0 | 0 | Conditional formatting (cnfStyle) is not read; table styles' conditional formats are not applied. |
| 17.4.8 | cnfStyle (Table Cell Conditional Formatting) | not implemented | 0 | 0 | Conditional formatting (cnfStyle) is not read; table styles' conditional formats are not applied. |
| 17.4.9 | divId (Associated HTML div ID) | not implemented | 0 | 0 | HTML div ids do not affect content; not read. |
| 17.4.10 | end (Table Cell Trailing Margin Exception) | not implemented | 0 | 0 | Cell margin exceptions live in tblPrEx, which is not read. |
| 17.4.11 | end (Table Cell Trailing Margin Default) | incomplete | 1 | 0 | Read by the same code as the other default cell margins (props.rs margins); no test covers this side. |
| 17.4.12 | end (Table Cell Trailing Edge Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.13 | end (Table Trailing Edge Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.14 | gridAfter (Grid Columns After Last Cell) | not implemented | 0 | 0 | gridAfter is not read; rows are laid out from their cells alone. |
| 17.4.15 | gridBefore (Grid Columns Before First Cell) | not implemented | 0 | 0 | gridBefore is not read; rows are laid out from their cells alone. |
| 17.4.16 | gridCol (Grid Column Definition) | implemented | 1 | 1 | gridCol widths form Table::grid (props.rs or story.rs, test structure.rs tables). |
| 17.4.17 | gridSpan (Grid Columns Spanned by Current Table Cell) | implemented | 1 | 1 | gridSpan is read, clamped to 1 to 64 (props.rs or story.rs, test structure.rs tables). |
| 17.4.18 | header (Header Cell Reference) | not implemented | 0 | 0 | Accessibility header cell references are not read. |
| 17.4.19 | headers (Header Cells Associated With Table Cell) | not implemented | 0 | 0 | Accessibility header cell references are not read. |
| 17.4.20 | hidden (Hidden Table Row Marker) | not implemented | 0 | 0 | Hidden row marks are not read. |
| 17.4.21 | hideMark (Ignore End Of Cell Marker In Row Height Calculation) | not implemented | 0 | 0 | hideMark is not read. |
| 17.4.22 | insideH (Table Inside Horizontal Edges Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.23 | insideH (Table Cell Inside Horizontal Edges Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.24 | insideV (Table Inside Vertical Edges Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.25 | insideV (Table Cell Inside Vertical Edges Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.26 | jc (Table Alignment Exception) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.27 | jc (Table Row Alignment) | not implemented | 0 | 0 | Row alignment (trPr jc) is not read. |
| 17.4.28 | jc (Table Alignment) | implemented | 2 | 1 | Table jc is read into TableProperties::justification (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.29 | noWrap (Don't Wrap Cell Content) | not implemented | 0 | 0 | noWrap is not read. |
| 17.4.30 | shd (Table Shading Exception) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.31 | shd (Table Shading) | implemented | 1 | 1 | Table shading is read into TableProperties::shading (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.32 | shd (Table Cell Shading) | implemented | 1 | 1 | Cell shading is read into TableCellProperties::shading (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.33 | start (Table Cell Leading Edge Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.34 | start (Table Cell Leading Margin Default) | implemented | 1 | 1 | The leading default cell margin is read (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.35 | start (Table Cell Leading Margin Exception) | not implemented | 0 | 0 | Cell margin exceptions live in tblPrEx, which is not read. |
| 17.4.36 | start (Table Leading Edge Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.37 | tbl (Table) | implemented | 1 | 1 | w:tbl is read into a Table block, nested tables included (props.rs or story.rs, test structure.rs tables). |
| 17.4.38 | tblBorders (Table Borders) | implemented | 2 | 1 | tblBorders is read, each side and the inside edges (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.39 | tblBorders (Table Borders Exceptions) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.40 | tblCaption (Table Caption) | not implemented | 0 | 0 | The table caption is not read. |
| 17.4.41 | tblCellMar (Table Cell Margin Exceptions) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.42 | tblCellMar (Table Cell Margin Defaults) | implemented | 1 | 1 | tblCellMar default margins are read (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.43 | tblCellSpacing (Table Row Cell Spacing) | not implemented | 0 | 0 | Cell spacing is not read; cells touch. |
| 17.4.44 | tblCellSpacing (Table Cell Spacing Exception) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.45 | tblCellSpacing (Table Cell Spacing Default) | not implemented | 0 | 0 | Cell spacing is not read; cells touch. |
| 17.4.46 | tblDescription (Table Description) | not implemented | 0 | 0 | The table description is not read. |
| 17.4.47 | tblGrid (Previous Table Grid) | not implemented | 0 | 0 | Tracked table grid changes are not read. |
| 17.4.48 | tblGrid (Table Grid) | implemented | 1 | 2 | tblGrid is read into Table::grid (props.rs or story.rs, test structure.rs tables). |
| 17.4.49 | tblHeader (Repeat Table Row on Every New Page) | implemented | 1 | 1 | tblHeader marks repeated header rows (props.rs or story.rs, test structure.rs tables). |
| 17.4.50 | tblInd (Table Indent from Leading Margin) | implemented | 1 | 1 | tblInd is read when given in twips (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.51 | tblInd (Table Indent from Leading Margin Exception) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.52 | tblLayout (Table Layout) | implemented | 1 | 1 | tblLayout fixed is read into TableProperties::fixed_layout (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.53 | tblLayout (Table Layout Exception) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.54 | tblLook (Table Style Conditional Formatting Settings Exception) | not implemented | 0 | 0 | tblLook is not read; table style conditional formats are not applied. |
| 17.4.55 | tblLook (Table Style Conditional Formatting Settings) | not implemented | 0 | 0 | tblLook is not read; table style conditional formats are not applied. |
| 17.4.56 | tblOverlap (Floating Table Allows Other Tables to Overlap) | not implemented | 0 | 0 | tblOverlap is not read; floating tables are placed as floats whatever it says. |
| 17.4.57 | tblpPr (Floating Table Positioning) | implemented | 3 | 2 | tblpPr is read (props.rs table_float, test fixtures.rs wrapping_frames_and_floating_tables_are_read) with LibreOffice's defaults for missing anchors; layout places the table as a float text wraps around, and a table taller than the text area flows with the text and is reported (flow.rs table_float, test layout.rs floating_tables_sit_at_their_position). |
| 17.4.58 | tblPr (Previous Table Properties) | not implemented | 0 | 0 | Tracked table property changes are not read. |
| 17.4.59 | tblPr (Table Properties) | incomplete | 1 | 1 | Style, width, alignment, indent, borders, shading, default cell margins, layout, bidiVisual and tblpPr are read (props.rs table_properties); tblLook, tblCellSpacing, tblOverlap, tblCaption and tblDescription are not. |
| 17.4.60 | tblPrEx (Table-Level Property Exceptions) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.61 | tblPrEx (Previous Table-Level Property Exceptions) | not implemented | 0 | 0 | Tracked table property changes are not read. |
| 17.4.62 | tblStyle (Referenced Table Style) | implemented | 1 | 1 | tblStyle is read into TableProperties::style_id (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.63 | tblW (Preferred Table Width) | implemented | 1 | 1 | tblW is read in twips or fiftieths of a percent; auto and nil give no width (props.rs or story.rs, test structure.rs tables). |
| 17.4.64 | tblW (Preferred Table Width Exception) | not implemented | 0 | 0 | Row-level property exceptions (tblPrEx) are not read. |
| 17.4.65 | tc (Table Cell) | implemented | 1 | 1 | w:tc is read with its properties and block content (props.rs or story.rs, test structure.rs tables). |
| 17.4.66 | tcBorders (Table Cell Borders) | implemented | 2 | 2 | tcBorders is read, each side and the inside edges (props.rs or story.rs, test structure.rs table_row_and_cell_properties); the border above a row, and the last row's bottom border, count in the row's height as LibreOffice lays Word tables out (table.rs drawn_width, test layout.rs table_borders_take_row_height_and_old_tables_outdent). |
| 17.4.67 | tcFitText (Fit Text Within Cell) | not implemented | 0 | 0 | tcFitText is not read. |
| 17.4.68 | tcMar (Single Table Cell Margins) | implemented | 1 | 1 | tcMar cell margins are read (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.69 | tcPr (Table Cell Properties) | incomplete | 1 | 1 | Width, grid span, vertical merge, borders, shading, vertical alignment and margins are read (props.rs cell_properties); noWrap, textDirection, tcFitText, hideMark, cnfStyle and horizontal merge are not. |
| 17.4.70 | tcPr (Previous Table Cell Properties) | not implemented | 0 | 0 | Tracked cell property changes are not read. |
| 17.4.71 | tcW (Preferred Table Cell Width) | implemented | 1 | 1 | tcW is read when given in twips (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.72 | textDirection (Table Cell Text Flow Direction) | implemented | 2 | 2 | btLr and tbRl (and the strict lr and rl) cells lay their text out along the row height, wrapping at a stated row height or else growing the row to the longest line, and turn it into the cell at paint time; tbLrV and lrV run across (props.rs text_direction, table.rs CellPlan::turn; tests structure.rs vertical_text_directions, layout.rs turned_cells_rotate_their_text). |
| 17.4.73 | tl2br (Table Cell Top Left to Bottom Right Diagonal Border) | not implemented | 0 | 0 | Diagonal cell borders are not read. |
| 17.4.74 | top (Table Cell Top Border) | incomplete | 1 | 0 | Read by the same code as the other border sides (props.rs borders); no test covers this side. |
| 17.4.75 | top (Table Cell Top Margin Default) | incomplete | 1 | 0 | Read by the same code as the other default cell margins (props.rs margins); no test covers this side. |
| 17.4.76 | top (Table Top Border) | implemented | 1 | 1 | The table's top border is read (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.77 | top (Table Cell Top Margin Exception) | not implemented | 0 | 0 | Cell margin exceptions live in tblPrEx, which is not read. |
| 17.4.78 | tr (Table Row) | implemented | 1 | 1 | w:tr is read with its properties and cells (props.rs or story.rs, test structure.rs tables). |
| 17.4.79 | tr2bl (Table Cell Top Right to Bottom Left Diagonal Border) | not implemented | 0 | 0 | Diagonal cell borders are not read. |
| 17.4.80 | trHeight (Table Row Height) | implemented | 1 | 1 | trHeight is read with hRule exact or at least (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.81 | trPr (Table Row Properties) | incomplete | 1 | 1 | Height, repeated header rows and cantSplit are read (props.rs row_properties); gridBefore, gridAfter, wBefore, wAfter, jc, hidden, cnfStyle and tblCellSpacing are not. |
| 17.4.82 | trPr (Previous Table Row Properties) | not implemented | 0 | 0 | Tracked row property changes are not read. |
| 17.4.83 | vAlign (Table Cell Vertical Alignment) | implemented | 1 | 1 | vAlign is read as top, center or bottom (props.rs or story.rs, test structure.rs table_row_and_cell_properties). |
| 17.4.84 | vMerge (Vertically Merged Cell) | implemented | 1 | 2 | vMerge restart and continue are read (props.rs or story.rs, test structure.rs tables). |
| 17.4.85 | wAfter (Preferred Width After Table Row) | not implemented | 0 | 0 | wAfter is not read. |
| 17.4.86 | wBefore (Preferred Width Before Table Row) | not implemented | 0 | 0 | wBefore is not read. |
| 17.4.87 | Table Measurement (CT_TblWidth) | not implemented | 0 | 0 | No reader code cites CT_TblWidth itself; widths are read in twips and percent as the tblW, tcW and tblInd rows say. |
| 17.5 | Custom Markup | incomplete | 2 | 1 | The content of structured document tags, smart tags and custom XML elements is read in place; their properties and data bindings are not. |
| 17.5.1 | Custom XML and Smart Tags | incomplete | 1 | 0 | Custom XML and smart tag elements are unwrapped and their content read (story.rs inline); their names and attributes are dropped. |
| 17.5.2 | Structured Document Tags | incomplete | 1 | 1 | sdtContent is read in place at block, row, cell and run level (test structure.rs markup_compatibility_and_content_controls); sdtPr (placeholders, data binding, control types) is not read. |
| 17.6 | Sections | incomplete | 18 | 21 | Page size, margins, columns, section type, the page number start and header and footer references are read; page borders, line numbering, document grid, text direction, vertical alignment and paper source are not. |
| 17.6.1 | bidi (Right to Left Section Layout) | not implemented | 0 | 0 | Right-to-left section layout is not read. |
| 17.6.2 | bottom (Bottom Border) | implemented | 1 | 2 | The bottom page border is read with the other sides of w:pgBorders and drawn around each page it shows on (props.rs section_properties, flow.rs page_border_lines; tests structure.rs page_borders, layout.rs page_borders_sit_at_their_offsets); w:shadow casts a black shadow as wide as the border to the right and below, the right and bottom lines moved in by that width as LibreOffice draws it (test layout.rs page_border_shadows_and_art_borders), and art borders are left out and reported, as LibreOffice leaves them out. |
| 17.6.3 | col (Single Column Definition) | implemented | 1 | 2 | Explicit column widths and spacing are read when equalWidth is off (props.rs section_properties, test structure.rs columns_footers_and_even_odd_settings). |
| 17.6.4 | cols (Column Definitions) | implemented | 1 | 1 | Column count, spacing, separator and equal width are read (props.rs section_properties, test structure.rs sections_split_at_paragraph_section_properties). |
| 17.6.5 | docGrid (Document Grid) | not implemented | 0 | 0 | The document grid is not read; lines are spaced by paragraph properties alone. |
| 17.6.6 | formProt (Only Allow Editing of Form Fields) | out of scope | 0 | 0 | Form editing restrictions do not affect reading. |
| 17.6.7 | left (Left Border) | implemented | 1 | 1 | The left page border is read with the other sides of w:pgBorders and drawn around each page it shows on (props.rs section_properties, flow.rs page_border_lines; tests structure.rs page_borders, layout.rs page_borders_sit_at_their_offsets); w:shadow casts a black shadow as wide as the border to the right and below, the right and bottom lines moved in by that width as LibreOffice draws it (test layout.rs page_border_shadows_and_art_borders), and art borders are left out and reported, as LibreOffice leaves them out. |
| 17.6.8 | lnNumType (Line Numbering Settings) | not implemented | 0 | 0 | Line numbering is not read or drawn. |
| 17.6.9 | paperSrc (Paper Source Information) | out of scope | 0 | 0 | Paper trays do not affect text or layout. |
| 17.6.10 | pgBorders (Page Borders) | implemented | 3 | 3 | The four sides, offsetFrom, display and zOrder are read (props.rs section_properties) and written back (write props.rs page_borders); layout draws each side through the border line code, from the page edge or outside the text area as LibreOffice places them, on the pages display names, under or over the page content (tests structure.rs page_borders, layout.rs page_borders_sit_at_their_offsets, package.rs page_borders_follow_the_margins). |
| 17.6.11 | pgMar (Page Margins) | implemented | 1 | 1 | All seven page margins are read, defaulting to one inch and half-inch header and footer (props.rs section_properties, test structure.rs sections_split_at_paragraph_section_properties). |
| 17.6.12 | pgNumType (Page Numbering Settings) | incomplete | 2 | 2 | Only the start value is read; the number format and chapter numbering are not. |
| 17.6.13 | pgSz (Page Size) | implemented | 1 | 1 | Width, height and orientation are read; the paper code is not (props.rs section_properties, test structure.rs sections_split_at_paragraph_section_properties). |
| 17.6.14 | printerSettings (Reference to Printer Settings Data) | out of scope | 0 | 0 | Printer settings do not affect text or layout. |
| 17.6.15 | right (Right Border) | implemented | 1 | 2 | The right page border is read with the other sides of w:pgBorders and drawn around each page it shows on (props.rs section_properties, flow.rs page_border_lines; tests structure.rs page_borders, layout.rs page_borders_sit_at_their_offsets); w:shadow casts a black shadow as wide as the border to the right and below, the right and bottom lines moved in by that width as LibreOffice draws it (test layout.rs page_border_shadows_and_art_borders), and art borders are left out and reported, as LibreOffice leaves them out. |
| 17.6.16 | rtlGutter (Gutter on Right Side of Page) | not implemented | 0 | 0 | rtlGutter is not read; the gutter is on the left. |
| 17.6.17 | sectPr (Document Final Section Properties) | implemented | 2 | 2 | A paragraph's sectPr ends a section and the body's describes the last one (props.rs section_properties, test structure.rs sections_split_at_paragraph_section_properties). |
| 17.6.18 | sectPr (Section Properties) | incomplete | 1 | 1 | Page size and margins, page borders, columns, type, page numbering start, the first-page switch and header and footer references are read (props.rs section_properties); the other children are not, as the rows of 17.6 say. |
| 17.6.19 | sectPr (Previous Section Properties) | not implemented | 0 | 0 | Tracked section property changes are not read. |
| 17.6.20 | textDirection (Text Flow Direction) | not implemented | 0 | 0 | Section text direction is not read; text runs horizontally. The corpus's vertical sections hold Japanese text, which a turned page would lay on its side. |
| 17.6.21 | top (Top Border) | implemented | 1 | 1 | The top page border is read with the other sides of w:pgBorders and drawn around each page it shows on (props.rs section_properties, flow.rs page_border_lines; tests structure.rs page_borders, layout.rs page_borders_sit_at_their_offsets); w:shadow casts a black shadow as wide as the border to the right and below, the right and bottom lines moved in by that width as LibreOffice draws it (test layout.rs page_border_shadows_and_art_borders), and art borders are left out and reported, as LibreOffice leaves them out. |
| 17.6.22 | type (Section Type) | implemented | 1 | 1 | nextPage, continuous, evenPage, oddPage and nextColumn are read (props.rs section_properties, test structure.rs sections_split_at_paragraph_section_properties). |
| 17.6.23 | vAlign (Vertical Text Alignment on Page) | not implemented | 0 | 0 | Vertical alignment of text on the page is not read; text starts at the top margin. |
| 17.7 | Styles | incomplete | 13 | 10 | Paragraph, character, table and numbering styles, based-on inheritance, document defaults and toggle properties are read and resolved; latent styles are ignored, and table styles neither take part in property resolution nor apply their conditional formats. |
| 17.7.1 | Style Inheritance | implemented | 1 | 1 | Styles::chain walks basedOn to the root, cutting cycles and chains longer than 32 (crates/docboss-model/src/style.rs, tests structure.rs styles_and_defaults and resolution.rs based_on_chain_resolves_root_first). |
| 17.7.2 | Style Hierarchy | incomplete | 3 | 4 | Styles::resolve_paragraph and resolve_run layer document defaults, the paragraph style chain, the list level, the character style chain and direct formatting; table styles are not in the hierarchy. |
| 17.7.3 | Toggle Properties | incomplete | 1 | 1 | Toggle properties set by both the paragraph and the character style chains cancel out (crates/docboss-model/src/style.rs, test resolution.rs toggle_properties_cancel_across_style_kinds); table style toggles are not included. |
| 17.7.4 | General Style Properties | implemented | 2 | 2 | Style type, id, name, basedOn, next, default and the pPr, rPr and tblPr of each style are read (parts.rs styles; DOC styles.rs from the STSH), tests structure.rs styles_and_defaults and read.rs character_and_paragraph_formatting. |
| 17.7.5 | Document Defaults | implemented | 1 | 1 | docDefaults rPrDefault and pPrDefault become Styles::default_run and default_paragraph (test structure.rs styles_and_defaults). |
| 17.7.6 | Table Styles | incomplete | 1 | 0 | Table styles are read with their table properties; their conditional formats (tblStylePr) are not applied and they do not take part in run or paragraph resolution. |
| 17.7.7 | Numbering Styles | incomplete | 1 | 0 | Numbering styles are read, and abstract definitions linked through numStyleLink take the levels of the style's definition (parts.rs resolve_style_links); no test covers it. |
| 17.7.8 | Paragraph Styles | implemented | 1 | 1 | Paragraph styles are read and resolved with their run properties, heading levels coming from outlineLvl or the style name (test structure.rs styles_and_defaults). |
| 17.7.9 | Run (Character) Styles | incomplete | 1 | 0 | Character styles are read and resolved by Styles::resolve_run; no DOCX test reads one. |
| 17.8 | Fonts | incomplete | 4 | 1 | Font table entries and embedded fonts are read; font substitution follows docboss-font's own table, not the file's panose1 and sig data. |
| 17.8.1 | Font Embedding | implemented | 1 | 1 | Embedded fonts are deobfuscated by XORing their first 32 bytes with the reversed fontKey GUID (parts.rs deobfuscate, unit test deobfuscation_uses_the_reversed_guid). |
| 17.8.2 | Font Substitution | not implemented | 0 | 0 | The file's substitution data (panose1, sig) is not read; docboss-font substitutes by name and FontEntry::family. |
| 17.8.3 | Elements | incomplete | 3 | 0 | w:font name, altName, family, pitch and the four embed elements are read (parts.rs fonts); charset, panose1 and sig are not, and no DOCX test reads a font table. |
| 17.9 | Numbering | incomplete | 23 | 18 | Abstract definitions, instances, overrides and levels are read and labels counted in document order; picture bullets and the level suffix are not read, and lvlRestart is not applied. |
| 17.9.1 | abstractNum (Abstract Numbering Definition) | implemented | 1 | 1 | abstractNum definitions are read with their levels (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.2 | abstractNumId (Abstract Numbering Definition Reference) | implemented | 1 | 1 | abstractNumId links an instance to its definition (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.3 | ilvl (Numbering Level Reference) | implemented | 1 | 1 | The paragraph's ilvl selects the list level, clamped to 0 to 8 (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.4 | isLgl (Display All Levels Using Arabic Numerals) | incomplete | 1 | 0 | isLgl is read and NumberingCounter shows every level as decimal; no test covers it. |
| 17.9.5 | lvl (Numbering Level Override Definition) | incomplete | 1 | 0 | Override levels replace the abstract level in Numbering::level; no test covers it. |
| 17.9.6 | lvl (Numbering Level Definition) | implemented | 1 | 1 | Level start, format, text, justification, restart, legal numbering and properties are read (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.7 | lvlJc (Justification) | incomplete | 1 | 0 | lvlJc is read into Level::justification; no test covers it. |
| 17.9.8 | lvlOverride (Numbering Level Definition Override) | implemented | 1 | 1 | lvlOverride start overrides and replacement levels are read (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.9 | lvlPicBulletId (Picture Numbering Symbol Definition Reference) | not implemented | 0 | 0 | Picture bullets are not read; such levels show their lvlText. |
| 17.9.10 | lvlRestart (Restart Numbering Level Symbol) | incomplete | 1 | 0 | lvlRestart is read into Level::restart_after, but NumberingCounter restarts a level whenever a shallower one advances and ignores the value. |
| 17.9.11 | lvlText (Numbering Level Text) | implemented | 1 | 2 | lvlText templates such as %1.%2) are filled by NumberingCounter; Symbol-font bullets map to Unicode (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.12 | multiLevelType (Abstract Numbering Definition Type) | out of scope | 0 | 0 | multiLevelType is informational and does not change labels. |
| 17.9.13 | name (Abstract Numbering Definition Name) | out of scope | 0 | 0 | Definition names are informational and do not change labels. |
| 17.9.14 | nsid (Abstract Numbering Definition Identifier) | out of scope | 0 | 0 | nsid identifies definitions when merging documents; it does not change labels. |
| 17.9.15 | num (Numbering Definition Instance) | implemented | 1 | 2 | num instances are read with their overrides (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.16 | numbering (Numbering Definitions) | implemented | 1 | 1 | The numbering part's definitions and instances are read (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.17 | numFmt (Numbering Format) | implemented | 1 | 1 | numFmt is read into NumberFormat (see 17.18.59) (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.18 | numId (Numbering Definition Instance Reference) | implemented | 1 | 1 | The paragraph's numId selects the instance; 0 removes numbering (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.19 | numIdMacAtCleanup (Last Reviewed Abstract Numbering Definition) | out of scope | 0 | 0 | numIdMacAtCleanup is editing state and does not change labels. |
| 17.9.20 | numPicBullet (Picture Numbering Symbol Definition) | not implemented | 0 | 0 | Picture bullets are not read; such levels show their lvlText. |
| 17.9.21 | numStyleLink (Numbering Style Reference) | incomplete | 1 | 0 | Definitions linked through numStyleLink take the levels of the numbering style's definition (parts.rs resolve_style_links); no test covers it. |
| 17.9.22 | pPr (Numbering Level Associated Paragraph Properties) | incomplete | 1 | 0 | Level paragraph properties are read and applied by Styles::resolve_paragraph; no test covers it. |
| 17.9.23 | pStyle (Paragraph Style's Associated Numbering Level) | incomplete | 1 | 0 | Output reads a paragraph's list membership from its resolved properties, so a style's numPr counts (crates/docboss-output/src/walk.rs); the level's pStyle element itself is not read. |
| 17.9.24 | rPr (Numbering Symbol Run Properties) | incomplete | 1 | 0 | Level run properties are read into Level::run; no test covers it. |
| 17.9.25 | start (Starting Value) | implemented | 1 | 1 | start gives a level's first number (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.26 | startOverride (Numbering Level Starting Value Override) | implemented | 1 | 1 | startOverride restarts a level of one instance (parts.rs numbering, test structure.rs numbering_definitions). |
| 17.9.27 | styleLink (Numbering Style Definition) | not implemented | 0 | 0 | styleLink is not read; linked definitions are resolved from numStyleLink (17.9.21). |
| 17.9.28 | suff (Content Between Numbering Symbol and Paragraph Text) | not implemented | 0 | 0 | The level suffix is not read; output and layout follow a label with a tab. |
| 17.9.29 | tmpl (Numbering Template Code) | out of scope | 0 | 0 | The template code is informational and does not change labels. |
| 17.10 | Headers and Footers | implemented | 7 | 7 | Header and footer parts, their references per page kind, the first-page switch and the even/odd setting are read (tests structure.rs sections_split_at_paragraph_section_properties and columns_footers_and_even_odd_settings); docboss-layout places them. |
| 17.10.1 | evenAndOddHeaders (Different Even/Odd Page Headers and Footers) | implemented | 1 | 1 | evenAndOddHeaders is read from the settings part into Settings::even_and_odd_headers (test structure.rs columns_footers_and_even_odd_settings). |
| 17.10.2 | footerReference (Footer Reference) | implemented | 1 | 1 | footerReference ids are read per default, first and even page kind (test structure.rs columns_footers_and_even_odd_settings). |
| 17.10.3 | ftr (Footer) | implemented | 1 | 1 | Footer parts are read as HeaderFooter bodies (test structure.rs columns_footers_and_even_odd_settings). |
| 17.10.4 | hdr (Header) | implemented | 1 | 1 | Header parts are read as HeaderFooter bodies (test structure.rs sections_split_at_paragraph_section_properties). |
| 17.10.5 | headerReference (Header Reference) | implemented | 1 | 1 | headerReference ids are read per default, first and even page kind (test structure.rs sections_split_at_paragraph_section_properties). |
| 17.10.6 | titlePg (Different First Page Headers and Footers) | implemented | 1 | 1 | titlePg is read into SectionProperties::title_page (test structure.rs sections_split_at_paragraph_section_properties). |
| 17.11 | Footnotes and Endnotes | incomplete | 13 | 13 | Footnote and endnote bodies, references and number marks are read; note properties (footnotePr and endnotePr: format, restart, start, position) are not. |
| 17.11.1 | continuationSeparator (Continuation Separator Mark) | incomplete | 1 | 0 | Continuation separator notes are skipped like separators; no test covers them. |
| 17.11.2 | endnote (Endnote Content) | implemented | 1 | 1 | Endnote bodies are read into Document::endnotes (lib.rs parse_story, test structure.rs notes_and_comments). |
| 17.11.3 | endnote (Special Endnote List) | not implemented | 0 | 0 | The settings' special note lists are not read; separator notes are recognized by their type in the notes part. |
| 17.11.4 | endnotePr (Document-Wide Endnote Properties) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.5 | endnotePr (Section-Wide Endnote Properties) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.6 | endnoteRef (Endnote Reference Mark) | incomplete | 1 | 0 | endnoteRef is read as the note number mark, like footnoteRef; no test covers the endnote form. |
| 17.11.7 | endnoteReference (Endnote Reference) | implemented | 1 | 1 | endnoteReference becomes RunContent::EndnoteReference (lib.rs parse_story, test structure.rs notes_and_comments). |
| 17.11.8 | endnotes (Document Endnotes) | implemented | 1 | 1 | The endnotes part is read (lib.rs parse_story, test structure.rs notes_and_comments). |
| 17.11.9 | footnote (Special Footnote List) | not implemented | 0 | 0 | The settings' special note lists are not read; separator notes are recognized by their type in the notes part. |
| 17.11.10 | footnote (Footnote Content) | implemented | 1 | 1 | Footnote bodies are read into Document::footnotes (lib.rs parse_story, test structure.rs notes_and_comments). |
| 17.11.11 | footnotePr (Section-Wide Footnote Properties) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.12 | footnotePr (Document-Wide Footnote Properties) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.13 | footnoteRef (Footnote Reference Mark) | implemented | 1 | 1 | footnoteRef becomes RunContent::NoteNumber (lib.rs parse_story, test structure.rs notes_and_comments). |
| 17.11.14 | footnoteReference (Footnote Reference) | implemented | 1 | 1 | footnoteReference becomes RunContent::FootnoteReference (lib.rs parse_story, test structure.rs notes_and_comments). |
| 17.11.15 | footnotes (Document Footnotes) | implemented | 1 | 1 | The footnotes part is read (lib.rs parse_story, test structure.rs notes_and_comments). |
| 17.11.16 | noEndnote (Suppress Endnotes In Document) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.17 | numFmt (Endnote Numbering Format) | incomplete | 1 | 0 | Endnotes are labelled lowerRoman, the default this clause gives (crates/docboss-output/src/walk.rs); the element itself is not read. |
| 17.11.18 | numFmt (Footnote Numbering Format) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.19 | numRestart (Footnote and Endnote Numbering Restart Location) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.20 | numStart (Footnote and Endnote Numbering Starting Value) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.21 | pos (Footnote Placement) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.22 | pos (Endnote Placement) | not implemented | 0 | 0 | Note properties are not read; footnotes number 1, 2, 3 and endnotes i, ii, iii from the start of the document. |
| 17.11.23 | separator (Footnote/Endnote Separator Mark) | implemented | 2 | 2 | Separator notes are skipped (lib.rs parse_story, test structure.rs notes_and_comments). |
| 17.12 | Glossary Document | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.1 | behavior (Entry Insertion Behavior) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.2 | behaviors (Entry Insertion Behaviors) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.3 | category (Entry Categorization) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.4 | description (Description for Entry) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.5 | docPart (Glossary Document Entry) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.6 | docPartBody (Contents of Glossary Document Entry) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.7 | docPartPr (Glossary Document Entry Properties) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.8 | docParts (List of Glossary Document Entries) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.9 | gallery (Gallery Associated With Entry) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.10 | glossaryDocument (Glossary Document Root Element) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.11 | guid (Entry ID) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.12 | name (Category Associated With Entry) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.13 | name (Entry Name) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.14 | style (Associated Paragraph Style Name) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.15 | type (Entry Type) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.12.16 | types (Entry Types) | out of scope | 0 | 0 | The glossary document holds building blocks for insertion, not document content; docboss does not read it. |
| 17.13 | Annotations | incomplete | 6 | 4 | Comments, insertions, deletions, moves and bookmarks are read; property revisions, range permissions and proofing marks are not. |
| 17.13.1 | Inline Annotations | out of scope | 0 | 0 | Descriptive clause; the inline annotations it introduces have their own rows (17.13.4 to 17.13.6). |
| 17.13.3 | Property Annotations | not implemented | 0 | 0 | Formatting revisions (rPrChange, pPrChange and the like) are not read; the current formatting is used. |
| 17.13.4 | Comments | implemented | 3 | 1 | Comments with author, initials, date and body are read, with their range marks and references (story.rs inline, test structure.rs notes_and_comments). |
| 17.13.5 | Revisions | incomplete | 2 | 2 | Insertions and deletions are read as Revision inlines with author and date, moves as insertions and deletions (test structure.rs revisions); paragraph mark, table and property revisions are not read. |
| 17.13.6 | Bookmarks | implemented | 1 | 1 | bookmarkStart and bookmarkEnd are read with their ids and names (story.rs inline, test structure.rs bookmarks). |
| 17.13.7 | Range Permissions | not implemented | 0 | 0 | permStart and permEnd are ignored. |
| 17.13.8 | Spelling and Grammar | out of scope | 0 | 0 | Proofing marks do not change content. |
| 17.14 | Mail Merge | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.1 | active (Record Is Included in Mail Merge) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.2 | activeRecord (Record Currently Displayed In Merged Document) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.3 | addressFieldName (Column Containing E-mail Address) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.4 | checkErrors (Mail Merge Error Reporting Setting) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.5 | colDelim (Column Delimiter for Data Source) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.6 | column (Index of Column Being Mapped) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.7 | column (Index of Column Containing Unique Values for Record) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.8 | connectString (Data Source Connection String) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.9 | dataSource (Data Source File Path) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.10 | dataType (Data Source Type) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.11 | destination (Merged Document Destination) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.12 | doNotSuppressBlankLines (Remove Blank Lines from Merged Documents) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.13 | dynamicAddress (Use Country-Based Address Field Ordering) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.14 | fHdr (First Row of Data Source Contains Column Names) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.15 | fieldMapData (External Data Source to Merge Field Mapping) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.16 | headerSource (Header Definition File Path) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.17 | lid (Merge Field Name Language ID) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.18 | linkToQuery (Query Contains Link to External Query File) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.19 | mailAsAttachment (Merged Document To E-Mail Attachment) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.20 | mailMerge (Mail Merge Settings) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.21 | mailSubject (Merged E-mail or Fax Subject Line) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.22 | mainDocumentType (Source Document Type) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.23 | mappedName (Predefined Merge Field Name) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.24 | name (Data Source Name for Column) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.25 | odso (Office Data Source Object Settings) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.26 | query (Query For Data Source Records To Merge) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.27 | recipientData (Data About Single Data Source Record) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.28 | recipientData (Reference to Inclusion/Exclusion Data for Data Source) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.29 | recipients (Inclusion/Exclusion Data for Data Source) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.30 | src (ODSO Data Source File Path) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.31 | table (Data Source Table Name) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.32 | type (ODSO Data Source Type) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.33 | type (Merge Field Mapping) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.34 | udl (UDL Connection String) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.35 | uniqueTag (Unique Value for Record) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.14.36 | viewMergedData (View Merged Data Within Document) | out of scope | 0 | 0 | Mail merge settings describe a data source connection; they do not change the document's content. |
| 17.15 | Settings | incomplete | 5 | 3 | defaultTabStop and evenAndOddHeaders are read from the settings part; the other settings are not. |
| 17.15.1 | Document Settings | incomplete | 3 | 1 | defaultTabStop and evenAndOddHeaders are read (parts.rs settings, test structure.rs columns_footers_and_even_odd_settings); zoom, protection, compatibility options and the rest are not. |
| 17.15.2 | Web Page Settings | out of scope | 0 | 0 | Web page settings affect HTML saving only. |
| 17.15.3 | Language Compatibility Settings | incomplete | 1 | 2 | Only the compatibilityMode compatSetting is read (parts.rs settings, test parts.rs settings_read_the_compatibility_mode) and written back; below 15, and when a file states none, tables move left by their first cell's left margin as Word 2007 and LibreOffice place them (test layout.rs table_borders_take_row_height_and_old_tables_outdent). The other compatibility settings are not read. |
| 17.16 | Fields and Hyperlinks | incomplete | 12 | 9 | Simple and complex fields keep their instruction and cached result, HYPERLINK fields become links and docboss-layout evaluates PAGE and NUMPAGES; other fields are not recalculated and form field data is not read. |
| 17.16.1 | Syntax | not implemented | 0 | 0 | Instructions are kept as text; only HYPERLINK arguments are parsed. |
| 17.16.2 | XML representation | out of scope | 0 | 0 | Descriptive clause; the elements it describes have their own rows (17.16.18, 17.16.19, 17.16.23). |
| 17.16.3 | Formulas and expressions | not implemented | 0 | 0 | Formula fields are not evaluated; their cached result is kept. |
| 17.16.4 | Field formatting | not implemented | 0 | 1 | Format switches are not applied; the cached result is kept. |
| 17.16.5 | Field definitions | incomplete | 2 | 2 | HYPERLINK becomes a hyperlink with its target, anchor and tooltip (test structure.rs complex_fields), and layout evaluates PAGE and NUMPAGES; other field types keep their cached results. |
| 17.16.6 | calcOnExit (Recalculate Fields When Current Field Is Modified) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.7 | checkBox (Checkbox Form Field Properties) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.8 | checked (Checkbox Form Field State) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.9 | ddList (Drop-Down List Form Field Properties) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.10 | default (Default Text Box Form Field String) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.11 | default (Default Drop-Down List Item Index) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.12 | default (Default Checkbox Form Field State) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.13 | delInstrText (Deleted Field Code) | incomplete | 1 | 0 | Deleted field codes are read like instrText (story.rs run_content); no test covers them. |
| 17.16.14 | enabled (Form Field Enabled) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.15 | entryMacro (Script Function to Execute on Form Field Entry) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.16 | exitMacro (Script Function to Execute on Form Field Exit) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.17 | ffData (Form Field Properties) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.18 | fldChar (Complex Field Character) | implemented | 3 | 1 | begin, separate and end field characters fold into Field inlines, nested and across runs and paragraphs (story.rs fold, tests structure.rs complex_fields and fields_spanning_paragraphs). |
| 17.16.19 | fldSimple (Simple Field) | implemented | 1 | 1 | fldSimple keeps its instruction and content as the result (test structure.rs hyperlinks_and_simple_fields). |
| 17.16.20 | format (Text Box Form Field Formatting) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.21 | helpText (Associated Help Text) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.22 | hyperlink (Hyperlink) | implemented | 2 | 1 | Hyperlinks are read with the relationship target, anchor and tooltip (test structure.rs hyperlinks_and_simple_fields). |
| 17.16.23 | instrText (Field Code) | implemented | 1 | 1 | instrText pieces are joined into the field's instruction (test structure.rs complex_fields). |
| 17.16.24 | label (Form Field Label) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.25 | listEntry (Drop-Down List Entry) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.26 | maxLength (Text Box Form Field Maximum Length) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.27 | name (Form Field Name) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.28 | result (Drop-Down List Selection) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.29 | size (Checkbox Form Field Size) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.30 | sizeAuto (Automatically Size Form Field) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.31 | statusText (Associated Status Text) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.32 | tabIndex (Form Field Navigation Order Index) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.33 | textInput (Text Box Form Field Properties) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.16.34 | type (Text Box Form Field Type) | not implemented | 0 | 0 | Form field data (ffData) is not read; the field's cached result is kept. |
| 17.17 | Miscellaneous Topics | incomplete | 2 | 2 | Boolean properties are read everywhere; alternative format chunks are reported as dropped and subdocuments are not followed. |
| 17.17.1 | Subdocuments | not implemented | 0 | 0 | subDoc references are not followed. |
| 17.17.2 | Alternative Format Import | incomplete | 1 | 1 | altChunk content is not imported; each occurrence is reported as dropped (story.rs block, test structure.rs alternative_format_chunks_are_reported). |
| 17.17.3 | Roundtripping Alternate Content | out of scope | 0 | 0 | The writer does not round-trip mc:AlternateContent; reading follows ECMA-376 Part 3. |
| 17.17.4 | Boolean Property (CT_OnOff) | implemented | 1 | 1 | on, off, true, false, 1, 0 and an absent val are read (xml.rs on_off_value and its unit test). |
| 17.18 | Simple Types | incomplete | 16 | 14 | Simple types are parsed where the elements using them are read; the rows of those elements say which values are handled. |
| 17.18.1 | ST_AnnotationVMerge (Table Cell Vertical Merge Revision Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.2 | ST_Border (Border Styles) | incomplete | 1 | 2 | single, thick, double, dotted, dashed, dotDash, dotDotDash and dashSmallGap are read and drawn, the dashed styles with round caps and the dash lengths LibreOffice uses (props.rs border, table.rs border_line; tests structure.rs dashed_border_styles, render.rs dashed_borders_paint_dashes); dashDotStroked is drawn dash-dotted as LibreOffice draws it; art borders (every value that is not a line style) are left out; the triple, thick-thin, 3-D and wave borders are drawn as single lines. |
| 17.18.3 | ST_BrClear (Line Break Text Wrapping Restart Location) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.4 | ST_BrType (Break Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.5 | ST_CaptionPos (Automatic Caption Positioning Values) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.6 | ST_ChapterSep (Chapter Separator Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.7 | ST_CharacterSpacing (Character-Level Whitespace Compression Settings) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.8 | ST_CombineBrackets (Two Lines in One Enclosing Character Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.9 | ST_DateTime (Standard Date and Time Storage Format) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.10 | ST_DecimalNumber (Decimal Number Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.11 | ST_DecimalNumberOrPercent (Percentage Measurement) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.12 | ST_Direction (Bidirectional Direction Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.13 | ST_DisplacedByCustomXml (Location of Custom XML Markup Displacing an Annotation) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.14 | ST_DocGrid (Document Grid Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.15 | ST_DocPartBehavior (Insertion Behavior Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.16 | ST_DocPartGallery (Entry Gallery Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.17 | ST_DocPartType (Entry Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.18 | ST_DocProtect (Document Protection Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.19 | ST_DocType (Document Classification Values) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.20 | ST_DropCap (Text Frame Drop Cap Location) | implemented | 2 | 1 | dropCap is read (props.rs frame_properties); a drop cap frame stands at the start of the next paragraph, a margin drop cap too as LibreOffice places it (flow.rs frame_float, tests fixtures.rs wrapping_frames_and_floating_tables_are_read, read.rs drop_cap_frames). |
| 17.18.21 | ST_EdGrp (Range Permision Editing Group) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.22 | ST_EdnPos (Endnote Positioning Location) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.23 | ST_EighthPointMeasure (Measurement in Eighths of a Point) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.24 | ST_Em (Emphasis Mark Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.25 | ST_FFHelpTextVal (Help Text Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.26 | ST_FFName (Form Field Name Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.27 | ST_FFStatusTextVal (Status Text Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.28 | ST_FFTextType (Text Box Form Field Type Values) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.29 | ST_FldCharType (Complex Field Character Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.30 | ST_FontFamily (Font Family Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.31 | ST_FrameLayout (Frameset Layout Order) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.32 | ST_FrameScrollbar (Frame Scrollbar Visibility) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.33 | ST_FtnEdn (Footnote or Endnote Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.34 | ST_FtnPos (Footnote Positioning Location) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.35 | ST_HAnchor (Horizontal Anchor Location) | implemented | 2 | 2 | hAnchor and horzAnchor are read into position bases (props.rs anchored_position, test fixtures.rs wrapping_frames_and_floating_tables_are_read). |
| 17.18.36 | ST_HdrFtr (Header or Footer Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.37 | ST_HeightRule (Height Rule) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.38 | ST_HexColor (Color Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.39 | ST_HexColorAuto (‘Automatic’ Color Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.40 | ST_HighlightColor (Text Highlight Colors) | incomplete | 2 | 0 | The sixteen highlight names map to RGB (xml.rs); no test covers it. |
| 17.18.41 | ST_Hint (Font Type Hint) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.42 | ST_HpsMeasure (Measurement in Half-Points) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.43 | ST_InfoTextType (Help or Status Text Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.44 | ST_Jc (Horizontal Alignment Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.45 | ST_JcTable (Table Alignment Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.46 | ST_LevelSuffix (Content Between Numbering Symbol and Paragraph Text) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.47 | ST_LineNumberRestart (Line Numbering Restart Position) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.48 | ST_LineSpacingRule (Line Spacing Rule) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.49 | ST_Lock (Locking Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.50 | ST_LongHexNumber (Eight Digit Hexadecimal Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.51 | ST_MacroName (Script Subroutine Name Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.52 | ST_MailMergeDataType (Mail Merge Data Source Type Values) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.53 | ST_MailMergeDest (Merged Document Destination Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.54 | ST_MailMergeDocType (Source Document Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.55 | ST_MailMergeOdsoFMDFieldType (Merge Field Mapping Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.56 | ST_MailMergeSourceType (Mail Merge ODSO Data Source Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.57 | ST_Merge (Merged Cell Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.58 | ST_MultiLevelType (Numbering Definition Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.59 | ST_NumberFormat (Numbering Format) | implemented | 1 | 1 | decimal, decimalZero, upper and lower Roman and letter, ordinal, bullet and none are mapped; other formats label as decimal (parts.rs number_format), held to 954 vectors from the Lean reference (crates/docboss-model/tests/ledger_vectors.rs). |
| 17.18.60 | ST_ObjectDrawAspect (Embedded Object Representations) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.61 | ST_ObjectUpdateMode (Embedded Object Update Modes) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.62 | ST_PageBorderDisplay (Page Border Display Options) | implemented | 1 | 1 | allPages, firstPage and notFirstPage pick the pages a page border is drawn on (props.rs section_properties, flow.rs shows_on; test layout.rs page_borders_sit_at_their_offsets). |
| 17.18.63 | ST_PageBorderOffset (Page Border Positioning Base) | implemented | 1 | 1 | page and text set what a page border's space is measured from (props.rs section_properties, flow.rs page_border_lines; test layout.rs page_borders_sit_at_their_offsets). |
| 17.18.64 | ST_PageBorderZOrder (Page Border Z-Order) | implemented | 1 | 1 | back draws page borders under the page content, front over it (props.rs section_properties; test structure.rs page_borders). |
| 17.18.65 | ST_PageOrientation (Page Orientation) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.66 | ST_Pitch (Font Pitch Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.67 | ST_PixelsMeasure (Measurement in Pixels) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.68 | ST_PointMeasure (Measurement in Points) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.69 | ST_Proof (Proofing State Values) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.70 | ST_ProofErr (Proofing Error Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.71 | ST_PTabAlignment (Absolute Position Tab Alignment) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.72 | ST_PTabLeader (Absolute Position Tab Leader Character) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.73 | ST_PTabRelativeTo (Absolute Position Tab Positioning Base) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.74 | ST_RestartNumber (Footnote/Endnote Numbering Restart Locations) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.75 | ST_RubyAlign (Phonetic Guide Text Alignment) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.76 | ST_SdtDateMappingType (Date Storage Format Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.77 | ST_SectionMark (Section Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.78 | ST_Shd (Shading Patterns) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.79 | ST_ShortHexNumber (Four Digit Hexadecimal Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.80 | ST_SignedHpsMeasure (Signed Measurement in Half-Points) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.81 | ST_SignedTwipsMeasure (Signed Measurement in Twentieths of a Point) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.82 | ST_StyleSort (Style Sort Settings) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.83 | ST_StyleType (Style Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.84 | ST_TabJc (Custom Tab Stop Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.85 | ST_TabTlc (Custom Tab Stop Leader Character) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.86 | ST_TargetScreenSz (Target Screen Sizes for Generated Web Pages) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.87 | ST_TblLayoutType (Table Layout Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.88 | ST_TblOverlap (Table Overlap Setting) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.89 | ST_TblStyleOverrideType (Conditional Table Style Formatting Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.90 | ST_TblWidth (Table Width Units) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.91 | ST_TextAlignment (Vertical Text Alignment Types) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.92 | ST_TextboxTightWrap (Lines To Tight Wrap Within Text Box) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.93 | ST_TextDirection (Text Flow Direction) | incomplete | 1 | 1 | The cell values are read (props.rs text_direction, test structure.rs vertical_text_directions); the rotated East Asian variants run across. |
| 17.18.94 | ST_TextEffect (Animated Text Effects) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.95 | ST_TextScale (Text Expansion/Compression Percentage) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.96 | ST_Theme (Theme Font) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.97 | ST_ThemeColor (Theme Color) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.98 | ST_UcharHexNumber (Two Digit Hexadecimal Value) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.99 | ST_Underline (Underline Patterns) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.100 | ST_VAnchor (Vertical Anchor Location) | implemented | 2 | 2 | vAnchor and vertAnchor are read into position bases (props.rs anchored_position, test fixtures.rs wrapping_frames_and_floating_tables_are_read). |
| 17.18.101 | ST_VerticalJc (Vertical Alignment Type) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.102 | ST_View (Document View Values) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.103 | ST_WmlColorSchemeIndex (Theme Color Reference) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.104 | ST_Wrap (Text Wrapping around Text Frame Type) | implemented | 2 | 2 | The frame wrap types are read (props.rs frame_properties) and laid out: around, auto and tight flow text beside the frame, notBeside moves it below, none lets it run under (flow.rs frame_float, tests fixtures.rs wrapping_frames_and_floating_tables_are_read, layout.rs text_frames_sit_apart_and_text_flows_around_them). |
| 17.18.105 | ST_Zoom (Magnification Preset Values) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.106 | ST_TextScalePercent (Text Expansion/Compression Percentage) | not implemented | 0 | 0 | No reader code cites this clause. |
| 17.18.107 | ST_MeasurementOrPercent (Measurement or Percentage Value) | not implemented | 0 | 0 | No reader code cites this clause. |
20 DrawingML - Framework Reference Material
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 20.4 | DrawingML - WordprocessingML Drawing | incomplete | 62 | 76 | Inline and anchored pictures and shapes with their extent, name, description, offsets, text box content and geometry are read and drawn, preset (all 186 presetShapeDefinitions.xml shapes, generated by crates/docboss-layout/tools/presets.py) and custom geometry turned and flipped by a:xfrm, with line ends, groups and drawing canvases with their members placed through each group's child coordinates, and linear and path gradient fills; text wraps around anchored objects in the body as the wrap rows say; picture and pattern fills are not. |
| 20.4.2 | Elements | incomplete | 49 | 58 | inline, anchor, extent, docPr, positionH, positionV, posOffset, the wrap elements and wrapPolygon, wsp, txbx, txbxContent, wgp, grpSp, grpSpPr and wpc are read; the other elements are not, as their rows say. |
| 20.4.2.1 | align (Relative Horizontal Alignment) | implemented | 2 | 4 | wp:align in positionH is read into DrawingPosition::align and layout places the object at the start, center or end of its base, inside and outside by page parity (story.rs drawing_children, flow.rs Frame::place; tests fixtures.rs word_aligned_text_box, layout.rs aligned_floats_sit_on_their_base). |
| 20.4.2.2 | align (Relative Vertical Alignment) | implemented | 2 | 2 | wp:align in positionV is read into DrawingPosition::align and layout places the object at the top, center or bottom of its base (story.rs drawing_children, flow.rs Frame::place; tests structure.rs drawing_alignment_and_bases, layout.rs aligned_floats_sit_on_their_base). |
| 20.4.2.3 | anchor (Anchor for Floating DrawingML Object) | incomplete | 2 | 4 | behindDoc, the positionH and positionV offsets, bases and alignments and the distances from the text are read (tests structure.rs drawings_and_media, drawing_alignment_and_bases, fixtures.rs wrapping_frames_and_floating_tables_are_read); simplePos and z-order are not. |
| 20.4.2.4 | cNvGraphicFramePr (Common DrawingML Non-Visual Properties) | not implemented | 0 | 0 | Not read. |
| 20.4.2.5 | docPr (Drawing Object Non-Visual Properties) | implemented | 2 | 1 | docPr name and descr are read into Drawing::name and description (story.rs drawing_children, test structure.rs drawings_and_media); a drawing marked hidden is left out and reported. |
| 20.4.2.6 | effectExtent (Object Extents Including Effects) | not implemented | 0 | 0 | effectExtent is not read; drawings take their extent alone. |
| 20.4.2.7 | extent (Drawing Object Size) | implemented | 1 | 1 | extent cx and cy are read into Drawing::width and height (story.rs drawing_children, test structure.rs drawings_and_media). |
| 20.4.2.8 | inline (Inline DrawingML Object) | implemented | 2 | 1 | Inline pictures are read with their extent and image (story.rs drawing_children, test structure.rs drawings_and_media). |
| 20.4.2.9 | lineTo (Wrapping Polygon Line End Position) | implemented | 1 | 1 | lineTo points are read into the wrap polygon (story.rs wrap, test fixtures.rs wrapping_frames_and_floating_tables_are_read). |
| 20.4.2.10 | positionH (Horizontal Positioning) | implemented | 2 | 3 | relativeFrom, posOffset and align are read into Drawing placement (story.rs drawing_children, tests structure.rs drawing_alignment_and_bases, fixtures.rs word_aligned_text_box); character positions are laid out from the column. |
| 20.4.2.11 | positionV (Vertical Positioning) | implemented | 2 | 2 | relativeFrom, posOffset and align are read into Drawing placement (story.rs drawing_children, tests structure.rs drawing_alignment_and_bases, fixtures.rs word_aligned_text_box); line positions are laid out from the paragraph's first line. |
| 20.4.2.12 | posOffset (Absolute Position Offset) | implemented | 1 | 1 | posOffset gives the anchor offset in EMU (story.rs drawing_children, test structure.rs drawings_and_media). |
| 20.4.2.13 | simplePos (Simple Positioning Coordinates) | not implemented | 0 | 0 | simplePos is not read. |
| 20.4.2.14 | start (Wrapping Polygon Start) | implemented | 1 | 1 | start is read as the wrap polygon's first point (story.rs wrap, test fixtures.rs wrapping_frames_and_floating_tables_are_read). |
| 20.4.2.15 | wrapNone (No Text Wrapping) | implemented | 2 | 1 | Read (story.rs wrap); text runs under or over the object (flow.rs register_floats). |
| 20.4.2.16 | wrapPolygon (Wrapping Polygon) | implemented | 3 | 3 | The polygon is read (story.rs wrap) and tight and through wrapping follow it across each line's height (wrap.rs outline_extent, tests fixtures.rs wrapping_frames_and_floating_tables_are_read, wrap.rs tight_wrapping_follows_the_polygon). |
| 20.4.2.17 | wrapSquare (Square Wrapping) | implemented | 3 | 5 | Read (story.rs wrap, test fixtures.rs wrapping_frames_and_floating_tables_are_read) and laid out: lines beside the object are shortened, or split in two when text flows on both sides, and move below it when no span is wide enough (paragraph.rs break_rows, wrap.rs band, tests wrap.rs and layout.rs square_wrapping_flows_text_on_both_sides, one_sided_and_top_and_bottom_wrapping, wrapping_moves_with_its_page, a_page_placed_picture_wraps_the_text_above_its_anchor). |
| 20.4.2.18 | wrapThrough (Through Wrapping) | implemented | 3 | 1 | Read (story.rs wrap, test fixtures.rs wrapping_frames_and_floating_tables_are_read) and laid out: lines beside the object are shortened, or split in two when text flows on both sides, and move below it when no span is wide enough (paragraph.rs break_rows, wrap.rs band, tests wrap.rs and layout.rs square_wrapping_flows_text_on_both_sides, one_sided_and_top_and_bottom_wrapping, wrapping_moves_with_its_page, a_page_placed_picture_wraps_the_text_above_its_anchor). Through wrapping follows the polygon like tight wrapping. |
| 20.4.2.19 | wrapTight (Tight Wrapping) | implemented | 3 | 3 | Read (story.rs wrap, test fixtures.rs wrapping_frames_and_floating_tables_are_read) and laid out: lines beside the object are shortened, or split in two when text flows on both sides, and move below it when no span is wide enough (paragraph.rs break_rows, wrap.rs band, tests wrap.rs and layout.rs square_wrapping_flows_text_on_both_sides, one_sided_and_top_and_bottom_wrapping, wrapping_moves_with_its_page, a_page_placed_picture_wraps_the_text_above_its_anchor). The wrap polygon gives the outline. |
| 20.4.2.20 | wrapTopAndBottom (Top and Bottom Wrapping) | implemented | 3 | 3 | Read (story.rs wrap, test fixtures.rs wrapping_frames_and_floating_tables_are_read) and laid out: lines beside the object are shortened, or split in two when text flows on both sides, and move below it when no span is wide enough (paragraph.rs break_rows, wrap.rs band, tests wrap.rs and layout.rs square_wrapping_flows_text_on_both_sides, one_sided_and_top_and_bottom_wrapping, wrapping_moves_with_its_page, a_page_placed_picture_wraps_the_text_above_its_anchor). |
| 20.4.2.21 | bg (Background Formatting) | not implemented | 0 | 0 | Not read. |
| 20.4.2.22 | bodyPr (Body Properties) | incomplete | 2 | 6 | lIns, tIns, rIns, bIns, anchor and a:spAutoFit are read, and text that overflows a box without spAutoFit is clipped to the box less its insets, as Word and LibreOffice draw it whatever vertOverflow and horzOverflow say (story.rs drawing_children, textbox.rs layout_text_box, paint.rs Renderer::render; tests layout.rs text_boxes_grow_to_fit_and_anchor_their_text, render.rs overflowing_text_box_content_is_clipped_to_its_insets). vert (vert, eaVert and mongolianVert top to bottom, vert270 bottom to top; wordArtVert runs across with a note) and upright are read; text turns with its shape's a:xfrm rotation, a vertical flip adding a half turn, through a transform the renderer applies to glyph outlines and images (textbox.rs text_map, paint.rs Renderer::turned; tests structure.rs vertical_text_directions, layout.rs text_boxes_turn_their_text, render.rs transforms_turn_rectangles_and_text); rot, wrap, columns and the other attributes are not read. |
| 20.4.2.23 | cNvCnPr (Non-Visual Connector Shape Drawing Properties) | not implemented | 0 | 0 | Not read. |
| 20.4.2.24 | cNvContentPartPr (Non-Visual Content Part Drawing Properties) | not implemented | 0 | 0 | Not read. |
| 20.4.2.25 | cNvFrPr (Non-Visual Graphic Frame Drawing Properties) | not implemented | 0 | 0 | Not read. |
| 20.4.2.26 | cNvGrpSpPr (Non-Visual Group Shape Drawing Properties) | not implemented | 0 | 0 | Not read. |
| 20.4.2.27 | cNvPr (Non-Visual Drawing Properties) | not implemented | 0 | 0 | Not read. |
| 20.4.2.28 | cNvSpPr (Non-Visual Drawing Properties for a Shape) | not implemented | 0 | 0 | Not read. |
| 20.4.2.29 | contentPart (Content Part) | not implemented | 0 | 0 | Not read. |
| 20.4.2.30 | extLst (Extension List) | not implemented | 0 | 0 | Not read. |
| 20.4.2.31 | graphicFrame (Graphical object container) | implemented | 1 | 1 | A group's graphic frame is read as a member at its wpg:xfrm box, holding the chart or diagram its graphic names (story/group.rs, test structure.rs group_graphic_frames_hold_charts). |
| 20.4.2.32 | grpSp (Group Shape) | implemented | 1 | 1 | Nested groups are read up to 16 deep; their members are placed through every group around them into the members of the outer drawing (story/group.rs StoryParser::group, model group.rs GroupFrame::place_through; tests structure.rs group_members_are_placed_through_their_groups, group.rs group_frames_place_children). |
| 20.4.2.33 | grpSpPr (Group Shape Properties) | implemented | 1 | 1 | The a:xfrm offset, extent, child offset, child extent, rotation and flips map the members' boxes; a child turned by a quarter scales along the swapped axes (story/group.rs group_transform, model group.rs GroupFrame::place; tests structure.rs group_members_are_placed_through_their_groups, group.rs group_frames_place_children). |
| 20.4.2.34 | linkedTxbx (Textual contents of shape) | not implemented | 0 | 0 | Not read. |
| 20.4.2.35 | spPr (Shape Properties) | incomplete | 1 | 2 | Solid fills, the outline with its dash, cap, join and line ends, the preset or custom geometry and the a:xfrm rotation and flips are read (story.rs shape_properties, geometry.rs) and drawn (drawn.rs shape_items; tests structure.rs shape_preset_geometry_transform_and_line_ends and shape_custom_geometry, layout.rs shapes_without_text_paint_their_geometry, render.rs preset_shapes_fill_and_stroke_their_outline); a:gradFill linear and path gradients with their stops and focus rectangle are read and painted per pixel (story.rs gradient_fill, shade.rs Shader; tests structure.rs shape_gradient_fill, render.rs gradient_fills_shade_across_the_shape); picture and pattern fills and effects are not. |
| 20.4.2.36 | style (Shape Style) | not implemented | 0 | 0 | Not read. |
| 20.4.2.37 | txbx (Textual contents of shape) | implemented | 1 | 1 | wps:txbx is read for its text box content (story.rs drawing_children, test structure.rs drawings_and_media). |
| 20.4.2.38 | txbxContent (Rich Text Box Content Container) | implemented | 3 | 4 | txbxContent is read as block content into Drawing::text_box (story.rs drawing_children, test structure.rs drawings_and_media). |
| 20.4.2.39 | wgp (WordprocessingML Shape Group) | implemented | 2 | 3 | A group's shapes, text boxes, pictures and nested groups become Drawing::members, laid out and painted in order at their boxes (story/group.rs, textbox.rs layout_group; tests structure.rs group_members_are_placed_through_their_groups, layout.rs groups_paint_their_members_in_place). |
| 20.4.2.40 | whole (Whole E2O Formatting) | not implemented | 0 | 0 | Not read. |
| 20.4.2.41 | wpc (WordprocessingML Drawing Canvas) | incomplete | 1 | 1 | A canvas's shapes, pictures and groups become members at their offsets in the canvas; an empty canvas keeps its extent (story/group.rs; test structure.rs canvas_members_keep_their_offsets); wpc:bg and wpc:whole are not read. |
| 20.4.2.42 | wsp (WordprocessingML Shape) | implemented | 1 | 1 | WordprocessingML shapes are read for their text box content (story.rs drawing_children, test structure.rs drawings_and_media) and drawn with their geometry, with or without text (test layout.rs shapes_without_text_paint_their_geometry). |
| 20.4.2.43 | xfrm (2D Transform for Graphic Frames) | not implemented | 0 | 0 | Not read. |
| 20.4.3 | Simple Types | incomplete | 13 | 18 | The alignment, relative positioning, wrap distance and wrap side types are read, as their rows say; ST_PositionOffset is not. |
| 20.4.3.1 | ST_AlignH (Relative Horizontal Alignment Positions) | implemented | 2 | 4 | left, center, right, inside and outside are read (story.rs position_align) and placed by layout (flow.rs Frame::place; tests structure.rs drawing_alignment_and_bases, layout.rs aligned_floats_sit_on_their_base). |
| 20.4.3.2 | ST_AlignV (Vertical Alignment Definition) | implemented | 2 | 2 | top, center, bottom, inside and outside are read (story.rs position_align) and placed by layout (flow.rs Frame::place; tests structure.rs drawing_alignment_and_bases, layout.rs aligned_floats_sit_on_their_base). |
| 20.4.3.3 | ST_PositionOffset (Absolute Position Offset Value) | not implemented | 0 | 0 | No reader code cites this type; positions and wrapping values are read only as the 20.4.2 rows say. |
| 20.4.3.4 | ST_RelFromH (Horizontal Relative Positioning) | implemented | 2 | 4 | Every value is read (story.rs position_base) and laid out against the page, margins, column or page margin areas (flow.rs Frame::horizontal; tests structure.rs drawing_alignment_and_bases, layout.rs aligned_floats_sit_on_their_base); character is laid out from the column. |
| 20.4.3.5 | ST_RelFromV (Vertical Relative Positioning) | implemented | 2 | 2 | Every value is read (story.rs position_base) and laid out against the page, margins, paragraph or margin areas (flow.rs Frame::vertical; tests structure.rs drawing_alignment_and_bases, layout.rs aligned_floats_sit_on_their_base); line is laid out from the paragraph's first line, insideMargin as the top margin and outsideMargin as the bottom margin. |
| 20.4.3.6 | ST_WrapDistance (Distance from Text) | implemented | 1 | 2 | distT, distB, distL and distR are read from wp:anchor and the wrap elements (story.rs wrap_distances, test fixtures.rs wrapping_frames_and_floating_tables_are_read) and keep text away (wrap.rs Exclusion). |
| 20.4.3.7 | ST_WrapText (Text Wrapping Location) | implemented | 4 | 4 | wrapText is read (story.rs wrap_side, test fixtures.rs wrapping_frames_and_floating_tables_are_read): both sides, left, right or the side with more room (wrap.rs band, tests wrap.rs square_wrapping_leaves_the_allowed_sides, layout.rs one_sided_and_top_and_bottom_wrapping). |
22 Shared MLs Reference Material
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 22.2 | Extended Properties | incomplete | 2 | 2 | Application, Company, Pages, Words and Characters are read into Metadata (parts.rs properties, test structure.rs document_properties); the other extended properties are not. |
| 22.2.2 | Elements | incomplete | 1 | 1 | Application, Company, Pages, Words and Characters are read; the other elements are not. |
ECMA-376 Part 2: Open Packaging Conventions (5th edition, 2021)
6 Abstract package model
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 6.2 | Parts | incomplete | 2 | 3 | Part names, media types and XML parts are read; growth hints are ignored and part name syntax is not validated. |
| 6.2.2 | Part names | incomplete | 1 | 2 | Part names resolve and compare case-insensitively (test structure.rs part_names_compare_case_insensitively); their syntax is not validated, so malformed names are read as written. |
| 6.2.3 | Media types | implemented | 1 | 1 | A part's media type comes from its Override, else the Default for its extension (package.rs content_type, test structure.rs part_names_compare_case_insensitively). |
| 6.2.4 | Growth hint | out of scope | 0 | 0 | Growth hints pad parts for in-place editing; readers ignore them. |
| 6.2.5 | XML usage | not implemented | 0 | 0 | The clause's XML restrictions are not enforced: a DOCTYPE is skipped rather than refused and any encoding the tokenizer can decode is accepted. |
| 6.3 | Part addressing | out of scope | 0 | 0 | Pack IRIs address parts from outside the package; docboss reads parts by name. |
| 6.3.2 | Pack scheme | out of scope | 0 | 0 | Pack IRIs address parts from outside the package; docboss reads parts by name. |
| 6.3.3 | Resolving a pack IRI to a resource | out of scope | 0 | 0 | Pack IRIs address parts from outside the package; docboss reads parts by name. |
| 6.3.4 | Composing a pack IRI | out of scope | 0 | 0 | Pack IRIs address parts from outside the package; docboss reads parts by name. |
| 6.3.5 | Equivalence | out of scope | 0 | 0 | Pack IRIs address parts from outside the package; docboss reads parts by name. |
| 6.4 | Resolving relative references | implemented | 3 | 2 | Relationship targets resolve against the source part's directory with dot segments removed and percent escapes decoded (package.rs resolve_target, unit test resolves_targets). |
| 6.4.2 | Base IRIs | implemented | 1 | 1 | The source part is the base IRI of its relationships (package.rs resolve_target, unit test resolves_targets). |
| 6.4.3 | Examples | out of scope | 0 | 1 | Informative examples; the unit test resolves_targets follows them. |
| 6.5 | Relationships | implemented | 5 | 3 | Package and part relationships are read by id with their type, target and target mode (package.rs, tests structure.rs and package.rs names_relationship_parts). |
| 6.5.2 | Relationships part | implemented | 2 | 1 | A part's relationships part name is derived from the part name, the package's being _rels/.rels (package.rs rels_name, unit test names_relationship_parts). |
| 6.5.3 | Relationship markup | implemented | 2 | 1 | Relationship Id, Type, Target and TargetMode are read; type URIs match on their last segment, so transitional and strict types agree (test structure.rs part_names_compare_case_insensitively). |
| 6.5.4 | Examples | out of scope | 0 | 0 | Informative examples. |
7 Physical package model
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 7.2 | Physical mapping guidelines | incomplete | 3 | 3 | Parts map to ZIP items by name and media types come from the Media Types stream; interleaved parts are not reassembled. |
| 7.2.1 | Using features of physical formats | out of scope | 0 | 0 | Guidance for designers of physical formats. |
| 7.2.2 | Mapped components | out of scope | 0 | 0 | Guidance for designers of physical formats. |
| 7.2.3 | Mapping media types to parts | implemented | 2 | 2 | [Content_Types].xml Default and Override elements are read (package.rs read_content_types, tests structure.rs part_names_compare_case_insensitively and write package.rs every_part_has_a_content_type). |
| 7.2.4 | Interleaving | not implemented | 0 | 0 | Interleaved parts (split into [n].piece items) are not reassembled; such a part is not found. |
| 7.2.5 | Mapping part names to physical package item names | implemented | 1 | 1 | A part name maps to the ZIP item of the same name without its leading slash (package.rs existing_name, test structure.rs part_names_compare_case_insensitively). |
| 7.3 | Mapping to a ZIP file | incomplete | 6 | 7 | Parts are read from and written to ZIP items with the Media Types stream; interleaved pieces and growth hints are not handled. |
| 7.3.2 | Mapping part data | implemented | 1 | 1 | Part data is the ZIP item's data (test structure.rs part_names_compare_case_insensitively). |
| 7.3.3 | ZIP item names | implemented | 1 | 1 | ZIP item names are decoded per APPNOTE and matched to part names (test structure.rs part_names_compare_case_insensitively). |
| 7.3.4 | Mapping logical item names to ZIP item names | implemented | 1 | 1 | The writer stores each part under its name without the leading slash (crates/docboss-write/src/package.rs, test package.rs every_part_has_a_content_type). |
| 7.3.5 | Mapping ZIP item names to logical item names | implemented | 1 | 2 | ZIP item names match part names case-insensitively (test structure.rs part_names_compare_case_insensitively). |
| 7.3.6 | ZIP package limitations | out of scope | 0 | 0 | Constraints on producers; the reader accepts ZIP64 archives and names beyond them. |
| 7.3.7 | Mapping the Media Types stream | implemented | 2 | 2 | The Media Types stream is the [Content_Types].xml item, read by the reader and written by the writer (tests structure.rs part_names_compare_case_insensitively and package.rs every_part_has_a_content_type). |
| 7.3.8 | Mapping the growth hint | out of scope | 0 | 0 | Growth hints pad parts for in-place editing; readers ignore them. |
8 Core properties
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 8.2 | Core Properties part | implemented | 1 | 1 | The core properties part is found through the package relationship (parts.rs properties, test structure.rs document_properties). |
| 8.3 | Core properties markup | incomplete | 3 | 3 | Title, subject, creator, keywords, description, lastModifiedBy, revision, created, modified and category are read; contentStatus, identifier, language, lastPrinted and version are not. |
| 8.3.2 | Support for versioning and extensibility | not implemented | 0 | 0 | Markup compatibility attributes in the core properties part are not processed. |
| 8.3.3 | coreProperties element | implemented | 1 | 1 | The coreProperties root is read (test structure.rs document_properties). |
| 8.3.4 | Core property elements | incomplete | 1 | 1 | Ten core property elements are read (test structure.rs document_properties); contentStatus, identifier, language, lastPrinted and version are not. |
10 Digital signatures
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 10.2 | Overview of OPC-specific restrictions and extensions to “XML-Signature Syntax and Processing” | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.3 | Choosing content to sign | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.4 | Digital signature parts | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.4.2 | Digital Signature Origin part | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.4.3 | Digital Signature XML Signature part | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.4.4 | Digital Signature Certificate part | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5 | Digital signature markup | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.2 | Support for versioning and extensibility | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.3 | Signature element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.4 | SignedInfo element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.5 | CanonicalizationMethod element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.6 | SignatureMethod element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.7 | Reference element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.8 | Transform element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.9 | RelationshipReference element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.10 | RelationshipsGroupReference element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.11 | DigestMethod element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.12 | Object element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.13 | Manifest element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.14 | SignatureProperty element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.15 | SignatureTime element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.16 | Format element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.17 | Value element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.5.18 | XPath element | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.6 | Relationships transform algorithm | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.7 | Digital signature example | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.8 | Generating signatures | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
| 10.9 | Validating signatures | out of scope | 0 | 0 | Digital signatures are not read or verified; reading content does not depend on them. |
ECMA-376 Part 3: Markup Compatibility and Extensibility (5th edition, 2015)
7 MCE Elements and Attributes
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 7.2 | Ignorable Attribute | not implemented | 0 | 0 | mc:Ignorable is not read; elements in namespaces the reader does not know are skipped whether or not they are ignorable. |
| 7.3 | ProcessContent Attribute | not implemented | 0 | 0 | ProcessContent is not read; the content of unknown elements is dropped. |
| 7.4 | MustUnderstand Attribute | not implemented | 0 | 0 | MustUnderstand is not read; documents that set it are not refused. |
| 7.5 | AlternateContent Element | implemented | 2 | 1 | AlternateContent is read at block, run and drawing level through one chooser (story.rs alternate_content, test structure.rs markup_compatibility_and_content_controls). |
| 7.6 | Choice Element | implemented | 1 | 1 | The first Choice whose Requires namespaces the reader understands is read (test structure.rs markup_compatibility_and_content_controls). |
| 7.7 | Fallback Element | implemented | 1 | 1 | Fallback is read when no Choice is understood (test structure.rs markup_compatibility_and_content_controls). |
9 Semantic Definitions and Reference Processing Model
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 9.1 | Overview | out of scope | 0 | 0 | Informative overview. |
| 9.2 | Step 1: Processing the Ignorable and ProcessContent Attributes | not implemented | 0 | 0 | Step 1 is not performed: Ignorable and ProcessContent are not read. |
| 9.3 | Step 2: Processing the AlternateContent, Choice and Fallback Elements | implemented | 2 | 3 | Choice and Fallback selection follows step 2 (story.rs alternate_content, test structure.rs markup_compatibility_and_content_controls). |
| 9.4 | Step 3: Processing the MustUnderstand Attribute and Creating the Output Document | not implemented | 0 | 0 | Step 3 is not performed: MustUnderstand is not checked. |
[MS-DOC]: Word (.doc) Binary File Format
2 Structures
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 2.1 | File Structure | incomplete | 7 | 4 | The WordDocument, table and Data streams, the summary streams and the Equation Native streams of the ObjectPool are read; other ObjectPool objects, custom XML, macros, signatures and IRM storages are not. |
| 2.1.1 | WordDocument Stream | implemented | 1 | 1 | The WordDocument stream holds the FIB, the text and the FKPs (document.rs, test read.rs text_matches_libreoffice). |
| 2.1.3 | Data Stream | implemented | 1 | 1 | The Data stream is read for PICF picture data (test read.rs inline_picture). |
| 2.1.4 | ObjectPool Storage | incomplete | 2 | 1 | The Equation Native stream of each object storage is read as an Equation Editor 3 equation and given to the preview picture of the field whose separator names the storage (document.rs equations, test read.rs equation_editor_objects); other embedded objects are not read. |
| 2.1.5 | Custom XML Data Storage | not implemented | 0 | 0 | Custom XML data storage is not read. |
| 2.1.6 | Summary Information Stream | implemented | 1 | 1 | SummaryInformation gives the title, author and other metadata (test read.rs metadata_and_format). |
| 2.1.7 | Document Summary Information Stream | incomplete | 1 | 0 | DocumentSummaryInformation gives the company and counts (property.rs); no DOC test checks those fields. |
| 2.1.8 | Encryption Stream | not implemented | 0 | 0 | Not read. |
| 2.1.9 | Macros Storage | out of scope | 0 | 0 | Macros are code, not content. |
| 2.1.10 | XML Signatures Storage | out of scope | 0 | 0 | Signatures are not read or verified; reading content does not depend on them. |
| 2.1.11 | Signatures Stream | out of scope | 0 | 0 | Signatures are not read or verified; reading content does not depend on them. |
| 2.1.12 | Information Rights Management Data Space Storage | not implemented | 0 | 0 | IRM-protected documents are not decrypted. |
| 2.1.13 | Protected Content Stream | not implemented | 0 | 0 | IRM-protected documents are not decrypted. |
| 2.2 | Fundamental Concepts | incomplete | 13 | 7 | CPs, PLCs, STTBs, sprm property storage, RC4 decryption and XOR obfuscation of Word 97 and later files are handled. |
| 2.2.1 | Character Position (CP) | implemented | 1 | 1 | CPs map to stream offsets through the piece table (text.rs, test read.rs text_matches_libreoffice). |
| 2.2.2 | PLC | implemented | 1 | 1 | PLCs are read as CP arrays with fixed-size data elements (document.rs plc, test read.rs text_matches_libreoffice). |
| 2.2.3 | Valid Selection | out of scope | 0 | 0 | Selection validity constrains editing, not reading. |
| 2.2.4 | STTB | implemented | 2 | 1 | Extended and non-extended STTBs are read with their extra data (sttb.rs, test read.rs font_table). |
| 2.2.5 | Property Storage | implemented | 4 | 2 | grpprls are walked with operand sizes from the spra bits (sprm.rs, unit tests and read.rs character_and_paragraph_formatting). |
| 2.2.6 | Encryption and Obfuscation (Password to Open) | incomplete | 5 | 2 | RC4 and RC4 CryptoAPI encryption are decrypted with the password (crypt.rs, test read.rs encrypted_documents), and XOR obfuscation undone with the docboss-crypt XOR array, the password tried through the document code page and by low bytes (document.rs deobfuscate, test read.rs xor_obfuscated_documents, fixtures made by tools/xor_obfuscate.py); password-protected Word 6 and 95 files are refused. |
| 2.3 | Document Parts | incomplete | 12 | 9 | All seven document parts are located by their CP ranges; no test has a header text box. |
| 2.3.1 | Main Document | implemented | 1 | 1 | The main document range comes first in the CP space (document.rs, test read.rs text_matches_libreoffice). |
| 2.3.2 | Footnotes | implemented | 2 | 2 | Footnote text is read per note through PlcffndTxt (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.3.3 | Headers | implemented | 1 | 1 | Header and footer stories are read through Plcfhdd, each section inheriting unset ones from the previous section (document.rs, test read.rs sections_and_headers). |
| 2.3.4 | Comments | implemented | 2 | 2 | Comment text is read per comment through PlcfandTxt (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.3.5 | Endnotes | implemented | 2 | 2 | Endnote text is read per note through PlcfendTxt (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.3.6 | Textboxes | implemented | 2 | 1 | Text box stories are read through PlcftxbxTxt (document.rs, test read.rs floating_picture_and_text_box). |
| 2.3.7 | Header Textboxes | incomplete | 1 | 0 | Header text box stories are read through PlcfHdrtxbxTxt like main text boxes (document.rs); no test covers them. |
| 2.4 | Document Content | incomplete | 11 | 10 | Text, paragraph and cell boundaries, tables and direct and style formatting are read; VtHyperlink application data is not. |
| 2.4.1 | Retrieving Text | implemented | 2 | 2 | Text is retrieved piece by piece, 8-bit pieces through the FcCompressed mapping (story.rs, test read.rs text_matches_libreoffice). |
| 2.4.2 | Determining Paragraph Boundaries | implemented | 2 | 1 | Paragraph marks end paragraphs; PAPX runs give their properties (story.rs, test read.rs text_matches_libreoffice). |
| 2.4.3 | Overview of Tables | implemented | 3 | 2 | Table depth and TTP marks build rows and nested tables (story.rs, test read.rs tables_with_merges_and_nesting). |
| 2.4.4 | Determining Cell Boundaries | implemented | 1 | 1 | Cell marks end cells at each table depth (story.rs, test read.rs tables_with_merges_and_nesting). |
| 2.4.5 | Determining Row Boundaries | implemented | 1 | 1 | Row ends come from TTP paragraphs at each depth (story.rs, test read.rs tables_with_merges_and_nesting). |
| 2.4.6 | Applying Properties | implemented | 2 | 3 | Styles, CHPX and PAPX formatting and list properties are applied in the order the clause gives (story.rs, test read.rs character_and_paragraph_formatting). |
| 2.4.7 | Application Data For VtHyperlink | not implemented | 0 | 0 | VtHyperlink application data is not read; hyperlinks come from HYPERLINK fields. |
| 2.5 | The File Information Block | incomplete | 13 | 10 | FibBase, FibRgLw97 and FibRgFcLcb97 are read; FibRgW97, the later FibRgFcLcb blocks and FibRgCswNew are skipped by their counts. The Word 6 and 95 FIB (nFib below 0x00C1: counts at 0x34, 38 fc/lcb pairs at 0x58 in the Word 97 order) is read too (word6.rs fill_fib, test read.rs word6_formatting_sections_and_headers). |
| 2.5.1 | Fib | implemented | 1 | 3 | The FIB is read from the start of the WordDocument stream (fib.rs, test read.rs text_matches_libreoffice). |
| 2.5.2 | FibBase | implemented | 1 | 1 | FibBase gives wIdent, nFib, lid, the complex, encrypted, table stream and obfuscation flags and the encryption key (fib.rs, test read.rs text_matches_libreoffice). |
| 2.5.3 | FibRgW97 | not implemented | 0 | 0 | FibRgW97 is skipped by its count; nothing in it is needed. |
| 2.5.4 | FibRgLw97 | implemented | 2 | 1 | FibRgLw97 gives the character count of every document part (fib.rs, test read.rs text_matches_libreoffice). |
| 2.5.5 | FibRgFcLcb | implemented | 1 | 1 | The FibRgFcLcb pairs are read as far as cbRgFcLcb says (fib.rs, test read.rs text_matches_libreoffice). |
| 2.5.6 | FibRgFcLcb97 | implemented | 2 | 1 | The FibRgFcLcb97 offsets locate every table stream structure docboss reads (fib.rs, test read.rs text_matches_libreoffice). |
| 2.5.7 | FibRgFcLcb2000 | not implemented | 0 | 0 | Skipped by its count: nothing docboss reads lives there. |
| 2.5.8 | FibRgFcLcb2002 | not implemented | 0 | 0 | Skipped by its count: nothing docboss reads lives there. |
| 2.5.9 | FibRgFcLcb2003 | not implemented | 0 | 0 | Skipped by its count: nothing docboss reads lives there. |
| 2.5.10 | FibRgFcLcb2007 | not implemented | 0 | 0 | Skipped by its count: nothing docboss reads lives there. |
| 2.5.11 | FibRgCswNew | not implemented | 0 | 0 | Skipped by its count: nothing docboss reads lives there. |
| 2.5.12 | FibRgCswNewData2000 | not implemented | 0 | 0 | Skipped by its count: nothing docboss reads lives there. |
| 2.5.13 | FibRgCswNewData2007 | not implemented | 0 | 0 | Skipped by its count: nothing docboss reads lives there. |
| 2.5.14 | Determining the nFib | incomplete | 1 | 1 | Word 97 and later files are told from FibBase.nFib alone (fib.rs is_word97); FibRgCswNew.nFibNew is not consulted. |
| 2.5.15 | How to read the FIB | implemented | 4 | 2 | The FIB is read in the order the clause gives, each block sized by the count before it (fib.rs, test read.rs text_matches_libreoffice). |
| 2.6 | Single Property Modifiers | incomplete | 13 | 12 | The character, paragraph, table and section sprms that map to model properties are applied; the rest are skipped by their operand size, and picture sprms are not read. |
| 2.6.1 | Character Properties | incomplete | 1 | 3 | The sprms that map to model properties are applied (props.rs or table.rs, test read.rs character_and_paragraph_formatting); the others are skipped by their operand size. |
| 2.6.2 | Paragraph Properties | incomplete | 2 | 3 | The sprms that map to model properties are applied (props.rs or table.rs, test read.rs character_and_paragraph_formatting), the frame sprms among them (props.rs apply_frame_prl, test read.rs drop_cap_frames); the others are skipped by their operand size. |
| 2.6.3 | Table Properties | incomplete | 6 | 4 | The sprms that map to model properties are applied (props.rs or table.rs, test read.rs tables_with_merges_and_nesting), the floating table sprms among them (table.rs table_float, test read.rs shape_wrapping_and_floating_tables); the others are skipped by their operand size. |
| 2.6.4 | Section Properties | incomplete | 3 | 2 | The sprms that map to model properties are applied (props.rs or table.rs, test read.rs sections_and_headers); the others are skipped by their operand size. |
| 2.6.5 | Picture Properties | not implemented | 0 | 0 | Picture sprms are not read; pictures take their size from the PICF. |
| 2.7 | Document Properties | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.1 | Dop | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.2 | DopBase | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.3 | Dop95 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.4 | Dop97 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.5 | Dop2000 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.6 | Dop2002 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.7 | Dop2003 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.8 | Dop2007 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.9 | Dop2010 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.10 | Dop2013 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.11 | Copts60 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.12 | Copts80 | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.13 | Copts | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.14 | Asumyi | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.15 | Dogrid | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.16 | DopTypography | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.7.17 | DopMth | not implemented | 0 | 0 | The Dop is not read; document settings keep their defaults, such as the 720-twip default tab stop. |
| 2.8 | PLCs | incomplete | 27 | 18 | The PLCs for formatting, notes, comments, bookmarks, headers, sections, shapes, text boxes and pieces are read; Plcfld, proofing, factoid, revision and web PLCs are not. |
| 2.8.1 | Plcbkf | incomplete | 1 | 0 | Comment range starts (PlcfAtnBkf) are read (document.rs comment_references); no test checks the ranges. |
| 2.8.2 | Plcbkfd | not implemented | 0 | 0 | Factoid bookmarks are not read. |
| 2.8.3 | Plcbkl | incomplete | 1 | 0 | Comment range ends (PlcfAtnBkl) are read (document.rs comment_references); no test checks the ranges. |
| 2.8.4 | Plcbkld | not implemented | 0 | 0 | Factoid bookmarks are not read. |
| 2.8.5 | PlcBteChpx | implemented | 2 | 1 | The CHPX bin table locates the character FKPs (document.rs, test read.rs character_and_paragraph_formatting). |
| 2.8.6 | PlcBtePapx | implemented | 2 | 1 | The PAPX bin table locates the paragraph FKPs (document.rs, test read.rs character_and_paragraph_formatting). |
| 2.8.7 | PlcfandRef | implemented | 2 | 1 | Comment references are read with their ATRDPre10 author and bookmark data (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.8.8 | PlcfandTxt | implemented | 1 | 1 | Comment text ranges are read (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.8.9 | PlcfAsumy | out of scope | 0 | 0 | Auto summary data does not change content. |
| 2.8.10 | Plcfbkf | implemented | 2 | 1 | Bookmark starts are read (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.8.11 | Plcfbkfd | not implemented | 0 | 0 | Factoid bookmarks are not read. |
| 2.8.12 | Plcfbkl | implemented | 1 | 1 | Bookmark ends are read (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.8.13 | Plcfbkld | not implemented | 0 | 0 | Factoid bookmarks are not read. |
| 2.8.14 | Plcfcookie | out of scope | 0 | 0 | Cookie data does not change content. |
| 2.8.15 | PlcfcookieOld | out of scope | 0 | 0 | Cookie data does not change content. |
| 2.8.16 | PlcfendRef | implemented | 1 | 1 | Endnote references are read (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.8.17 | PlcfendTxt | implemented | 1 | 1 | Endnote text ranges are read (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.8.18 | Plcffactoid | not implemented | 0 | 0 | Smart tag factoids are not read; their text is. |
| 2.8.19 | PlcffndRef | implemented | 2 | 1 | Footnote references are read (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.8.20 | PlcffndTxt | implemented | 1 | 1 | Footnote text ranges are read (document.rs, test read.rs notes_comments_fields_bookmarks). |
| 2.8.21 | Plcfgram | out of scope | 0 | 0 | Proofing state does not change content. |
| 2.8.22 | Plcfhdd | implemented | 2 | 1 | Header and footer ranges are read per section and story kind (document.rs, test read.rs sections_and_headers). |
| 2.8.23 | PlcfHdrtxbxTxt | incomplete | 1 | 0 | Header text box story ranges are read (document.rs); no test covers them. |
| 2.8.24 | Plcflad | out of scope | 0 | 0 | Language auto-detection state does not change content. |
| 2.8.25 | Plcfld | not implemented | 0 | 0 | Fields are found by their 0x13, 0x14 and 0x15 characters; Plcfld is not read. |
| 2.8.26 | PlcfSed | implemented | 2 | 2 | Section boundaries are read with each Sed's SEPX offset (document.rs, test read.rs sections_and_headers). |
| 2.8.27 | PlcfSpa | implemented | 2 | 2 | Shape anchors are read with their Spa data (document.rs, test read.rs floating_picture_and_text_box). |
| 2.8.28 | Plcfspl | out of scope | 0 | 0 | Proofing state does not change content. |
| 2.8.29 | PlcfTch | out of scope | 0 | 0 | The text cache does not change content. |
| 2.8.30 | PlcfTxbxBkd | not implemented | 0 | 0 | Linked text box chains are not followed; each text box story is read whole. |
| 2.8.31 | PlcfTxbxHdrBkd | not implemented | 0 | 0 | Linked text box chains are not followed; each text box story is read whole. |
| 2.8.32 | PlcftxbxTxt | implemented | 2 | 2 | Text box story ranges are read (document.rs, test read.rs floating_picture_and_text_box). |
| 2.8.33 | Plcfuim | not implemented | 0 | 0 | Not read. |
| 2.8.34 | PlcfWKB | not implemented | 0 | 0 | Not read. |
| 2.8.35 | PlcPcd | implemented | 1 | 1 | The piece table is read from the Clx (document.rs, test read.rs text_matches_libreoffice). |
| 2.9 | Basic Types | incomplete | 91 | 79 | Basic types are read where the structures above need them; each row says whether its type is. |
| 2.9.1 | Acd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.2 | Afd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.3 | ASUMY | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.4 | ATNBE | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.5 | AtrdExtra | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.6 | ATRDPost10 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.7 | ATRDPre10 | implemented | 1 | 1 | ATRDPre10 gives each comment's author index and bookmark id (test read.rs notes_comments_fields_bookmarks). |
| 2.9.8 | BKC | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.9 | BKF | implemented | 1 | 1 | BKF entries pair bookmark starts with their ends (test read.rs notes_comments_fields_bookmarks). |
| 2.9.10 | BKFD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.11 | BKL | implemented | 1 | 1 | BKL entries end bookmarks (test read.rs notes_comments_fields_bookmarks). |
| 2.9.12 | BKLD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.13 | BlockSel | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.14 | Bool16 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.15 | Bool8 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.16 | Brc | incomplete | 1 | 1 | Brc values are read with their fShadow bit (props.rs brc; test props.rs border_shadow_bits); fFrame is not. |
| 2.9.17 | Brc80 | incomplete | 2 | 2 | Brc80 values are read for paragraph, cell and page borders (props.rs brc80; test props.rs page_borders_from_section_sprms), with fShadow; fFrame is not. |
| 2.9.18 | Brc80MayBeNil | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.19 | BrcCvOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.20 | BrcMayBeNil | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.21 | BrcOperand | implemented | 1 | 1 | The BrcOperand of sprmSBrcTop to sprmSBrcRight is read past its cb byte into a page border side (props.rs apply_sep; test props.rs page_borders_from_section_sprms). |
| 2.9.22 | BrcType | incomplete | 1 | 1 | none, single, thick, double, dotted, dashed, dotDash, dotDotDash, dashSmallGap and dashDotStroked are read, and 0x40 to 0xE3 as art borders, which are not drawn (props.rs brc_style; test props.rs dashed_border_types); the other types are read as single. |
| 2.9.23 | BxPap | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.24 | CAPI | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.25 | CDB | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.26 | CellHideMarkOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.27 | CellRangeFitText | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.28 | CellRangeNoWrap | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.29 | CellRangeTextFlow | implemented | 1 | 1 | sprmTTextFlow sets the text flow of its range of cells (table.rs RowInfo::parse, test table.rs cells_take_their_text_flow). |
| 2.9.30 | CellRangeVertAlign | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.31 | CFitTextOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.32 | Chpx | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.33 | ChpxFkp | implemented | 3 | 1 | ChpxFkp pages give character runs and their CHPX (test read.rs character_and_paragraph_formatting). |
| 2.9.34 | Cid | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.35 | CidAllocated | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.36 | CidFci | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.37 | CidMacro | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.38 | Clx | implemented | 3 | 1 | The Clx is read as Prc entries then the Pcdt (test read.rs text_matches_libreoffice). |
| 2.9.39 | CMajorityOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.40 | Cmt | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.41 | CNFOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.42 | CNS | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.43 | COLORREF | implemented | 1 | 1 | COLORREF values become colors, fAuto giving auto (test read.rs character_and_paragraph_formatting). |
| 2.9.44 | COSL | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.45 | CSSA | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.46 | CSSAOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.47 | CSymbolOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.48 | CTB | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.49 | CTBWRAPPER | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.50 | Customization | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.51 | DCS | implemented | 1 | 2 | sprmPDcs's DCS gives a frame's drop cap type and lines (props.rs apply_frame_prl, test read.rs drop_cap_frames). |
| 2.9.52 | DefTableShd80Operand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.53 | DefTableShdOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.54 | DispFldRmOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.55 | Dofr | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.56 | DofrFsn | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.57 | DofrFsnFnm | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.58 | DofrFsnName | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.59 | DofrFsnp | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.60 | DofrFsnSpbd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.61 | Dofrh | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.62 | DofrRglstsf | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.63 | Dofrt | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.64 | DPCID | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.65 | DTTM | implemented | 1 | 1 | DTTM values become ISO 8601 dates (test read.rs notes_comments_fields_bookmarks). |
| 2.9.66 | FACTOIDINFO | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.67 | FactoidSpls | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.68 | FarEastLayoutOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.69 | Fatl | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.70 | FBKF | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.71 | FBKFD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.72 | FBKLD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.73 | FcCompressed | implemented | 1 | 2 | FcCompressed selects 8-bit or UTF-16 pieces, 8-bit through the Windows-1252 exceptions (test read.rs text_matches_libreoffice). |
| 2.9.74 | FCCT | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.75 | Fci | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.76 | FCKS | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.77 | FCKSOLD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.78 | FFData | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.79 | FFDataBits | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.80 | FFID | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.81 | FFM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.82 | FFN | implemented | 4 | 1 | FFN entries give font names, families and pitch (test read.rs font_table). |
| 2.9.83 | FieldMapBase | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.84 | FieldMapDataItem | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.85 | FieldMapInfo | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.86 | FieldMapTerminator | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.87 | FilterDataItem | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.88 | Fld | implemented | 1 | 1 | Fld markers are folded into fields (test read.rs notes_comments_fields_bookmarks). |
| 2.9.89 | fldch | implemented | 1 | 1 | fldch values tell begin, separator and end (test read.rs notes_comments_fields_bookmarks). |
| 2.9.90 | flt | incomplete | 1 | 1 | Only flt 0x58 (HYPERLINK) changes how a field is read; other types keep their cached results. |
| 2.9.91 | FNFB | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.92 | FNIF | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.93 | FNPI | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.94 | FOBJH | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.95 | FrameTextFlowOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.96 | FSDAP | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.97 | Fsnk | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.98 | Fssd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.99 | FssUnits | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.100 | FTO | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.101 | Fts | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.102 | FtsWWidth_Indent | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.103 | FtsWWidth_Table | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.104 | FtsWWidth_TablePart | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.105 | FTXBXNonReusable | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.106 | FTXBXS | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.107 | FTXBXSReusable | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.108 | GOSL | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.109 | GrammarSpls | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.110 | grffldEnd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.111 | grfhic | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.112 | GRFSTD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.113 | GrLPUpxSw | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.114 | GrpPrlAndIstd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.115 | HFD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.116 | HFDBits | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.117 | Hplxsdr | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.118 | HresiOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.119 | Ico | incomplete | 1 | 0 | Ico values are read (props.rs or text.rs); no test covers them. |
| 2.9.120 | IDPCI | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.121 | Ipat | incomplete | 1 | 1 | Clear and solid fill, and the percentage patterns (5% to 90%, 12.5%, 15%) mix the foreground into the background as LibreOffice paints them (props.rs pattern_fill, tests props.rs shading_patterns_mix_their_colors, read.rs word95_tables_merge_and_shade_their_cells); stripes, crosses and the other new percentages keep the background. |
| 2.9.122 | IScrollType | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.123 | ItcFirstLim | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.124 | Kcm | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.125 | Kme | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.126 | Kt | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.127 | Kul | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.128 | LadSpls | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.129 | LBCOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.130 | LEGOXTR_V11 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.131 | LFO | implemented | 1 | 1 | LFO entries become numbering instances (test read.rs list_labels). |
| 2.9.132 | LFOData | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.133 | LFOLVL | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.134 | LID | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.135 | LPStd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.136 | LPStshi | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.137 | LPStshiGrpPrl | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.138 | LPUpxChpx | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.139 | LPUpxChpxRM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.140 | LPUpxPapx | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.141 | LPUpxPapxRM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.142 | LPUpxRm | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.143 | LPUpxTapx | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.144 | LPXCharBuffer9 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.145 | LSD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.146 | LSPD | implemented | 1 | 1 | LSPD gives line spacing and its rule (test read.rs character_and_paragraph_formatting). |
| 2.9.147 | LSTF | implemented | 1 | 1 | LSTF gives each list's id and level count (test read.rs list_labels). |
| 2.9.148 | Lstsf | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.149 | LVL | implemented | 2 | 1 | LVL gives each level's format, start, text and properties (test read.rs list_labels). |
| 2.9.150 | LVLF | implemented | 1 | 1 | LVLF gives each level's fixed fields (test read.rs list_labels). |
| 2.9.151 | MacroName | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.152 | MacroNames | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.153 | MathPrOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.154 | Mcd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.155 | MDP | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.156 | MFPF | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.157 | NilBrc | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.158 | NilPICFAndBinData | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.159 | NumRM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.160 | NumRMOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.161 | OcxInfo | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.162 | ODSOPropertyBase | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.163 | ODSOPropertyLarge | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.164 | ODSOPropertyStandard | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.165 | ODT | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.166 | ODTPersist1 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.167 | ODTPersist2 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.168 | OfficeArtClientAnchor | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.169 | OfficeArtClientData | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.170 | OfficeArtClientTextbox | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.171 | OfficeArtContent | incomplete | 2 | 1 | OfficeArtContent is read for the BLIP store and shape containers (document.rs shapes); shapes other than pictures and text boxes are dropped. |
| 2.9.172 | OfficeArtWordDrawing | implemented | 1 | 1 | OfficeArtWordDrawing gives each story's drawing container (test read.rs floating_picture_and_text_box). |
| 2.9.173 | PANOSE | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.174 | PapxFkp | implemented | 2 | 1 | PapxFkp pages give paragraph runs and their PAPX (test read.rs character_and_paragraph_formatting). |
| 2.9.175 | PapxInFkp | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.176 | PbiGrfOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.177 | Pcd | implemented | 1 | 1 | Pcd entries give each piece's offset, compression and Prm (test read.rs text_matches_libreoffice). |
| 2.9.178 | Pcdt | implemented | 1 | 1 | The Pcdt holds the PlcPcd (test read.rs text_matches_libreoffice). |
| 2.9.179 | PChgTabsAdd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.180 | PChgTabsDel | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.181 | PChgTabsDelClose | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.182 | PChgTabsOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.183 | PChgTabsPapxOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.184 | PgbApplyTo | implemented | 1 | 1 | pgbAllPages, pgbFirstPage and pgbAllButFirst are read into the page border display (props.rs apply_sep; test props.rs page_borders_from_section_sprms). |
| 2.9.185 | PgbOffsetFrom | implemented | 1 | 1 | pgbFromText and pgbFromEdge are read into what page border space is measured from (props.rs apply_sep; test props.rs page_borders_from_section_sprms). |
| 2.9.186 | PgbPageDepth | implemented | 1 | 1 | pgbAtFront and pgbAtBack are read into whether page borders are drawn behind the text (props.rs apply_sep; test props.rs page_borders_from_section_sprms). |
| 2.9.187 | PGPArray | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.188 | PGPInfo | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.189 | PGPOptions | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.190 | PICF | implemented | 1 | 1 | PICF gives a picture's size and scaling (test read.rs inline_picture). |
| 2.9.191 | PICF_Shape | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.192 | PICFAndOfficeArtData | implemented | 1 | 2 | PICFAndOfficeArtData leads to the picture's BLIP (test read.rs inline_picture). |
| 2.9.193 | PICMID | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.194 | PlcfGlsy | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.195 | PlfAcd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.196 | PlfCosl | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.197 | PlfGosl | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.198 | PlfguidUim | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.199 | PlfKme | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.200 | PlfLfo | implemented | 1 | 1 | PlfLfo gives the list instances (test read.rs list_labels). |
| 2.9.201 | PlfLst | implemented | 2 | 1 | PlfLst gives the list definitions (test read.rs list_labels). |
| 2.9.202 | PlfMcd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.203 | PLRSID | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.204 | Pmfs | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.205 | Pms | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.206 | PnFkpChpx | implemented | 1 | 1 | PnFkpChpx entries locate character FKP pages (test read.rs character_and_paragraph_formatting). |
| 2.9.207 | PnFkpPapx | implemented | 1 | 1 | PnFkpPapx entries locate paragraph FKP pages (test read.rs character_and_paragraph_formatting). |
| 2.9.208 | PositionCodeOperand | implemented | 1 | 3 | pcVert and pcHorz give the bases of frames and floating tables (props.rs position_code, tests read.rs drop_cap_frames, shape_wrapping_and_floating_tables). |
| 2.9.209 | Prc | incomplete | 1 | 0 | Prc values are read (props.rs or text.rs); no test covers them. |
| 2.9.210 | PrcData | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.211 | PrDrvr | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.212 | PrEnvLand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.213 | PrEnvPort | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.214 | Prm | implemented | 1 | 1 | A piece's Prm is read (test read.rs text_matches_libreoffice). |
| 2.9.215 | Prm0 | incomplete | 2 | 1 | Prm0 values are read (props.rs or text.rs); no test covers them. |
| 2.9.216 | Prm1 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.217 | PropRMark | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.218 | PropRMarkOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.219 | ProtectionType | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.220 | PRTI | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.221 | PTIstdInfoOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.222 | Rca | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.223 | RecipientBase | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.224 | RecipientDataItem | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.225 | RecipientInfo | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.226 | RecipientTerminator | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.227 | Rfs | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.228 | RgCdb | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.229 | RgxOcxInfo | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.230 | RmdThreading | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.231 | Rnc | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.232 | RouteSlip | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.233 | RouteSlipInfo | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.234 | RouteSlipProtectionEnum | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.235 | SBkcOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.236 | SBOrientationOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.237 | SClmOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.238 | SDmBinOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.239 | SDTI | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.240 | SDTT | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.241 | SDxaColSpacingOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.242 | SDxaColWidthOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.243 | Sed | implemented | 1 | 1 | Sed entries give each section's SEPX offset (test read.rs sections_and_headers). |
| 2.9.244 | Selsf | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.245 | Sepx | implemented | 1 | 1 | SEPX grpprls give section properties (test read.rs sections_and_headers). |
| 2.9.246 | SFpcOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.247 | Shd | incomplete | 1 | 1 | Shd values are read, their pattern mixed as the Ipat row says (props.rs shd, test props.rs shading_patterns_mix_their_colors). |
| 2.9.248 | Shd80 | incomplete | 1 | 2 | Shd80 values are read, their pattern mixed as the Ipat row says (props.rs shd80, tests props.rs shading_patterns_mix_their_colors, read.rs word95_tables_merge_and_shade_their_cells). |
| 2.9.249 | SHDOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.250 | SLncOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.251 | SmartTagData | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.252 | SortColumnAndDirection | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.253 | Spa | implemented | 2 | 2 | Spa entries give floating shape anchors, ids, the bx and by origins of each axis, and wr and wrk the wrapping; fBelowText counts only when wr is 3 (document.rs shapes, tests read.rs floating_picture_and_text_box, shape_wrapping_and_floating_tables). |
| 2.9.254 | SpellingSpls | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.255 | SPgbPropOperand | implemented | 1 | 1 | pgbApplyTo, pgbPageDepth and pgbOffsetFrom are read from sprmSPgbProp (props.rs apply_sep; test props.rs page_borders_from_section_sprms). |
| 2.9.256 | SPLS | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.257 | SPPOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.258 | STD | implemented | 2 | 1 | STD entries give each style's kind, base, next, name and UPXs (test read.rs character_and_paragraph_formatting). |
| 2.9.259 | Stdf | implemented | 1 | 1 | Stdf fields give each style's kind and links (test read.rs character_and_paragraph_formatting). |
| 2.9.260 | StdfBase | implemented | 1 | 1 | StdfBase is read with the size STSHI states (test read.rs character_and_paragraph_formatting). |
| 2.9.261 | StdfPost2000 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.262 | StdfPost2000OrNone | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.263 | StkCharGRLPUPX | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.264 | StkCharLPUpxGrLPUpxRM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.265 | StkCharUpxGrLPUpxRM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.266 | StkListGRLPUPX | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.267 | StkParaGRLPUPX | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.268 | StkParaLPUpxGrLPUpxRM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.269 | StkParaUpxGrLPUpxRM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.270 | StkTableGRLPUPX | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.271 | STSH | implemented | 3 | 1 | The STSH is read into model styles (test read.rs character_and_paragraph_formatting). |
| 2.9.272 | STSHI | implemented | 1 | 1 | STSHI gives the style count, base size and default fonts (test read.rs character_and_paragraph_formatting). |
| 2.9.273 | STSHIB | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.274 | Stshif | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.275 | StshiLsd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.276 | SttbfAssoc | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.277 | SttbfAtnBkmk | implemented | 1 | 1 | SttbfAtnBkmk names comment range bookmarks (test read.rs notes_comments_fields_bookmarks). |
| 2.9.278 | SttbfAutoCaption | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.279 | SttbfBkmk | implemented | 1 | 1 | SttbfBkmk gives bookmark names (test read.rs notes_comments_fields_bookmarks). |
| 2.9.280 | SttbfBkmkBPRepairs | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.281 | SttbfBkmkFactoid | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.282 | SttbfBkmkFcc | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.283 | SttbfBkmkProt | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.284 | SttbfBkmkSdt | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.285 | SttbfCaption | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.286 | SttbfFfn | implemented | 1 | 1 | SttbfFfn is read into FontEntry values (test read.rs font_table). |
| 2.9.287 | SttbfGlsy | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.288 | SttbFnm | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.289 | SttbfRfs | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.290 | SttbfRMark | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.291 | SttbGlsyStyle | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.292 | SttbListNames | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.293 | SttbProtUser | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.294 | SttbRgtplc | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.295 | SttbSavedBy | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.296 | SttbTtmbd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.297 | SttbW6 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.298 | StwUser | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.299 | Sty | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.300 | TabJC | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.301 | TabLC | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.302 | TableBordersOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.303 | TableBordersOperand80 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.304 | TableBrc80Operand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.305 | TableBrcOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.306 | TableCellWidthOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.307 | TableSel | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.308 | TableShadeOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.309 | TBC | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.310 | TBD | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.311 | TBDelta | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.312 | Tbkd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.313 | TC80 | implemented | 4 | 2 | TC80 gives each cell's merge flags, width and borders (test read.rs tables_with_merges_and_nesting). |
| 2.9.314 | TCellBrcTypeOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.315 | Tcg | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.316 | Tcg255 | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.317 | TCGRF | implemented | 2 | 3 | TCGRF gives horizontal and vertical merge flags and the text flow (tests read.rs tables_with_merges_and_nesting, table.rs cells_take_their_text_flow). |
| 2.9.318 | TcgSttbf | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.319 | TcgSttbfCore | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.320 | Tch | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.321 | TDefTableOperand | implemented | 2 | 2 | TDefTableOperand gives cell edges and TC80s (test read.rs tables_with_merges_and_nesting). |
| 2.9.322 | TDxaColOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.323 | TextFlow | implemented | 2 | 1 | grpfTFtbrl and grpfTFtbrlv turn a cell's text top to bottom, grpfTFbtlr bottom to top; the East Asian variants are read as the plain flows (table.rs text_direction, test table.rs cells_take_their_text_flow). |
| 2.9.324 | TInsertOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.325 | TIQ | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.326 | TLP | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.327 | ToggleOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.328 | Tplc | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.329 | TplcBuildIn | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.330 | TplcUser | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.331 | Ttmbd | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.332 | UFEL | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.333 | UID | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.334 | UidSel | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.335 | UIM | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.336 | UpxChpx | implemented | 1 | 1 | UpxChpx gives a style's character grpprl (test read.rs character_and_paragraph_formatting). |
| 2.9.337 | UPXPadding | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.338 | UpxPapx | implemented | 1 | 1 | UpxPapx gives a style's paragraph grpprl (test read.rs character_and_paragraph_formatting). |
| 2.9.339 | UpxRm | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.340 | UpxTapx | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.341 | VerticalAlign | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.342 | VerticalMergeFlag | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.343 | VertMergeOperand | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.344 | Vjc | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.345 | WHeightAbs | implemented | 1 | 1 | sprmPWHeightAbs gives a frame's height and whether it is a minimum (props.rs apply_frame_prl). |
| 2.9.346 | WKB | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.347 | Wpms | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.348 | Wpmsdt | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.349 | XAS | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.350 | XAS_nonNeg | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.351 | XAS_plusOne | implemented | 1 | 2 | sprmPDxaAbs and sprmTDxaAbs are read as XAS_plusOne, their special values as alignments (props.rs plus_one_position, test read.rs shape_wrapping_and_floating_tables). |
| 2.9.352 | XSDR | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.353 | Xst | implemented | 2 | 1 | Xst strings give comment authors (test read.rs notes_comments_fields_bookmarks). |
| 2.9.354 | Xstz | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.355 | YAS | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.356 | YAS_nonNeg | not implemented | 0 | 0 | No reader code cites this structure; it is not read, or is read only inside a structure whose row names it. |
| 2.9.357 | YAS_plusOne | implemented | 1 | 2 | sprmPDyaAbs and sprmTDyaAbs are read as YAS_plusOne, their special values as alignments and 0 as inline (props.rs plus_one_position, test read.rs shape_wrapping_and_floating_tables). |
[MS-CFB]: Compound File Binary File Format
2 Structures
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 2.1 | Compound File Sector Numbers and Types | implemented | 1 | 1 | FREESECT, ENDOFCHAIN, FATSECT and DIFSECT end or skip chains; a chain that loops or runs past the file is cut and reported (tests cfb.rs walks_the_directory_of_a_word_file and fat_loops_are_cut). |
| 2.2 | Compound File Header | implemented | 5 | 4 | Signature, version, sector shifts, the FAT, directory, mini FAT and DIFAT locations and the first 109 DIFAT entries are read for v3 and v4 files (lib.rs parse, test cfb.rs walks_the_directory_of_a_word_file). |
| 2.3 | Compound File FAT Sectors | implemented | 2 | 2 | FAT sectors are read and chains followed with loop detection (tests cfb.rs walks_the_directory_of_a_word_file and fat_loops_are_cut). |
| 2.4 | Compound File Mini FAT Sectors | implemented | 2 | 1 | The mini FAT and the mini stream held by the root entry serve streams below the cutoff (test cfb.rs walks_the_directory_of_a_word_file). |
| 2.5 | Compound File DIFAT Sectors | implemented | 2 | 1 | DIFAT sectors after the header's 109 entries are followed to find every FAT sector (lib.rs parse, test cfb.rs walks_the_directory_of_a_word_file). |
| 2.6 | Compound File Directory Sectors | implemented | 8 | 5 | Directory sectors are read into entries with names, types, sizes and sibling and child links (test cfb.rs walks_the_directory_of_a_word_file). |
| 2.6.1 | Compound File Directory Entry | implemented | 3 | 1 | Directory entries are read with their name, object type, links, start sector and size (directory.rs, test cfb.rs walks_the_directory_of_a_word_file). |
| 2.6.2 | Root Directory Entry | implemented | 1 | 1 | The root entry's start sector and size locate the mini stream (test cfb.rs walks_the_directory_of_a_word_file). |
| 2.6.3 | Other Directory Entries | implemented | 1 | 1 | Storage and stream entries are read and opened by path (test cfb.rs walks_the_directory_of_a_word_file). |
| 2.6.4 | Red-Black Tree | implemented | 2 | 1 | Children are walked through the sibling tree in order and names compare case-insensitively (lib.rs children, test cfb.rs lookup_ignores_case). |
| 2.7 | Compound File User-Defined Data Sectors | out of scope | 0 | 0 | User-defined data sectors are ordinary sectors of their stream's chain; nothing more to read. |
| 2.8 | Compound File Range Lock Sector | out of scope | 0 | 0 | The range lock sector is never read. |
| 2.9 | Compound File Size Limits | not implemented | 0 | 0 | The size limits are not enforced; reads are bounded by the file's length. |
[MS-OLEPS]: Object Linking and Embedding (OLE) Property Set Data Structures
2 Structures
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 2.1 | PropertyIdentifier | implemented | 1 | 1 | Property identifiers 2 to 19 map to metadata fields (property.rs read_metadata, test cfb.rs reads_summary_metadata). |
| 2.2 | PropertyType | implemented | 1 | 1 | The property type selects the value decoder (property.rs parse_value, test cfb.rs reads_summary_metadata). |
| 2.3 | CURRENCY (Packet Version) | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.4 | DATE (Packet Version) | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.5 | CodePageString | implemented | 1 | 1 | CodePageString values decode through the set's code page, with 874, 1250 to 1258, Mac Roman, UTF-8, UTF-16 and the CJK code pages supported (codepage.rs, test cfb.rs reads_summary_metadata). |
| 2.6 | DECIMAL (Packet Version) | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.7 | UnicodeString | incomplete | 1 | 0 | UnicodeString values decode (property.rs parse_value); no test file stores one. |
| 2.8 | FILETIME (Packet Version) | implemented | 1 | 1 | FILETIME values become ISO 8601 dates (time.rs, unit test filetime_epoch_and_known_dates). |
| 2.9 | BLOB | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.10 | IndirectPropertyName | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.11 | ClipboardData | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.12 | GUID (Packet Version) | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.13 | VersionedStream | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.14 | Vector and Array Property Types | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.14.1 | Property Types in Variable-Typed Vectors and Arrays | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.14.2 | VectorHeader | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.14.3 | ArrayDimension | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.14.4 | ArrayHeader | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.15 | TypedPropertyValue | incomplete | 4 | 2 | VT_I2, VT_I4, VT_UI4, VT_BOOL, VT_FILETIME, VT_LPSTR and VT_LPWSTR decode; other types are kept as Value::Other and reported (property.rs parse_value). |
| 2.16 | DictionaryEntry | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.17 | Dictionary | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.18 | Special Properties | incomplete | 1 | 1 | Only the CodePage property is read among the special properties. |
| 2.18.1 | Dictionary Property | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.18.2 | CodePage Property | implemented | 1 | 1 | The CodePage property selects the decoding of the set's strings (test cfb.rs reads_summary_metadata). |
| 2.18.3 | Locale Property | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.18.4 | Behavior Property | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.19 | PropertyIdentifierAndOffset | implemented | 1 | 1 | Property identifier and offset pairs locate each value (test cfb.rs reads_summary_metadata). |
| 2.20 | PropertySet | implemented | 2 | 2 | A property set's size, count and pairs are read with bounds checks (property.rs parse_set, test cfb.rs reads_summary_metadata). |
| 2.21 | PropertySetStream | incomplete | 2 | 2 | The stream header and the first property set are read (test cfb.rs reads_summary_metadata); the user-defined second set of DocumentSummaryInformation is not. |
| 2.22 | Non-Simple Property Set Storage Format | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.23 | Property Set Stream and Storage Names | implemented | 1 | 1 | The summary streams are opened by their names with the 0x05 prefix (test cfb.rs reads_summary_metadata). |
| 2.24 | Standard Bindings | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.24.1 | Compound File Binding | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.24.2 | Alternate Stream Binding | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.24.3 | Control Stream | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.24.4 | Simple Property Set Stream | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.24.5 | Non-Simple Property Set Storage | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
| 2.25 | Well-Known Property Set Formats | incomplete | 1 | 1 | SummaryInformation and the DocumentSummaryInformation fields docboss models are read; PropertyBag is not. |
| 2.25.1 | SummaryInformation | implemented | 1 | 1 | Title, subject, author, keywords, comments, last author, revision, application, dates and counts are read into Metadata (test cfb.rs reads_summary_metadata). |
| 2.25.2 | PropertyBag | not implemented | 0 | 0 | Not read: the metadata docboss models uses none of it. |
[MS-OSHARED]: Office Common Data Types and Objects Structures
2 Structures
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 2.1 | Common ABNF Definitions | not implemented | 0 | 0 | Not used by the DOC reader. |
| 2.2 | Data Types | incomplete | 1 | 1 | MSONFC list number formats map to model formats (lists.rs, test read.rs list_labels); the other data types are not used. |
| 2.3 | Common Objects | not implemented | 0 | 0 | Not used by the DOC reader. |
| 2.4 | Common Algorithms | not implemented | 0 | 0 | Not used by the DOC reader. |
[MS-ODRAW]: Office Drawing Binary File Format
2 Structures
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 2.1 | Custom OfficeArt Types | not implemented | 0 | 0 | Not read. |
| 2.2 | OfficeArt Record Types | incomplete | 14 | 7 | Record headers, containers, BLIP records and the BLIP store are read for pictures, shape ids for text boxes, the OfficeArtFSP shape type and flips for drawn shapes, and group containers with their OfficeArtFSPGR coordinate space and the OfficeArtChildAnchor of each member, nested groups included (picture.rs shape_groups, story.rs group_members; tests read.rs inline_picture, floating_picture_and_text_box and group_members_and_shaded_fill, picture.rs shape_type_flips_rotation_and_line_ends); shapes that are neither pictures, text boxes, preset shape types nor groups are dropped and reported. |
| 2.3 | Properties | incomplete | 43 | 35 | The pib property, the fill, line and text frame properties, lineDashing, lineJoinStyle and lineEndCapStyle, the line end properties, rotation, the shaded fills (fillType msofillShade to msofillShadeTitle with fillBackColor, fillAngle and fillFocus, drawn as gradients; test read.rs group_members_and_shaded_fill), txflTextFlow (test picture.rs shape_format_reads_fill_line_insets_and_anchor), adjustValue to adjust8Value for the shape types whose preset guides take them as the same fraction (inline.rs Geometry::from_shape_type_adjusted; tests picture.rs shape_type_flips_rotation_and_line_ends, inline.rs shape_type_adjust_values_carry_over), posh, posrelh, posv and posrelv, and the wrap distances dxWrapDistLeft, dyWrapDistTop, dxWrapDistRight and dyWrapDistBottom (test read.rs shape_wrapping_and_floating_tables) of OfficeArtFOPT and OfficeArtTertiaryFOPT are read (picture.rs); the others are not. |
| 2.4 | Enumerations | incomplete | 11 | 10 | MSOLINEDASHING, MSOLINEJOIN, MSOLINECAP, MSOLINEEND, MSOLINEENDWIDTH and MSOLINEENDLENGTH are read for shape outlines, MSOFILLTYPE for shaded fills, MSOTXFL for text box flow, and MSOSPT maps shape types to DrawingML preset geometries for DOC shapes and VML (picture.rs line_dashing, shape_format and line_end, inline.rs Geometry::from_shape_type; tests picture.rs shape_format_reads_line_dashing_join_and_cap and shape_type_flips_rotation_and_line_ends, inline.rs shape_types_name_presets); the other enumerations are not. |
| 2.5 | Algorithms | not implemented | 0 | 0 | Not read. |
[MS-WMF]: Windows Metafile Format
2 Structures
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 2.1 | WMF Constants | incomplete | 1 | 1 | RecordType, BinaryRasterOperation (R2_BLACK, R2_WHITE, R2_NOP and copy; other mix modes are drawn as copy), BrushStyle, CharacterSet (the symbol character set maps to the symbol-font private-use codes), MapMode, PenStyle (styles, caps and joins), PolyFillMode, TernaryRasterOperation (SRCCOPY, SRCPAINT and SRCAND as black or white keyed out, NOTSRCCOPY, PATCOPY, BLACKNESS, WHITENESS; others noted), ExtTextOutOptions and TextAlignmentMode are read (docboss-metafile dc.rs, wmf.rs); the other enumerations are not needed for drawing or are ignored. |
| 2.2 | WMF Objects | incomplete | 4 | 1 | Brush, Font and Pen objects, the DeviceIndependentBitmap with BitmapCoreHeader, BitmapInfoHeader, BitmapV4Header and BitmapV5Header (1 to 32 bits, bit fields, RLE4 and RLE8; bitmap.rs, tests bitmap.rs), LogBrush, PolyPolygon, PointS and Rect are read. Palette and Region objects only hold their table slot; Bitmap16 pattern brushes fill grey; DIB pattern brushes fill with the bitmap's average color. |
| 2.3 | WMF Records | incomplete | 20 | 3 | Records are played through a device context model into paths, text and bitmaps that the layout scales into the picture's rectangle (docboss-metafile wmf.rs, dc.rs; docboss-layout metafile.rs; tests tests/play.rs). What is left out is listed per record class below and reported as a diagnostic per picture. |
| 2.3.1 | Bitmap Record Types | incomplete | 1 | 0 | META_DIBBITBLT, META_DIBSTRETCHBLT and META_STRETCHDIB are drawn, with or without a bitmap (without one they paint the brush); META_BITBLT and META_STRETCHBLT with a Bitmap16 and META_SETDIBTODEV are reported and not drawn. |
| 2.3.2 | Control Record Types | implemented | 3 | 1 | META_PLACEABLE gives the frame and its units per inch; a file without it takes its frame from the first window origin and extent. META_HEADER is checked and META_EOF ends playback (wmf.rs; test tests/play.rs wmf_records_draw_the_same_shapes). |
| 2.3.3 | Drawing Record Types | incomplete | 9 | 0 | META_ARC, META_CHORD, META_ELLIPSE, META_EXTTEXTOUT (advances, opaque and clip rectangles), META_LINETO, META_PATBLT, META_PIE, META_POLYLINE, META_POLYGON, META_POLYPOLYGON, META_RECTANGLE, META_ROUNDRECT, META_SETPIXEL and META_TEXTOUT are drawn. The region records (META_FILLREGION, META_FRAMEREGION, META_INVERTREGION, META_PAINTREGION) and the flood fills are reported and not drawn. |
| 2.3.4 | Object Record Types | incomplete | 4 | 0 | Pens, brushes and fonts are created into the lowest free slot of the object table, selected and deleted; palettes and regions only hold their slot, META_SELECTCLIPREGION clears the clip and META_SELECTPALETTE is ignored. |
| 2.3.5 | State Record Types | incomplete | 1 | 0 | Window origin, extent, offset and scale, the map mode, background mode and color, text color and alignment, fill mode, mix mode, the current position, META_INTERSECTCLIPRECT and META_SAVEDC and META_RESTOREDC are played. The viewport stays the picture's frame, so the viewport records are ignored; META_EXCLUDECLIPRECT and META_OFFSETCLIPRGN are reported and ignored; palette, layout, mapper flag, text character extra and justification records are ignored. |
| 2.3.6 | Escape Record Types | incomplete | 1 | 2 | META_ESCAPE_ENHANCED_METAFILE: when the escape records carry a whole EMF it is played in place of the WMF records (wmf.rs embedded_emf; test tests/play.rs wmf_plays_the_emf_its_escapes_carry). The other escapes are printer driver requests and are ignored. |
[MS-EMF]: Enhanced Metafile Format
2 Structures
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 2.1 | EMF Enumerations | incomplete | 3 | 1 | RecordType, ArcDirection, BackgroundMode, ExtTextOutOptions (opaque, clipped, glyph index, PDY), MapMode, ModifyWorldTransformMode, PenStyle, PolygonFillMode, RegionMode (and, or and copy; xor and diff are reported), StockObject and the text alignment flags are read (docboss-metafile dc.rs, emf.rs); the color, ICM, font description and OpenGL enumerations are not needed for drawing. |
| 2.2 | EMF Objects | incomplete | 4 | 0 | Header (with HeaderExtension1 and HeaderExtension2's micrometre size), EmrText, LogBrushEx, LogFont (height, escapement, weight, italic, underline, strike-out, character set, face; the width is not honoured), LogPen, LogPenEx (user dash styles), RegionData (as the bounds of its rectangles) and XForm are read. Palettes, color spaces, PixelFormatDescriptor, the design vector and gradient objects are not. |
| 2.3 | EMF Records | incomplete | 32 | 8 | Records are played through a device context model into paths, text and bitmaps that the layout scales from the frame into the picture's rectangle (docboss-metafile emf.rs, dc.rs; docboss-layout metafile.rs; tests tests/play.rs). What is left out is listed per record class below and reported as a diagnostic per picture. |
| 2.3.1 | Bitmap Record Types | incomplete | 3 | 1 | EMR_ALPHABLEND (constant and per-pixel alpha), EMR_BITBLT, EMR_SETDIBITSTODEVICE, EMR_STRETCHBLT and EMR_STRETCHDIBITS are drawn, those without a bitmap as brush fills; EMR_MASKBLT, EMR_PLGBLT and EMR_TRANSPARENTBLT are reported and not drawn. |
| 2.3.2 | Clipping Record Types | incomplete | 2 | 0 | EMR_INTERSECTCLIPRECT is exact; EMR_EXTSELECTCLIPRGN and EMR_SELECTCLIPPATH clip to the bounds of the region or path. EMR_EXCLUDECLIPRECT and EMR_OFFSETCLIPRGN are reported and ignored. |
| 2.3.3 | Comment Record Types | incomplete | 1 | 0 | EMR_COMMENT_EMFPLUS is only detected: every EMF+ picture in the test corpus is EMF+ dual, so its EMF records are played and the EMF+ records skipped; an EMF+ only picture is reported and drawn as a placeholder. The other comments carry no drawing and are skipped. |
| 2.3.4 | Control Record Types | implemented | 1 | 1 | EMR_HEADER gives the frame, the reference device size and its millimetre or micrometre size; EMR_EOF ends playback (emf.rs; test tests/play.rs emf_shapes_fill_with_their_brushes_on_the_frame). |
| 2.3.5 | Drawing Record Types | incomplete | 12 | 3 | EMR_ANGLEARC, EMR_ARC, EMR_ARCTO, EMR_CHORD, EMR_ELLIPSE, EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW, EMR_FILLPATH, EMR_LINETO, EMR_PIE, the POLYBEZIER, POLYGON, POLYLINE, POLYPOLYGON and POLYPOLYLINE records in both widths, EMR_RECTANGLE, EMR_ROUNDRECT, EMR_STROKEANDFILLPATH and EMR_STROKEPATH are drawn. Text given as glyph indices, EMR_EXTFLOODFILL, EMR_FILLRGN, EMR_FRAMERGN, EMR_PAINTRGN, EMR_GRADIENTFILL, EMR_POLYDRAW, EMR_POLYTEXTOUT, EMR_SETPIXELV and EMR_SMALLTEXTOUT are reported and not drawn. |
| 2.3.6 | Escape Record Types | not implemented | 0 | 0 | Printer escapes carry no drawing and are skipped. |
| 2.3.7 | Object Creation Record Types | incomplete | 6 | 1 | EMR_CREATEBRUSHINDIRECT, EMR_CREATEPEN, EMR_EXTCREATEPEN and EMR_EXTCREATEFONTINDIRECTW are read; EMR_CREATEDIBPATTERNBRUSHPT and EMR_CREATEMONOBRUSH fill with their bitmap's average color and hatched brushes with a tint of their color. Palettes and color spaces are skipped. |
| 2.3.8 | Object Manipulation Record Types | incomplete | 2 | 0 | EMR_SELECTOBJECT (table and stock objects) and EMR_DELETEOBJECT are played; the palette and color space records are skipped. |
| 2.3.9 | OpenGL Record Types | not implemented | 0 | 0 | OpenGL records are skipped. |
| 2.3.10 | Path Bracket Record Types | incomplete | 1 | 0 | EMR_BEGINPATH, EMR_ENDPATH, EMR_CLOSEFIGURE and EMR_ABORTPATH bracket the figures that the path records fill, stroke or clip to; EMR_FLATTENPATH and EMR_WIDENPATH are reported and ignored, and text inside a bracket is not drawn. |
| 2.3.11 | State Record Types | incomplete | 1 | 1 | Window and viewport origins, extents and their scaling, the map mode, arc direction, background mode and color, text color and alignment, fill mode, mix mode, EMR_MOVETOEX, EMR_SAVEDC and EMR_RESTOREDC (relative and absolute) are played. Brush origin, color adjustment, ICM, layout, linked fonts, mapper flags, miter limit, stretch mode and text justification are skipped. |
| 2.3.12 | Transform Record Types | implemented | 2 | 1 | EMR_SETWORLDTRANSFORM and EMR_MODIFYWORLDTRANSFORM in all four modes (dc.rs world; test dc.rs world_transform_modes_compose_in_order). |
APPNOTE.TXT: .ZIP File Format Specification (PKWARE)
4 ZIP Files
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 4.1 | What is a ZIP file | incomplete | 1 | 1 | Stored and deflated entries are read and written with CRC-32 checks; encryption, other compression methods, split archives and manifest files are not supported. |
| 4.1.1 | ZIP files MAY be identified by the standard .ZIP file extension although use of… | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.1.2 | ZIP files SHOULD contain at least one file and MAY contain multiple files | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.1.3 | Data compression MAY be used to reduce the size of files placed into a ZIP… | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.1.4 | Data encryption MAY be used to protect files within a ZIP file | not implemented | 0 | 0 | Encrypted entries are refused with Error::Encrypted (crates/docboss-zip/src/lib.rs); nothing is decrypted. |
| 4.1.5 | Data integrity MUST be provided for each file using CRC32 | implemented | 1 | 1 | Every entry read is checked against its CRC-32; a mismatch is an error from Archive::entry and a flag from Archive::read (test archive.rs corrupted_bytes_fail_the_crc_check). |
| 4.1.6 | Additional data integrity MAY be included through the use of digital signatures | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.1.7 | Files MAY be placed within a ZIP file uncompressed or stored | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.1.8 | Each data file placed into a ZIP file MAY be compressed, stored, encrypted or… | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.1.9 | ZIP files MAY be streamed, split into segments (on fixed or on removable media)… | not implemented | 0 | 0 | Split and spanned archives are not read; only the last segment's central directory would be found. |
| 4.1.10 | Extensibility is provided for platform or application specific needs through… | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.1.11 | Common uses for ZIP MAY also include the use of manifest files | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.1.12 | ZIP files MAY be placed within other ZIP files | out of scope | 0 | 0 | Introductory statement; the requirements it summarizes have their own rows under 4.3 to 4.5. |
| 4.2 | ZIP Metadata | out of scope | 0 | 0 | Introductory statement; the record types have their own rows under 4.3. |
| 4.2.1 | ZIP files are identified by metadata consisting of defined record types… | out of scope | 0 | 0 | Introductory statement; the record types have their own rows under 4.3. |
| 4.3 | General Format of a .ZIP file | incomplete | 19 | 14 | Local headers, file data, data descriptors, the central directory, the ZIP64 records and the end record are read and written; the archive decryption header, archive extra data record and digital signature are not. |
| 4.3.1 | A ZIP file MUST contain an "end of central directory record" | out of scope | 0 | 0 | Normative summary of the layout that 4.3.6 to 4.3.16 specify record by record; see those rows. |
| 4.3.2 | Each file placed into a ZIP file MUST be preceded by a "local file header"… | out of scope | 0 | 0 | Normative summary of the layout that 4.3.6 to 4.3.16 specify record by record; see those rows. |
| 4.3.3 | Files MAY be stored in arbitrary order within a ZIP file | out of scope | 0 | 0 | Normative summary of the layout that 4.3.6 to 4.3.16 specify record by record; see those rows. |
| 4.3.4 | Compression MUST NOT be applied to a "local file header", an "encryption… | out of scope | 0 | 0 | Normative summary of the layout that 4.3.6 to 4.3.16 specify record by record; see those rows. |
| 4.3.5 | File data MAY be followed by a "data descriptor" for the file | out of scope | 0 | 0 | Normative summary of the layout that 4.3.6 to 4.3.16 specify record by record; see those rows. |
| 4.3.6 | Overall .ZIP file format | implemented | 1 | 1 | Entries are located through the central directory and read at their local header offsets (crates/docboss-zip/src/lib.rs central_directory, test archive.rs reads_stored_and_deflated_entries). |
| 4.3.7 | Local file header | implemented | 3 | 2 | Local headers give each entry's data offset and, when the central directory cannot be read, are scanned to recover the entries, which is reported as a diagnostic (test archive.rs recovers_from_a_missing_central_directory); the writer emits one per entry. |
| 4.3.8 | File data | implemented | 1 | 1 | Stored data is borrowed from the input and deflated data inflated under the size and ratio limits of Limits (test archive.rs reads_stored_and_deflated_entries). |
| 4.3.9 | Data descriptor | implemented | 1 | 2 | General purpose bit 3 defers the CRC and sizes to a data descriptor, which recovery finds after the data (test archive.rs reads_entries_with_data_descriptors); the writer can emit descriptors (write.rs every_layout_reads_back). |
| 4.3.10 | Archive decryption header | not implemented | 0 | 0 | The archive decryption header of central directory encryption is not read; such archives do not open. |
| 4.3.11 | Archive extra data record | not implemented | 0 | 0 | The archive extra data record is not read. |
| 4.3.12 | Central directory structure | implemented | 5 | 2 | Central directory headers give each entry's name, method, flags, CRC, sizes and local header offset (test archive.rs reads_stored_and_deflated_entries); the writer emits them. |
| 4.3.13 | Digital signature | not implemented | 0 | 0 | The central directory digital signature is not read or verified. |
| 4.3.14 | Zip64 end of central directory record | implemented | 2 | 2 | The ZIP64 end of central directory record gives 64-bit entry counts, directory size and offset (test archive.rs reads_zip64_archives); the writer emits it with WriteOptions::zip64. |
| 4.3.15 | Zip64 end of central directory locator | implemented | 2 | 1 | The ZIP64 locator is followed to the ZIP64 end record (test archive.rs reads_zip64_archives); the writer emits it with WriteOptions::zip64. |
| 4.3.16 | End of central directory record | implemented | 4 | 3 | The end of central directory record is located from the end of the file and gives the directory's offset and entry count; the writer ends every archive with one (test write.rs archive_ends_with_directory_record). |
| 4.4 | Explanation of fields | incomplete | 7 | 7 | The fields needed to locate, decode and check entries are read; version, attribute, disk, date and comment fields are ignored. |
| 4.4.1 | General notes on fields | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.2 | version made by (2 bytes) | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.3 | version needed to extract (2 bytes) | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.4 | general purpose bit flag | incomplete | 3 | 2 | Bit 0 refuses an encrypted entry, bit 3 defers sizes to a data descriptor and bit 11 selects UTF-8 names (tests archive.rs reads_entries_with_data_descriptors and decodes_name_encodings); the other bits are ignored. |
| 4.4.5 | compression method | incomplete | 1 | 1 | Methods 0 (stored) and 8 (deflated) are read and written; any other method is Error::UnsupportedMethod. |
| 4.4.6 | date and time fields | not implemented | 0 | 0 | Entry dates and times are not read; the writer stores 1980-01-01 00:00 so its output does not depend on the clock. |
| 4.4.7 | CRC-32 | implemented | 2 | 3 | Slicing-by-8 CRC-32 over the reflected polynomial (crates/docboss-zip/src/crc.rs), held to 40 vectors computed by the Lean reference (tests/ledger_vectors.rs). |
| 4.4.8 | compressed size | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.9 | uncompressed size | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.10 | file name length | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.11 | extra field length | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.12 | file comment length | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.13 | disk number start | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.14 | internal file attributes | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.15 | external file attributes | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.16 | relative offset of local header | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.17 | file name | implemented | 1 | 1 | Names decode as UTF-8 when bit 11 is set, else as code page 437 (crates/docboss-zip/src/cp437.rs, test archive.rs decodes_name_encodings). |
| 4.4.18 | file comment | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.19 | number of this disk | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.20 | number of the disk with the start of the central directory | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.21 | total number of entries in the central dir on this disk | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.22 | total number of entries in the central dir | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.23 | size of the central directory | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.24 | offset of start of central directory with respect to the starting disk number | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.25 | ZIP file comment length | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.26 | ZIP file comment | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.27 | zip64 extensible data sector (variable size) | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.4.28 | extra field | not implemented | 0 | 0 | No reader code cites this field; the reader uses it only as far as the 4.3 record rows say. |
| 4.5 | Extensible data fields | incomplete | 2 | 1 | Only the ZIP64 extended information extra field (0x0001) is read; every other extra field is skipped by its length. |
| 4.5.1 | In order to allow different programs and different types of information to be… | not implemented | 0 | 0 | Extra fields are walked as Header ID and size pairs within their declared length; only ID 0x0001 is interpreted (lib.rs zip64_extra). |
| 4.5.2 | The current Header ID mappings defined by PKWARE are | not implemented | 0 | 0 | Of the PKWARE Header IDs only 0x0001 is interpreted; the rest are skipped by their length. |
| 4.5.3 | Zip64 Extended Information Extra Field (0x0001) | implemented | 2 | 1 | The ZIP64 extra field supplies 64-bit sizes and offsets when the 32-bit fields are saturated (test archive.rs reads_zip64_archives); the writer emits it with WriteOptions::zip64. |
| 4.5.4 | OS/2 Extra Field (0x0009) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.5 | NTFS Extra Field (0x000a) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.6 | OpenVMS Extra Field (0x000c) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.7 | UNIX Extra Field (0x000d) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.8 | PATCH Descriptor Extra Field (0x000f) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.9 | PKCS#7 Store for X.509 Certificates (0x0014) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.10 | X.509 Certificate ID and Signature for individual file (0x0015) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.11 | X.509 Certificate ID and Signature for central directory (0x0016) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.12 | Strong Encryption Header (0x0017) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.13 | Record Management Controls (0x0018) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.14 | PKCS#7 Encryption Recipient Certificate List (0x0019) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.15 | MVS Extra Field (0x0065) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.16 | OS/400 Extra Field (0x0065) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.17 | Policy Decryption Key Record Extra Field (0x0021) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.18 | Key Provider Record Extra Field (0x0022) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.5.19 | Policy Key Data Record Record Extra Field (0x0023) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.6 | Third Party Mappings | not implemented | 0 | 0 | Third-party extra fields are skipped by their length. |
| 4.6.1 | Third party mappings commonly used are | not implemented | 0 | 0 | Third-party extra fields are skipped by their length. |
| 4.6.2 | Third-party Extra Fields MUST include a Header ID using the format defined in… | not implemented | 0 | 0 | Third-party extra fields are skipped by their length. |
| 4.6.3 | In case two different programs appropriate the same Header ID value, it is… | not implemented | 0 | 0 | Third-party extra fields are skipped by their length. |
| 4.6.4 | ZipIt Macintosh Extra Field (long) (0x2605) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.6.5 | ZipIt Macintosh Extra Field (short, for files) (0x2705) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.6.6 | ZipIt Macintosh Extra Field (short, for directories) (0x2805) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.6.7 | FWKCS MD5 Extra Field (0x4b46) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.6.8 | Info-ZIP Unicode Comment Extra Field (0x6375) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.6.9 | Info-ZIP Unicode Path Extra Field (0x7075) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.6.10 | Microsoft Open Packaging Growth Hint (0xa220) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.6.11 | Data Stream Alignment (Apache Commons-Compress) (0xa11e) | not implemented | 0 | 0 | This extra field is skipped by its length. |
| 4.7 | Manifest Files | out of scope | 0 | 0 | Manifest files are application data; docboss reads OPC parts by name instead. |
| 4.7.1 | Applications using ZIP files MAY have a need for additional information that… | out of scope | 0 | 0 | Manifest files are application data; docboss reads OPC parts by name instead. |
| 4.7.2 | A manifest file is a file created for the application process that requires… | out of scope | 0 | 0 | Manifest files are application data; docboss reads OPC parts by name instead. |
| 4.7.3 | Manifest files MAY be compressed or encrypted as needed for application… | out of scope | 0 | 0 | Manifest files are application data; docboss reads OPC parts by name instead. |
5 Explanation of compression methods
| Clause | Feature | Status | Code citations | Test citations | Note |
|---|---|---|---|---|---|
| 5.1 | UnShrinking - Method 1 | not implemented | 0 | 0 | Method 1 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.2 | Expanding - Methods 2-5 | not implemented | 0 | 0 | Method 2 to 5 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.3 | Imploding - Method 6 | not implemented | 0 | 0 | Method 6 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.4 | Tokenizing - Method 7 | not implemented | 0 | 0 | Method 7 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.5 | Deflating - Method 8 | implemented | 1 | 1 | Deflate streams are inflated and written through flate2's zlib-rs backend, a truncated stream keeping what it inflated (tests archive.rs truncated_deflate_keeps_the_readable_prefix and write.rs every_layout_reads_back). |
| 5.6 | Enhanced Deflating - Method 9 | not implemented | 0 | 0 | Method 9 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.7 | BZIP2 - Method 12 | not implemented | 0 | 0 | Method 12 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.8 | LZMA - Method 14 | not implemented | 0 | 0 | Method 14 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.9 | WavPack - Method 97 | not implemented | 0 | 0 | Method 97 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.10 | PPMd - Method 98 | not implemented | 0 | 0 | Method 98 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.11 | AE-x Encryption marker - Method 99 | not implemented | 0 | 0 | Method 99 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.12 | JPEG variant - Method 96 | not implemented | 0 | 0 | Method 96 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.13 | PKWARE Data Compression Library Imploding - Method 10 | not implemented | 0 | 0 | Method 10 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.14 | Reserved - Method 11 | out of scope | 0 | 0 | Reserved method number with nothing to implement. |
| 5.15 | Reserved - Method 13 | out of scope | 0 | 0 | Reserved method number with nothing to implement. |
| 5.16 | Reserved - Method 15 | out of scope | 0 | 0 | Reserved method number with nothing to implement. |
| 5.17 | IBM z/OS CMPSC Compression - Method 16 | not implemented | 0 | 0 | Method 16 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.18 | Reserved - Method 17 | out of scope | 0 | 0 | Reserved method number with nothing to implement. |
| 5.19 | IBM TERSE - Method 18 | not implemented | 0 | 0 | Method 18 is not read; such entries fail with Error::UnsupportedMethod. |
| 5.20 | IBM LZ77 z Architecture - Method 19 | not implemented | 0 | 0 | Method 19 is not read; such entries fail with Error::UnsupportedMethod. |