Commit 1924e549 authored by jan.koester's avatar jan.koester
Browse files

repaired

parent e1be5333
Loading
Loading
Loading
Loading
+75 −56
Original line number Diff line number Diff line
@@ -25,10 +25,9 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstdarg>
#include <compare>

#include <algorithm>
#include <fstream>
@@ -38,6 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "config.h"
#include "encode.h"


#define HTMLTAG_OPEN '<'
#define HTMLTAG_TERMINATE '/'
#define HTMLTAG_CLOSE '>'
@@ -94,10 +94,6 @@ namespace libhtmlpp {
libhtmlpp::HtmlString::HtmlString(){
}

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(char str) : HtmlString(){
    _Data.push_back(str);
}
@@ -117,11 +113,6 @@ libhtmlpp::HtmlString::HtmlString(const libhtmlpp::HtmlString& str) : HtmlString
    std::copy(str._Data.begin(),str._Data.end(),std::insert_iterator<std::vector<char>>(_Data,_Data.begin()));
}

libhtmlpp::HtmlString::HtmlString(const libhtmlpp::HtmlString* str) : HtmlString(){
    std::copy(str->_Data.begin(),str->_Data.end(),std::insert_iterator<std::vector<char>>(_Data,_Data.begin()));
}


void libhtmlpp::HtmlString::push_back(const char src){
   _Data.push_back(src);
}
@@ -152,7 +143,7 @@ bool libhtmlpp::HtmlString::empty(){
}


libhtmlpp::HtmlString &libhtmlpp::HtmlString::operator+=(const char *src){
libhtmlpp::HtmlString &libhtmlpp::HtmlString::operator+=(const std::string &src){
    append(src);
    return *this;
}
@@ -162,15 +153,9 @@ libhtmlpp::HtmlString & libhtmlpp::HtmlString::operator+=(libhtmlpp::HtmlString&
    return *this;
}

libhtmlpp::HtmlString &libhtmlpp::HtmlString::operator=(const char *src){
libhtmlpp::HtmlString & libhtmlpp::HtmlString::operator=(const std::string &src){
    clear();
    std::copy(src,src+strlen(src),std::insert_iterator<std::vector<char>>(_Data,_Data.begin()));
    return *this;
}

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()));
    std::copy(src.begin(),src.end(),std::insert_iterator<std::vector<char>>(_Data,_Data.begin()));
    return *this;
}

@@ -235,7 +220,7 @@ size_t libhtmlpp::HtmlString::size() const{
}

const std::string libhtmlpp::HtmlString::str(){
    return _Data.data();
    return std::string(_Data.data(),_Data.size());
}

const std::vector<char>& libhtmlpp::HtmlString::data() {
@@ -383,11 +368,11 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() {

    for(size_t ii=0; ii<_Data.size(); ++ii){
        if(_Data[ii]==HTMLTAG_OPEN){
            if(strncmp(_Data.data()+ii,"<!--",4)==0){
            if(std::equal(_Data.begin()+ii,_Data.begin()+(ii+4), "<!--")){
                ii+=4;
                size_t start=ii;
                while(ii<_Data.size()){
                    if(strncmp(_Data.data()+ii,"-->",3)==0 ) {
                    if(std::equal(_Data.begin()+ii,_Data.begin()+(ii+3),"-->")) {
                        addelement(&firstEl,&lastEl,new CommentElement());
                        std::copy(_Data.begin()+start,_Data.begin()+ii,
                                   std::back_inserter(((CommentElement*)lastEl->element)->_Comment));
@@ -396,7 +381,7 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() {
                    }
                    ++ii;
                }
            }else if(strncmp(_Data.data()+ii,"<script",7)==0){
            }else if(std::equal(_Data.begin()+ii,_Data.begin()+(ii+7),"<script")){
                size_t start=ii;

                ii+=7;
@@ -419,7 +404,7 @@ libhtmlpp::Element *libhtmlpp::HtmlString::_buildTree() {
                size_t close=++ii;

                while(ii<_Data.size()){
                    if( strncmp(_Data.data()+ii,"</script",8)==0 ) {
                    if( std::equal(_Data.begin()+ii,_Data.begin()+(ii+8),"</script")) {

                        std::copy(_Data.begin()+close,_Data.begin()+ii,
                                  std::back_inserter(((ScriptElement*)lastEl->element)->_Script));
@@ -505,7 +490,7 @@ void libhtmlpp::HtmlString::_serialelize(std::vector<char> in, libhtmlpp::HtmlEl
    }

    GETTAGEND:
    for(et=st; et<in.size(); ++et){
    for(et=st; et<in.size(); et++){
        if(in[et]==' ' || in[et]=='/' || in[et]=='>' ){
            break;
        }
@@ -561,7 +546,10 @@ void libhtmlpp::HtmlString::_serialelize(std::vector<char> in, libhtmlpp::HtmlEl
                if(vend!=0){
                    std::copy(in.begin()+vstart,in.begin()+vend,std::back_inserter(val));
                }
                out->setAttribute(key.data(),val.data());
                if(val.empty())
                    out->setAttribute(std::string(key.data(),key.size()),"");
                else
                    out->setAttribute(std::string(key.data(),key.size()),std::string(val.data(),val.size()));
            }
    }
}
@@ -659,13 +647,16 @@ int libhtmlpp::Element::getType() const{
    return -1;
}

void libhtmlpp::HtmlElement::setTagname(const char* name){
void libhtmlpp::HtmlElement::setTagname(const std::string &name){
    _TagName.clear();
    std::copy(name,name+strlen(name),std::insert_iterator<std::vector<char>>(_TagName,_TagName.begin()) );
    _TagName.resize(name.length());
    std::copy(name.begin(),name.end(),std::insert_iterator<std::vector<char>>(_TagName,_TagName.begin()) );
}

const std::string libhtmlpp::HtmlElement::getTagname() const{
    return _TagName.data();
    if(_TagName.empty())
        return "";
    return std::string(_TagName.data(),_TagName.size());
}

void libhtmlpp::HtmlElement::insertChild(const libhtmlpp::Element* el){
@@ -1211,7 +1202,8 @@ void libhtmlpp::HtmlPage::loadFile(libhtmlpp::HtmlElement &html,const char* path
        throw excp[HTMLException::Critical] << e.what();
    }

    while (fs.read(tmp, HTML_BLOCKSIZE)) {
    while (fs.good() && !fs.eof()) {
        fs.read(tmp, HTML_BLOCKSIZE);
        data.append(tmp,fs.gcount());
    }
    fs.close();
@@ -1226,12 +1218,6 @@ void libhtmlpp::HtmlPage::loadString(libhtmlpp::HtmlElement &html,const std::str
    _copy(&html,el);
}

void libhtmlpp::HtmlPage::loadString(libhtmlpp::HtmlElement &html,const char *src){
    HtmlString buf=src;
    Element *el=buf.parse();
    _copy(&html,el);
}

void libhtmlpp::HtmlPage::loadString(libhtmlpp::HtmlElement &html,const HtmlString &node){
    HtmlString buf=node;
    Element *el=buf.parse();
@@ -1328,7 +1314,6 @@ void libhtmlpp::HtmlPage::_CheckHeader(const HtmlString &page){
}

void libhtmlpp::print(Element* el, HtmlString &output,bool formated) {

    auto isContainer = [](const std::string &tagname) {
        for(int i=0; ContainerTypes[i]; ++i){
            if(tagname==ContainerTypes[i])
@@ -1355,10 +1340,18 @@ void libhtmlpp::print(Element* el, HtmlString &output,bool formated) {
            output.append(((HtmlElement*) el)->getTagname());
            for (HtmlElement::Attributes* curattr = ((HtmlElement*) el)->_firstAttr; curattr; curattr = curattr->_nextAttr) {
                output.append(" ");
                output.append(curattr->_Key.data());
                std::copy(
                    curattr->_Key.begin(),
                    curattr->_Key.end(),
                    std::back_inserter(output)
                );
                if(!curattr->_Value.empty()){
                    output.append("=\"");
                    output.append(curattr->_Value.data());
                    std::copy(
                        curattr->_Value.begin(),
                        curattr->_Value.end(),
                        std::back_inserter(output)
                    );
                    output.append("\"");
                }
            }
@@ -1381,7 +1374,11 @@ void libhtmlpp::print(Element* el, HtmlString &output,bool formated) {
            //Container must be always terminated fuck html5
            if(isContainer(((HtmlElement*) el)->getTagname())){
                output.append("</");
                output.append(((HtmlElement*) el)->_TagName.data());
                std::copy(
                    ((HtmlElement*) el)->_TagName.begin(),
                    ((HtmlElement*) el)->_TagName.end(),
                    std::back_inserter(output)
                );
                output.append(">");
            }

@@ -1395,7 +1392,11 @@ void libhtmlpp::print(Element* el, HtmlString &output,bool formated) {
        }break;

        case TextEl :{
            output.append(((TextElement*)el)->_Text.data());
            std::copy(
                ((TextElement*)el)->_Text.begin(),
                ((TextElement*)el)->_Text.end(),
                std::back_inserter(output)
            );
            if(formated)
                output.append("\r\n");

@@ -1406,7 +1407,11 @@ void libhtmlpp::print(Element* el, HtmlString &output,bool formated) {
        }break;
        case CommentEl: {
            output.append("<!--");
            output.append(((CommentElement*)el)->_Comment.data());
            std::copy(
                 ((CommentElement*)el)->_Comment.begin(),
                 ((CommentElement*)el)->_Comment.end(),
                 std::back_inserter(output)
            );
            output.append("-->");
            if(formated)
                output.append("\r\n");
@@ -1421,10 +1426,18 @@ void libhtmlpp::print(Element* el, HtmlString &output,bool formated) {
            output.append(((ScriptElement*) el)->getTagname());
            for (ScriptElement::Attributes* curattr = ((ScriptElement*) el)->_firstAttr; curattr; curattr = curattr->_nextAttr) {
                output.append(" ");
                output.append(curattr->_Key.data());
                std::copy(
                    curattr->_Key.begin(),
                    curattr->_Key.end(),
                    std::back_inserter(output)
                );
                if(!curattr->_Value.empty()){
                    output.append("=\"");
                    output.append(curattr->_Value.data());
                    std::copy(
                        curattr->_Value.begin(),
                        curattr->_Value.end(),
                        std::back_inserter(output)
                    );
                    output.append("\"");
                }
            }
@@ -1436,7 +1449,11 @@ void libhtmlpp::print(Element* el, HtmlString &output,bool formated) {
                    output.append("    ");
                }
            }
            output.append(((ScriptElement*)el)->_Script.data());
            std::copy(
                ((ScriptElement*)el)->_Script.begin(),
                ((ScriptElement*)el)->_Script.end(),
                std::back_inserter(output)
            );
            if(formated){
                output.append("\r\n");
                for(int i=0; i<lvl; ++i){
@@ -1473,7 +1490,11 @@ void libhtmlpp::print(Element* el, HtmlString &output,bool formated) {
        }

        output.append("</");
        output.append(((HtmlElement*) el)->_TagName.data());
        std::copy(
            ((HtmlElement*) el)->_TagName.begin(),
            ((HtmlElement*) el)->_TagName.end(),
            std::back_inserter(output)
        );
        output.append(">");

        if(formated)
@@ -1547,12 +1568,10 @@ void libhtmlpp::HtmlElement::setAttribute(const std::string &name, const std::st
    Attributes* cattr = nullptr;

    for (Attributes* curattr = _firstAttr; curattr; curattr=curattr->_nextAttr) {
        if(curattr->_Key.size() == name.length()){
            if ( name == curattr->_Key.data() ) {
        if ( std::equal(curattr->_Key.begin(),curattr->_Key.end(),name.begin()) ) {
            cattr = curattr;
        }
    }
    }
    if (!cattr) {
        if (_lastAttr){
            _lastAttr->_nextAttr = new Attributes();
@@ -1562,12 +1581,12 @@ void libhtmlpp::HtmlElement::setAttribute(const std::string &name, const std::st
            _lastAttr = _firstAttr;
        }
        cattr = _lastAttr;
        cattr->_Key.resize(name.length());
        std::copy(name.begin(),name.end(),std::insert_iterator<std::vector<char>>(cattr->_Key,cattr->_Key.begin()) );
    }
    cattr->_Value.resize(value.length());
    if(value.length()>0)
        std::copy(value.begin(),value.end(),std::insert_iterator<std::vector<char>>(cattr->_Value ,cattr->_Value .begin()) );
    else
        cattr->_Value.clear();
}

void libhtmlpp::HtmlElement::setIntAttribute(const std::string& name, int value) {
@@ -1578,8 +1597,8 @@ void libhtmlpp::HtmlElement::setIntAttribute(const std::string& name, int value)

const std::string libhtmlpp::HtmlElement::getAtributte(const std::string& name) const{
    for (Attributes* curattr = _firstAttr; curattr; curattr = curattr->_nextAttr) {
        if ( name==curattr->_Key.data() ) {
            return curattr->_Value.data();
        if ( std::equal(curattr->_Key.begin(),curattr->_Key.end(),name.begin()) ){
            return std::string(curattr->_Value.data(),curattr->_Value.size());
        }
    }
    return "";
+3 −7
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ namespace libhtmlpp {
        void         appendChild(const Element* el);
        void         appendChild(const Element& el);

        void         setTagname(const char *name);
        void         setTagname(const std::string &name);
        const std::string getTagname() const;

        HtmlElement *getElementbyID(const std::string &id) const;
@@ -220,8 +220,6 @@ namespace libhtmlpp {

        HtmlString();
        HtmlString(const HtmlString &str);
        HtmlString(const HtmlString *str);
        HtmlString(const char *str);
        HtmlString(char str);
        HtmlString(const std::string &str);
        ~HtmlString();
@@ -233,10 +231,9 @@ namespace libhtmlpp {

        void insert(size_t pos, char src);

        HtmlString& operator+=(const char* src);
        HtmlString& operator+=(const std::string  &src);
        HtmlString& operator+=(HtmlString& hstring);
        HtmlString& operator=(const char* src);
        HtmlString& operator=(const std::string *src);
        HtmlString& operator=(const std::string &src);
        HtmlString& operator=(const HtmlString& src);
        char operator[](size_t pos) const;

@@ -280,7 +277,6 @@ namespace libhtmlpp {
        void         loadFile(libhtmlpp::HtmlElement &html,const char* path);
        void         saveFile(libhtmlpp::HtmlElement &html,const char* path);
        void         loadString(libhtmlpp::HtmlElement &html,const std::string &src);
        void         loadString(libhtmlpp::HtmlElement &html,const char *src);
        void         loadString(libhtmlpp::HtmlElement &html,const HtmlString &node);
        void         loadString(libhtmlpp::HtmlElement &html,const HtmlString *node);
    private: