1extern crate quick_xml;
2
3use quick_xml::*;
4use quick_xml::events::*;
5
6use std::path::*;
7use std::io::*;
8use std::fs::*;
9
10#[derive(Debug)]
11pub enum Error {
12 Xml(quick_xml::Error),
13 Io(std::io::Error),
14}
15
16pub type Result<T> = std::result::Result<T, Error>;
17
18pub fn parse_dir(dir: &AsRef<Path>, target: &AsRef<Path>) -> Result<()> {
19 let target = File::create(target).map_err(Error::Io)?;
20 let mut writer = Writer::new(target);
21 write_start(&mut writer).map_err(Error::Xml)?;
22 for entry in read_dir(dir).map_err(Error::Io)? {
23 let dir = entry.map_err(Error::Io)?;
24 if !dir.path().is_file() {
25 continue;
26 }
27 let mut reader = Reader::from_file(dir.path()).map_err(Error::Xml)?;
28 reader.trim_text(true);
29 let mut buf = Vec::new();
30 write_symbol_start(&mut writer, dir.path().file_name().unwrap_or_default().to_str().unwrap_or_default()).map_err(Error::Xml)?;
31 loop {
32 match reader.read_event(&mut buf) {
33 Ok(Event::Start(e)) => {
34 if e.name() != b"?xml" {
35 writer.write_event(Event::Start(e)).map_err(Error::Xml)?;
37 }
38 }
39 Ok(Event::End(e)) => {
40 if e.name() != b"?xml" {
41 writer.write_event(Event::End(e)).map_err(Error::Xml)?;
42 }
43 }
44 Ok(Event::Eof) => break,
45 Ok(e) => {
47 writer.write_event(&e).map_err(Error::Xml)?;
48 },
49 Err(e) => return Err(Error::Xml(e)),
50 }
51 buf.clear();
52 }
53 write_symbol_end(&mut writer).map_err(Error::Xml)?;
54 }
55 write_end(&mut writer).map_err(Error::Xml)?;
56 Ok(())
57}
58
59fn write_start<T: Write>(writer: &mut Writer<T>) -> quick_xml::Result<usize> {
60 let mut elem = BytesStart::borrowed_name(b"svg");
61 elem.push_attribute(("xmlns", "http://www.w3.org/2000/svg"));
62 writer.write_event(Event::Start(elem))?;
63 writer.write_event(Event::Start(BytesStart::borrowed_name(b"defs")))
64}
65
66fn write_end<T: Write>(writer: &mut Writer<T>) -> quick_xml::Result<usize> {
67 writer.write_event(Event::End(BytesEnd::borrowed(b"defs")))?;
68 writer.write_event(Event::End(BytesEnd::borrowed(b"svg")))
69}
70
71fn write_symbol_start<T: Write>(writer: &mut Writer<T>, id: &str) -> quick_xml::Result<usize> {
72 let mut elem = BytesStart::borrowed_name(b"symbol");
73 elem.push_attribute(("id", id));
74 writer.write_event(Event::Start(elem))
75}
76
77fn write_symbol_end<T: Write>(writer: &mut Writer<T>) -> quick_xml::Result<usize> {
78 writer.write_event(Event::End(BytesEnd::borrowed(b"symbol")))
79}
80
81#[test]
82fn test_() {
83 parse_dir(&"./svgs", &"defs.svg").unwrap();
84}