Commit 467cc612 authored by jan.koester's avatar jan.koester
Browse files

fixes over fixes

parent 1184266b
Loading
Loading
Loading
Loading
+106 −75
Original line number Diff line number Diff line
@@ -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()));
}

@@ -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;
@@ -308,7 +307,6 @@ NEXTDOCEL:
        childel.end=parent;
        cpylist.push(childel);
        next=parent;
        parent=nullptr;
    }

    if(!next){
@@ -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:
@@ -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;
@@ -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)
@@ -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;
@@ -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]);
@@ -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;
        }
    }

@@ -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;
@@ -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()) );
}

@@ -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;
@@ -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();
}

+2 −2
Original line number Diff line number Diff line
@@ -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);
@@ -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;