| 7a956470 |
sago007 |
2016-02-14 17:09 |
1 |
#ifndef RAPIDXML_PRINT_HPP_INCLUDED |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
2 |
#define RAPIDXML_PRINT_HPP_INCLUDED |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
3 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
4 |
// Copyright (C) 2006, 2009 Marcin Kalicinski |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
5 |
// Version 1.13 |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
6 |
// Revision $DateTime: 2009/05/13 01:46:17 $ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
7 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
8 |
#include "rapidxml.hpp" |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
9 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
10 |
// Only include streams if not disabled |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
11 |
#ifndef RAPIDXML_NO_STREAMS |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
12 |
#include <ostream> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
13 |
#include <iterator> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
14 |
#endif |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
15 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
16 |
namespace rapidxml |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
17 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
18 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
19 |
/////////////////////////////////////////////////////////////////////// |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
20 |
// Printing flags |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
21 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
22 |
const int print_no_indenting = 0x1; //!< Printer flag instructing the printer to suppress indenting of XML. See print() function. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
23 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
24 |
/////////////////////////////////////////////////////////////////////// |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
25 |
// Internal |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
26 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
27 |
//! \cond internal |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
28 |
namespace internal |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
29 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
30 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
31 |
/////////////////////////////////////////////////////////////////////////// |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
32 |
// Internal character operations |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
33 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
34 |
// Copy characters from given range to given output iterator |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
35 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
36 |
inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
37 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
38 |
while (begin != end) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
39 |
*out++ = *begin++; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
40 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
41 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
42 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
43 |
// Copy characters from given range to given output iterator and expand |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
44 |
// characters into references (< > ' " &) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
45 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
46 |
inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
47 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
48 |
while (begin != end) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
49 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
50 |
if (*begin == noexpand) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
51 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
52 |
*out++ = *begin; // No expansion, copy character |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
53 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
54 |
else |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
55 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
56 |
switch (*begin) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
57 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
58 |
case Ch('<'): |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
59 |
*out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';'); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
60 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
61 |
case Ch('>'): |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
62 |
*out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';'); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
63 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
64 |
case Ch('\''): |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
65 |
*out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';'); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
66 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
67 |
case Ch('"'): |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
68 |
*out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';'); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
69 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
70 |
case Ch('&'): |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
71 |
*out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';'); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
72 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
73 |
default: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
74 |
*out++ = *begin; // No expansion, copy character |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
75 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
76 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
77 |
++begin; // Step to next character |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
78 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
79 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
80 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
81 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
82 |
// Fill given output iterator with repetitions of the same character |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
83 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
84 |
inline OutIt fill_chars(OutIt out, int n, Ch ch) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
85 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
86 |
for (int i = 0; i < n; ++i) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
87 |
*out++ = ch; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
88 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
89 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
90 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
91 |
// Find character |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
92 |
template<class Ch, Ch ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
93 |
inline bool find_char(const Ch *begin, const Ch *end) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
94 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
95 |
while (begin != end) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
96 |
if (*begin++ == ch) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
97 |
return true; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
98 |
return false; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
99 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
100 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
101 |
/////////////////////////////////////////////////////////////////////////// |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
102 |
// Internal printing operations |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
103 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
104 |
// Print node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
105 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
106 |
inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
107 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
108 |
// Print children of the node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
109 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
110 |
inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
111 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
112 |
for (xml_node<Ch> *child = node->first_node(); child; child = child->next_sibling()) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
113 |
out = print_node(out, child, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
114 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
115 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
116 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
117 |
// Print attributes of the node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
118 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
119 |
inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int /*flags*/) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
120 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
121 |
for (xml_attribute<Ch> *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute()) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
122 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
123 |
if (attribute->name() && attribute->value()) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
124 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
125 |
// Print attribute name |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
126 |
*out = Ch(' '), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
127 |
out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
128 |
*out = Ch('='), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
129 |
// Print attribute value using appropriate quote type |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
130 |
if (find_char<Ch, Ch('"')>(attribute->value(), attribute->value() + attribute->value_size())) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
131 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
132 |
*out = Ch('\''), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
133 |
out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('"'), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
134 |
*out = Ch('\''), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
135 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
136 |
else |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
137 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
138 |
*out = Ch('"'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
139 |
out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\''), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
140 |
*out = Ch('"'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
141 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
142 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
143 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
144 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
145 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
146 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
147 |
// Print data node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
148 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
149 |
inline OutIt print_data_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
150 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
151 |
assert(node->type() == node_data); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
152 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
153 |
out = fill_chars(out, indent, Ch('\t')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
154 |
out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
155 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
156 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
157 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
158 |
// Print data node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
159 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
160 |
inline OutIt print_cdata_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
161 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
162 |
assert(node->type() == node_cdata); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
163 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
164 |
out = fill_chars(out, indent, Ch('\t')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
165 |
*out = Ch('<'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
166 |
*out = Ch('!'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
167 |
*out = Ch('['); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
168 |
*out = Ch('C'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
169 |
*out = Ch('D'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
170 |
*out = Ch('A'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
171 |
*out = Ch('T'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
172 |
*out = Ch('A'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
173 |
*out = Ch('['); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
174 |
out = copy_chars(node->value(), node->value() + node->value_size(), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
175 |
*out = Ch(']'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
176 |
*out = Ch(']'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
177 |
*out = Ch('>'); ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
178 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
179 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
180 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
181 |
// Print element node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
182 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
183 |
inline OutIt print_element_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
184 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
185 |
assert(node->type() == node_element); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
186 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
187 |
// Print element name and attributes, if any |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
188 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
189 |
out = fill_chars(out, indent, Ch('\t')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
190 |
*out = Ch('<'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
191 |
out = copy_chars(node->name(), node->name() + node->name_size(), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
192 |
out = print_attributes(out, node, flags); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
193 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
194 |
// If node is childless |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
195 |
if (node->value_size() == 0 && !node->first_node()) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
196 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
197 |
// Print childless node tag ending |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
198 |
*out = Ch('/'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
199 |
*out = Ch('>'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
200 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
201 |
else |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
202 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
203 |
// Print normal node tag ending |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
204 |
*out = Ch('>'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
205 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
206 |
// Test if node contains a single data node only (and no other nodes) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
207 |
xml_node<Ch> *child = node->first_node(); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
208 |
if (!child) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
209 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
210 |
// If node has no children, only print its value without indenting |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
211 |
out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
212 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
213 |
else if (child->next_sibling() == 0 && child->type() == node_data) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
214 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
215 |
// If node has a sole data child, only print its value without indenting |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
216 |
out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
217 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
218 |
else |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
219 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
220 |
// Print all children with full indenting |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
221 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
222 |
*out = Ch('\n'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
223 |
out = print_children(out, node, flags, indent + 1); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
224 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
225 |
out = fill_chars(out, indent, Ch('\t')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
226 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
227 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
228 |
// Print node end |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
229 |
*out = Ch('<'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
230 |
*out = Ch('/'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
231 |
out = copy_chars(node->name(), node->name() + node->name_size(), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
232 |
*out = Ch('>'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
233 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
234 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
235 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
236 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
237 |
// Print declaration node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
238 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
239 |
inline OutIt print_declaration_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
240 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
241 |
// Print declaration start |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
242 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
243 |
out = fill_chars(out, indent, Ch('\t')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
244 |
*out = Ch('<'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
245 |
*out = Ch('?'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
246 |
*out = Ch('x'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
247 |
*out = Ch('m'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
248 |
*out = Ch('l'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
249 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
250 |
// Print attributes |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
251 |
out = print_attributes(out, node, flags); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
252 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
253 |
// Print declaration end |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
254 |
*out = Ch('?'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
255 |
*out = Ch('>'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
256 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
257 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
258 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
259 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
260 |
// Print comment node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
261 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
262 |
inline OutIt print_comment_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
263 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
264 |
assert(node->type() == node_comment); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
265 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
266 |
out = fill_chars(out, indent, Ch('\t')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
267 |
*out = Ch('<'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
268 |
*out = Ch('!'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
269 |
*out = Ch('-'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
270 |
*out = Ch('-'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
271 |
out = copy_chars(node->value(), node->value() + node->value_size(), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
272 |
*out = Ch('-'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
273 |
*out = Ch('-'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
274 |
*out = Ch('>'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
275 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
276 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
277 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
278 |
// Print doctype node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
279 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
280 |
inline OutIt print_doctype_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
281 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
282 |
assert(node->type() == node_doctype); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
283 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
284 |
out = fill_chars(out, indent, Ch('\t')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
285 |
*out = Ch('<'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
286 |
*out = Ch('!'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
287 |
*out = Ch('D'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
288 |
*out = Ch('O'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
289 |
*out = Ch('C'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
290 |
*out = Ch('T'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
291 |
*out = Ch('Y'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
292 |
*out = Ch('P'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
293 |
*out = Ch('E'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
294 |
*out = Ch(' '), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
295 |
out = copy_chars(node->value(), node->value() + node->value_size(), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
296 |
*out = Ch('>'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
297 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
298 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
299 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
300 |
// Print pi node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
301 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
302 |
inline OutIt print_pi_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
303 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
304 |
assert(node->type() == node_pi); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
305 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
306 |
out = fill_chars(out, indent, Ch('\t')); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
307 |
*out = Ch('<'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
308 |
*out = Ch('?'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
309 |
out = copy_chars(node->name(), node->name() + node->name_size(), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
310 |
*out = Ch(' '), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
311 |
out = copy_chars(node->value(), node->value() + node->value_size(), out); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
312 |
*out = Ch('?'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
313 |
*out = Ch('>'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
314 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
315 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
316 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
317 |
// Print node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
318 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
319 |
inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
320 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
321 |
// Print proper node type |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
322 |
switch (node->type()) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
323 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
324 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
325 |
// Document |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
326 |
case node_document: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
327 |
out = print_children(out, node, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
328 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
329 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
330 |
// Element |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
331 |
case node_element: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
332 |
out = print_element_node(out, node, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
333 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
334 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
335 |
// Data |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
336 |
case node_data: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
337 |
out = print_data_node(out, node, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
338 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
339 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
340 |
// CDATA |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
341 |
case node_cdata: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
342 |
out = print_cdata_node(out, node, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
343 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
344 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
345 |
// Declaration |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
346 |
case node_declaration: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
347 |
out = print_declaration_node(out, node, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
348 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
349 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
350 |
// Comment |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
351 |
case node_comment: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
352 |
out = print_comment_node(out, node, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
353 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
354 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
355 |
// Doctype |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
356 |
case node_doctype: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
357 |
out = print_doctype_node(out, node, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
358 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
359 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
360 |
// Pi |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
361 |
case node_pi: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
362 |
out = print_pi_node(out, node, flags, indent); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
363 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
364 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
365 |
// Unknown |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
366 |
default: |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
367 |
assert(0); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
368 |
break; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
369 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
370 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
371 |
// If indenting not disabled, add line break after node |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
372 |
if (!(flags & print_no_indenting)) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
373 |
*out = Ch('\n'), ++out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
374 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
375 |
// Return modified iterator |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
376 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
377 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
378 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
379 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
380 |
//! \endcond |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
381 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
382 |
/////////////////////////////////////////////////////////////////////////// |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
383 |
// Printing |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
384 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
385 |
//! Prints XML to given output iterator. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
386 |
//! \param out Output iterator to print to. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
387 |
//! \param node Node to be printed. Pass xml_document to print entire document. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
388 |
//! \param flags Flags controlling how XML is printed. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
389 |
//! \return Output iterator pointing to position immediately after last character of printed text. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
390 |
template<class OutIt, class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
391 |
inline OutIt print(OutIt out, const xml_node<Ch> &node, int flags = 0) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
392 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
393 |
return internal::print_node(out, &node, flags, 0); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
394 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
395 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
396 |
#ifndef RAPIDXML_NO_STREAMS |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
397 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
398 |
//! Prints XML to given output stream. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
399 |
//! \param out Output stream to print to. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
400 |
//! \param node Node to be printed. Pass xml_document to print entire document. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
401 |
//! \param flags Flags controlling how XML is printed. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
402 |
//! \return Output stream. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
403 |
template<class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
404 |
inline std::basic_ostream<Ch> &print(std::basic_ostream<Ch> &out, const xml_node<Ch> &node, int flags = 0) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
405 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
406 |
print(std::ostream_iterator<Ch>(out), node, flags); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
407 |
return out; |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
408 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
409 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
410 |
//! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
411 |
//! \param out Output stream to print to. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
412 |
//! \param node Node to be printed. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
413 |
//! \return Output stream. |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
414 |
template<class Ch> |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
415 |
inline std::basic_ostream<Ch> &operator <<(std::basic_ostream<Ch> &out, const xml_node<Ch> &node) |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
416 |
{ |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
417 |
return print(out, node); |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
418 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
419 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
420 |
#endif |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
421 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
422 |
} |
| 7a956470 |
sago007 |
2016-02-14 17:09 |
423 |
|
| 7a956470 |
sago007 |
2016-02-14 17:09 |
424 |
#endif |
|
|
1970-01-01 00:00 |
425 |
|