rosvgtree 0.1.0

Represent an SVG as a read-only tree.
Documentation
// Parse and write SVG back to XML to see how it was preprocessed.

fn main() {
    let args: Vec<_> = std::env::args().collect();
    if args.len() != 2 {
        println!("Usage:\n\tcargo run --example parse -- input.svg");
        std::process::exit(1);
    }

    let input = std::fs::read_to_string(&args[1]).unwrap();
    let svg = rosvgtree::Document::parse_str(&input).unwrap();

    let opt = xmlwriter::Options::default();
    let mut xml = xmlwriter::XmlWriter::new(opt);
    write_element(svg.root(), &mut xml);
    print!("{}", xml.end_document());
}

fn write_element(parent: rosvgtree::Node, xml: &mut xmlwriter::XmlWriter) {
    for node in parent.children() {
        let tag_name = match node.tag_name() {
            Some(v) => v,
            None => {
                let text = node.text();
                if !text.is_empty() {
                    xml.write_text(text);
                }

                continue;
            }
        };

        xml.start_element(tag_name.to_str());

        for attr in node.attributes() {
            xml.write_attribute(attr.name.to_str(), &attr.value);
        }

        if tag_name == rosvgtree::ElementId::Text {
            xml.set_preserve_whitespaces(true);
        }

        if node.has_children() {
            write_element(node, xml);
        }

        xml.end_element();

        if tag_name == rosvgtree::ElementId::Text {
            xml.set_preserve_whitespaces(false);
        }
    }
}