//! Emphasis marks (`w:em`, ISO/IEC 29500-1 §17.3.2.12: Font › Emphasis mark) are read and //! saved again, in their place in `w:rPr`. Fixtures are hand-written from the spec. use std::io::{Read, Write}; use craft_wordmodel::props::EmphasisMark; fn docx(body: &str) -> Vec { let root = r#""#; let doc = format!( r#"{body}"# ); let mut zw = zip::ZipWriter::new(std::io::Cursor::new(Vec::new())); for (name, xml) in [("_rels/.rels", root.to_string()), ("word/document.xml", doc)] { zw.start_file(name, zip::write::SimpleFileOptions::default()).unwrap(); zw.write_all(xml.as_bytes()).unwrap(); } zw.finish().unwrap().into_inner() } fn marks(d: &craft_wordmodel::Document) -> Vec> { d.body[0].as_para().unwrap().runs.iter().map(|r| r.props.emphasis).collect() } #[test] fn emphasis_marks_are_read_and_saved() { let run = |t: &str, em: &str| format!(r#"{em}{t}"#); let body = format!( "{}{}{}{}{}{}", run("a", r#""#), run("b", r#""#), run("c", r#""#), run("d", r#""#), run("e", r#""#), run("f", r#""#), ); let d = craft_docx::read(&docx(&body)).unwrap(); // An unknown mark is none (and the run with it joins the one before, now alike). let want = [EmphasisMark::Dot, EmphasisMark::Comma, EmphasisMark::Circle, EmphasisMark::UnderDot, EmphasisMark::None].map(Some); assert_eq!(marks(&d), want); let saved = craft_docx::write(&d).unwrap(); let mut z = zip::ZipArchive::new(std::io::Cursor::new(&saved)).unwrap(); let mut xml = String::new(); z.by_name("word/document.xml").unwrap().read_to_string(&mut xml).unwrap(); // In its place: after w:cs, before w:lang. assert!(xml.contains(r#"