⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlparser.cpp

📁 konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版本源码包.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		}                return false;	    }            break;        case ID_TITLE:        case ID_STYLE:            if ( !head )                createHead();            if ( head ) {                DOM::NodeImpl *newNode = head->addChild(n);                if ( newNode ) {                    pushBlock(id, tagPriority[id]);                    setCurrent ( newNode );#if SPEED_DEBUG < 2		    if(!n->attached() && HTMLWidget)                        n->attach();#endif                } else {#ifdef PARSER_DEBUG                    kdDebug( 6035 ) << "adding style before to body failed!!!!" << endl;#endif                    discard_until = ID_STYLE + ID_CLOSE_TAG;                    return false;                }                return true;            } else if(inBody) {                discard_until = id + ID_CLOSE_TAG;                return false;            }            break;        case ID_SCRIPT:            // if we failed to insert it, go into skip mode            discard_until = id + ID_CLOSE_TAG;            break;        case ID_BODY:            if(inBody && doc()->body()) {                // we have another <BODY> element.... apply attributes to existing one                // make sure we don't overwrite already existing attributes                // some sites use <body bgcolor=rightcolor>...<body bgcolor=wrongcolor>                NamedAttrMapImpl *map = static_cast<ElementImpl*>(n)->attributes(true);                NamedAttrMapImpl *bmap = doc()->body()->attributes(false);                bool changed = false;                for (unsigned long l = 0; map && l < map->length(); ++l) {                    NodeImpl::Id attrId = map->idAt(l);                    DOMStringImpl *attrValue = map->valueAt(l);                    if ( !bmap->getValue(attrId) ) {                        bmap->setValue(attrId,attrValue);                        changed = true;                    }                }                if ( changed )                    doc()->recalcStyle( NodeImpl::Inherit );            } else if ( current->isDocumentNode() )                break;            return false;            break;            // the following is a hack to move non rendered elements            // outside of tables.            // needed for broken constructs like <table><form ...><tr>....        case ID_INPUT:        {            ElementImpl *e = static_cast<ElementImpl *>(n);            DOMString type = e->getAttribute(ATTR_TYPE);            if ( strcasecmp( type, "hidden" ) != 0 )                break;            // Fall through!        }        case ID_TEXT:        {            // Don't try to fit random white-space anywhere            TextImpl *t = static_cast<TextImpl *>(n);            if (t->containsOnlyWhitespace())                return false;            // ignore text inside the following elements.            switch(current->id())            {            case ID_SELECT:                return false;            default:                ;                // fall through!!            };            break;        }        case ID_DL:            popBlock( ID_DT );            if ( current->id() == ID_DL ) {                e = new HTMLGenericElementImpl( document, ID_DD );                insertNode( e );                handled = true;            }            break;        case ID_AREA:        {            if(map)            {                map->addChild(n);#if SPEED_DEBUG < 2                if(!n->attached() && HTMLWidget)		    n->attach();#endif                handled = true;                return true;            }            else                return false;        }        case ID_CAPTION: {            switch (current->id()) {                case ID_THEAD:                case ID_TBODY:                case ID_TFOOT:                case ID_TR:                case ID_TH:                case ID_TD: {                    NodeImpl* tsection = current;                    if (current->id() == ID_TR)                        tsection = current->parent();                    else if (current->id() == ID_TD || current->id() == ID_TH)                        tsection = current->parent()->parent();                    NodeImpl* table = tsection->parent();                    int exceptioncode = 0;                    table->insertBefore(n, tsection, exceptioncode);                    pushBlock(id, tagPriority[id]);                    setCurrent(n);                    inStrayTableContent++;                    blockStack->strayTableContent = true;                    return true;                }                default:                    break;            }            break;        }        case ID_THEAD:        case ID_TBODY:        case ID_TFOOT:        case ID_COLGROUP: {            if (isTableRelatedTag(current->id())) {                while (blockStack && current->id() != ID_TABLE && isTableRelatedTag(current->id()))                    popOneBlock();                return insertNode(n);            }        }        default:            break;        }        // switch on the currently active element        switch(current->id())        {        case ID_HTML:            switch(id)            {            case ID_SCRIPT:            case ID_STYLE:            case ID_META:            case ID_LINK:            case ID_OBJECT:            case ID_EMBED:            case ID_TITLE:            case ID_ISINDEX:            case ID_BASE:                if(!head) {                    head = new HTMLHeadElementImpl(document);                    e = head;                    insertNode(e);                    handled = true;                }                break;            case ID_TEXT: {                TextImpl *t = static_cast<TextImpl *>(n);                if (t->containsOnlyWhitespace())                    return false;                /* Fall through to default */            }            default:                if ( haveFrameSet ) break;                e = new HTMLBodyElementImpl(document);                startBody();                insertNode(e);                handled = true;                break;            }            break;        case ID_HEAD:            // we can get here only if the element is not allowed in head.            if (id == ID_HTML)                return false;            else {                // This means the body starts here...                if ( haveFrameSet ) break;                popBlock(ID_HEAD);                e = new HTMLBodyElementImpl(document);                startBody();                insertNode(e);                handled = true;            }            break;        case ID_BODY:            break;        case ID_CAPTION:            // Illegal content in a caption. Close the caption and try again.            popBlock(ID_CAPTION);            switch( id ) {            case ID_THEAD:            case ID_TFOOT:            case ID_TBODY:            case ID_TR:            case ID_TD:            case ID_TH:                return insertNode(n, flat);            }            break;        case ID_TABLE:        case ID_THEAD:        case ID_TFOOT:        case ID_TBODY:        case ID_TR:            switch(id)            {            case ID_TABLE:                popBlock(ID_TABLE); // end the table                handled = checkChild( current->id(), id, !doc()->inCompatMode());                break;            default:            {                NodeImpl *node = current;                NodeImpl *parent = node->parentNode();                NodeImpl *parentparent = parent->parentNode();                if (n->isTextNode() ||                    ( node->id() == ID_TR &&                     ( parent->id() == ID_THEAD ||                       parent->id() == ID_TBODY ||                       parent->id() == ID_TFOOT ) && parentparent->id() == ID_TABLE ) ||                   ( !checkChild( ID_TR, id ) && ( node->id() == ID_THEAD || node->id() == ID_TBODY || node->id() == ID_TFOOT ) &&                     parent->id() == ID_TABLE ) )                {                    node = (node->id() == ID_TABLE) ? node :                           ((node->id() == ID_TR ) ? parentparent : parent);                    NodeImpl *parent = node->parentNode();                    int exceptioncode = 0;#ifdef PARSER_DEBUG                    kdDebug( 6035 ) << "calling insertBefore(" << n->nodeName().string() << "," << node->nodeName().string() << ")" << endl;#endif                    parent->insertBefore(n, node, exceptioncode);                    if (exceptioncode) {#ifndef PARSER_DEBUG                        if (!n->isTextNode())#endif                            kdDebug(6035) << "adding content before table failed.." << endl;                        break;                    }                    if ( n->isElementNode() && tagPriority[id] != 0 &&                         !flat && endTag[id] != DOM::FORBIDDEN ) {                        pushBlock(id, tagPriority[id]);                        setCurrent ( n );                        inStrayTableContent++;                        blockStack->strayTableContent = true;                    }                    return true;                }                if ( current->id() == ID_TR )                    e = new HTMLTableCellElementImpl(document, ID_TD);                else if ( current->id() == ID_TABLE )                    e = new HTMLTableSectionElementImpl( document, ID_TBODY, true /* implicit */ );                else                    e = new HTMLTableRowElementImpl( document );                insertNode(e);                handled = true;                break;            } // end default            } // end switch            break;        case ID_OBJECT:            discard_until = id + ID_CLOSE_TAG;            return false;        case ID_UL:        case ID_OL:        case ID_DIR:        case ID_MENU:            e = new HTMLLIElementImpl(document);            e->addCSSProperty(CSS_PROP_LIST_STYLE_TYPE, CSS_VAL_NONE);            insertNode(e);            handled = true;            break;        case ID_DL:            popBlock(ID_DL);            handled = true;            break;        case ID_DT:            popBlock(ID_DT);            handled = true;            break;        case ID_FORM:            popBlock(ID_FORM);            handled = true;            break;        case ID_SELECT:            if( n->isInline() )                return false;            break;        case ID_P:        case ID_H1:        case ID_H2:        case ID_H3:        case ID_H4:        case ID_H5:        case ID_H6:            if(!n->isInline())            {                popBlock(current->id());                handled = true;            }            break;        case ID_OPTION:        case ID_OPTGROUP:            if (id == ID_OPTGROUP)            {                popBlock(current->id());                handled = true;            }            else if(id == ID_SELECT)            {                // IE treats a nested select as </select>. Let's do the same                popBlock( ID_SELECT );                break;            }            break;            // head elements in the body should be ignored.        case ID_ADDRESS:        case ID_COLGROUP:        case ID_FONT:            popBlock(current->id());            handled = true;            break;        default:            if(current->isDocumentNode())            {                if(current->firstChild() == 0) {                    e = new HTMLHtmlElementImpl(document);                    insertNode(e);                    handled = true;                }            }            else if(current->isInline())            {                popInlineBlocks();                handled = true;            }        }        // if we couldn't handle the error, just rethrow the exception...        if(!handled)        {            //kdDebug( 6035 ) << "Exception handler failed in HTMLPArser::insertNode()" << endl;            return false;        }        return insertNode(n);    }}NodeImpl *KHTMLParser::getElement(Token* t){    NodeImpl *n = 0;    switch(t->tid)    {    case ID_HTML:        n = new HTMLHtmlElementImpl(document);        break;    case ID_HEAD:        if(!head && current->id() == ID_HTML) {            head = new HTMLHeadElementImpl(document);            n = head;        }        break;    case ID_BODY:        // body no longer allowed if we have a frameset        if(haveFrameSet) break;        popBlock(ID_HEAD);        n = new HTMLBodyElementImpl(document);        haveBody =  true;        startBody();        break;// head elements    case ID_BASE:        n = new HTMLBaseElementImpl(document);        break;    case ID_LINK:        n = new HTMLLinkElementImpl(document);        break;    case ID_META:        n = new HTMLMetaElementImpl(document);        break;    case ID_STYLE:        n = new HTMLStyleElementImpl(document);        break;    case ID_TITLE:        // only one non-empty <title> allowed        if (haveTitle) {            discard_until = ID_TITLE+ID_CLOSE_TAG;            break;        }        n = new HTMLTitleElementImpl(document);        // we'll set haveTitle when closing the tag        break;// frames    case ID_FRAME:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -