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>
25 std::string_view ns_alias;
26 std::string_view name;
27 std::ptrdiff_t begin_pos;
28 std::ptrdiff_t end_pos;
34 std::string_view ns_alias;
35 std::string_view name;
36 std::string_view value;
45 std::string_view name;
47 entity_name(std::string_view _ns, std::string_view _name) :
48 ns(_ns), name(_name) {}
52 return other.ns == ns && other.name == name;
59 std::hash<std::string_view> hasher;
60 return hasher(v.ns) + hasher(v.name);
65 typedef std::unordered_set<std::string_view> ns_keys_type;
66 typedef std::unordered_set<entity_name, entity_name::hash> entity_names_type;
71 std::string_view name;
75 typedef std::vector<std::unique_ptr<elem_scope>> elem_scopes_type;
82 void operator() (std::string_view key)
95 void start_declaration(std::string_view ) {}
97 void end_declaration(std::string_view ) {}
103 void characters(std::string_view ,
bool ) {}
105 void attribute(std::string_view , std::string_view ) {}
113 template<
typename _Handler>
117 typedef _Handler handler_type;
120 sax_ns_parser(
const char* content,
const size_t size,
bool transient_stream,
131 class handler_wrapper
133 __sax::elem_scopes_type m_scopes;
134 __sax::ns_keys_type m_ns_keys;
135 __sax::entity_names_type m_attrs;
141 handler_type& m_handler;
146 handler_wrapper(
xmlns_context& ns_cxt, handler_type& handler) : m_ns_cxt(ns_cxt), m_handler(handler), m_declaration(
false) {}
150 m_handler.doctype(dtd);
153 void start_declaration(std::string_view name)
155 m_declaration =
true;
156 m_handler.start_declaration(name);
159 void end_declaration(std::string_view name)
161 m_declaration =
false;
162 m_handler.end_declaration(name);
167 m_scopes.push_back(std::make_unique<__sax::elem_scope>());
169 scope.ns = m_ns_cxt.
get(elem.ns);
170 scope.name = elem.name;
171 scope.ns_keys.swap(m_ns_keys);
173 m_elem.ns = scope.ns;
174 m_elem.ns_alias = elem.ns;
175 m_elem.name = scope.name;
176 m_elem.begin_pos = elem.begin_pos;
177 m_elem.end_pos = elem.end_pos;
178 m_handler.start_element(m_elem);
186 if (scope.ns != m_ns_cxt.
get(elem.ns) || scope.name != elem.name)
189 m_elem.ns = scope.ns;
190 m_elem.ns_alias = elem.ns;
191 m_elem.name = scope.name;
192 m_elem.begin_pos = elem.begin_pos;
193 m_elem.end_pos = elem.end_pos;
194 m_handler.end_element(m_elem);
202 void characters(std::string_view val,
bool transient)
204 m_handler.characters(val,
transient);
212 m_handler.attribute(attr.name, attr.value);
218 "You can't define two attributes of the same name in the same element.", -1);
222 if (attr.ns.empty() && attr.name ==
"xmlns")
225 m_ns_cxt.push(std::string_view{}, attr.value);
226 m_ns_keys.insert(std::string_view{});
230 if (attr.ns ==
"xmlns")
233 if (!attr.name.empty())
235 m_ns_cxt.push(attr.name, attr.value);
236 m_ns_keys.insert(attr.name);
241 m_attr.ns = attr.ns.empty() ? XMLNS_UNKNOWN_ID : m_ns_cxt.
get(attr.ns);
242 m_attr.ns_alias = attr.ns;
243 m_attr.name = attr.name;
244 m_attr.value = attr.value;
245 m_attr.transient = attr.transient;
246 m_handler.attribute(m_attr);
251 handler_wrapper m_wrapper;
255 template<
typename _Handler>
257 const char* content,
const size_t size,
xmlns_context& ns_cxt, handler_type& handler) :
258 m_wrapper(ns_cxt, handler), m_parser(content, size, m_wrapper)
262 template<
typename _Handler>
263 sax_ns_parser<_Handler>::sax_ns_parser(
264 const char* content,
const size_t size,
bool transient_stream, xmlns_context& ns_cxt, handler_type& handler) :
265 m_wrapper(ns_cxt, handler), m_parser(content, size, transient_stream, m_wrapper)
269 template<
typename _Handler>
270 sax_ns_parser<_Handler>::~sax_ns_parser()
274 template<
typename _Handler>
275 void sax_ns_parser<_Handler>::parse()
Definition: sax_ns_parser.hpp:78
Definition: sax_ns_parser.hpp:91
Definition: sax_ns_parser.hpp:115
Definition: xml_namespace.hpp:82
xmlns_id_t get(std::string_view key) const
Definition: sax_ns_parser.hpp:69
Definition: sax_ns_parser.hpp:56
Definition: sax_ns_parser.hpp:43
Definition: sax_parser_base.hpp:45
Definition: sax_parser_base.hpp:100
Definition: sax_parser_base.hpp:85
Definition: sax_ns_parser.hpp:32
Definition: sax_ns_parser.hpp:23