mirror of
https://github.com/storytold/wordcraft.git
synced 2026-11-05 10:11:16 +00:00
Word brings a document's alternative format chunks (w:altChunk) in where they stand when it opens the file; WordCraft left them out, so a document made of one (as generators and mail-merge tools write them) opened empty. - docx: read_with/ReadOptions with a ChunkImporter for formats other than WordprocessingML; nested Word documents are read here (at most 4 deep, 256 chunks and 512 MB of chunk bytes a file, XML depth counted on). - doc: Document::adopt (moved from paste) brings another document's media, lists, styles, notes, comments and revisions along under new ids; pictures in groups and charts are relinked. Insert > Text from File uses it and now keeps the file's pictures and lists. - engine: chunks in MHT, HTML (in their charset), RTF and plain text go through the format importers. - formats: MHT web archives open (MIME, quoted-printable/base64, charsets, pictures by Content-Location or cid). HTML reads style element rules (simple selectors, cascade, budgets), paragraph margins, indents, line height, cell widths and borders; an opened page takes Word's web-page defaults (Times New Roman 12 pt, single lines, black headings, automatic spacing). html::decode knows the single-byte Windows code pages. docxide-pdf suite: croatian_regulations_altchunk goes from one empty page to Word's 8 pages, SSIM 2.7% -> 78.7%; no other document changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
1.9 KiB
Rust
47 lines
1.9 KiB
Rust
//! HTML.
|
||
//!
|
||
//! Import is a tolerant tag-soup reader (no DOM): a tokenizer plus a stack of open elements with
|
||
//! HTML's implicit closes for `p`, `li`, `tr`, `td`/`th` and headings. It understands `p`, `div`,
|
||
//! `h1`–`h6`, `b`/`strong`, `i`/`em`, `u`, `s`/`strike`/`del`, `sup`/`sub`, `code`/`kbd`, `a`
|
||
//! (links and `id`/`name` anchors), `br`, `hr`, `ul`/`ol`/`li` (nested), `table`/`tr`/`td`/`th`
|
||
//! (colspan/rowspan), `img` (`data:` URIs, other sources through a caller's [`ImageLoader`]), `blockquote`, `pre`, `font`, `ruby`
|
||
//! (`rb`/`rt`/`rp`: furigana and other phonetic guides, #1681), and the CSS
|
||
//! properties `color`, `background-color`, `font-weight`, `font-style`, `font-size`,
|
||
//! `font-family`, `text-decoration`, `vertical-align`, `text-align`, `white-space` and page
|
||
//! breaks, and on paragraphs `margin`, `text-indent` and `line-height`. CSS comes from `style`
|
||
//! attributes and from `style` elements' rules with simple selectors (`p`, `.note`, `p.note`),
|
||
//! applied in cascade order (specificity, then source order, then the `style` attribute).
|
||
//! Scripts are skipped; nesting is capped.
|
||
//!
|
||
//! Export writes clean semantic HTML with inline CSS, pictures as `data:` URIs and ruby as
|
||
//! `<ruby>`.
|
||
|
||
use std::sync::Arc;
|
||
|
||
use wordcraft_doc::props::LineSpacing;
|
||
use wordcraft_doc::props::VAlign;
|
||
use wordcraft_doc::{Align, Document};
|
||
|
||
use crate::model::{
|
||
self, Cell, FBlock, FTable, Flow, Fmt, Inline, Kind, ListInfo, Meta, Para, Spacing, base64_encode, data_uri, make_img, mime_of, parse_color,
|
||
};
|
||
|
||
mod builder;
|
||
mod css;
|
||
mod entity;
|
||
mod export;
|
||
mod import;
|
||
mod lexer;
|
||
mod math_ruby;
|
||
|
||
pub use builder::ImageLoader;
|
||
pub use css::css_len_pt;
|
||
pub use entity::{decode, decode_as, decode_entity, unescape};
|
||
pub use export::{esc, export, export_flow, export_fragment, inlines_html};
|
||
#[cfg(test)]
|
||
use import::parse_in;
|
||
pub use import::{PAGE_FONT, import, import_on, import_page, import_with, parse, parse_with};
|
||
|
||
#[cfg(test)]
|
||
mod tests;
|