rwml 0.1.0

Native Rust toolkit for Microsoft Word — read, write, edit, and render legacy .doc (Word 97-2003, [MS-DOC]) and modern .docx (OOXML): one document model, package-preserving edits, field evaluation, Markdown/HTML export, PDF preview
Documentation
#![cfg(feature = "render")]

use std::panic::{catch_unwind, AssertUnwindSafe};

use rwml::{DocBuilder, Error};

fn fonts() -> Vec<Vec<u8>> {
    vec![rwml_fonts::noto_sans_kr_subset().to_vec()]
}

#[test]
fn layout_pages_rejects_empty_or_unregistered_strict_fonts() {
    let model = DocBuilder::new().paragraph("strict font test").build();

    assert!(matches!(
        rwml::layout_pages_with_fonts(&model, &[]),
        Err(Error::Render(_))
    ));

    let garbage = catch_unwind(AssertUnwindSafe(|| {
        rwml::layout_pages_with_fonts(&model, &[vec![1, 2, 3, 4, 5]])
    }));
    assert!(garbage.is_ok(), "garbage font bytes must not panic");
    assert!(matches!(garbage.unwrap(), Err(Error::Render(_))));
}

#[test]
fn layout_pages_reports_physical_pages_for_body_page_fields() {
    let model = DocBuilder::new()
        .field("PAGE", "stale one")
        .page_break()
        .field("PAGE", "stale two")
        .page_break()
        .paragraph("last page")
        .build();

    let pages = rwml::layout_pages_with_fonts(&model, &fonts()).expect("layout pages");

    assert_eq!(pages.pages, 3);
    assert_eq!(pages.page_fields, vec![Some(1), Some(2)]);
    assert_eq!(
        rwml::layout_pages_with_fonts(&model, &fonts()).expect("layout pages repeat"),
        pages
    );
}

#[test]
fn layout_pages_reports_first_page_each_top_level_block_touches() {
    let model = DocBuilder::new()
        .paragraph("first block")
        .page_break()
        .paragraph("post-break block")
        .build();

    let pages = rwml::layout_pages_with_fonts(&model, &fonts()).expect("layout pages");

    assert_eq!(pages.block_pages[0], Some(1));
    assert_eq!(pages.block_pages[2], Some(2));
}