Commit 92d622cb authored by jan.koester's avatar jan.koester
Browse files

some better styling

parent c9a99b74
Loading
Loading
Loading
Loading
+46 −33
Original line number Diff line number Diff line
@@ -401,42 +401,56 @@ void libhtmlpp::HtmlString::_buildTree() {
    DocElements *lastEl = nullptr;
    std::unique_ptr<DocElements> firstEl = nullptr;

    auto starts_with_ci = [&] (const std::vector<char> &s, size_t pos,const std::string_view k) {
        if (pos + k.size() > s.size()) return false;
        for (size_t i = 0; i < k.size(); ++i) {
            unsigned char a = static_cast<unsigned char>(s[pos + i]);
            unsigned char b = static_cast<unsigned char>(k[i]);
            if (std::tolower(a) != std::tolower(b)) return false;
        }
        return true;
    };

    auto addelement = [&firstEl](DocElements **last){
        if (!firstEl.get()) {
        if (!firstEl) {
            firstEl = std::make_unique<DocElements>();
            *last = firstEl.get();
        } else {
            (*last)->nextel = std::make_unique<DocElements>();
            (*last)->nextel->prevel = *last;
            (*last) = (*last)->nextel.get();
            (*last)->nextel->prevel = (*last);
            *last = (*last)->nextel.get();
        }
    };

    HTMLException excp;

    for(size_t ii=0; ii<_Data.size(); ++ii){
    size_t ii = 0;
    while (ii < _Data.size()) {
        if (_Data[ii] == HTMLTAG_OPEN) {
            if( (ii + 3) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+3), "<!--")){
            if (starts_with_ci(_Data, ii, "<!--")) {
                addelement(&lastEl);
                ii+=CommentElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator);
            }else if((ii+6) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+6),"<script")){
                ii = CommentElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator);
            } else if (starts_with_ci(_Data, ii, "<script")) {
                addelement(&lastEl);
                ii+=ScriptElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator);
            }else if( (ii+3) < _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+3),"<svg")){
                ii = ScriptElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator);
            } else if (starts_with_ci(_Data, ii, "<svg")) {
                addelement(&lastEl);
                ii+=SvgElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator);
            }else if( (ii + 9) <= _Data.size() && std::equal(_Data.begin()+ii,_Data.begin()+(ii+9),"<textarea")){
                ii = SvgElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator);
            } else if (starts_with_ci(_Data, ii, "<textarea")) {
                addelement(&lastEl);
                ii+=TextArea::parseElement(_Data,lastEl->element,ii,lastEl->terminator);
                ii = TextArea::parseElement(_Data, lastEl->element, ii, lastEl->terminator);
            } else {
                addelement(&lastEl);
                    ii+=HtmlElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator);
                ii = HtmlElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator);
            }
        }else if(_Data[ii]!=' '){
        } else if (!std::isspace(static_cast<unsigned char>(_Data[ii]))) {
            addelement(&lastEl);
            ii+=TextElement::parseElement(_Data,lastEl->element,ii,lastEl->terminator);
            ii = TextElement::parseElement(_Data, lastEl->element, ii, lastEl->terminator);
        } else {
            ++ii; // nur Whitespace „verbrauchen“
        }
    }

    _buildtreenode(firstEl.get(), nullptr, _rootEl);
}
/**
@@ -685,7 +699,9 @@ void libhtmlpp::HtmlElement::remove(libhtmlpp::Element* el){
void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) {
    size_t st=0,et=0;

    for (size_t i = 0; i < in.size(); ++i) {
    bool send=false;

    for (size_t i = 0; i < in.size() && !send; ++i) {
        switch (in[i]) {
            case '<':
                continue;
@@ -695,28 +711,26 @@ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) {
                continue;
            default:
                st=i;
                goto GETTAGEND;
                send=true;
        }
    }

    GETTAGEND:
    for(et=st; et<in.size(); et++){
        if(in[et]==' ' || in[et]=='/' || in[et]=='>' || in[et]=='\r' || in[et]=='\n'){
            break;
        }
    }

    std::string tag;

    std::copy(in.begin()+st,in.begin()+et,std::back_inserter(tag));

    setTagname(tag);
    std::copy(in.begin()+st,in.begin()+(et),std::back_inserter(_TagName));

    if (_TagName.empty()) {
        HTMLException excp;
        throw excp[HTMLException::Critical] << "no tag in element found!";
    }

    _TagName.emplace_back('\0');

    for(size_t i=et; i<in.size(); i++){
        if(in[i]=='>')
            return;
@@ -766,24 +780,23 @@ void libhtmlpp::HtmlElement::_serialelize(std::vector<char> in) {
}

size_t libhtmlpp::HtmlElement::parseElement(const std::vector<char> in, std::unique_ptr<libhtmlpp::Element>& el, size_t start,bool &termination){
    size_t startel=start;
    el=std::make_unique<HtmlElement>();
    bool term=false;
    std::vector<char> tel;
    while(start<in.size()){
        if(!term &&  in[start]==HTMLTAG_TERMINATE){
            termination=true;
        }else if(in[start]==HTMLTAG_CLOSE) {
            std::vector<char> tel;
            std::copy(in.begin()+startel,in.begin()+start,std::back_inserter(tel));
            reinterpret_cast<HtmlElement*>(el.get())->_serialelize(tel);
            return start;
            break;
        }
        if(in[start]!=' '){
            term=true;
        }
        tel.emplace_back(in[start]);
        ++start;
    }
    return start;
    return ++start;
}

namespace libhtmlpp {