Skip to main content

dump_doc_text/
dump_doc_text.rs

1fn main() {
2    let path = std::env::args().nth(1).expect("path");
3    let bytes = std::fs::read(&path).expect("read");
4    let pkg = if path.ends_with(".doc") {
5        extend_docx::parse_document_bytes(&bytes).expect("parse")
6    } else {
7        extend_docx::parse_docx(&bytes).expect("parse_docx")
8    };
9    let model = extend_docx::build_doc_model(&pkg);
10    print!("{}", text(&model));
11}
12fn text(model: &extend_docx::DocModel) -> String {
13    let mut out = String::new();
14    for node in &model.nodes { walk(node, &mut out); }
15    out
16}
17fn walk(node: &extend_docx::DocNode, out: &mut String) {
18    match node {
19        extend_docx::DocNode::Paragraph(p) => {
20            for c in &p.children {
21                if let extend_docx::ParagraphChildNode::Text(r) = c { out.push_str(&r.text); }
22            }
23            out.push('\n');
24        }
25        extend_docx::DocNode::Table(t) => {
26            for row in &t.rows { for cell in &row.cells { for n in &cell.nodes {
27                match n {
28                    extend_docx::TableCellContentNode::Paragraph(p) => {
29                        for c in &p.children { if let extend_docx::ParagraphChildNode::Text(r) = c { out.push_str(&r.text); } }
30                        out.push('\n');
31                    }
32                    extend_docx::TableCellContentNode::Table(t2) => walk(&extend_docx::DocNode::Table(*t2.clone()), out),
33                }
34            } } }
35        }
36    }
37}