Loading src/html.cpp +53 −64 Original line number Original line Diff line number Diff line Loading @@ -263,8 +263,8 @@ bool libhtmlpp::HtmlString::validate(std::string *err){ } } return false; return false; } } #include <iostream> void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *firstel,libhtmlpp::DocElements *lastel){ libhtmlpp::Element* libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *firstel,libhtmlpp::DocElements *lastel){ struct cpyel { struct cpyel { cpyel(){ cpyel(){ Loading @@ -272,84 +272,94 @@ void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *firstel,libht }; }; cpyel(const cpyel &src){ cpyel(const cpyel &src){ next=src.next; start=src.start; start=src.start; end=src.end; end=src.end; }; }; libhtmlpp::DocElements *next; libhtmlpp::DocElements *start; libhtmlpp::DocElements *start; libhtmlpp::DocElements *end; libhtmlpp::DocElements *end; }; }; std::stack<cpyel> cpylist; std::stack<cpyel> cpylist; DocElements *prev=nullptr; DocElements *start=firstel; DocElements *start=firstel; DocElements *next=start->nextel; DocElements *next=start->nextel; DocElements *end=lastel; DocElements *end=lastel; Element* first=start->element; auto checkterminator = [](DocElements *termel, DocElements *end){ auto checkterminator = [](DocElements *termel, DocElements *end){ int i=0; int i=0; for (DocElements* curcel=termel->nextel; curcel; curcel=curcel->nextel) { for (DocElements* curcel=termel->nextel; curcel; curcel=curcel->nextel) { if (curcel->element && curcel->element->_Type==HtmlEl && !curcel->terminator && if (curcel->element && curcel->element->_Type==HtmlEl && !curcel->terminator && (*(HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { *((HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { ++i; ++i; } } if (curcel->element && curcel->element->_Type==HtmlEl && curcel->terminator && if (curcel->element && curcel->element->_Type==HtmlEl && curcel->terminator && (*(HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { *((HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { if(i==0) if(i==0){ std::cout << ((HtmlElement*)curcel->element)->getTagname() << std::endl; return curcel; return curcel; else }else{ --i; --i; } } } if(curcel==end) if(curcel==end) break; break; } } return (DocElements*) nullptr; return (DocElements*) nullptr; }; }; NEXTDOCEL: NEXTDOCEL: for(DocElements *tmps=start; tmps!=end; tmps=tmps->nextel){ if(!tmps->terminator){ start=tmps; if(start->element && prev){ break; start->element->_prevElement=prev->element; } prev->element->_nextElement=start->element; prev->prevel=nullptr; prev->nextel=nullptr; delete prev; } } if(start && ((Element*)(start->element))->getType()==HtmlEl){ if(start && ((Element*)(start->element))->getType()==HtmlEl){ DocElements *parent=checkterminator(start,end); DocElements *parent=checkterminator(start,end); if(parent){ if(parent){ ((HtmlElement*)(start->element))->_childElement=start->nextel->element; DocElements *child=start->nextel; if(child!=parent){ ((HtmlElement*)(start->element))->_childElement=child->element; cpyel childel; cpyel childel; childel.start= parent!=start->nextel ? start->nextel : nullptr; childel.start=child; childel.next = parent!=next->nextel ? next->nextel : nullptr; childel.end=parent; childel.end=parent; cpylist.push(childel); cpylist.push(childel); next=parent->nextel; next=parent->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; goto NEXTDOCEL; } } if(next && next!=end){ if(!next->terminator && next->element){ prev=start; start=next; } } next=next->nextel; goto NEXTDOCEL; } } if(!cpylist.empty()){ if(!cpylist.empty()){ cpyel childel(cpylist.top()); cpyel childel(cpylist.top()); prev=nullptr; start=childel.start; start=childel.start; next=childel.next; next=childel.start->nextel; end=childel.end; end=childel.end; cpylist.pop(); cpylist.pop(); goto NEXTDOCEL; goto NEXTDOCEL; } } return first; } } libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { Loading @@ -366,12 +376,9 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { } } }; }; for(size_t i = 0; i < _HTableSize; ++i) { size_t i = 0; while( i < _HTableSize ) { if(_HTable[i][0] == -1 || _HTable[i][2] == -1){ if(_HTable[i][0] == -1 || _HTable[i][2] == -1){ break; continue; } } addelement(&firstEl,&lastEl); addelement(&firstEl,&lastEl); Loading @@ -379,8 +386,6 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { lastEl->spos = _HTable[i][0]; lastEl->spos = _HTable[i][0]; lastEl->epos = _HTable[i][2]; lastEl->epos = _HTable[i][2]; lastEl->epos++; if (_HTable[i][1] != -1){ if (_HTable[i][1] != -1){ lastEl->terminator = true; lastEl->terminator = true; } } Loading @@ -404,15 +409,11 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { lastEl->element=new CommentElement(); lastEl->element=new CommentElement(); std::copy(_Data.begin()+lastEl->spos+4,_Data.begin()+lastEl->epos-2, 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())); std::inserter<std::vector<char>>(((CommentElement*) lastEl->element)->_Comment,((CommentElement*) lastEl->element)->_Comment.begin())); ++i; continue; } } ++i; size_t epos = i+1 < _HTableSize ? _HTable[i+1][0] : _Data.size(); size_t epos = i < _HTableSize ? _HTable[i][0] : _Data.size(); size_t spos = _HTable[i-1][2]+1; size_t spos = _HTable[i][2]+1; if(int(epos - spos) > 0){ if(int(epos - spos) > 0){ addelement(&firstEl,&lastEl); addelement(&firstEl,&lastEl); Loading @@ -424,19 +425,7 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { } } } } _buildtreenode(firstEl,lastEl); return _buildtreenode(firstEl,lastEl); DocElements *dnext=nullptr,*dcurel=firstEl; Element *rootnode=firstEl->element; while(dcurel){ dnext=dcurel->nextel; delete dcurel; dcurel=dnext; }; return rootnode; } } void libhtmlpp::HtmlString::_serialelize(std::vector<char> in, libhtmlpp::HtmlElement *out) { void libhtmlpp::HtmlString::_serialelize(std::vector<char> in, libhtmlpp::HtmlElement *out) { Loading src/html.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -220,7 +220,7 @@ namespace libhtmlpp { void _parseTree(); void _parseTree(); void _serialelize(std::vector<char> in, HtmlElement* out); void _serialelize(std::vector<char> in, HtmlElement* out); Element* _buildTree(ssize_t& pos); Element* _buildTree(ssize_t& pos); void _buildtreenode(DocElements *firstel,DocElements *lastel); Element* _buildtreenode(DocElements *firstel,DocElements *lastel); std::vector<char> _Data; std::vector<char> _Data; std::vector<char> _CStr; std::vector<char> _CStr; ssize_t** _HTable; ssize_t** _HTable; Loading Loading
src/html.cpp +53 −64 Original line number Original line Diff line number Diff line Loading @@ -263,8 +263,8 @@ bool libhtmlpp::HtmlString::validate(std::string *err){ } } return false; return false; } } #include <iostream> void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *firstel,libhtmlpp::DocElements *lastel){ libhtmlpp::Element* libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *firstel,libhtmlpp::DocElements *lastel){ struct cpyel { struct cpyel { cpyel(){ cpyel(){ Loading @@ -272,84 +272,94 @@ void libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements *firstel,libht }; }; cpyel(const cpyel &src){ cpyel(const cpyel &src){ next=src.next; start=src.start; start=src.start; end=src.end; end=src.end; }; }; libhtmlpp::DocElements *next; libhtmlpp::DocElements *start; libhtmlpp::DocElements *start; libhtmlpp::DocElements *end; libhtmlpp::DocElements *end; }; }; std::stack<cpyel> cpylist; std::stack<cpyel> cpylist; DocElements *prev=nullptr; DocElements *start=firstel; DocElements *start=firstel; DocElements *next=start->nextel; DocElements *next=start->nextel; DocElements *end=lastel; DocElements *end=lastel; Element* first=start->element; auto checkterminator = [](DocElements *termel, DocElements *end){ auto checkterminator = [](DocElements *termel, DocElements *end){ int i=0; int i=0; for (DocElements* curcel=termel->nextel; curcel; curcel=curcel->nextel) { for (DocElements* curcel=termel->nextel; curcel; curcel=curcel->nextel) { if (curcel->element && curcel->element->_Type==HtmlEl && !curcel->terminator && if (curcel->element && curcel->element->_Type==HtmlEl && !curcel->terminator && (*(HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { *((HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { ++i; ++i; } } if (curcel->element && curcel->element->_Type==HtmlEl && curcel->terminator && if (curcel->element && curcel->element->_Type==HtmlEl && curcel->terminator && (*(HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { *((HtmlElement*)curcel->element) == ((HtmlElement*)termel->element)) { if(i==0) if(i==0){ std::cout << ((HtmlElement*)curcel->element)->getTagname() << std::endl; return curcel; return curcel; else }else{ --i; --i; } } } if(curcel==end) if(curcel==end) break; break; } } return (DocElements*) nullptr; return (DocElements*) nullptr; }; }; NEXTDOCEL: NEXTDOCEL: for(DocElements *tmps=start; tmps!=end; tmps=tmps->nextel){ if(!tmps->terminator){ start=tmps; if(start->element && prev){ break; start->element->_prevElement=prev->element; } prev->element->_nextElement=start->element; prev->prevel=nullptr; prev->nextel=nullptr; delete prev; } } if(start && ((Element*)(start->element))->getType()==HtmlEl){ if(start && ((Element*)(start->element))->getType()==HtmlEl){ DocElements *parent=checkterminator(start,end); DocElements *parent=checkterminator(start,end); if(parent){ if(parent){ ((HtmlElement*)(start->element))->_childElement=start->nextel->element; DocElements *child=start->nextel; if(child!=parent){ ((HtmlElement*)(start->element))->_childElement=child->element; cpyel childel; cpyel childel; childel.start= parent!=start->nextel ? start->nextel : nullptr; childel.start=child; childel.next = parent!=next->nextel ? next->nextel : nullptr; childel.end=parent; childel.end=parent; cpylist.push(childel); cpylist.push(childel); next=parent->nextel; next=parent->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; goto NEXTDOCEL; } } if(next && next!=end){ if(!next->terminator && next->element){ prev=start; start=next; } } next=next->nextel; goto NEXTDOCEL; } } if(!cpylist.empty()){ if(!cpylist.empty()){ cpyel childel(cpylist.top()); cpyel childel(cpylist.top()); prev=nullptr; start=childel.start; start=childel.start; next=childel.next; next=childel.start->nextel; end=childel.end; end=childel.end; cpylist.pop(); cpylist.pop(); goto NEXTDOCEL; goto NEXTDOCEL; } } return first; } } libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { Loading @@ -366,12 +376,9 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { } } }; }; for(size_t i = 0; i < _HTableSize; ++i) { size_t i = 0; while( i < _HTableSize ) { if(_HTable[i][0] == -1 || _HTable[i][2] == -1){ if(_HTable[i][0] == -1 || _HTable[i][2] == -1){ break; continue; } } addelement(&firstEl,&lastEl); addelement(&firstEl,&lastEl); Loading @@ -379,8 +386,6 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { lastEl->spos = _HTable[i][0]; lastEl->spos = _HTable[i][0]; lastEl->epos = _HTable[i][2]; lastEl->epos = _HTable[i][2]; lastEl->epos++; if (_HTable[i][1] != -1){ if (_HTable[i][1] != -1){ lastEl->terminator = true; lastEl->terminator = true; } } Loading @@ -404,15 +409,11 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { lastEl->element=new CommentElement(); lastEl->element=new CommentElement(); std::copy(_Data.begin()+lastEl->spos+4,_Data.begin()+lastEl->epos-2, 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())); std::inserter<std::vector<char>>(((CommentElement*) lastEl->element)->_Comment,((CommentElement*) lastEl->element)->_Comment.begin())); ++i; continue; } } ++i; size_t epos = i+1 < _HTableSize ? _HTable[i+1][0] : _Data.size(); size_t epos = i < _HTableSize ? _HTable[i][0] : _Data.size(); size_t spos = _HTable[i-1][2]+1; size_t spos = _HTable[i][2]+1; if(int(epos - spos) > 0){ if(int(epos - spos) > 0){ addelement(&firstEl,&lastEl); addelement(&firstEl,&lastEl); Loading @@ -424,19 +425,7 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { } } } } _buildtreenode(firstEl,lastEl); return _buildtreenode(firstEl,lastEl); DocElements *dnext=nullptr,*dcurel=firstEl; Element *rootnode=firstEl->element; while(dcurel){ dnext=dcurel->nextel; delete dcurel; dcurel=dnext; }; return rootnode; } } void libhtmlpp::HtmlString::_serialelize(std::vector<char> in, libhtmlpp::HtmlElement *out) { void libhtmlpp::HtmlString::_serialelize(std::vector<char> in, libhtmlpp::HtmlElement *out) { Loading
src/html.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -220,7 +220,7 @@ namespace libhtmlpp { void _parseTree(); void _parseTree(); void _serialelize(std::vector<char> in, HtmlElement* out); void _serialelize(std::vector<char> in, HtmlElement* out); Element* _buildTree(ssize_t& pos); Element* _buildTree(ssize_t& pos); void _buildtreenode(DocElements *firstel,DocElements *lastel); Element* _buildtreenode(DocElements *firstel,DocElements *lastel); std::vector<char> _Data; std::vector<char> _Data; std::vector<char> _CStr; std::vector<char> _CStr; ssize_t** _HTable; ssize_t** _HTable; Loading