XMLTreeWalker.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /*
3  * This file is part of the libe-book project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #ifndef XMLTREEWALKER_H_INCLUDED
11 #define XMLTREEWALKER_H_INCLUDED
12 
13 #include <iterator>
14 #include <string>
15 
16 #include <boost/intrusive_ptr.hpp>
17 
18 #include <librevenge-stream/librevenge-stream.h>
19 
20 #include "libebook_libcss.h"
21 #include "XMLStylesheet.h"
22 #include "XMLTreeNode.h"
23 
24 namespace libebook
25 {
26 
28 {
29 public:
30  class Attribute;
31  class AttributeIterator;
32  class Iterator;
33 
34  typedef int (*TokenizerFun_t)(const char *, std::size_t);
35 
36 public:
37  explicit XMLTreeWalker(const XMLTreeNodePtr_t &p, TokenizerFun_t tok = 0);
38 
39  bool empty() const;
40 
41  Iterator begin() const;
42  const Iterator end() const;
43 
44  bool hasParent() const;
45  const XMLTreeWalker getParent() const;
46 
47  bool isDocument() const;
48  bool isElement() const;
49  bool isText() const;
50 
51  int getId() const;
52 
53  const std::string getName() const;
54  const std::string getNamespace() const;
55 
56  const std::string &getText() const;
57 
58  bool hasAttributes() const;
59 
61  const AttributeIterator endAttributes() const;
62 
63  CSSSelectResultsPtr_t getStyle(const XMLStylesheets_t &sheets, bool quirks = false,
64  const CSSStylesheetPtr_t &inlineSheet = CSSStylesheetPtr_t()) const;
65 
66 private:
69 };
70 
72 {
73  // need access to ctor
74  friend class AttributeIterator;
75  friend class XMLTreeWalker;
76 
77 public:
78  int getId() const;
79  int getValueId() const;
80 
81  const std::string getName() const;
82  const std::string getNamespace() const;
83  const std::string getValue() const;
84 
85  bool operator==(const XMLTreeWalker::Attribute &rhs) const;
86 
87 private:
88  Attribute(const XMLTreeNodePtr_t &node, std::size_t index, TokenizerFun_t tok);
89 
90 private:
92  std::size_t m_index;
94 };
95 
97 
99 {
100  friend class XMLTreeWalker; // needs access to ctor
101 
102 public:
104  const AttributeIterator operator++(int);
105 
106  const Attribute &operator*() const;
107  const Attribute *operator->() const;
108 
110 
111 private:
112  explicit AttributeIterator(const XMLTreeNodePtr_t &node, TokenizerFun_t tok, bool end = false);
113 
114 private:
116  std::size_t m_index;
119 };
120 
122 
124 {
125  friend class XMLTreeWalker; // needs access to ctor
126 
127 public:
128  Iterator &operator++();
129  const Iterator operator++(int);
130 
131  const XMLTreeWalker &operator*() const;
132  const XMLTreeWalker *operator->() const;
133 
134  bool operator==(const XMLTreeWalker::Iterator &rhs) const;
135 
136 private:
137  Iterator(const XMLTreeNodePtr_t &node, TokenizerFun_t tok);
138 
139 private:
143 };
144 
146 
147 }
148 
149 namespace std
150 {
151 
152 // NOTE: I use specialization of std::iterator_traits because -Weffc++
153 // is too eager and does not let me derive from std::iterator .
154 
155 template<>
156 struct iterator_traits<libebook::XMLTreeWalker::AttributeIterator>
157 {
159  typedef std::ptrdiff_t difference_type;
160  typedef std::forward_iterator_tag iterator_category;
163 };
164 
165 template<>
166 struct iterator_traits<libebook::XMLTreeWalker::Iterator>
167 {
169  typedef std::ptrdiff_t difference_type;
170  typedef std::forward_iterator_tag iterator_category;
173 };
174 
175 }
176 
177 #endif // XMLTREEWALKER_H_INCLUDED
178 
179 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
libebook::XMLTreeWalker::Attribute
Definition: XMLTreeWalker.h:72
libebook_libcss.h
len
size_t len
Definition: EBOOKHTMLParser.cpp:47
std::iterator_traits< libebook::XMLTreeWalker::Iterator >::pointer_type
libebook::XMLTreeWalker * pointer_type
Definition: XMLTreeWalker.h:171
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::pointer_type
libebook::XMLTreeWalker::Attribute * pointer_type
Definition: XMLTreeWalker.h:161
libebook::EBOOKHTMLToken::link
@ link
Definition: EBOOKHTMLToken.h:97
libebook::XMLTreeWalker
Definition: XMLTreeWalker.h:28
libebook::XMLTreeWalker::AttributeIterator::m_node
const XMLTreeNodePtr_t m_node
Definition: XMLTreeWalker.h:115
libebook::XMLTreeWalker::Attribute::getName
const std::string getName() const
Definition: XMLTreeWalker.cpp:1391
libebook::XMLTreeWalker::AttributeIterator
Definition: XMLTreeWalker.h:99
libebook::XMLTreeWalker::hasParent
bool hasParent() const
Definition: XMLTreeWalker.cpp:1248
libebook::XMLTreeWalker::begin
Iterator begin() const
Definition: XMLTreeWalker.cpp:1232
libebook::XMLTreeWalker::isText
bool isText() const
Definition: XMLTreeWalker.cpp:1276
libebook::XMLStylesheets_t
std::deque< XMLStylesheet > XMLStylesheets_t
Definition: XMLStylesheet.h:51
libebook::FictionBook2Token::v
@ v
Definition: FictionBook2Token.h:97
libebook::XMLTreeWalker::Attribute::operator==
bool operator==(const XMLTreeWalker::Attribute &rhs) const
Definition: XMLTreeWalker.cpp:1406
libebook::XMLTreeWalker::m_impl
XMLTreeNodePtr_t m_impl
Definition: XMLTreeWalker.h:67
libebook::XMLTreeNode::NODE_TYPE_DOCUMENT
@ NODE_TYPE_DOCUMENT
Definition: XMLTreeNode.h:31
libebook::XMLTreeWalker::AttributeIterator::m_index
std::size_t m_index
Definition: XMLTreeWalker.h:116
libebook::XMLTreeWalker::Iterator::operator->
const XMLTreeWalker * operator->() const
Definition: XMLTreeWalker.cpp:1499
libebook::XMLTreeWalker::getParent
const XMLTreeWalker getParent() const
Definition: XMLTreeWalker.cpp:1255
libebook::XMLStylesheet::SOURCE_UA
@ SOURCE_UA
Definition: XMLStylesheet.h:28
libebook::XMLStylesheet::SOURCE_USER
@ SOURCE_USER
Definition: XMLStylesheet.h:29
libebook::XMLTreeWalker::Attribute::m_index
std::size_t m_index
Definition: XMLTreeWalker.h:92
libebook::XMLTreeWalker::Iterator::operator++
Iterator & operator++()
Definition: XMLTreeWalker.cpp:1474
libebook
Definition: BBeBCollector.cpp:19
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::difference_type
std::ptrdiff_t difference_type
Definition: XMLTreeWalker.h:159
libebook::XMLTreeNode::QName::name
LWCStringPtr_t name
Definition: XMLTreeNode.h:40
value
qi::rule< Iterator, AttrValue_t, qi::space_type > value
Definition: TealDocParser.cpp:231
libebook::XMLTreeWalker::getStyle
CSSSelectResultsPtr_t getStyle(const XMLStylesheets_t &sheets, bool quirks=false, const CSSStylesheetPtr_t &inlineSheet=CSSStylesheetPtr_t()) const
Definition: XMLTreeWalker.cpp:1524
libebook::XMLTreeNode::AttributeData::id
int id
Definition: XMLTreeNode.h:83
libebook_utils.h
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::reference_type
libebook::XMLTreeWalker::Attribute & reference_type
Definition: XMLTreeWalker.h:162
XMLTreeNode.h
libebook::XMLTreeWalker::getName
const std::string getName() const
Definition: XMLTreeWalker.cpp:1306
libebook::XMLTreeWalker::Iterator::operator*
const XMLTreeWalker & operator*() const
Definition: XMLTreeWalker.cpp:1492
libebook::XMLTreeWalker::Attribute::getValue
const std::string getValue() const
Definition: XMLTreeWalker.cpp:1401
libebook::XMLTreeWalker::Attribute::m_node
XMLTreeNodePtr_t m_node
Definition: XMLTreeWalker.h:91
libebook::intrusive_ptr_add_ref
void intrusive_ptr_add_ref(XMLTreeNode *const p)
Definition: XMLTreeNode.cpp:483
libebook::operator!=
bool operator!=(const XMLTreeNode::QName &lhs, const XMLTreeNode::QName &rhs)
Definition: XMLTreeNode.cpp:445
m_str
const string & m_str
Definition: XMLTreeWalker.cpp:144
libebook::XMLTreeNode::AttributeData::value
LWCStringPtr_t value
Definition: XMLTreeNode.h:82
libebook::XMLTreeWalker::endAttributes
const AttributeIterator endAttributes() const
Definition: XMLTreeWalker.cpp:1346
libebook::EBOOKHTMLToken::rhs
@ rhs
Definition: EBOOKHTMLToken.h:309
libebook::XMLTreeWalker::Attribute::getValueId
int getValueId() const
Definition: XMLTreeWalker.cpp:1382
libebook::CSSSelectResultsPtr_t
std::shared_ptr< css_select_results > CSSSelectResultsPtr_t
Definition: libebook_libcss.h:25
libebook::XMLTreeNode::NODE_TYPE_TEXT
@ NODE_TYPE_TEXT
Definition: XMLTreeNode.h:33
libebook::EBOOKHTMLToken::i
@ i
Definition: EBOOKHTMLToken.h:86
libebook::XMLTreeWalker::hasAttributes
bool hasAttributes() const
Definition: XMLTreeWalker.cpp:1330
libebook::operator==
bool operator==(const XMLTreeNode::QName &lhs, const XMLTreeNode::QName &rhs)
Definition: XMLTreeNode.cpp:440
libebook::XMLTreeWalker::Attribute::getNamespace
const std::string getNamespace() const
Definition: XMLTreeWalker.cpp:1396
libebook::XMLTreeWalker::beginAttributes
AttributeIterator beginAttributes() const
Definition: XMLTreeWalker.cpp:1338
libebook::XMLTreeWalker::XMLTreeWalker
XMLTreeWalker(const XMLTreeNodePtr_t &p, TokenizerFun_t tok=0)
Definition: XMLTreeWalker.cpp:1354
libebook::XMLTreeWalker::AttributeIterator::m_tok
TokenizerFun_t m_tok
Definition: XMLTreeWalker.h:118
std::iterator_traits< libebook::XMLTreeWalker::Iterator >::difference_type
std::ptrdiff_t difference_type
Definition: XMLTreeWalker.h:169
libebook::XMLTreeWalker::AttributeIterator::m_current
Attribute m_current
Definition: XMLTreeWalker.h:117
libebook::XMLTreeWalker::Iterator
Definition: XMLTreeWalker.h:124
libebook::XMLTreeWalker::isDocument
bool isDocument() const
Definition: XMLTreeWalker.cpp:1262
libebook::CSSStylesheetPtr_t
std::shared_ptr< css_stylesheet > CSSStylesheetPtr_t
Definition: libebook_libcss.h:23
std::iterator_traits< libebook::XMLTreeWalker::Iterator >::value_type
libebook::XMLTreeWalker value_type
Definition: XMLTreeWalker.h:168
libebook::FictionBook2Token::match
@ match
Definition: FictionBook2Token.h:112
libebook::XMLTreeNode::AttributeData::qname
QName qname
Definition: XMLTreeNode.h:81
libebook::XMLTreeWalker::Attribute::getId
int getId() const
Definition: XMLTreeWalker.cpp:1360
str
const char * str
Definition: EBOOKHTMLParser.cpp:46
libebook::EBOOKHTMLToken::p
@ p
Definition: EBOOKHTMLToken.h:116
libebook::XMLTreeWalker::Attribute::Attribute
Attribute(const XMLTreeNodePtr_t &node, std::size_t index, TokenizerFun_t tok)
Definition: XMLTreeWalker.cpp:1411
libebook::wrap
HUBBUBParserPtr_t wrap(hubbub_parser *const p)
Definition: libebook_hubbub.cpp:15
libebook::XMLTreeWalker::end
const Iterator end() const
Definition: XMLTreeWalker.cpp:1240
libebook::XMLTreeWalker::TokenizerFun_t
int(* TokenizerFun_t)(const char *, std::size_t)
Definition: XMLTreeWalker.h:34
m_qname
const XMLTreeNode::QName & m_qname
Definition: XMLTreeWalker.cpp:164
libebook::XMLTreeWalker::getText
const std::string & getText() const
Definition: XMLTreeWalker.cpp:1322
libebook::XMLTreeWalker::Attribute::m_tok
TokenizerFun_t m_tok
Definition: XMLTreeWalker.h:93
libebook::XMLTreeWalker::Iterator::Iterator
Iterator(const XMLTreeNodePtr_t &node, TokenizerFun_t tok)
Definition: XMLTreeWalker.cpp:1511
std::iterator_traits< libebook::XMLTreeWalker::Iterator >::iterator_category
std::forward_iterator_tag iterator_category
Definition: XMLTreeWalker.h:170
libebook::XMLTreeWalker::m_tok
TokenizerFun_t m_tok
Definition: XMLTreeWalker.h:68
name
string name
Definition: HTMLHelpStream.cpp:80
libebook::XMLTreeNode::AttributeData::idSet
bool idSet
Definition: XMLTreeNode.h:84
libebook::XMLTreeNode::QName::ns
LWCStringPtr_t ns
Definition: XMLTreeNode.h:41
values
libebook::@0::TagGrammar::values_ values
libebook::EBOOKHTMLToken::lang
@ lang
Definition: EBOOKHTMLToken.h:205
libebook::XMLTreeWalker::Iterator::m_node
XMLTreeNodePtr_t m_node
Definition: XMLTreeWalker.h:140
libebook::XMLTreeWalker::getId
int getId() const
Definition: XMLTreeWalker.cpp:1283
std
Definition: XMLTreeWalker.h:150
libebook::EBOOKHTMLToken::lhs
@ lhs
Definition: EBOOKHTMLToken.h:290
XMLTreeWalker.h
libebook::XMLTreeWalker::Iterator::m_current
XMLTreeWalker m_current
Definition: XMLTreeWalker.h:141
std::iterator_traits< libebook::XMLTreeWalker::Iterator >::reference_type
libebook::XMLTreeWalker & reference_type
Definition: XMLTreeWalker.h:172
libebook::XMLTreeNode::NODE_TYPE_ELEMENT
@ NODE_TYPE_ELEMENT
Definition: XMLTreeNode.h:32
libebook::XMLTreeWalker::AttributeIterator::AttributeIterator
AttributeIterator(const XMLTreeNodePtr_t &node, TokenizerFun_t tok, bool end=false)
Definition: XMLTreeWalker.cpp:1460
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::iterator_category
std::forward_iterator_tag iterator_category
Definition: XMLTreeWalker.h:160
libebook::XMLTreeNode::AttributeData
Definition: XMLTreeNode.h:80
libebook::XMLTreeWalker::AttributeIterator::operator->
const Attribute * operator->() const
Definition: XMLTreeWalker.cpp:1448
libebook::XMLTreeWalker::isElement
bool isElement() const
Definition: XMLTreeWalker.cpp:1269
libebook::XMLTreeWalker::AttributeIterator::operator==
bool operator==(const XMLTreeWalker::AttributeIterator &rhs) const
Definition: XMLTreeWalker.cpp:1455
m_caseless
const bool m_caseless
Definition: XMLTreeWalker.cpp:145
libebook::EBOOKHTMLToken::size
@ size
Definition: EBOOKHTMLToken.h:249
XMLStylesheet.h
libebook::XMLTreeNodePtr_t
boost::intrusive_ptr< XMLTreeNode > XMLTreeNodePtr_t
Definition: XMLTreeNode.h:24
libebook::XMLTreeWalker::empty
bool empty() const
Definition: XMLTreeWalker.cpp:1224
libebook::XMLTreeWalker::AttributeIterator::operator*
const Attribute & operator*() const
Definition: XMLTreeWalker.cpp:1441
libebook::EBOOKHTMLToken::s
@ s
Definition: EBOOKHTMLToken.h:125
libebook::XMLStylesheet::SOURCE_AUTHOR
@ SOURCE_AUTHOR
Definition: XMLStylesheet.h:30
libebook::caselessEqual
bool caselessEqual(const XMLTreeNode::QName &lhs, const XMLTreeNode::QName &rhs)
Definition: XMLTreeNode.cpp:450
libebook::XMLTreeWalker::getNamespace
const std::string getNamespace() const
Definition: XMLTreeWalker.cpp:1314
libebook::CSSSelectCtxPtr_t
std::shared_ptr< css_select_ctx > CSSSelectCtxPtr_t
Definition: libebook_libcss.h:24
libebook::XMLTreeWalker::AttributeIterator::operator++
AttributeIterator & operator++()
Definition: XMLTreeWalker.cpp:1423
libebook::XMLTreeWalker::Iterator::m_tok
TokenizerFun_t m_tok
Definition: XMLTreeWalker.h:142
libebook::GenericException
Definition: libebook_utils.h:106
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::value_type
libebook::XMLTreeWalker::Attribute value_type
Definition: XMLTreeWalker.h:158
libebook::LWCStringPtr_t
boost::intrusive_ptr< lwc_string > LWCStringPtr_t
Definition: libebook_libcss.h:27
libebook::XMLTreeWalker::Iterator::operator==
bool operator==(const XMLTreeWalker::Iterator &rhs) const
Definition: XMLTreeWalker.cpp:1506

Generated for libe-book by doxygen 1.8.20