Loading src/html.cpp +100 −73 Changes for src/html.cpp: 100 added lines, 73 removed lines. Original line number Diff line number Diff line Loading @@ -175,76 +175,87 @@ libhtmlpp::HtmlElement* libhtmlpp::HtmlString::parse() { } #include <iostream> libhtmlpp::DocElements * libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements* prev,libhtmlpp::DocElements* start, libhtmlpp::DocElements* end){ libhtmlpp::DocElements *libhtmlpp::HtmlString::_buildtreenode(DocElements* prev,libhtmlpp::DocElements* next,libhtmlpp::DocElements* start,libhtmlpp::DocElements* end){ auto checkterminator = [end](DocElements *termel){ DocElements *ret=nullptr; for (DocElements* parent=end; parent; parent=parent->prevel) { if(parent==termel) return ret; if (parent->element->_Type==HtmlEl && parent->terminator && ((HtmlElement*)parent->element)->_TagName == ((HtmlElement*)termel->element)->_TagName) { ret=parent; for (DocElements* curcel=end; curcel!=termel; curcel=curcel->prevel) { if (curcel->element->_Type==HtmlEl && curcel->terminator && ((HtmlElement*)curcel->element)->_TagName == ((HtmlElement*)termel->element)->_TagName) { ret=curcel; } } return ret; }; if(start==end) return end; if(!start->terminator && start->element->_Type==HtmlEl){ DocElements *parent=checkterminator(start); if(parent && start->nextel && start->element->_Type==HtmlEl){ ((HtmlElement*)start->element)->_childElement =start->nextel->element; start=_buildtreenode(start,start->nextel,parent); } if(parent){ ((HtmlElement*)start->element)->_childElement =next->element; start=_buildtreenode(nullptr,next->nextel,next,parent); } }; if(start->nextel){ if(!start->nextel->terminator){ start->element->_nextElement=start->nextel->element; if(prev) if(!start->terminator){ if(start->element && prev) start->element->_prevElement=prev->element; start=_buildtreenode(start,start->nextel,end); std::cerr << "tag" << std::endl; }else { std::cerr << "term" <<std::endl; start=_buildtreenode(prev,start->nextel,end); if(start->element && !next->terminator ){ start->element->_nextElement=next->element; return _buildtreenode(start,next->nextel,next,end); } start->element->_nextElement=nullptr; if(next==end) return end; return _buildtreenode(prev,next->nextel,start,end); } return start; return _buildtreenode(prev,next->nextel,next,end); } libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { DocElements *firstEl = nullptr, *lastEl = nullptr; for (size_t i = 0; i < _HTableSize; ++i) { if (!firstEl) { firstEl = new DocElements; lastEl = firstEl; } else { lastEl->nextel = new DocElements; lastEl->nextel->prevel = lastEl; lastEl = lastEl->nextel; auto addelement = [](DocElements **first,DocElements **last){ if (!*first) { *first = new DocElements; *last = *first; } else { (*last)->nextel = new DocElements; (*last)->nextel->prevel = *last; *last = (*last)->nextel; } }; lastEl->spos = _HTable[i][0]+1; lastEl->epos = _HTable[i][2]-1; for (size_t i = 0; i < _HTableSize; ++i) { addelement(&firstEl,&lastEl); lastEl->spos = _HTable[i][0]; lastEl->epos = _HTable[i][2]; if (_HTable[i][1] != -1) if (_HTable[i][1] != -1){ lastEl->terminator = true; } _serialelize(_Data.substr(lastEl->spos,(lastEl->epos - lastEl->spos)+1), (HtmlElement**) &lastEl->element); if((i+1) < _HTableSize){ int tlen = (_HTable[i+1][0]-_HTable[i][2])-1; if(tlen>0){ lastEl->nextel = new DocElements; lastEl->nextel->prevel = lastEl; lastEl = lastEl->nextel; int tlen = (_HTable[i+1][0]-_HTable[i][2]); if(tlen>1){ addelement(&firstEl,&lastEl); lastEl->element=new TextElement(); ((TextElement*) lastEl->element)->_Text=_Data.substr(_HTable[i][2]+1,tlen); lastEl->spos = _HTable[i][2]+1; lastEl->epos = _HTable[i+1][0]-1; ((TextElement*) lastEl->element)->_Text=_Data.substr(lastEl->spos,tlen-1); lastEl->terminator=false; } } Loading @@ -253,7 +264,7 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { Element* firsthel = firstEl->element; _buildtreenode(nullptr,firstEl,lastEl); _buildtreenode(nullptr,firstEl->nextel,firstEl,lastEl); delete firstEl; Loading @@ -261,53 +272,63 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { } void libhtmlpp::HtmlString::_serialelize(std::string in, libhtmlpp::HtmlElement **out) { size_t i,s=0; size_t st=0,et=0; for (i = 0; i <= in.length(); ++i) { if(in[i] == '/'){ ++s; for (size_t i = 0; i < in.length(); ++i) { switch (in[i]) { case '<': continue; }else if (in[i] == ' ') { *out = new HtmlElement(in.substr(s, i-s).c_str()); break; }else if (i == in.length()){ *out = new HtmlElement(in.substr(s, i-s).c_str()); case '/': continue; case ' ': continue; default: st=i; goto GETTAGEND; } } GETTAGEND: for(et=st; et<in.length(); ++et){ if(in[et]==' ' || in[et]=='/' || in[et]=='>' ){ break; } } *out = new HtmlElement(in.substr(st,et-st).c_str()); if (!*out) { HTMLException excp; throw excp[HTMLException::Critical] << "no tag in element found!"; } int startpos = -1; std::string key,value; int vst=-1,hvst=-1;; std::string key; int vst=-1,hvst=-1; size_t i; for(i=et; i<in.length(); ++i){ if(in[i]!=' '){ break; } } while(i < in.length()) { switch (in[i]) { case ' ': { if (startpos > 0){ if (startpos >= 0 ){ key = in.substr(startpos, i - startpos); }else if (!key.empty() && hvst < 0) { (*out)->setAttribute(key.c_str(), nullptr); key.clear(); vst = -1; startpos = -1; hvst=-1; } break; } case '=': { if(key.empty()){ key = in.substr(startpos, i - startpos); } hvst=i; } case '\"': { if(!key.empty() && vst < 0){ vst=i; }else if(vst > 0 && hvst > 0) { }else if(!key.empty() && vst > 0 && hvst > 0) { (*out)->setAttribute(key.c_str(), in.substr(vst+2,((i-vst)+1)).c_str()); key.clear(); vst = -1; Loading @@ -317,7 +338,7 @@ void libhtmlpp::HtmlString::_serialelize(std::string in, libhtmlpp::HtmlElement break; } default: { if (startpos == -1) { if (startpos == -1 && key.empty()) { startpos = i; } break; Loading Loading @@ -377,18 +398,21 @@ void libhtmlpp::HtmlString::_parseTree(){ } bool open=false; bool pterm=false; size_t ip=0; for(size_t ii=0; ii<_Data.length(); ++ii){ switch(_Data[ii]){ case HTMLTAG_OPEN: if (_Data.substr(ii, 4) != "<!--") { open = true; pterm = true; _HTable[ip][0] = ii; }else{ ii+=4; } break; case HTMLTAG_TERMINATE: if(pterm==true) _HTable[ip][1]=ii; break; case HTMLTAG_CLOSE: Loading @@ -402,7 +426,10 @@ void libhtmlpp::HtmlString::_parseTree(){ open = false; } break; case ' ': break; default: pterm=false; break; } } Loading Loading @@ -538,7 +565,6 @@ void libhtmlpp::print(Element* el, HtmlElement* parent,std::string& output) { case TextEl :{ output.append(((TextElement*)el)->_Text); if (el->_nextElement) { print(el->_nextElement,parent,output); }else if(parent){ Loading @@ -549,6 +575,9 @@ void libhtmlpp::print(Element* el, HtmlElement* parent,std::string& output) { }break; default: HTMLException excp; excp[HTMLException::Error] << "Unkown Elementtype"; throw excp; break; } } Loading Loading @@ -603,18 +632,16 @@ libhtmlpp::HtmlElement::Attributes::~Attributes() { delete _nextAttr; } libhtmlpp::HtmlTable::HtmlTable() : HtmlElement("table") { } libhtmlpp::HtmlTable::~HtmlTable(){ libhtmlpp::HtmlTable::HtmlTable(HtmlElement *element){ _Element=element; if(_Element->_TagName!="table"){ HTMLException exp; exp[HTMLException::Critical] << "Element ist not table Aborting!"; throw exp; } libhtmlpp::HtmlDivLayer::HtmlDivLayer() : HtmlElement("div") { } libhtmlpp::HtmlDivLayer::~HtmlDivLayer(){ libhtmlpp::HtmlTable::~HtmlTable(){ } libhtmlpp::TextElement::TextElement(){ Loading src/html.h +5 −11 Changes for src/html.h: 5 added lines, 11 removed lines. Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ namespace libhtmlpp { Attributes* _firstAttr; Attributes* _lastAttr; friend class HtmlString; friend class HtmlTable; friend void print(Element* el, HtmlElement* parent,std::string &output); }; Loading @@ -106,16 +107,9 @@ namespace libhtmlpp { void print(Element* el, HtmlElement* parent,std::string &output); class HtmlDivLayer : public HtmlElement { public: HtmlDivLayer(); ~HtmlDivLayer(); private: }; class HtmlTable : public HtmlElement { class HtmlTable { public: HtmlTable(); HtmlTable(HtmlElement *element); ~HtmlTable(); class Row { public: Loading @@ -125,9 +119,9 @@ namespace libhtmlpp { Row(); ~Row(); Row* _nextRow; friend class HtmlTable; }; private: HtmlElement *_Element; }; class HtmlString { Loading Loading @@ -163,7 +157,7 @@ namespace libhtmlpp { void _parseTree(); void _serialelize(std::string in, HtmlElement** out); Element* _buildTree(ssize_t& pos); DocElements* _buildtreenode(DocElements* prev,DocElements *start,DocElements *end); DocElements *_buildtreenode(DocElements* prev,DocElements* next,DocElements *start,DocElements *end); std::string _Data; ssize_t** _HTable; size_t _HTableSize; Loading Loading
src/html.cpp +100 −73 Changes for src/html.cpp: 100 added lines, 73 removed lines. Original line number Diff line number Diff line Loading @@ -175,76 +175,87 @@ libhtmlpp::HtmlElement* libhtmlpp::HtmlString::parse() { } #include <iostream> libhtmlpp::DocElements * libhtmlpp::HtmlString::_buildtreenode(libhtmlpp::DocElements* prev,libhtmlpp::DocElements* start, libhtmlpp::DocElements* end){ libhtmlpp::DocElements *libhtmlpp::HtmlString::_buildtreenode(DocElements* prev,libhtmlpp::DocElements* next,libhtmlpp::DocElements* start,libhtmlpp::DocElements* end){ auto checkterminator = [end](DocElements *termel){ DocElements *ret=nullptr; for (DocElements* parent=end; parent; parent=parent->prevel) { if(parent==termel) return ret; if (parent->element->_Type==HtmlEl && parent->terminator && ((HtmlElement*)parent->element)->_TagName == ((HtmlElement*)termel->element)->_TagName) { ret=parent; for (DocElements* curcel=end; curcel!=termel; curcel=curcel->prevel) { if (curcel->element->_Type==HtmlEl && curcel->terminator && ((HtmlElement*)curcel->element)->_TagName == ((HtmlElement*)termel->element)->_TagName) { ret=curcel; } } return ret; }; if(start==end) return end; if(!start->terminator && start->element->_Type==HtmlEl){ DocElements *parent=checkterminator(start); if(parent && start->nextel && start->element->_Type==HtmlEl){ ((HtmlElement*)start->element)->_childElement =start->nextel->element; start=_buildtreenode(start,start->nextel,parent); } if(parent){ ((HtmlElement*)start->element)->_childElement =next->element; start=_buildtreenode(nullptr,next->nextel,next,parent); } }; if(start->nextel){ if(!start->nextel->terminator){ start->element->_nextElement=start->nextel->element; if(prev) if(!start->terminator){ if(start->element && prev) start->element->_prevElement=prev->element; start=_buildtreenode(start,start->nextel,end); std::cerr << "tag" << std::endl; }else { std::cerr << "term" <<std::endl; start=_buildtreenode(prev,start->nextel,end); if(start->element && !next->terminator ){ start->element->_nextElement=next->element; return _buildtreenode(start,next->nextel,next,end); } start->element->_nextElement=nullptr; if(next==end) return end; return _buildtreenode(prev,next->nextel,start,end); } return start; return _buildtreenode(prev,next->nextel,next,end); } libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { DocElements *firstEl = nullptr, *lastEl = nullptr; for (size_t i = 0; i < _HTableSize; ++i) { if (!firstEl) { firstEl = new DocElements; lastEl = firstEl; } else { lastEl->nextel = new DocElements; lastEl->nextel->prevel = lastEl; lastEl = lastEl->nextel; auto addelement = [](DocElements **first,DocElements **last){ if (!*first) { *first = new DocElements; *last = *first; } else { (*last)->nextel = new DocElements; (*last)->nextel->prevel = *last; *last = (*last)->nextel; } }; lastEl->spos = _HTable[i][0]+1; lastEl->epos = _HTable[i][2]-1; for (size_t i = 0; i < _HTableSize; ++i) { addelement(&firstEl,&lastEl); lastEl->spos = _HTable[i][0]; lastEl->epos = _HTable[i][2]; if (_HTable[i][1] != -1) if (_HTable[i][1] != -1){ lastEl->terminator = true; } _serialelize(_Data.substr(lastEl->spos,(lastEl->epos - lastEl->spos)+1), (HtmlElement**) &lastEl->element); if((i+1) < _HTableSize){ int tlen = (_HTable[i+1][0]-_HTable[i][2])-1; if(tlen>0){ lastEl->nextel = new DocElements; lastEl->nextel->prevel = lastEl; lastEl = lastEl->nextel; int tlen = (_HTable[i+1][0]-_HTable[i][2]); if(tlen>1){ addelement(&firstEl,&lastEl); lastEl->element=new TextElement(); ((TextElement*) lastEl->element)->_Text=_Data.substr(_HTable[i][2]+1,tlen); lastEl->spos = _HTable[i][2]+1; lastEl->epos = _HTable[i+1][0]-1; ((TextElement*) lastEl->element)->_Text=_Data.substr(lastEl->spos,tlen-1); lastEl->terminator=false; } } Loading @@ -253,7 +264,7 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { Element* firsthel = firstEl->element; _buildtreenode(nullptr,firstEl,lastEl); _buildtreenode(nullptr,firstEl->nextel,firstEl,lastEl); delete firstEl; Loading @@ -261,53 +272,63 @@ libhtmlpp::Element* libhtmlpp::HtmlString::_buildTree(ssize_t& pos) { } void libhtmlpp::HtmlString::_serialelize(std::string in, libhtmlpp::HtmlElement **out) { size_t i,s=0; size_t st=0,et=0; for (i = 0; i <= in.length(); ++i) { if(in[i] == '/'){ ++s; for (size_t i = 0; i < in.length(); ++i) { switch (in[i]) { case '<': continue; }else if (in[i] == ' ') { *out = new HtmlElement(in.substr(s, i-s).c_str()); break; }else if (i == in.length()){ *out = new HtmlElement(in.substr(s, i-s).c_str()); case '/': continue; case ' ': continue; default: st=i; goto GETTAGEND; } } GETTAGEND: for(et=st; et<in.length(); ++et){ if(in[et]==' ' || in[et]=='/' || in[et]=='>' ){ break; } } *out = new HtmlElement(in.substr(st,et-st).c_str()); if (!*out) { HTMLException excp; throw excp[HTMLException::Critical] << "no tag in element found!"; } int startpos = -1; std::string key,value; int vst=-1,hvst=-1;; std::string key; int vst=-1,hvst=-1; size_t i; for(i=et; i<in.length(); ++i){ if(in[i]!=' '){ break; } } while(i < in.length()) { switch (in[i]) { case ' ': { if (startpos > 0){ if (startpos >= 0 ){ key = in.substr(startpos, i - startpos); }else if (!key.empty() && hvst < 0) { (*out)->setAttribute(key.c_str(), nullptr); key.clear(); vst = -1; startpos = -1; hvst=-1; } break; } case '=': { if(key.empty()){ key = in.substr(startpos, i - startpos); } hvst=i; } case '\"': { if(!key.empty() && vst < 0){ vst=i; }else if(vst > 0 && hvst > 0) { }else if(!key.empty() && vst > 0 && hvst > 0) { (*out)->setAttribute(key.c_str(), in.substr(vst+2,((i-vst)+1)).c_str()); key.clear(); vst = -1; Loading @@ -317,7 +338,7 @@ void libhtmlpp::HtmlString::_serialelize(std::string in, libhtmlpp::HtmlElement break; } default: { if (startpos == -1) { if (startpos == -1 && key.empty()) { startpos = i; } break; Loading Loading @@ -377,18 +398,21 @@ void libhtmlpp::HtmlString::_parseTree(){ } bool open=false; bool pterm=false; size_t ip=0; for(size_t ii=0; ii<_Data.length(); ++ii){ switch(_Data[ii]){ case HTMLTAG_OPEN: if (_Data.substr(ii, 4) != "<!--") { open = true; pterm = true; _HTable[ip][0] = ii; }else{ ii+=4; } break; case HTMLTAG_TERMINATE: if(pterm==true) _HTable[ip][1]=ii; break; case HTMLTAG_CLOSE: Loading @@ -402,7 +426,10 @@ void libhtmlpp::HtmlString::_parseTree(){ open = false; } break; case ' ': break; default: pterm=false; break; } } Loading Loading @@ -538,7 +565,6 @@ void libhtmlpp::print(Element* el, HtmlElement* parent,std::string& output) { case TextEl :{ output.append(((TextElement*)el)->_Text); if (el->_nextElement) { print(el->_nextElement,parent,output); }else if(parent){ Loading @@ -549,6 +575,9 @@ void libhtmlpp::print(Element* el, HtmlElement* parent,std::string& output) { }break; default: HTMLException excp; excp[HTMLException::Error] << "Unkown Elementtype"; throw excp; break; } } Loading Loading @@ -603,18 +632,16 @@ libhtmlpp::HtmlElement::Attributes::~Attributes() { delete _nextAttr; } libhtmlpp::HtmlTable::HtmlTable() : HtmlElement("table") { } libhtmlpp::HtmlTable::~HtmlTable(){ libhtmlpp::HtmlTable::HtmlTable(HtmlElement *element){ _Element=element; if(_Element->_TagName!="table"){ HTMLException exp; exp[HTMLException::Critical] << "Element ist not table Aborting!"; throw exp; } libhtmlpp::HtmlDivLayer::HtmlDivLayer() : HtmlElement("div") { } libhtmlpp::HtmlDivLayer::~HtmlDivLayer(){ libhtmlpp::HtmlTable::~HtmlTable(){ } libhtmlpp::TextElement::TextElement(){ Loading
src/html.h +5 −11 Changes for src/html.h: 5 added lines, 11 removed lines. Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ namespace libhtmlpp { Attributes* _firstAttr; Attributes* _lastAttr; friend class HtmlString; friend class HtmlTable; friend void print(Element* el, HtmlElement* parent,std::string &output); }; Loading @@ -106,16 +107,9 @@ namespace libhtmlpp { void print(Element* el, HtmlElement* parent,std::string &output); class HtmlDivLayer : public HtmlElement { public: HtmlDivLayer(); ~HtmlDivLayer(); private: }; class HtmlTable : public HtmlElement { class HtmlTable { public: HtmlTable(); HtmlTable(HtmlElement *element); ~HtmlTable(); class Row { public: Loading @@ -125,9 +119,9 @@ namespace libhtmlpp { Row(); ~Row(); Row* _nextRow; friend class HtmlTable; }; private: HtmlElement *_Element; }; class HtmlString { Loading Loading @@ -163,7 +157,7 @@ namespace libhtmlpp { void _parseTree(); void _serialelize(std::string in, HtmlElement** out); Element* _buildTree(ssize_t& pos); DocElements* _buildtreenode(DocElements* prev,DocElements *start,DocElements *end); DocElements *_buildtreenode(DocElements* prev,DocElements* next,DocElements *start,DocElements *end); std::string _Data; ssize_t** _HTable; size_t _HTableSize; Loading