Loading src/html.cpp +46 −33 Original line number Diff line number Diff line Loading @@ -401,42 +401,56 @@ void libhtmlpp::HtmlString::_buildTree() { DocElements *lastEl = nullptr; std::unique_ptr<DocElements> firstEl = nullptr; auto starts_with_ci = [&] (const std::vector<char> &s, size_t pos,const std::string_view k) { if (pos + k.size() > s.size()) return false; for (size_t i = 0; i < k.size(); ++i) { unsigned char a = static_cast<unsigned char>(s[pos + i]); unsigned char b = static_cast<unsigned char>(k[i]); if (std::tolower(a) != std::tolower(b)) return false; } return true; }; auto addelement = [&firstEl](DocElements **last){ if (!firstEl.get()) { if (!firstEl) { firstEl = std::make_unique<DocElements>(); *last = firstEl.get(); } else { (*last)->nextel = std::make_unique<DocElements>(); (*last)->nextel->prevel = *last; (*last) = (*last)->nextel.get(); (*last)->nextel->prevel = (*last); *last = (*last)->nextel.get(); } }; HTMLException excp; for(size_t ii=0; ii<_Data.size(); ++ii){ size_t ii = 0; while (ii < _Data.size()) { if (_Data[ii] == HTMLTAG_OPEN) { if( (ii + 3) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+3), "<!--")){ if (starts_with_ci(_Data, ii, "<!--")) { addelement(&lastEl); ii+=CommentElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); }else if((ii+6) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+6),"<script")){ ii = CommentElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else if (starts_with_ci(_Data, ii, "<script")) { addelement(&lastEl); ii+=ScriptElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); }else if( (ii+3) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+3),"<svg")){ ii = ScriptElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else if (starts_with_ci(_Data, ii, "<svg")) { addelement(&lastEl); ii+=SvgElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); }else if( (ii + 9) <= _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+9),"<textarea")){ ii = SvgElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else if (starts_with_ci(_Data, ii, "<textarea")) { addelement(&lastEl); ii+=TextArea::parseElement(_Data,lastEl->element,ii,lastEl->terminator); ii = TextArea::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else { addelement(&lastEl); ii+=HtmlElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); ii = HtmlElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } }else if(_Data[ii]!=' '){ } else if (!std::isspace(static_cast<unsigned char>(_Data[ii]))) { addelement(&lastEl); ii+=TextElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); ii = TextElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else { ++ii; // nur Whitespace „verbrauchen“ } } _buildtreenode(firstEl.get(), nullptr, _rootEl); } /** Loading Loading @@ -685,7 +699,9 @@ void libhtmlpp::HtmlElement::remove(libhtmlpp::Element* el){ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) { size_t st=0,et=0; for (size_t i = 0; i < in.size(); ++i) { bool send=false; for (size_t i = 0; i < in.size() && !send; ++i) { switch (in[i]) { case '<': continue; Loading @@ -695,28 +711,26 @@ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) { continue; default: st=i; goto GETTAGEND; send=true; } } GETTAGEND: for(et=st; et<in.size(); et++){ if(in[et]==' ' || in[et]=='/' || in[et]=='>' || in[et]=='\r' || in[et]=='\n'){ break; } } std::string tag; std::copy(in.begin()+st,in.begin()+et,std::back_inserter(tag)); setTagname(tag); std::copy(in.begin()+st,in.begin()+(et),std::back_inserter(_TagName)); if (_TagName.empty()) { HTMLException excp; throw excp[HTMLException::Critical] << "no tag in element found!"; } _TagName.emplace_back('\0'); for(size_t i=et; i<in.size(); i++){ if(in[i]=='>') return; Loading Loading @@ -766,24 +780,23 @@ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) { } size_t libhtmlpp::HtmlElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start,bool &termination){ size_t startel=start; el=std::make_unique<HtmlElement>(); bool term=false; std::vector<char> tel; while(start<in.size()){ if(!term && in[start]==HTMLTAG_TERMINATE){ termination=true; }else if(in[start]==HTMLTAG_CLOSE) { std::vector<char> tel; std::copy(in.begin()+startel,in.begin()+start,std::back_inserter(tel)); reinterpret_cast<HtmlElement*>(el.get())->_serialelize(tel); return start; break; } if(in[start]!=' '){ term=true; } tel.emplace_back(in[start]); ++start; } return start; return ++start; } namespace libhtmlpp { Loading Loading
src/html.cpp +46 −33 Original line number Diff line number Diff line Loading @@ -401,42 +401,56 @@ void libhtmlpp::HtmlString::_buildTree() { DocElements *lastEl = nullptr; std::unique_ptr<DocElements> firstEl = nullptr; auto starts_with_ci = [&] (const std::vector<char> &s, size_t pos,const std::string_view k) { if (pos + k.size() > s.size()) return false; for (size_t i = 0; i < k.size(); ++i) { unsigned char a = static_cast<unsigned char>(s[pos + i]); unsigned char b = static_cast<unsigned char>(k[i]); if (std::tolower(a) != std::tolower(b)) return false; } return true; }; auto addelement = [&firstEl](DocElements **last){ if (!firstEl.get()) { if (!firstEl) { firstEl = std::make_unique<DocElements>(); *last = firstEl.get(); } else { (*last)->nextel = std::make_unique<DocElements>(); (*last)->nextel->prevel = *last; (*last) = (*last)->nextel.get(); (*last)->nextel->prevel = (*last); *last = (*last)->nextel.get(); } }; HTMLException excp; for(size_t ii=0; ii<_Data.size(); ++ii){ size_t ii = 0; while (ii < _Data.size()) { if (_Data[ii] == HTMLTAG_OPEN) { if( (ii + 3) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+3), "<!--")){ if (starts_with_ci(_Data, ii, "<!--")) { addelement(&lastEl); ii+=CommentElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); }else if((ii+6) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+6),"<script")){ ii = CommentElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else if (starts_with_ci(_Data, ii, "<script")) { addelement(&lastEl); ii+=ScriptElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); }else if( (ii+3) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+3),"<svg")){ ii = ScriptElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else if (starts_with_ci(_Data, ii, "<svg")) { addelement(&lastEl); ii+=SvgElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); }else if( (ii + 9) <= _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+9),"<textarea")){ ii = SvgElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else if (starts_with_ci(_Data, ii, "<textarea")) { addelement(&lastEl); ii+=TextArea::parseElement(_Data,lastEl->element,ii,lastEl->terminator); ii = TextArea::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else { addelement(&lastEl); ii+=HtmlElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); ii = HtmlElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } }else if(_Data[ii]!=' '){ } else if (!std::isspace(static_cast<unsigned char>(_Data[ii]))) { addelement(&lastEl); ii+=TextElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator); ii = TextElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator); } else { ++ii; // nur Whitespace „verbrauchen“ } } _buildtreenode(firstEl.get(), nullptr, _rootEl); } /** Loading Loading @@ -685,7 +699,9 @@ void libhtmlpp::HtmlElement::remove(libhtmlpp::Element* el){ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) { size_t st=0,et=0; for (size_t i = 0; i < in.size(); ++i) { bool send=false; for (size_t i = 0; i < in.size() && !send; ++i) { switch (in[i]) { case '<': continue; Loading @@ -695,28 +711,26 @@ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) { continue; default: st=i; goto GETTAGEND; send=true; } } GETTAGEND: for(et=st; et<in.size(); et++){ if(in[et]==' ' || in[et]=='/' || in[et]=='>' || in[et]=='\r' || in[et]=='\n'){ break; } } std::string tag; std::copy(in.begin()+st,in.begin()+et,std::back_inserter(tag)); setTagname(tag); std::copy(in.begin()+st,in.begin()+(et),std::back_inserter(_TagName)); if (_TagName.empty()) { HTMLException excp; throw excp[HTMLException::Critical] << "no tag in element found!"; } _TagName.emplace_back('\0'); for(size_t i=et; i<in.size(); i++){ if(in[i]=='>') return; Loading Loading @@ -766,24 +780,23 @@ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) { } size_t libhtmlpp::HtmlElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start,bool &termination){ size_t startel=start; el=std::make_unique<HtmlElement>(); bool term=false; std::vector<char> tel; while(start<in.size()){ if(!term && in[start]==HTMLTAG_TERMINATE){ termination=true; }else if(in[start]==HTMLTAG_CLOSE) { std::vector<char> tel; std::copy(in.begin()+startel,in.begin()+start,std::back_inserter(tel)); reinterpret_cast<HtmlElement*>(el.get())->_serialelize(tel); return start; break; } if(in[start]!=' '){ term=true; } tel.emplace_back(in[start]); ++start; } return start; return ++start; } namespace libhtmlpp { Loading