Loading src/html.cpp +106 −75 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ libhtmlpp::HtmlString::HtmlString(const char* str) : HtmlString(){ std::copy(str,str+strlen(str),std::insert_iterator<std::vector<char>>(_Data,_Data.begin()) ); } libhtmlpp::HtmlString::HtmlString(std::string& str) : HtmlString(){ libhtmlpp::HtmlString::HtmlString(const std::string& str) : HtmlString(){ std::copy(str.begin(),str.end(),std::insert_iterator<std::vector<char>>(_Data,_Data.begin())); } Loading Loading @@ -145,11 +145,10 @@ libhtmlpp::HtmlString & libhtmlpp::HtmlString::operator+=(libhtmlpp::HtmlString& libhtmlpp::HtmlString &libhtmlpp::HtmlString::operator=(const char *src){ clear(); std::copy(src,src+strlen(src),std::insert_iterator<std::vector<char>>(_Data,_Data.begin())); return *this; } libhtmlpp::HtmlString & libhtmlpp::HtmlString::operator=(std::string *src){ libhtmlpp::HtmlString & libhtmlpp::HtmlString::operator=(const std::string *src){ clear(); std::copy(src->begin(),src->end(),std::insert_iterator<std::vector<char>>(_Data,_Data.begin())); return *this; Loading Loading @@ -308,7 +307,6 @@ NEXTDOCEL: childel.end=parent; cpylist.push(childel); next=parent; parent=nullptr; } if(!next){ Loading Loading @@ -361,6 +359,8 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { size_t comment=std::string::npos; size_t prevclose=std::string::npos; bool added=false; for(size_t ii=0; ii<_Data.size(); ++ii){ switch(_Data[ii]){ case HTMLTAG_OPEN: Loading @@ -369,7 +369,8 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { } break; case HTMLTAG_TERMINATE: if(open!=std::string::npos && close ==std::string::npos){ if(open!=std::string::npos && close ==std::string::npos && starttag ==std::string::npos ){ terminate=ii; } break; Loading @@ -379,39 +380,43 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { } break; case '!': if(open!=std::string::npos && close ==std::string::npos) if( ii+2 < _Data.size() && _Data[ii+1]=='-' && _Data[ii+2]=='-'){ if(open!=std::string::npos && close ==std::string::npos){ if( ii+3 < _Data.size() && _Data[ii+1]=='-' && _Data[ii+2]=='-'){ comment=(ii+=2); } } break; case ' ': break; default: if(open!=std::string::npos && close ==std::string::npos && starttag==std::string::npos) if(open!=std::string::npos && close ==std::string::npos && starttag==std::string::npos && comment==std::string::npos) starttag=ii; break; } if(open!=std::string::npos && close !=std::string::npos){ if(open!=std::string::npos && close !=std::string::npos && starttag!=std::string::npos){ addelement(&firstEl,&lastEl); if(terminate!=std::string::npos) lastEl->terminator=true; if(comment==std::string::npos){ lastEl->element=new HtmlElement(); lastEl->element->_firstElement=firstEl->element; std::vector<char> el; std::copy(_Data.begin()+open,_Data.begin()+(close+1),std::inserter<std::vector<char>>(el,el.begin())); _serialelize(el,(HtmlElement*)lastEl->element); }else{ std::vector<char> tel; std::copy(_Data.begin()+open,_Data.begin()+(close+1),std::inserter<std::vector<char>>(tel,tel.begin())); _serialelize(tel,(HtmlElement*)lastEl->element); prevclose=close; added=true; }else if (open!=std::string::npos && comment !=std::string::npos){ int ctlvl=0; size_t endcomment=std::string::npos; while(ii < _Data.size()){ switch(_Data[ii]){ case '-': ++ctlvl; if(endcomment==std::string::npos) endcomment=ii; ++ctlvl; break; case '>': if(endcomment!=std::string::npos && ctlvl==2) Loading @@ -425,19 +430,24 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { ++ii; } ENDCOMMANDTAGDOUND: if(endcomment!=std::string::npos){ if(--endcomment!=std::string::npos && ctlvl==2){ addelement(&firstEl,&lastEl); lastEl->element=new CommentElement(); lastEl->element->_firstElement=firstEl->element; std::vector<char> el; std::copy(_Data.begin()+comment,_Data.begin()+endcomment,std::inserter<std::vector<char>>(el,el.begin())); ((CommentElement*)lastEl->element)->_Comment=el; std::vector<char> cel; std::copy(_Data.begin()+(comment+1),_Data.begin()+endcomment,std::inserter<std::vector<char>>(cel,cel.begin())); ((CommentElement*)lastEl->element)->_Comment=cel; } prevclose=ii; added=true; } if(prevclose!=std::string::npos && int(open-prevclose) > 0){ if(prevclose!=std::string::npos && open!=std::string::npos && int(open-(prevclose+1)) > 0){ std::vector<char> buf; bool start=false; for(size_t it = prevclose; it<open; ++it){ for(size_t it = prevclose+1; it<open; ++it){ switch(_Data[it]){ case '\r': continue; Loading @@ -446,6 +456,9 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { case ' ': if(!start) continue; else buf.push_back(_Data[it]); continue; default: start=true; buf.push_back(_Data[it]); Loading @@ -453,19 +466,23 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { } } if(!buf.empty()){ // addelement(&firstEl,&lastEl); // lastEl->element=new TextElement(); // lastEl->element->_firstElement=firstEl->element; // ((TextElement*)lastEl->element)->_Text=buf; // lastEl->terminator=false; addelement(&firstEl,&lastEl); lastEl->element=new TextElement(); lastEl->element->_firstElement=firstEl->element; std::copy(buf.begin(),buf.end(),std::inserter<std::vector<char>>(((TextElement*)(lastEl->element))->_Text, ((TextElement*)lastEl->element)->_Text.begin())); lastEl->terminator=false; } prevclose=open; } if(added){ open=std::string::npos; prevclose=close; close=std::string::npos; terminate=std::string::npos; close=std::string::npos; starttag=std::string::npos; comment=std::string::npos; added=false; } } Loading @@ -473,12 +490,25 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { _buildtreenode(firstEl,lastEl); while(firstEl){ DocElements *next=firstEl->nextel; if(firstEl->terminator) first->remove(firstEl->element); delete firstEl; firstEl=next; DocElements *ft=firstEl; while(ft){ DocElements *next=ft->nextel; Element *el=ft->element; switch(el->getType()){ case HtmlEl: break; case TextEl: break; case CommentEl: break; } if(ft->terminator) first->remove(ft->element); ft->nextel=nullptr; ft->element=nullptr; delete ft; ft=next; } lastEl=nullptr; Loading Loading @@ -581,7 +611,7 @@ void libhtmlpp::HtmlEncode(const char* input, HtmlString* output){ } libhtmlpp::HtmlElement::HtmlElement(const char *tagname) : Element(){ libhtmlpp::HtmlElement::HtmlElement(const char *tagname) : HtmlElement(){ std::copy(tagname,tagname+strlen(tagname),std::insert_iterator<std::vector<char>>(_TagName,_TagName.begin()) ); } Loading Loading @@ -819,7 +849,7 @@ NEWEL: } if(((libhtmlpp::HtmlElement*)src)->_childElement){ switch(src->getType()){ switch(((libhtmlpp::HtmlElement*)src)->_childElement->getType()){ case HtmlEl: ((libhtmlpp::HtmlElement*)dest)->_childElement= new HtmlElement; break; Loading Loading @@ -1110,12 +1140,13 @@ void libhtmlpp::HtmlPage::loadFile(libhtmlpp::HtmlElement &html,const char* path data.append(tmp,fs.gcount()); } fs.close(); _CheckHeader(data); loadString(html,data); } void libhtmlpp::HtmlPage::loadString(libhtmlpp::HtmlElement &html,const std::string &src){ HtmlString buf=src.c_str(); HtmlString buf(src); html=(HtmlElement*)buf.parse(); } Loading src/html.h +2 −2 Original line number Diff line number Diff line Loading @@ -189,7 +189,7 @@ namespace libhtmlpp { HtmlString(const HtmlString &str); HtmlString(const HtmlString *str); HtmlString(const char *str); HtmlString(std::string &str); HtmlString(const std::string &str); ~HtmlString(); void append(const char* src, size_t srcsize); Loading @@ -203,7 +203,7 @@ namespace libhtmlpp { HtmlString& operator+=(const char* src); HtmlString& operator+=(HtmlString& hstring); HtmlString& operator=(const char* src); HtmlString& operator=(std::string *src); HtmlString& operator=(const std::string *src); HtmlString& operator=(const HtmlString& src); const char operator[](size_t pos) const; Loading Loading
src/html.cpp +106 −75 Original line number Diff line number Diff line Loading @@ -77,7 +77,7 @@ libhtmlpp::HtmlString::HtmlString(const char* str) : HtmlString(){ std::copy(str,str+strlen(str),std::insert_iterator<std::vector<char>>(_Data,_Data.begin()) ); } libhtmlpp::HtmlString::HtmlString(std::string& str) : HtmlString(){ libhtmlpp::HtmlString::HtmlString(const std::string& str) : HtmlString(){ std::copy(str.begin(),str.end(),std::insert_iterator<std::vector<char>>(_Data,_Data.begin())); } Loading Loading @@ -145,11 +145,10 @@ libhtmlpp::HtmlString & libhtmlpp::HtmlString::operator+=(libhtmlpp::HtmlString& libhtmlpp::HtmlString &libhtmlpp::HtmlString::operator=(const char *src){ clear(); std::copy(src,src+strlen(src),std::insert_iterator<std::vector<char>>(_Data,_Data.begin())); return *this; } libhtmlpp::HtmlString & libhtmlpp::HtmlString::operator=(std::string *src){ libhtmlpp::HtmlString & libhtmlpp::HtmlString::operator=(const std::string *src){ clear(); std::copy(src->begin(),src->end(),std::insert_iterator<std::vector<char>>(_Data,_Data.begin())); return *this; Loading Loading @@ -308,7 +307,6 @@ NEXTDOCEL: childel.end=parent; cpylist.push(childel); next=parent; parent=nullptr; } if(!next){ Loading Loading @@ -361,6 +359,8 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { size_t comment=std::string::npos; size_t prevclose=std::string::npos; bool added=false; for(size_t ii=0; ii<_Data.size(); ++ii){ switch(_Data[ii]){ case HTMLTAG_OPEN: Loading @@ -369,7 +369,8 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { } break; case HTMLTAG_TERMINATE: if(open!=std::string::npos && close ==std::string::npos){ if(open!=std::string::npos && close ==std::string::npos && starttag ==std::string::npos ){ terminate=ii; } break; Loading @@ -379,39 +380,43 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { } break; case '!': if(open!=std::string::npos && close ==std::string::npos) if( ii+2 < _Data.size() && _Data[ii+1]=='-' && _Data[ii+2]=='-'){ if(open!=std::string::npos && close ==std::string::npos){ if( ii+3 < _Data.size() && _Data[ii+1]=='-' && _Data[ii+2]=='-'){ comment=(ii+=2); } } break; case ' ': break; default: if(open!=std::string::npos && close ==std::string::npos && starttag==std::string::npos) if(open!=std::string::npos && close ==std::string::npos && starttag==std::string::npos && comment==std::string::npos) starttag=ii; break; } if(open!=std::string::npos && close !=std::string::npos){ if(open!=std::string::npos && close !=std::string::npos && starttag!=std::string::npos){ addelement(&firstEl,&lastEl); if(terminate!=std::string::npos) lastEl->terminator=true; if(comment==std::string::npos){ lastEl->element=new HtmlElement(); lastEl->element->_firstElement=firstEl->element; std::vector<char> el; std::copy(_Data.begin()+open,_Data.begin()+(close+1),std::inserter<std::vector<char>>(el,el.begin())); _serialelize(el,(HtmlElement*)lastEl->element); }else{ std::vector<char> tel; std::copy(_Data.begin()+open,_Data.begin()+(close+1),std::inserter<std::vector<char>>(tel,tel.begin())); _serialelize(tel,(HtmlElement*)lastEl->element); prevclose=close; added=true; }else if (open!=std::string::npos && comment !=std::string::npos){ int ctlvl=0; size_t endcomment=std::string::npos; while(ii < _Data.size()){ switch(_Data[ii]){ case '-': ++ctlvl; if(endcomment==std::string::npos) endcomment=ii; ++ctlvl; break; case '>': if(endcomment!=std::string::npos && ctlvl==2) Loading @@ -425,19 +430,24 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { ++ii; } ENDCOMMANDTAGDOUND: if(endcomment!=std::string::npos){ if(--endcomment!=std::string::npos && ctlvl==2){ addelement(&firstEl,&lastEl); lastEl->element=new CommentElement(); lastEl->element->_firstElement=firstEl->element; std::vector<char> el; std::copy(_Data.begin()+comment,_Data.begin()+endcomment,std::inserter<std::vector<char>>(el,el.begin())); ((CommentElement*)lastEl->element)->_Comment=el; std::vector<char> cel; std::copy(_Data.begin()+(comment+1),_Data.begin()+endcomment,std::inserter<std::vector<char>>(cel,cel.begin())); ((CommentElement*)lastEl->element)->_Comment=cel; } prevclose=ii; added=true; } if(prevclose!=std::string::npos && int(open-prevclose) > 0){ if(prevclose!=std::string::npos && open!=std::string::npos && int(open-(prevclose+1)) > 0){ std::vector<char> buf; bool start=false; for(size_t it = prevclose; it<open; ++it){ for(size_t it = prevclose+1; it<open; ++it){ switch(_Data[it]){ case '\r': continue; Loading @@ -446,6 +456,9 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { case ' ': if(!start) continue; else buf.push_back(_Data[it]); continue; default: start=true; buf.push_back(_Data[it]); Loading @@ -453,19 +466,23 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { } } if(!buf.empty()){ // addelement(&firstEl,&lastEl); // lastEl->element=new TextElement(); // lastEl->element->_firstElement=firstEl->element; // ((TextElement*)lastEl->element)->_Text=buf; // lastEl->terminator=false; addelement(&firstEl,&lastEl); lastEl->element=new TextElement(); lastEl->element->_firstElement=firstEl->element; std::copy(buf.begin(),buf.end(),std::inserter<std::vector<char>>(((TextElement*)(lastEl->element))->_Text, ((TextElement*)lastEl->element)->_Text.begin())); lastEl->terminator=false; } prevclose=open; } if(added){ open=std::string::npos; prevclose=close; close=std::string::npos; terminate=std::string::npos; close=std::string::npos; starttag=std::string::npos; comment=std::string::npos; added=false; } } Loading @@ -473,12 +490,25 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() { _buildtreenode(firstEl,lastEl); while(firstEl){ DocElements *next=firstEl->nextel; if(firstEl->terminator) first->remove(firstEl->element); delete firstEl; firstEl=next; DocElements *ft=firstEl; while(ft){ DocElements *next=ft->nextel; Element *el=ft->element; switch(el->getType()){ case HtmlEl: break; case TextEl: break; case CommentEl: break; } if(ft->terminator) first->remove(ft->element); ft->nextel=nullptr; ft->element=nullptr; delete ft; ft=next; } lastEl=nullptr; Loading Loading @@ -581,7 +611,7 @@ void libhtmlpp::HtmlEncode(const char* input, HtmlString* output){ } libhtmlpp::HtmlElement::HtmlElement(const char *tagname) : Element(){ libhtmlpp::HtmlElement::HtmlElement(const char *tagname) : HtmlElement(){ std::copy(tagname,tagname+strlen(tagname),std::insert_iterator<std::vector<char>>(_TagName,_TagName.begin()) ); } Loading Loading @@ -819,7 +849,7 @@ NEWEL: } if(((libhtmlpp::HtmlElement*)src)->_childElement){ switch(src->getType()){ switch(((libhtmlpp::HtmlElement*)src)->_childElement->getType()){ case HtmlEl: ((libhtmlpp::HtmlElement*)dest)->_childElement= new HtmlElement; break; Loading Loading @@ -1110,12 +1140,13 @@ void libhtmlpp::HtmlPage::loadFile(libhtmlpp::HtmlElement &html,const char* path data.append(tmp,fs.gcount()); } fs.close(); _CheckHeader(data); loadString(html,data); } void libhtmlpp::HtmlPage::loadString(libhtmlpp::HtmlElement &html,const std::string &src){ HtmlString buf=src.c_str(); HtmlString buf(src); html=(HtmlElement*)buf.parse(); } Loading
src/html.h +2 −2 Original line number Diff line number Diff line Loading @@ -189,7 +189,7 @@ namespace libhtmlpp { HtmlString(const HtmlString &str); HtmlString(const HtmlString *str); HtmlString(const char *str); HtmlString(std::string &str); HtmlString(const std::string &str); ~HtmlString(); void append(const char* src, size_t srcsize); Loading @@ -203,7 +203,7 @@ namespace libhtmlpp { HtmlString& operator+=(const char* src); HtmlString& operator+=(HtmlString& hstring); HtmlString& operator=(const char* src); HtmlString& operator=(std::string *src); HtmlString& operator=(const std::string *src); HtmlString& operator=(const HtmlString& src); const char operator[](size_t pos) const; Loading