Files
craft-libs/crates/docx
pakiatandClaude Opus 5.5 0e83ef6d51 craft-docx: Thai text outside a complex-script run takes the run's own font and size, as in Word
Moved from the DOCX part of storytold/wordcraft#6244. Runs are marked with what Word counts as complex script (the run, its paragraph style chain, its table style and the run defaults, not a character style). StyleSheet::table_cells_chr works out a table's cell run formatting once; ResolvedChar gains cs_off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-14 09:33:37 +00:00
..

craft-docx

DOCX (ECMA-376 / ISO/IEC 29500 WordprocessingML) read and written, on the craft-wordmodel document model. Also Word XML Documents (Flat OPC, one .xml file holding the whole package) and Word 2003 XML, password-protected packages and Restrict Editing password hashes.

It is WordCraft's DOCX crate, moved onto the shared crates: craft-opc for the package, craft-xml for parsing, craft-offcrypto for encryption, craft-wordmodel for the model.

use craft_wordmodel::Document;

let doc = Document::from_text("Hello\nWorld");
let bytes = craft_docx::write(&doc).unwrap();
let back = craft_docx::read(&bytes).unwrap();
assert_eq!(back.plain_text(craft_wordmodel::StoryRef::Body), doc.plain_text(craft_wordmodel::StoryRef::Body));

Reading

  • read(bytes), read_with(bytes, &ReadOptions { password, chunks }), read_with_password.
  • read_xml(bytes): a Word XML Document or a Word 2003 XML Document, told apart by its root.
  • package_title(reader, max_part): the title in docProps/core.xml, inflating only that part.

The reader is lenient (unknown markup is skipped, bad numbers fall back to defaults) and bounded:

Limit Value
ZIP entries 20,000 (checked before the archive is indexed)
One part 256 MiB
All parts 512 MiB, counting entries that fail their checksum
XML nesting 256 open elements
XML elements 8,000,000 in one part
Attributes 1,024 on one element
Word XML file 1 GiB

Markup the model does not hold is kept in Document::passthrough and the kept markup, and written back as it was read.

Writing

write(doc), write_as(doc, Flavor) for .docx, .docm, .dotx and .dotm; write_flat and write_wordml2003 for the XML forms; encrypt for a password.

Equations (OMML) are read and written by craft_math::omml.

Not here yet

  • DrawingML (a:) shape fills, lines, custom geometry and colours are still read with this crate's own code; they move to craft-drawingml.