ooxml_core/oxml/
writer.rs1use std::fmt::Write as FmtWrite;
24
25#[derive(Debug, Default, Clone)]
27pub struct XmlWriter {
28 pub buf: String,
30}
31
32impl XmlWriter {
33 pub fn new() -> Self {
35 XmlWriter::default()
36 }
37 pub fn with_decl() -> Self {
39 let mut w = XmlWriter::new();
40 w.decl();
41 w
42 }
43
44 pub fn decl(&mut self) {
46 self.buf
47 .push_str("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n");
48 }
49
50 pub fn open(&mut self, name: &str) {
52 self.buf.push('<');
53 self.buf.push_str(name);
54 self.buf.push('>');
55 }
56 pub fn open_with(&mut self, name: &str, attrs: &[(&str, &str)]) {
58 self.buf.push('<');
59 self.buf.push_str(name);
60 for (k, v) in attrs {
61 self.buf.push(' ');
62 self.buf.push_str(k);
63 self.buf.push_str("=\"");
64 self.buf.push_str(&super::parser::escape(v));
65 self.buf.push('"');
66 }
67 self.buf.push('>');
68 }
69 pub fn empty(&mut self, name: &str) {
71 self.buf.push('<');
72 self.buf.push_str(name);
73 self.buf.push_str("/>");
74 }
75 pub fn empty_with(&mut self, name: &str, attrs: &[(&str, &str)]) {
77 self.buf.push('<');
78 self.buf.push_str(name);
79 for (k, v) in attrs {
80 self.buf.push(' ');
81 self.buf.push_str(k);
82 self.buf.push_str("=\"");
83 self.buf.push_str(&super::parser::escape(v));
84 self.buf.push('"');
85 }
86 self.buf.push_str("/>");
87 }
88 pub fn close(&mut self, name: &str) {
90 self.buf.push_str("</");
91 self.buf.push_str(name);
92 self.buf.push('>');
93 }
94 pub fn text(&mut self, t: &str) {
96 self.buf.push_str(&super::parser::escape(t));
97 }
98 pub fn raw(&mut self, s: &str) {
100 self.buf.push_str(s);
101 }
102 pub fn leaf(&mut self, name: &str, value: &str) {
104 self.open(name);
105 self.text(value);
106 self.close(name);
107 }
108 pub fn leaf_empty(&mut self, name: &str) {
110 self.empty(name);
111 }
112 pub fn leaf_with(&mut self, name: &str, attrs: &[(&str, &str)]) {
114 self.empty_with(name, attrs);
115 }
116
117 pub fn into_string(self) -> String {
119 self.buf
120 }
121 pub fn as_str(&self) -> &str {
123 &self.buf
124 }
125}
126
127impl FmtWrite for XmlWriter {
128 fn write_str(&mut self, s: &str) -> std::fmt::Result {
129 self.buf.push_str(s);
130 Ok(())
131 }
132}