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 
149 
150 }
151 
152 namespace std
153 {
154 
155 // NOTE: I use specialization of std::iterator_traits because -Weffc++
156 // is too eager and does not let me derive from std::iterator .
157 
158 template<>
159 struct iterator_traits<libebook::XMLTreeWalker::AttributeIterator>
160 {
162  typedef std::ptrdiff_t difference_type;
163  typedef std::forward_iterator_tag iterator_category;
166 };
167 
168 template<>
169 struct iterator_traits<libebook::XMLTreeWalker::Iterator>
170 {
172  typedef std::ptrdiff_t difference_type;
173  typedef std::forward_iterator_tag iterator_category;
176 };
177 
178 }
179 
180 #endif // XMLTREEWALKER_H_INCLUDED
181 
182 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
libebook::XMLTreeWalker::Attribute
Definition: XMLTreeWalker.h:72
libebook_libcss.h
len
size_t len
Definition: EBOOKHTMLParser.cpp:53
std::iterator_traits< libebook::XMLTreeWalker::Iterator >::pointer_type
libebook::XMLTreeWalker * pointer_type
Definition: XMLTreeWalker.h:174
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::pointer_type
libebook::XMLTreeWalker::Attribute * pointer_type
Definition: XMLTreeWalker.h:164
libebook::EBOOKHTMLToken::link
@ link
Definition: EBOOKHTMLToken.h:99
libebook::CSSStylesheetPtr_t
boost::shared_ptr< css_stylesheet > CSSStylesheetPtr_t
Definition: libebook_libcss.h:22
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:1392
libebook::XMLTreeWalker::AttributeIterator
Definition: XMLTreeWalker.h:99
libebook::XMLTreeWalker::hasParent
bool hasParent() const
Definition: XMLTreeWalker.cpp:1249
libebook::XMLTreeWalker::begin
Iterator begin() const
Definition: XMLTreeWalker.cpp:1233
libebook::XMLTreeWalker::isText
bool isText() const
Definition: XMLTreeWalker.cpp:1277
libebook::XMLTreeNode
Definition: XMLTreeNode.h:28
libebook::XMLStylesheets_t
std::deque< XMLStylesheet > XMLStylesheets_t
Definition: XMLStylesheet.h:51
libebook::XMLTreeWalker::Attribute::operator==
bool operator==(const XMLTreeWalker::Attribute &rhs) const
Definition: XMLTreeWalker.cpp:1407
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:1500
libebook::CSSSelectCtxPtr_t
boost::shared_ptr< css_select_ctx > CSSSelectCtxPtr_t
Definition: libebook_libcss.h:23
libebook::XMLTreeWalker::getParent
const XMLTreeWalker getParent() const
Definition: XMLTreeWalker.cpp:1256
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:1475
libebook::CSSSelectResultsPtr_t
boost::shared_ptr< css_select_results > CSSSelectResultsPtr_t
Definition: libebook_libcss.h:24
libebook
Definition: CHMParser.cpp:21
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::difference_type
std::ptrdiff_t difference_type
Definition: XMLTreeWalker.h:162
libebook::XMLTreeNode::QName::name
LWCStringPtr_t name
Definition: XMLTreeNode.h:40
libebook::XMLTreeWalker::getStyle
CSSSelectResultsPtr_t getStyle(const XMLStylesheets_t &sheets, bool quirks=false, const CSSStylesheetPtr_t &inlineSheet=CSSStylesheetPtr_t()) const
Definition: XMLTreeWalker.cpp:1525
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:165
XMLTreeNode.h
libebook::XMLTreeWalker::getName
const std::string getName() const
Definition: XMLTreeWalker.cpp:1307
libebook::XMLTreeWalker::Iterator::operator*
const XMLTreeWalker & operator*() const
Definition: XMLTreeWalker.cpp:1493
libebook::XMLTreeWalker::Attribute::getValue
const std::string getValue() const
Definition: XMLTreeWalker.cpp:1402
libebook::XMLTreeWalker::Attribute::m_node
XMLTreeNodePtr_t m_node
Definition: XMLTreeWalker.h:91
libebook::EBOOKHTMLToken::value
@ value
Definition: EBOOKHTMLToken.h:263
libebook::intrusive_ptr_add_ref
void intrusive_ptr_add_ref(XMLTreeNode *const p)
Definition: XMLTreeNode.cpp:484
libebook::operator!=
bool operator!=(const XMLTreeNode::QName &lhs, const XMLTreeNode::QName &rhs)
Definition: XMLTreeNode.cpp:446
m_str
const string & m_str
Definition: XMLTreeWalker.cpp:145
libebook::XMLTreeNode::AttributeData::value
LWCStringPtr_t value
Definition: XMLTreeNode.h:82
libebook::XMLTreeWalker::endAttributes
const AttributeIterator endAttributes() const
Definition: XMLTreeWalker.cpp:1347
libebook::EBOOKHTMLToken::rhs
@ rhs
Definition: EBOOKHTMLToken.h:311
libebook::XMLTreeWalker::Attribute::getValueId
int getValueId() const
Definition: XMLTreeWalker.cpp:1383
libebook::XMLTreeNode::NODE_TYPE_TEXT
@ NODE_TYPE_TEXT
Definition: XMLTreeNode.h:33
libebook::EBOOKHTMLToken::i
@ i
Definition: EBOOKHTMLToken.h:88
libebook::XMLTreeWalker::hasAttributes
bool hasAttributes() const
Definition: XMLTreeWalker.cpp:1331
libebook::operator==
bool operator==(const XMLTreeNode::QName &lhs, const XMLTreeNode::QName &rhs)
Definition: XMLTreeNode.cpp:441
libebook::XMLTreeWalker::Attribute::getNamespace
const std::string getNamespace() const
Definition: XMLTreeWalker.cpp:1397
libebook::XMLTreeWalker::beginAttributes
AttributeIterator beginAttributes() const
Definition: XMLTreeWalker.cpp:1339
libebook::XMLTreeWalker::XMLTreeWalker
XMLTreeWalker(const XMLTreeNodePtr_t &p, TokenizerFun_t tok=0)
Definition: XMLTreeWalker.cpp:1355
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:172
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:1263
std::iterator_traits< libebook::XMLTreeWalker::Iterator >::value_type
libebook::XMLTreeWalker value_type
Definition: XMLTreeWalker.h:171
libebook::XMLTreeNode::AttributeData::qname
QName qname
Definition: XMLTreeNode.h:81
libebook::XMLTreeWalker::Attribute::getId
int getId() const
Definition: XMLTreeWalker.cpp:1361
str
const char * str
Definition: EBOOKHTMLParser.cpp:52
libebook::EBOOKHTMLToken::p
@ p
Definition: EBOOKHTMLToken.h:118
libebook::XMLTreeWalker::Attribute::Attribute
Attribute(const XMLTreeNodePtr_t &node, std::size_t index, TokenizerFun_t tok)
Definition: XMLTreeWalker.cpp:1412
libebook::wrap
HUBBUBParserPtr_t wrap(hubbub_parser *const p)
Definition: libebook_hubbub.cpp:15
libebook::XMLTreeWalker::end
const Iterator end() const
Definition: XMLTreeWalker.cpp:1241
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:165
libebook::XMLTreeWalker::getText
const std::string & getText() const
Definition: XMLTreeWalker.cpp:1323
libebook::FB2Token::v
@ v
Definition: FB2Token.h:99
name
string name
Definition: CHMStream.cpp:80
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:1512
std::iterator_traits< libebook::XMLTreeWalker::Iterator >::iterator_category
std::forward_iterator_tag iterator_category
Definition: XMLTreeWalker.h:173
libebook::XMLTreeWalker::m_tok
TokenizerFun_t m_tok
Definition: XMLTreeWalker.h:68
libebook::XMLTreeNode::AttributeData::idSet
bool idSet
Definition: XMLTreeNode.h:84
libebook::XMLTreeNode::QName::ns
LWCStringPtr_t ns
Definition: XMLTreeNode.h:41
libebook::EBOOKHTMLToken::lang
@ lang
Definition: EBOOKHTMLToken.h:207
libebook::XMLTreeWalker::Iterator::m_node
XMLTreeNodePtr_t m_node
Definition: XMLTreeWalker.h:140
libebook::XMLTreeWalker::getId
int getId() const
Definition: XMLTreeWalker.cpp:1284
std
Definition: XMLTreeWalker.h:153
libebook::EBOOKHTMLToken::lhs
@ lhs
Definition: EBOOKHTMLToken.h:292
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:175
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:1461
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::iterator_category
std::forward_iterator_tag iterator_category
Definition: XMLTreeWalker.h:163
libebook::XMLTreeNode::AttributeData
Definition: XMLTreeNode.h:80
libebook::XMLTreeWalker::AttributeIterator::operator->
const Attribute * operator->() const
Definition: XMLTreeWalker.cpp:1449
libebook::XMLTreeWalker::isElement
bool isElement() const
Definition: XMLTreeWalker.cpp:1270
libebook::XMLTreeWalker::AttributeIterator::operator==
bool operator==(const XMLTreeWalker::AttributeIterator &rhs) const
Definition: XMLTreeWalker.cpp:1456
m_caseless
const bool m_caseless
Definition: XMLTreeWalker.cpp:146
libebook::EBOOKHTMLToken::size
@ size
Definition: EBOOKHTMLToken.h:251
XMLStylesheet.h
libebook::XMLTreeNodePtr_t
boost::intrusive_ptr< XMLTreeNode > XMLTreeNodePtr_t
Definition: XMLTreeNode.h:24
libebook::XMLTreeWalker::empty
bool empty() const
Definition: XMLTreeWalker.cpp:1225
libebook::XMLTreeWalker::AttributeIterator::operator*
const Attribute & operator*() const
Definition: XMLTreeWalker.cpp:1442
libebook::EBOOKHTMLToken::s
@ s
Definition: EBOOKHTMLToken.h:127
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:451
libebook::XMLTreeWalker::getNamespace
const std::string getNamespace() const
Definition: XMLTreeWalker.cpp:1315
libebook::FB2Token::match
@ match
Definition: FB2Token.h:114
libebook::XMLTreeWalker::AttributeIterator::operator++
AttributeIterator & operator++()
Definition: XMLTreeWalker.cpp:1424
libebook::intrusive_ptr_release
void intrusive_ptr_release(XMLTreeNode *const p)
Definition: XMLTreeNode.cpp:489
libebook::XMLTreeWalker::Iterator::m_tok
TokenizerFun_t m_tok
Definition: XMLTreeWalker.h:142
libebook::GenericException
Definition: libebook_utils.h:132
std::iterator_traits< libebook::XMLTreeWalker::AttributeIterator >::value_type
libebook::XMLTreeWalker::Attribute value_type
Definition: XMLTreeWalker.h:161
libebook::LWCStringPtr_t
boost::intrusive_ptr< lwc_string > LWCStringPtr_t
Definition: libebook_libcss.h:26
libebook::XMLTreeWalker::Iterator::operator==
bool operator==(const XMLTreeWalker::Iterator &rhs) const
Definition: XMLTreeWalker.cpp:1507

Generated for libe-book by doxygen 1.8.18