OSDN Git Service

Initial commit
[wordring-tm/wordring-tm.git] / html / htmltag.cpp
1 #include "htmltag.h"
2 #include "htmltags.h"
3 #include "htmlstring.h"
4
5 #include "debug.h"
6
7 void HtmlElement::set_attribute(
8                 string_type const &nuri_, string_type const &lname_,
9                 string_type const &qname_, string_type const &value_)
10 {
11         m_attributes.push_back(HtmlAttribute(nuri_, lname_, qname_, value_));
12 }
13
14 int HtmlElement::tclass() const { return Unknown; }
15
16 Html::string_type HtmlElement::tname() const { return name(); }
17
18 int HtmlElement::tcategory() const { return Unknown; }
19
20 int HtmlElement::tinfo() const { return Unknown; }
21
22 Html::string_type HtmlElement::name() const
23 {
24         return m_local_name;
25 }
26
27 Html::attribute_iterator HtmlElement::abegin()
28 {
29         return m_attributes.begin();
30 }
31
32 Html::attribute_iterator HtmlElement::aend()
33 {
34         return m_attributes.end();
35 }
36
37 Html::const_attribute_iterator HtmlElement::abegin() const
38 {
39         return const_cast<self_type*>(this)->abegin();
40 }
41
42 Html::const_attribute_iterator HtmlElement::aend() const
43 {
44         return const_cast<self_type*>(this)->aend();
45 }
46
47 bool HtmlElement::has_attribute(string_type const &name_) const
48 {
49         auto it = std::find(m_attributes.begin(), m_attributes.end(), name_);
50         return it != m_attributes.end();
51 }
52
53 Html::string_type HtmlElement::attribute(string_type const &name_) const
54 {
55         auto it = std::find(m_attributes.begin(), m_attributes.end(), name_);
56         return it != m_attributes.end() ? it->value : string_type();
57 }
58
59 HtmlNode& HtmlElement::set_attribute(
60                 string_type const &name_, string_type const &value_)
61 {
62         auto it = std::find(m_attributes.begin(), m_attributes.end(), name_);
63         if(it == m_attributes.end())
64                 it = m_attributes.insert(m_attributes.end(), HtmlAttribute(name_, value_));
65         else it->value = value_;
66         return *lself();
67 }
68
69 HtmlNode& HtmlElement::set_attribute(string_type const &name_, int value_)
70 {
71         return set_attribute(name_, string_cast<string_type>(value_));
72 }
73
74 Html::string_type HtmlElement::to_string() const
75 {
76         return to_string_open();
77 }
78
79 Html::string_type HtmlElement::to_string_open() const
80 {
81         string_type result;
82         result.append(string_cast<string_type>("<"));
83         result.append(string_cast<string_type>(name()));
84         const_attribute_iterator it1 = abegin(), it2 = aend();
85         while(it1 != it2)
86         {
87                 result.append(string_cast<string_type>(" "));
88                 result.append(encode_entities(it1->local_name));
89                 result.append(string_cast<string_type>("=\""));
90                 result.append(encode_entities(it1->value));
91                 result.append(string_cast<string_type>("\""));
92                 ++it1;
93         }
94         if(tcategory() & Html::Empty) result.append(string_cast<string_type>(" />"));
95         else result.append(string_cast<string_type>(">"));
96         return result;
97 }
98
99 Html::string_type HtmlElement::to_string_close() const
100 {
101         string_type result;
102         if(!(tcategory() & Html::Empty))
103         {
104                 result.append(string_cast<string_type>("</"));
105                 result.append(string_cast<string_type>(name()));
106                 result.append(string_cast<string_type>(">"));
107         }
108         return result;
109 }
110
111 Html::pointer HtmlElement::lclone(weak_pointer const &parent_)
112 {
113         HtmlElement *p = new HtmlElement(parent_);
114         p->m_namespace_uri = m_namespace_uri;
115         p->m_local_name = m_local_name;
116         p->m_q_name = m_q_name;
117         p->m_attributes = m_attributes;
118         return pointer(p);
119 }
120
121 HtmlElement* HtmlElement::create(int tclass_, weak_pointer const &parent_)
122 {
123         switch(tclass_)
124         {
125         case A: return new HtmlElementA(parent_);
126         case Abbr: return new HtmlElementAbbr(parent_);
127         case Acronym: return new HtmlElementAcronym(parent_);
128         case Address: return new HtmlElementAddress(parent_);
129         case Applet: return new HtmlElementApplet(parent_);
130         case Area: return new HtmlElementArea(parent_);
131         case Article: return new HtmlElementArticle(parent_);
132         case Aside: return new HtmlElementAside(parent_);
133         case Audio: return new HtmlElementAudio(parent_);
134         case B: return new HtmlElementB(parent_);
135         case Base: return new HtmlElementBase(parent_);
136         case Basefont: return new HtmlElementBasefont(parent_);
137         case Bdi: return new HtmlElementBdi(parent_);
138         case Bdo: return new HtmlElementBdo(parent_);
139         case Bgsound: return new HtmlElementBgsound(parent_);
140         case Big: return new HtmlElementBig(parent_);
141         case Blink: return new HtmlElementBlink(parent_);
142         case Blockquote: return new HtmlElementBlockquote(parent_);
143         case Body: return new HtmlElementBody(parent_);
144         case Br: return new HtmlElementBr(parent_);
145         case Button: return new HtmlElementButton(parent_);
146         case Canvas: return new HtmlElementCanvas(parent_);
147         case Caption: return new HtmlElementCaption(parent_);
148         case Center: return new HtmlElementCenter(parent_);
149         case Cite: return new HtmlElementCite(parent_);
150         case Code: return new HtmlElementCode(parent_);
151         case Col: return new HtmlElementCol(parent_);
152         case Colgroup: return new HtmlElementColgroup(parent_);
153         case Command: return new HtmlElementCommand(parent_);
154         case Datalist: return new HtmlElementDatalist(parent_);
155         case Dd: return new HtmlElementDd(parent_);
156         case Del: return new HtmlElementDel(parent_);
157         case Details: return new HtmlElementDetails(parent_);
158         case Dfn: return new HtmlElementDfn(parent_);
159         case Dir: return new HtmlElementDir(parent_);
160         case Div: return new HtmlElementDiv(parent_);
161         case Dl: return new HtmlElementDl(parent_);
162         case Dt: return new HtmlElementDt(parent_);
163         case Em: return new HtmlElementEm(parent_);
164         case Embed: return new HtmlElementEmbed(parent_);
165         case Fieldset: return new HtmlElementFieldset(parent_);
166         case Figcaption: return new HtmlElementFigcaption(parent_);
167         case Figure: return new HtmlElementFigure(parent_);
168         case Font: return new HtmlElementFont(parent_);
169         case Footer: return new HtmlElementFooter(parent_);
170         case Form: return new HtmlElementForm(parent_);
171         case Frame: return new HtmlElementFrame(parent_);
172         case Frameset: return new HtmlElementFrameset(parent_);
173         case H1: return new HtmlElementH1(parent_);
174         case H2: return new HtmlElementH2(parent_);
175         case H3: return new HtmlElementH3(parent_);
176         case H4: return new HtmlElementH4(parent_);
177         case H5: return new HtmlElementH5(parent_);
178         case H6: return new HtmlElementH6(parent_);
179         case Head: return new HtmlElementHead(parent_);
180         case Header: return new HtmlElementHeader(parent_);
181         case Hgroup: return new HtmlElementHgroup(parent_);
182         case Hr: return new HtmlElementHr(parent_);
183         case Htm: return new HtmlElementHtm(parent_);
184         case I: return new HtmlElementI(parent_);
185         case Iframe: return new HtmlElementIframe(parent_);
186         case Img: return new HtmlElementImg(parent_);
187         case Input: return new HtmlElementInput(parent_);
188         case Ins: return new HtmlElementIns(parent_);
189         case Isindex: return new HtmlElementIsindex(parent_);
190         case Kbd: return new HtmlElementKbd(parent_);
191         case Keygen: return new HtmlElementKeygen(parent_);
192         case Label: return new HtmlElementLabel(parent_);
193         case Legend: return new HtmlElementLegend(parent_);
194         case Li: return new HtmlElementLi(parent_);
195         case Link: return new HtmlElementLink(parent_);
196         case Listing: return new HtmlElementListing(parent_);
197         case Map: return new HtmlElementMap(parent_);
198         case Mark: return new HtmlElementMark(parent_);
199         case Marquee: return new HtmlElementMarquee(parent_);
200         case Menu: return new HtmlElementMenu(parent_);
201         case Meta: return new HtmlElementMeta(parent_);
202         case Meter: return new HtmlElementMeter(parent_);
203         case Nav: return new HtmlElementNav(parent_);
204         case Nobr: return new HtmlElementNobr(parent_);
205         case Noframes: return new HtmlElementNoframes(parent_);
206         case Noscript: return new HtmlElementNoscript(parent_);
207         case Object: return new HtmlElementObject(parent_);
208         case Ol: return new HtmlElementOl(parent_);
209         case Optgroup: return new HtmlElementOptgroup(parent_);
210         case Option: return new HtmlElementOption(parent_);
211         case Output: return new HtmlElementOutput(parent_);
212         case P: return new HtmlElementP(parent_);
213         case Param: return new HtmlElementParam(parent_);
214         case Plaintext: return new HtmlElementPlaintext(parent_);
215         case Pre: return new HtmlElementPre(parent_);
216         case Progress: return new HtmlElementProgress(parent_);
217         case Q: return new HtmlElementQ(parent_);
218         case Rp: return new HtmlElementRp(parent_);
219         case Rt: return new HtmlElementRt(parent_);
220         case Ruby: return new HtmlElementRuby(parent_);
221         case S: return new HtmlElementS(parent_);
222         case Samp: return new HtmlElementSamp(parent_);
223         case Script: return new HtmlElementScript(parent_);
224         case Section: return new HtmlElementSection(parent_);
225         case Select: return new HtmlElementSelect(parent_);
226         case Small: return new HtmlElementSmall(parent_);
227         case Source: return new HtmlElementSource(parent_);
228         case Spacer: return new HtmlElementSpacer(parent_);
229         case Span: return new HtmlElementSpan(parent_);
230         case Strike: return new HtmlElementStrike(parent_);
231         case Strong: return new HtmlElementStrong(parent_);
232         case Style: return new HtmlElementStyle(parent_);
233         case Sub: return new HtmlElementSub(parent_);
234         case Summary: return new HtmlElementSummary(parent_);
235         case Sup: return new HtmlElementSup(parent_);
236         case Table: return new HtmlElementTable(parent_);
237         case Tbody: return new HtmlElementTbody(parent_);
238         case Td: return new HtmlElementTd(parent_);
239         case Textarea: return new HtmlElementTextarea(parent_);
240         case Tfoot: return new HtmlElementTfoot(parent_);
241         case Th: return new HtmlElementTh(parent_);
242         case Thead: return new HtmlElementThead(parent_);
243         case Time: return new HtmlElementTime(parent_);
244         case Title: return new HtmlElementTitle(parent_);
245         case Tr: return new HtmlElementTr(parent_);
246         case Track: return new HtmlElementTrack(parent_);
247         case Tt: return new HtmlElementTt(parent_);
248         case U: return new HtmlElementU(parent_);
249         case Ul: return new HtmlElementUl(parent_);
250         case Var: return new HtmlElementVar(parent_);
251         case Video: return new HtmlElementVideo(parent_);
252         case Wbr: return new HtmlElementWbr(parent_);
253         case Xmp: return new HtmlElementXmp(parent_);
254         }
255         return new HtmlElement(parent_);
256 }
257
258 Html::pointer HtmlElement::create(
259                 int tclass_, string_type const &name_, weak_pointer const &parent_)
260 {
261         HtmlElement *p = create(tclass_, parent_);
262         p->m_local_name = name_;
263         return pointer(p);
264 }
265
266 Html::pointer HtmlElement::create_node(
267                 int tclass_, string_type const &name_, weak_pointer const &parent_)
268 {
269         pointer begin_ = create(tclass_, name_, parent_);
270         pointer tail_(new HtmlElementClosePrivate(parent_));
271
272         begin_->set_lnext(tail_);
273         tail_->set_lprevious(begin_);
274         begin_->set_ltail(tail_);
275         tail_->set_lbegin(begin_);
276
277         return begin_;
278 }
279
280 HtmlElement::HtmlElement(weak_pointer const &parent_)
281         : HtmlElementOpenPrivate(parent_)
282 {
283 }
284
285 // HtmlElementClose -----------------------------------------------------------
286
287 Html::pointer HtmlElementClose::lclone(weak_pointer const &parent_)
288 {
289         self_type *p = new HtmlElementClosePrivate(parent_);
290         return pointer(p);
291 }
292
293 Html::pointer HtmlElementClose::create(const weak_pointer &parent_)
294 {
295         return pointer(new HtmlElementClosePrivate(parent_));
296 }
297
298 // HtmlText -------------------------------------------------------------------
299
300 Html::pointer HtmlText::lclone(weak_pointer const &parent_)
301 {
302         self_type *p = new HtmlTextPrivate(parent_);
303         p->m_value = m_value;
304         return pointer(p);
305 }
306
307 Html::pointer HtmlText::create(const weak_pointer &parent_)
308 {
309         return pointer(new HtmlTextPrivate(parent_));
310 }
311
312 // HtmlComment ----------------------------------------------------------------
313
314 Html::pointer HtmlComment::lclone(weak_pointer const &parent_)
315 {
316         auto *p = new HtmlCommentPrivate(parent_);
317         p->m_value = m_value;
318         return pointer(p);
319 }
320
321 Html::pointer HtmlComment::create(const weak_pointer &parent_)
322 {
323         return pointer(new HtmlCommentPrivate(parent_));
324 }
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339