3 #include "htmlstring.h"
7 void HtmlElement::set_attribute(
8 string_type const &nuri_, string_type const &lname_,
9 string_type const &qname_, string_type const &value_)
11 m_attributes.push_back(HtmlAttribute(nuri_, lname_, qname_, value_));
14 int HtmlElement::tclass() const { return Unknown; }
16 Html::string_type HtmlElement::tname() const { return name(); }
18 int HtmlElement::tcategory() const { return Unknown; }
20 int HtmlElement::tinfo() const { return Unknown; }
22 Html::string_type HtmlElement::name() const
27 Html::attribute_iterator HtmlElement::abegin()
29 return m_attributes.begin();
32 Html::attribute_iterator HtmlElement::aend()
34 return m_attributes.end();
37 Html::const_attribute_iterator HtmlElement::abegin() const
39 return const_cast<self_type*>(this)->abegin();
42 Html::const_attribute_iterator HtmlElement::aend() const
44 return const_cast<self_type*>(this)->aend();
47 bool HtmlElement::has_attribute(string_type const &name_) const
49 auto it = std::find(m_attributes.begin(), m_attributes.end(), name_);
50 return it != m_attributes.end();
53 Html::string_type HtmlElement::attribute(string_type const &name_) const
55 auto it = std::find(m_attributes.begin(), m_attributes.end(), name_);
56 return it != m_attributes.end() ? it->value : string_type();
59 HtmlNode& HtmlElement::set_attribute(
60 string_type const &name_, string_type const &value_)
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_;
69 HtmlNode& HtmlElement::set_attribute(string_type const &name_, int value_)
71 return set_attribute(name_, string_cast<string_type>(value_));
74 Html::string_type HtmlElement::to_string() const
76 return to_string_open();
79 Html::string_type HtmlElement::to_string_open() const
82 result.append(string_cast<string_type>("<"));
83 result.append(string_cast<string_type>(name()));
84 const_attribute_iterator it1 = abegin(), it2 = aend();
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>("\""));
94 if(tcategory() & Html::Empty) result.append(string_cast<string_type>(" />"));
95 else result.append(string_cast<string_type>(">"));
99 Html::string_type HtmlElement::to_string_close() const
102 if(!(tcategory() & Html::Empty))
104 result.append(string_cast<string_type>("</"));
105 result.append(string_cast<string_type>(name()));
106 result.append(string_cast<string_type>(">"));
111 Html::pointer HtmlElement::lclone(weak_pointer const &parent_)
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;
121 HtmlElement* HtmlElement::create(int tclass_, weak_pointer const &parent_)
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_);
255 return new HtmlElement(parent_);
258 Html::pointer HtmlElement::create(
259 int tclass_, string_type const &name_, weak_pointer const &parent_)
261 HtmlElement *p = create(tclass_, parent_);
262 p->m_local_name = name_;
266 Html::pointer HtmlElement::create_node(
267 int tclass_, string_type const &name_, weak_pointer const &parent_)
269 pointer begin_ = create(tclass_, name_, parent_);
270 pointer tail_(new HtmlElementClosePrivate(parent_));
272 begin_->set_lnext(tail_);
273 tail_->set_lprevious(begin_);
274 begin_->set_ltail(tail_);
275 tail_->set_lbegin(begin_);
280 HtmlElement::HtmlElement(weak_pointer const &parent_)
281 : HtmlElementOpenPrivate(parent_)
285 // HtmlElementClose -----------------------------------------------------------
287 Html::pointer HtmlElementClose::lclone(weak_pointer const &parent_)
289 self_type *p = new HtmlElementClosePrivate(parent_);
293 Html::pointer HtmlElementClose::create(const weak_pointer &parent_)
295 return pointer(new HtmlElementClosePrivate(parent_));
298 // HtmlText -------------------------------------------------------------------
300 Html::pointer HtmlText::lclone(weak_pointer const &parent_)
302 self_type *p = new HtmlTextPrivate(parent_);
303 p->m_value = m_value;
307 Html::pointer HtmlText::create(const weak_pointer &parent_)
309 return pointer(new HtmlTextPrivate(parent_));
312 // HtmlComment ----------------------------------------------------------------
314 Html::pointer HtmlComment::lclone(weak_pointer const &parent_)
316 auto *p = new HtmlCommentPrivate(parent_);
317 p->m_value = m_value;
321 Html::pointer HtmlComment::create(const weak_pointer &parent_)
323 return pointer(new HtmlCommentPrivate(parent_));