Loading src/html.cpp +62 −29 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ #include <cstdarg> #include <compare> #include <string_view> #include <array> #include <algorithm> #include <fstream> Loading @@ -59,7 +60,7 @@ namespace libhtmlpp { const std::string_view ContainerTypes[]={ const std::array<std::string_view,21> ContainerTypes{{ "div", "style", "span", Loading @@ -80,8 +81,8 @@ namespace libhtmlpp { "header", "main", "html", "" }; "a" }}; class DocElements { public: Loading Loading @@ -275,7 +276,7 @@ void libhtmlpp::HtmlString::_buildtreenode( Element *prev_el_in_tree = nullptr; auto checkContainer = [&](const std::string &tag) { for (size_t i = 0; !ContainerTypes[i].empty(); ++i) { for (size_t i = 0; i<ContainerTypes.size(); ++i) { if (tag == ContainerTypes[i]) { return true; } Loading Loading @@ -342,11 +343,8 @@ void libhtmlpp::HtmlString::_buildtreenode( Frame fr = stack.top(); stack.pop(); HtmlElement *opener_el = static_cast<HtmlElement*>(fr.open->element.get()); for (DocElements *cnex=fr.open->nextel.get(); cnex; cnex=cnex->nextel.get()) { if (fr.open->nextel->element && !fr.open->nextel->terminator) { if (fr.open->nextel->element ) { opener_el->_childElement = std::move(fr.open->nextel->element); break; } } prev_el_in_tree = opener_el; Loading Loading @@ -773,32 +771,67 @@ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) { std::copy(in.begin()+vstart,in.begin()+vend,std::back_inserter(val)); } std::cout << _TagName.data() << "->" << key << ": " << val << std::endl; setAttribute(key,val); } } } } size_t libhtmlpp::HtmlElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start,bool &termination){ #include <cctype> #include <vector> #include <memory> size_t libhtmlpp::HtmlElement::parseElement( const std::vector<char>& in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination ){ el = std::make_unique<HtmlElement>(); bool term=false; std::vector<char> tel; while(start<in.size()){ if(!term && in[start]==HTMLTAG_TERMINATE){ termination = false; bool selfClosing = false; size_t i = start; if (i >= in.size() || in[i] != HTMLTAG_OPEN) { return i; } ++i; while (i < in.size() && std::isspace(static_cast<unsigned char>(in[i]))) ++i; if (i < in.size() && in[i] == HTMLTAG_TERMINATE) { // '/' termination = true; }else if(in[start]==HTMLTAG_CLOSE) { reinterpret_cast<HtmlElement*>(el.get())->_serialelize(tel); break; ++i; // '/' konsumieren while (i < in.size() && std::isspace(static_cast<unsigned char>(in[i]))) ++i; } if(in[start]!=' '){ term=true; std::vector<char> tel; while (i < in.size() && in[i] != HTMLTAG_CLOSE) { // '>' tel.emplace_back(in[i]); ++i; } tel.emplace_back(in[start]); ++start; while (!tel.empty() && std::isspace(static_cast<unsigned char>(tel.back()))) tel.pop_back(); if (!termination && !tel.empty() && tel.back() == HTMLTAG_TERMINATE) { selfClosing = true; tel.pop_back(); // den '/' entfernen while (!tel.empty() && std::isspace(static_cast<unsigned char>(tel.back()))) tel.pop_back(); } return ++start; reinterpret_cast<HtmlElement*>(el.get())->_serialelize(tel); if (i < in.size() && in[i] == HTMLTAG_CLOSE) ++i; return i; } namespace libhtmlpp { void _copy(libhtmlpp::Element *dest,const libhtmlpp::Element *src){ Loading Loading @@ -1212,7 +1245,7 @@ int libhtmlpp::CommentElement::getType() const{ return ElementType::CommentEl; } size_t libhtmlpp::CommentElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t libhtmlpp::CommentElement::parseElement(const std::vector<char> &in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t startel=start+3; while(start<in.size()){ if(std::equal(in.begin()+start,in.begin()+(start+3),"-->")) { Loading Loading @@ -1268,7 +1301,7 @@ int libhtmlpp::ScriptElement::getType() const{ return ElementType::ScriptEL; } size_t libhtmlpp::ScriptElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t libhtmlpp::ScriptElement::parseElement(const std::vector<char> &in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t startel=start; while(start<in.size()){ Loading Loading @@ -1341,7 +1374,7 @@ int libhtmlpp::SvgElement::getType() const{ return ElementType::SvgEL; } size_t libhtmlpp::SvgElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t libhtmlpp::SvgElement::parseElement(const std::vector<char> &in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t startel=start; while(start<in.size()){ Loading Loading @@ -1413,7 +1446,7 @@ int libhtmlpp::TextArea::getType() const{ return ElementType::TextAreaEL; } size_t libhtmlpp::TextArea::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el,size_t start, bool& termination){ size_t libhtmlpp::TextArea::parseElement(const std::vector<char> &in, std::unique_ptr<libhtmlpp::Element>& el,size_t start, bool& termination){ size_t startel = start; while(start < in.size()){ if(in[start] == HTMLTAG_CLOSE) { Loading src/html.h +5 −5 Original line number Diff line number Diff line Loading @@ -141,7 +141,7 @@ namespace libhtmlpp { int getType() const; void remove(Element* el); static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::unique_ptr<Element> _childElement=nullptr; Loading Loading @@ -213,7 +213,7 @@ namespace libhtmlpp { int getType() const; static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::vector<char> _Comment; friend class HtmlString; Loading Loading @@ -243,7 +243,7 @@ namespace libhtmlpp { void appendChild(const Element* el)=delete; void appendChild(const Element& el)=delete; static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::unique_ptr<Element> _childElement=nullptr; Loading Loading @@ -276,7 +276,7 @@ namespace libhtmlpp { void appendChild(const Element* el)=delete; void appendChild(const Element& el)=delete; static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::unique_ptr<Element> _childElement=nullptr; Loading Loading @@ -310,7 +310,7 @@ namespace libhtmlpp { void appendChild(const Element* el)=delete; void appendChild(const Element& el)=delete; static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::unique_ptr<Element> _childElement=nullptr; Loading Loading
src/html.cpp +62 −29 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ #include <cstdarg> #include <compare> #include <string_view> #include <array> #include <algorithm> #include <fstream> Loading @@ -59,7 +60,7 @@ namespace libhtmlpp { const std::string_view ContainerTypes[]={ const std::array<std::string_view,21> ContainerTypes{{ "div", "style", "span", Loading @@ -80,8 +81,8 @@ namespace libhtmlpp { "header", "main", "html", "" }; "a" }}; class DocElements { public: Loading Loading @@ -275,7 +276,7 @@ void libhtmlpp::HtmlString::_buildtreenode( Element *prev_el_in_tree = nullptr; auto checkContainer = [&](const std::string &tag) { for (size_t i = 0; !ContainerTypes[i].empty(); ++i) { for (size_t i = 0; i<ContainerTypes.size(); ++i) { if (tag == ContainerTypes[i]) { return true; } Loading Loading @@ -342,11 +343,8 @@ void libhtmlpp::HtmlString::_buildtreenode( Frame fr = stack.top(); stack.pop(); HtmlElement *opener_el = static_cast<HtmlElement*>(fr.open->element.get()); for (DocElements *cnex=fr.open->nextel.get(); cnex; cnex=cnex->nextel.get()) { if (fr.open->nextel->element && !fr.open->nextel->terminator) { if (fr.open->nextel->element ) { opener_el->_childElement = std::move(fr.open->nextel->element); break; } } prev_el_in_tree = opener_el; Loading Loading @@ -773,32 +771,67 @@ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) { std::copy(in.begin()+vstart,in.begin()+vend,std::back_inserter(val)); } std::cout << _TagName.data() << "->" << key << ": " << val << std::endl; setAttribute(key,val); } } } } size_t libhtmlpp::HtmlElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start,bool &termination){ #include <cctype> #include <vector> #include <memory> size_t libhtmlpp::HtmlElement::parseElement( const std::vector<char>& in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination ){ el = std::make_unique<HtmlElement>(); bool term=false; std::vector<char> tel; while(start<in.size()){ if(!term && in[start]==HTMLTAG_TERMINATE){ termination = false; bool selfClosing = false; size_t i = start; if (i >= in.size() || in[i] != HTMLTAG_OPEN) { return i; } ++i; while (i < in.size() && std::isspace(static_cast<unsigned char>(in[i]))) ++i; if (i < in.size() && in[i] == HTMLTAG_TERMINATE) { // '/' termination = true; }else if(in[start]==HTMLTAG_CLOSE) { reinterpret_cast<HtmlElement*>(el.get())->_serialelize(tel); break; ++i; // '/' konsumieren while (i < in.size() && std::isspace(static_cast<unsigned char>(in[i]))) ++i; } if(in[start]!=' '){ term=true; std::vector<char> tel; while (i < in.size() && in[i] != HTMLTAG_CLOSE) { // '>' tel.emplace_back(in[i]); ++i; } tel.emplace_back(in[start]); ++start; while (!tel.empty() && std::isspace(static_cast<unsigned char>(tel.back()))) tel.pop_back(); if (!termination && !tel.empty() && tel.back() == HTMLTAG_TERMINATE) { selfClosing = true; tel.pop_back(); // den '/' entfernen while (!tel.empty() && std::isspace(static_cast<unsigned char>(tel.back()))) tel.pop_back(); } return ++start; reinterpret_cast<HtmlElement*>(el.get())->_serialelize(tel); if (i < in.size() && in[i] == HTMLTAG_CLOSE) ++i; return i; } namespace libhtmlpp { void _copy(libhtmlpp::Element *dest,const libhtmlpp::Element *src){ Loading Loading @@ -1212,7 +1245,7 @@ int libhtmlpp::CommentElement::getType() const{ return ElementType::CommentEl; } size_t libhtmlpp::CommentElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t libhtmlpp::CommentElement::parseElement(const std::vector<char> &in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t startel=start+3; while(start<in.size()){ if(std::equal(in.begin()+start,in.begin()+(start+3),"-->")) { Loading Loading @@ -1268,7 +1301,7 @@ int libhtmlpp::ScriptElement::getType() const{ return ElementType::ScriptEL; } size_t libhtmlpp::ScriptElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t libhtmlpp::ScriptElement::parseElement(const std::vector<char> &in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t startel=start; while(start<in.size()){ Loading Loading @@ -1341,7 +1374,7 @@ int libhtmlpp::SvgElement::getType() const{ return ElementType::SvgEL; } size_t libhtmlpp::SvgElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t libhtmlpp::SvgElement::parseElement(const std::vector<char> &in, std::unique_ptr<libhtmlpp::Element>& el, size_t start, bool& termination){ size_t startel=start; while(start<in.size()){ Loading Loading @@ -1413,7 +1446,7 @@ int libhtmlpp::TextArea::getType() const{ return ElementType::TextAreaEL; } size_t libhtmlpp::TextArea::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el,size_t start, bool& termination){ size_t libhtmlpp::TextArea::parseElement(const std::vector<char> &in, std::unique_ptr<libhtmlpp::Element>& el,size_t start, bool& termination){ size_t startel = start; while(start < in.size()){ if(in[start] == HTMLTAG_CLOSE) { Loading
src/html.h +5 −5 Original line number Diff line number Diff line Loading @@ -141,7 +141,7 @@ namespace libhtmlpp { int getType() const; void remove(Element* el); static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::unique_ptr<Element> _childElement=nullptr; Loading Loading @@ -213,7 +213,7 @@ namespace libhtmlpp { int getType() const; static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::vector<char> _Comment; friend class HtmlString; Loading Loading @@ -243,7 +243,7 @@ namespace libhtmlpp { void appendChild(const Element* el)=delete; void appendChild(const Element& el)=delete; static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::unique_ptr<Element> _childElement=nullptr; Loading Loading @@ -276,7 +276,7 @@ namespace libhtmlpp { void appendChild(const Element* el)=delete; void appendChild(const Element& el)=delete; static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::unique_ptr<Element> _childElement=nullptr; Loading Loading @@ -310,7 +310,7 @@ namespace libhtmlpp { void appendChild(const Element* el)=delete; void appendChild(const Element& el)=delete; static size_t parseElement(const std::vector<char> in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); static size_t parseElement(const std::vector<char> &in,std::unique_ptr<libhtmlpp::Element> &el,size_t start,bool &termination); protected: std::unique_ptr<Element> _childElement=nullptr; Loading