8 #ifndef INCLUDED_ORCUS_SAX_NS_PARSER_HPP 9 #define INCLUDED_ORCUS_SAX_NS_PARSER_HPP 11 #include "sax_parser.hpp" 12 #include "xml_namespace.hpp" 15 #include <unordered_set> 27 std::ptrdiff_t begin_pos;
28 std::ptrdiff_t end_pos;
48 ns(_ns), name(_name) {}
52 return other.ns == ns && other.name == name;
60 return hasher(v.ns) + hasher(v.name);
65 typedef std::unordered_set<pstring, pstring::hash> ns_keys_type;
66 typedef std::unordered_set<entity_name, entity_name::hash> entity_names_type;
75 typedef std::vector<std::unique_ptr<elem_scope>> elem_scopes_type;
82 void operator() (
const pstring& key)
93 template<
typename _Handler>
97 typedef _Handler handler_type;
100 sax_ns_parser(
const char* content,
const size_t size,
bool transient_stream,
111 class handler_wrapper
113 __sax::elem_scopes_type m_scopes;
114 __sax::ns_keys_type m_ns_keys;
115 __sax::entity_names_type m_attrs;
121 handler_type& m_handler;
126 handler_wrapper(
xmlns_context& ns_cxt, handler_type& handler) : m_ns_cxt(ns_cxt), m_handler(handler), m_declaration(
false) {}
130 m_handler.doctype(dtd);
133 void start_declaration(
const pstring& name)
135 m_declaration =
true;
136 m_handler.start_declaration(name);
139 void end_declaration(
const pstring& name)
141 m_declaration =
false;
142 m_handler.end_declaration(name);
147 m_scopes.push_back(orcus::make_unique<__sax::elem_scope>());
149 scope.ns = m_ns_cxt.
get(elem.ns);
150 scope.name = elem.name;
151 scope.ns_keys.swap(m_ns_keys);
153 m_elem.ns = scope.ns;
154 m_elem.ns_alias = elem.ns;
155 m_elem.name = scope.name;
156 m_elem.begin_pos = elem.begin_pos;
157 m_elem.end_pos = elem.end_pos;
158 m_handler.start_element(m_elem);
166 if (scope.ns != m_ns_cxt.
get(elem.ns) || scope.name != elem.name)
169 m_elem.ns = scope.ns;
170 m_elem.ns_alias = elem.ns;
171 m_elem.name = scope.name;
172 m_elem.begin_pos = elem.begin_pos;
173 m_elem.end_pos = elem.end_pos;
174 m_handler.end_element(m_elem);
182 void characters(
const pstring& val,
bool transient)
184 m_handler.characters(val,
transient);
192 m_handler.attribute(attr.name, attr.value);
198 "You can't define two attributes of the same name in the same element.", -1);
202 if (attr.ns.empty() && attr.name ==
"xmlns")
205 m_ns_cxt.push(
pstring(), attr.value);
210 if (attr.ns ==
"xmlns")
213 if (!attr.name.empty())
215 m_ns_cxt.push(attr.name, attr.value);
216 m_ns_keys.insert(attr.name);
221 m_attr.ns = m_ns_cxt.
get(attr.ns);
222 m_attr.ns_alias = attr.ns;
223 m_attr.name = attr.name;
224 m_attr.value = attr.value;
225 m_attr.transient = attr.transient;
226 m_handler.attribute(m_attr);
231 handler_wrapper m_wrapper;
235 template<
typename _Handler>
237 const char* content,
const size_t size,
xmlns_context& ns_cxt, handler_type& handler) :
238 m_wrapper(ns_cxt, handler), m_parser(content, size, m_wrapper)
242 template<
typename _Handler>
243 sax_ns_parser<_Handler>::sax_ns_parser(
244 const char* content,
const size_t size,
bool transient_stream, xmlns_context& ns_cxt, handler_type& handler) :
245 m_wrapper(ns_cxt, handler), m_parser(content, size, transient_stream, m_wrapper)
249 template<
typename _Handler>
250 sax_ns_parser<_Handler>::~sax_ns_parser()
254 template<
typename _Handler>
255 void sax_ns_parser<_Handler>::parse()
Definition: pstring.hpp:82
Definition: sax_ns_parser.hpp:68
Definition: pstring.hpp:27
Definition: sax_ns_parser.hpp:55
Definition: sax_ns_parser.hpp:42
Definition: sax_ns_parser.hpp:31
Definition: sax_ns_parser.hpp:94
Definition: xml_namespace.hpp:82
Definition: sax_ns_parser.hpp:22
Definition: sax_parser_base.hpp:100
Definition: sax_parser_base.hpp:85
Definition: sax_parser_base.hpp:45
Definition: sax_ns_parser.hpp:77
xmlns_id_t get(const pstring &key) const
Definition: base64.hpp:15