Loading src/html.cpp +54 −56 Original line number Diff line number Diff line Loading @@ -263,8 +263,8 @@ bool libhtmlpp::HtmlString::validate(std::string *err){ } return false; } void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *srcel){ #include <iostream> void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *firstel,libhtmlpp::DocElements *lastel){ struct cpyel { cpyel(){ Loading @@ -272,13 +272,11 @@ void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *srcel){ }; cpyel(const cpyel &src){ prev=src.prev; next=src.next; start=src.start; end=src.end; }; libhtmlpp::DocElements *prev; libhtmlpp::DocElements *next; libhtmlpp::DocElements *start; libhtmlpp::DocElements *end; Loading @@ -286,22 +284,21 @@ void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *srcel){ std::stack<cpyel> cpylist; DocElements *start=srcel; DocElements *start=firstel; DocElements *next=start->nextel; DocElements *prev=start->prevel; DocElements *end=nullptr; DocElements *end=lastel; auto checkterminator = [](DocElements *termel, DocElements *end){ int i=0; for (DocElements* curcel=termel->nextel; curcel; curcel=curcel->nextel) { if (curcel->element->_Type==HtmlEl && !curcel->terminator && (*(HtmlElement*)curcel->element) == (*(HtmlElement*)termel->element)) { if (curcel->element && curcel->element->_Type==HtmlEl && !curcel->terminator && (*(HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { ++i; } if (curcel->element->_Type==HtmlEl && curcel->terminator && (*(HtmlElement*)curcel->element) == (*(HtmlElement*)termel->element)) { if (curcel->element && curcel->element->_Type==HtmlEl && curcel->terminator && (*(HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { if(i==0) return curcel; else Loading @@ -313,50 +310,51 @@ void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *srcel){ return (DocElements*) nullptr; }; NEXTDOCEL: if(!start->terminator){ if(prev){ start->element->_prevElement=prev->element; prev=start; if(start){ for(DocElements *tmps=start; tmps!=end; tmps=tmps->nextel){ if(!tmps->terminator){ start=tmps; break; } } } if(!start->terminator && start->element->_Type==HtmlEl){ if(start && ((Element*)(start->element))->getType()==HtmlEl){ DocElements *parent=checkterminator(start,end); if(parent){ ((HtmlElement*)start->element)->_childElement =next->element; cpyel cpy; cpy.prev=nullptr; cpy.next=next->nextel; cpy.start=next; cpy.end=parent; cpylist.push(cpy); ((HtmlElement*)(start->element))->_childElement=start->nextel->element; cpyel childel; childel.start= parent!=start->nextel ? start->nextel : nullptr; childel.next = parent!=next->nextel ? next->nextel : nullptr; childel.end=parent; cpylist.push(childel); next=parent->nextel; } }; } while(next!=end){ if(!next->terminator){ start->element->_nextElement=next->element; prev=start; start=next; next=next->nextel; if(next){ for(DocElements *tmps=next; tmps!=end; tmps=tmps->nextel){ if(!tmps->terminator){ start->element->_nextElement=tmps->element; tmps->element->_prevElement=start->element; start=tmps; next=tmps->nextel; std::cerr << start->element->getType() << std::endl; goto NEXTDOCEL; } next=next->nextel; } } while(!cpylist.empty()){ cpyel cpy; cpy=cpylist.top(); prev=cpy.prev; next=cpy.next; start=cpy.start; end=cpy.end; if(!cpylist.empty()){ cpyel childel(cpylist.top()); start=childel.start; next=childel.next; end=childel.end; cpylist.pop(); goto NEXTDOCEL; } } #include <iostream> libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { DocElements *firstEl = nullptr, *lastEl = nullptr; Loading Loading @@ -384,6 +382,8 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { lastEl->spos = _HTable[i][0]; lastEl->epos = _HTable[i][2]; lastEl->epos++; if (_HTable[i][1] != -1){ lastEl->terminator = true; } Loading @@ -400,27 +400,22 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { if(!comment){ std::vector<char> el; std::copy(_Data.begin()+lastEl->spos,_Data.begin()+lastEl->epos,std::inserter<std::vector<char>>(el,el.begin())); lastEl->element=new HtmlElement(); _serialelize(el,(HtmlElement*)lastEl->element); }else{ lastEl->element=new CommentElement(); std::copy(_Data.begin()+lastEl->spos,_Data.begin()+lastEl->epos, std::copy(_Data.begin()+lastEl->spos+4,_Data.begin()+lastEl->epos-2, std::inserter<std::vector<char>>(((CommentElement*) lastEl->element)->_Comment,((CommentElement*) lastEl->element)->_Comment.begin())); ++i; continue; } ++i; std::cout << i << ": " << _HTableSize << std::endl; ssize_t epos = i < _HTableSize ? _HTable[i][0] : _Data.size(); --epos; ssize_t spos = _HTable[i-1][2]+1; size_t epos = i < _HTableSize ? _HTable[i][0] : _Data.size(); std::cout << spos << ":" << epos << ": "<< int(epos - spos) << std::endl; size_t spos = _HTable[i-1][2]+1; if(int(epos - spos) > 0){ addelement(&firstEl,&lastEl); Loading @@ -432,7 +427,7 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { } } _buildtreenode(firstEl); _buildtreenode(firstEl,lastEl); DocElements *dnext=nullptr,*dcurel=firstEl; Loading @@ -446,7 +441,6 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { return rootnode; } #include <iostream> void libhtmlpp::HtmlString::_serialelize(std::vector<char> in, libhtmlpp::HtmlElement *out) { size_t st=0,et=0; Loading Loading @@ -566,9 +560,11 @@ void libhtmlpp::HtmlString::_parseTree(){ _HTable[ip][1]=ii; break; case HTMLTAG_CLOSE: if(open){ _HTable[ip][2] = ii; ++ip; open = false; } break; case ' ': break; Loading Loading @@ -1123,7 +1119,9 @@ PRINTNEXTEL: } }break; case CommentEl: { output.append("<!--"); output.append(((CommentElement*)el)->_Comment.data(),((CommentElement*)el)->_Comment.size()); output.append("-->"); if (el->_nextElement) { el=el->_nextElement; Loading src/html.h +1 −1 Original line number Diff line number Diff line Loading @@ -220,7 +220,7 @@ namespace libhtmlpp { void _parseTree(); void _serialelize(std::vector<char> in, HtmlElement* out); Element* _buildTree(ssize_t& pos); void _buildtreenode(DocElements *srcel); void _buildtreenode(DocElements *firstel,DocElements *lastel); std::vector<char> _Data; std::vector<char> _CStr; ssize_t** _HTable; Loading Loading
src/html.cpp +54 −56 Original line number Diff line number Diff line Loading @@ -263,8 +263,8 @@ bool libhtmlpp::HtmlString::validate(std::string *err){ } return false; } void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *srcel){ #include <iostream> void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *firstel,libhtmlpp::DocElements *lastel){ struct cpyel { cpyel(){ Loading @@ -272,13 +272,11 @@ void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *srcel){ }; cpyel(const cpyel &src){ prev=src.prev; next=src.next; start=src.start; end=src.end; }; libhtmlpp::DocElements *prev; libhtmlpp::DocElements *next; libhtmlpp::DocElements *start; libhtmlpp::DocElements *end; Loading @@ -286,22 +284,21 @@ void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *srcel){ std::stack<cpyel> cpylist; DocElements *start=srcel; DocElements *start=firstel; DocElements *next=start->nextel; DocElements *prev=start->prevel; DocElements *end=nullptr; DocElements *end=lastel; auto checkterminator = [](DocElements *termel, DocElements *end){ int i=0; for (DocElements* curcel=termel->nextel; curcel; curcel=curcel->nextel) { if (curcel->element->_Type==HtmlEl && !curcel->terminator && (*(HtmlElement*)curcel->element) == (*(HtmlElement*)termel->element)) { if (curcel->element && curcel->element->_Type==HtmlEl && !curcel->terminator && (*(HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { ++i; } if (curcel->element->_Type==HtmlEl && curcel->terminator && (*(HtmlElement*)curcel->element) == (*(HtmlElement*)termel->element)) { if (curcel->element && curcel->element->_Type==HtmlEl && curcel->terminator && (*(HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { if(i==0) return curcel; else Loading @@ -313,50 +310,51 @@ void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *srcel){ return (DocElements*) nullptr; }; NEXTDOCEL: if(!start->terminator){ if(prev){ start->element->_prevElement=prev->element; prev=start; if(start){ for(DocElements *tmps=start; tmps!=end; tmps=tmps->nextel){ if(!tmps->terminator){ start=tmps; break; } } } if(!start->terminator && start->element->_Type==HtmlEl){ if(start && ((Element*)(start->element))->getType()==HtmlEl){ DocElements *parent=checkterminator(start,end); if(parent){ ((HtmlElement*)start->element)->_childElement =next->element; cpyel cpy; cpy.prev=nullptr; cpy.next=next->nextel; cpy.start=next; cpy.end=parent; cpylist.push(cpy); ((HtmlElement*)(start->element))->_childElement=start->nextel->element; cpyel childel; childel.start= parent!=start->nextel ? start->nextel : nullptr; childel.next = parent!=next->nextel ? next->nextel : nullptr; childel.end=parent; cpylist.push(childel); next=parent->nextel; } }; } while(next!=end){ if(!next->terminator){ start->element->_nextElement=next->element; prev=start; start=next; next=next->nextel; if(next){ for(DocElements *tmps=next; tmps!=end; tmps=tmps->nextel){ if(!tmps->terminator){ start->element->_nextElement=tmps->element; tmps->element->_prevElement=start->element; start=tmps; next=tmps->nextel; std::cerr << start->element->getType() << std::endl; goto NEXTDOCEL; } next=next->nextel; } } while(!cpylist.empty()){ cpyel cpy; cpy=cpylist.top(); prev=cpy.prev; next=cpy.next; start=cpy.start; end=cpy.end; if(!cpylist.empty()){ cpyel childel(cpylist.top()); start=childel.start; next=childel.next; end=childel.end; cpylist.pop(); goto NEXTDOCEL; } } #include <iostream> libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { DocElements *firstEl = nullptr, *lastEl = nullptr; Loading Loading @@ -384,6 +382,8 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { lastEl->spos = _HTable[i][0]; lastEl->epos = _HTable[i][2]; lastEl->epos++; if (_HTable[i][1] != -1){ lastEl->terminator = true; } Loading @@ -400,27 +400,22 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { if(!comment){ std::vector<char> el; std::copy(_Data.begin()+lastEl->spos,_Data.begin()+lastEl->epos,std::inserter<std::vector<char>>(el,el.begin())); lastEl->element=new HtmlElement(); _serialelize(el,(HtmlElement*)lastEl->element); }else{ lastEl->element=new CommentElement(); std::copy(_Data.begin()+lastEl->spos,_Data.begin()+lastEl->epos, std::copy(_Data.begin()+lastEl->spos+4,_Data.begin()+lastEl->epos-2, std::inserter<std::vector<char>>(((CommentElement*) lastEl->element)->_Comment,((CommentElement*) lastEl->element)->_Comment.begin())); ++i; continue; } ++i; std::cout << i << ": " << _HTableSize << std::endl; ssize_t epos = i < _HTableSize ? _HTable[i][0] : _Data.size(); --epos; ssize_t spos = _HTable[i-1][2]+1; size_t epos = i < _HTableSize ? _HTable[i][0] : _Data.size(); std::cout << spos << ":" << epos << ": "<< int(epos - spos) << std::endl; size_t spos = _HTable[i-1][2]+1; if(int(epos - spos) > 0){ addelement(&firstEl,&lastEl); Loading @@ -432,7 +427,7 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { } } _buildtreenode(firstEl); _buildtreenode(firstEl,lastEl); DocElements *dnext=nullptr,*dcurel=firstEl; Loading @@ -446,7 +441,6 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { return rootnode; } #include <iostream> void libhtmlpp::HtmlString::_serialelize(std::vector<char> in, libhtmlpp::HtmlElement *out) { size_t st=0,et=0; Loading Loading @@ -566,9 +560,11 @@ void libhtmlpp::HtmlString::_parseTree(){ _HTable[ip][1]=ii; break; case HTMLTAG_CLOSE: if(open){ _HTable[ip][2] = ii; ++ip; open = false; } break; case ' ': break; Loading Loading @@ -1123,7 +1119,9 @@ PRINTNEXTEL: } }break; case CommentEl: { output.append("<!--"); output.append(((CommentElement*)el)->_Comment.data(),((CommentElement*)el)->_Comment.size()); output.append("-->"); if (el->_nextElement) { el=el->_nextElement; Loading
src/html.h +1 −1 Original line number Diff line number Diff line Loading @@ -220,7 +220,7 @@ namespace libhtmlpp { void _parseTree(); void _serialelize(std::vector<char> in, HtmlElement* out); Element* _buildTree(ssize_t& pos); void _buildtreenode(DocElements *srcel); void _buildtreenode(DocElements *firstel,DocElements *lastel); std::vector<char> _Data; std::vector<char> _CStr; ssize_t** _HTable; Loading