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 #include "FictionBook2Collector.h"
11 #include "FictionBook2ParserContext.h"
12 #include "FictionBook2TextContext.h"
13 #include "FictionBook2Token.h"
14 
15 namespace libebook
16 {
17 
FictionBook2ParserContext(FictionBook2ParserContext * const parentContext,FictionBook2Collector * const collector)18 FictionBook2ParserContext::FictionBook2ParserContext(FictionBook2ParserContext *const parentContext, FictionBook2Collector *const collector)
19   : m_collector(collector ? collector : (parentContext ? parentContext->m_collector : nullptr))
20   , m_parentContext(parentContext)
21 {
22 }
23 
leaveContext() const24 FictionBook2XMLParserContext *FictionBook2ParserContext::leaveContext() const
25 {
26   FictionBook2ParserContext *const parentContext = m_parentContext;
27   delete this;
28   return parentContext;
29 }
30 
getCollector() const31 FictionBook2Collector *FictionBook2ParserContext::getCollector() const
32 {
33   return m_collector;
34 }
35 
getParentContext() const36 FictionBook2ParserContext *FictionBook2ParserContext::getParentContext() const
37 {
38   return m_parentContext;
39 }
40 
FictionBook2NodeContextBase(FictionBook2ParserContext * const parentContext,FictionBook2Collector * const collector)41 FictionBook2NodeContextBase::FictionBook2NodeContextBase(FictionBook2ParserContext *const parentContext, FictionBook2Collector *const collector)
42   : FictionBook2ParserContext(parentContext, collector)
43 {
44 }
45 
startOfElement()46 void FictionBook2NodeContextBase::startOfElement()
47 {
48 }
49 
endOfAttributes()50 void FictionBook2NodeContextBase::endOfAttributes()
51 {
52 }
53 
text(const char *)54 void FictionBook2NodeContextBase::text(const char *)
55 {
56 }
57 
FictionBook2DataContextBase(FictionBook2ParserContext * const parentContext)58 FictionBook2DataContextBase::FictionBook2DataContextBase(FictionBook2ParserContext *const parentContext)
59   : FictionBook2ParserContext(parentContext)
60 {
61 }
62 
element(const FictionBook2TokenData &,const FictionBook2TokenData &)63 FictionBook2XMLParserContext *FictionBook2DataContextBase::element(const FictionBook2TokenData &, const FictionBook2TokenData &)
64 {
65   return nullptr;
66 }
67 
startOfElement()68 void FictionBook2DataContextBase::startOfElement()
69 {
70 }
71 
endOfAttributes()72 void FictionBook2DataContextBase::endOfAttributes()
73 {
74 }
75 
text(const char *)76 void FictionBook2DataContextBase::text(const char *)
77 {
78 }
79 
FictionBook2TextContextBase(FictionBook2ParserContext * const parentContext)80 FictionBook2TextContextBase::FictionBook2TextContextBase(FictionBook2ParserContext *const parentContext)
81   : FictionBook2ParserContext(parentContext)
82 {
83 }
84 
element(const FictionBook2TokenData &,const FictionBook2TokenData &)85 FictionBook2XMLParserContext *FictionBook2TextContextBase::element(const FictionBook2TokenData &, const FictionBook2TokenData &)
86 {
87   return nullptr;
88 }
89 
startOfElement()90 void FictionBook2TextContextBase::startOfElement()
91 {
92 }
93 
endOfElement()94 void FictionBook2TextContextBase::endOfElement()
95 {
96 }
97 
attribute(const FictionBook2TokenData &,const FictionBook2TokenData *,const char *)98 void FictionBook2TextContextBase::attribute(const FictionBook2TokenData &, const FictionBook2TokenData *, const char *)
99 {
100 }
101 
endOfAttributes()102 void FictionBook2TextContextBase::endOfAttributes()
103 {
104 }
105 
FictionBook2SkipElementContext(FictionBook2ParserContext * const parentContext)106 FictionBook2SkipElementContext::FictionBook2SkipElementContext(FictionBook2ParserContext *const parentContext)
107   : FictionBook2ParserContext(parentContext)
108   , m_level(1)
109 {
110 }
111 
leaveContext() const112 FictionBook2XMLParserContext *FictionBook2SkipElementContext::leaveContext() const
113 {
114   if (m_level)
115     return const_cast<FictionBook2SkipElementContext *>(this);
116 
117   FictionBook2ParserContext *const parentContext = getParentContext();
118   delete this;
119   return parentContext;
120 }
121 
element(const FictionBook2TokenData &,const FictionBook2TokenData &)122 FictionBook2XMLParserContext *FictionBook2SkipElementContext::element(const FictionBook2TokenData &, const FictionBook2TokenData &)
123 {
124   ++m_level;
125   return this;
126 }
127 
startOfElement()128 void FictionBook2SkipElementContext::startOfElement()
129 {
130 }
131 
endOfElement()132 void FictionBook2SkipElementContext::endOfElement()
133 {
134   --m_level;
135 }
136 
attribute(const FictionBook2TokenData &,const FictionBook2TokenData *,const char *)137 void FictionBook2SkipElementContext::attribute(const FictionBook2TokenData &, const FictionBook2TokenData *, const char *)
138 {
139 }
140 
endOfAttributes()141 void FictionBook2SkipElementContext::endOfAttributes()
142 {
143 }
144 
text(const char *)145 void FictionBook2SkipElementContext::text(const char *)
146 {
147 }
148 
FictionBook2StyleContextBase(FictionBook2ParserContext * parentContext,const FictionBook2Style & style)149 FictionBook2StyleContextBase::FictionBook2StyleContextBase(FictionBook2ParserContext *parentContext, const FictionBook2Style &style)
150   : FictionBook2ParserContext(parentContext)
151   , m_style(style)
152 {
153 }
154 
getStyle()155 FictionBook2Style &FictionBook2StyleContextBase::getStyle()
156 {
157   return m_style;
158 }
159 
getTextFormat()160 FictionBook2TextFormat &FictionBook2StyleContextBase::getTextFormat()
161 {
162   return m_style.getTextFormat();
163 }
164 
element(const FictionBook2TokenData & name,const FictionBook2TokenData & ns)165 FictionBook2XMLParserContext *FictionBook2StyleContextBase::element(const FictionBook2TokenData &name, const FictionBook2TokenData &ns)
166 {
167   if (FictionBook2Token::NS_FICTIONBOOK == getFictionBook2TokenID(ns))
168   {
169     switch (getFictionBook2TokenID(name))
170     {
171     case FictionBook2Token::strong :
172       return new FictionBook2StrongContext(this, getStyle());
173     case FictionBook2Token::emphasis :
174       return new FictionBook2EmphasisContext(this, getStyle());
175     case FictionBook2Token::style :
176       return new FictionBook2StyleContext(this, getStyle());
177     case FictionBook2Token::a :
178       return new FictionBook2AContext(this, getStyle());
179     case FictionBook2Token::strikethrough :
180       return new FictionBook2StrikethroughContext(this, getStyle());
181     case FictionBook2Token::sub :
182       return new FictionBook2SubContext(this, getStyle());
183     case FictionBook2Token::sup :
184       return new FictionBook2SupContext(this, getStyle());
185     case FictionBook2Token::code :
186       return new FictionBook2CodeContext(this, getStyle());
187     case FictionBook2Token::image :
188       return new FictionBook2InlineImageContext(this, getStyle());
189     default :
190       break;
191     }
192   }
193 
194   return new FictionBook2SkipElementContext(this);
195 }
196 
endOfElement()197 void FictionBook2StyleContextBase::endOfElement()
198 {
199 }
200 
endOfAttributes()201 void FictionBook2StyleContextBase::endOfAttributes()
202 {
203 }
204 
attribute(const FictionBook2TokenData & name,const FictionBook2TokenData * ns,const char * const value)205 void FictionBook2StyleContextBase::attribute(const FictionBook2TokenData &name, const FictionBook2TokenData *ns, const char *const value)
206 {
207   if ((FictionBook2Token::NS_XML == getFictionBook2TokenID(ns)) && (FictionBook2Token::lang == getFictionBook2TokenID(name)))
208     m_style.getTextFormat().lang = value;
209 }
210 
text(const char * value)211 void FictionBook2StyleContextBase::text(const char *value)
212 {
213   getCollector()->openSpan(getStyle());
214   getCollector()->insertText(value);
215   getCollector()->closeSpan();
216 }
217 
FictionBook2BlockFormatContextBase(FictionBook2ParserContext * parentContext,const FictionBook2BlockFormat & format)218 FictionBook2BlockFormatContextBase::FictionBook2BlockFormatContextBase(FictionBook2ParserContext *parentContext, const FictionBook2BlockFormat &format)
219   : FictionBook2NodeContextBase(parentContext)
220   , m_format(format)
221 {
222 }
223 
getBlockFormat()224 FictionBook2BlockFormat &FictionBook2BlockFormatContextBase::getBlockFormat()
225 {
226   return m_format;
227 }
228 
getBlockFormat() const229 const FictionBook2BlockFormat &FictionBook2BlockFormatContextBase::getBlockFormat() const
230 {
231   return m_format;
232 }
233 
setLang(const char * const lang)234 void FictionBook2BlockFormatContextBase::setLang(const char *const lang)
235 {
236   m_format.lang = lang;
237 }
238 
239 }
240 
241 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
242