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

📄 html_elementimpl.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                namedAttrMap->setID(AtomicString(attr->value().implementation()->lower()));            else                namedAttrMap->setID(attr->value());        }        setChanged();        break;    case ATTR_CLASS:        // class        setHasClass(!attr->isNull());        if (namedAttrMap) static_cast<HTMLNamedAttrMapImpl*>(namedAttrMap)->parseClassAttribute(attr->value());        setChanged();        break;    case ATTR_CONTENTEDITABLE:        setContentEditable(attr);        break;    case ATTR_STYLE:        // ### we need to remove old style info in case there was any!        // ### the inline sheet ay contain more than 1 property!        // stylesheet info        setHasStyle();        if (!m_inlineStyleDecl) createInlineStyleDecl();        m_inlineStyleDecl->setProperty(attr->value());        setChanged();        break;    case ATTR_TABINDEX:        indexstring=getAttribute(ATTR_TABINDEX);        if (indexstring.length())            setTabIndex(indexstring.toInt());        break;// i18n attributes    case ATTR_LANG:        break;    case ATTR_DIR:        addCSSProperty(attr, CSS_PROP_DIRECTION, attr->value());        addCSSProperty(attr, CSS_PROP_UNICODE_BIDI, CSS_VAL_EMBED);        break;// standard events    case ATTR_ONCLICK:	setHTMLEventListener(EventImpl::KHTML_CLICK_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONCONTEXTMENU:	setHTMLEventListener(EventImpl::CONTEXTMENU_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONDBLCLICK:	setHTMLEventListener(EventImpl::KHTML_DBLCLICK_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONMOUSEDOWN:        setHTMLEventListener(EventImpl::MOUSEDOWN_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONMOUSEMOVE:        setHTMLEventListener(EventImpl::MOUSEMOVE_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONMOUSEOUT:        setHTMLEventListener(EventImpl::MOUSEOUT_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONMOUSEOVER:        setHTMLEventListener(EventImpl::MOUSEOVER_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONMOUSEUP:        setHTMLEventListener(EventImpl::MOUSEUP_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONFOCUS:        setHTMLEventListener(EventImpl::DOMFOCUSIN_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONKEYDOWN:        setHTMLEventListener(EventImpl::KEYDOWN_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));	break;    case ATTR_ONKEYPRESS:        setHTMLEventListener(EventImpl::KEYPRESS_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));	break;    case ATTR_ONKEYUP:        setHTMLEventListener(EventImpl::KEYUP_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONSCROLL:        setHTMLEventListener(EventImpl::SCROLL_EVENT,            getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONBEFORECUT:        setHTMLEventListener(EventImpl::BEFORECUT_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONCUT:        setHTMLEventListener(EventImpl::CUT_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONBEFORECOPY:        setHTMLEventListener(EventImpl::BEFORECOPY_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONCOPY:        setHTMLEventListener(EventImpl::COPY_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONBEFOREPASTE:        setHTMLEventListener(EventImpl::BEFOREPASTE_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONPASTE:        setHTMLEventListener(EventImpl::PASTE_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;            case ATTR_ONDRAGENTER:        setHTMLEventListener(EventImpl::DRAGENTER_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONDRAGOVER:        setHTMLEventListener(EventImpl::DRAGOVER_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONDRAGLEAVE:        setHTMLEventListener(EventImpl::DRAGLEAVE_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONDROP:        setHTMLEventListener(EventImpl::DROP_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONDRAGSTART:        setHTMLEventListener(EventImpl::DRAGSTART_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONDRAG:        setHTMLEventListener(EventImpl::DRAG_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONDRAGEND:        setHTMLEventListener(EventImpl::DRAGEND_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONSELECTSTART:        setHTMLEventListener(EventImpl::SELECTSTART_EVENT,                             getDocument()->createHTMLEventListener(attr->value().string()));        break;        // other misc attributes    default:#ifdef UNSUPPORTED_ATTR	kdDebug(6030) << "UATTR: <" << this->nodeName().string() << "> ["		      << attr->name().string() << "]=[" << attr->value().string() << "]" << endl;#endif        break;    }}void HTMLElementImpl::createAttributeMap() const{    namedAttrMap = new HTMLNamedAttrMapImpl(const_cast<HTMLElementImpl*>(this));    namedAttrMap->ref();}CSSStyleDeclarationImpl* HTMLElementImpl::getInlineStyleDecl(){    if (!m_inlineStyleDecl)        createInlineStyleDecl();    return m_inlineStyleDecl;}CSSStyleDeclarationImpl* HTMLElementImpl::additionalAttributeStyleDecl(){    return 0;}const AtomicStringList* HTMLElementImpl::getClassList() const{    return namedAttrMap ? static_cast<HTMLNamedAttrMapImpl*>(namedAttrMap)->getClassList() : 0;}static inline bool isHexDigit( const QChar &c ) {    return ( c >= '0' && c <= '9' ) ||	   ( c >= 'a' && c <= 'f' ) ||	   ( c >= 'A' && c <= 'F' );}static inline int toHex( const QChar &c ) {    return ( (c >= '0' && c <= '9')             ? (c.unicode() - '0')             : ( ( c >= 'a' && c <= 'f' )                 ? (c.unicode() - 'a' + 10)                 : ( ( c >= 'A' && c <= 'F' )                     ? (c.unicode() - 'A' + 10)                     : -1 ) ) );}void HTMLElementImpl::addCSSProperty(HTMLAttributeImpl* attr, int id, const DOMString &value){    if (!attr->decl()) createMappedDecl(attr);    attr->decl()->setProperty(id, value, false);}void HTMLElementImpl::addCSSProperty(HTMLAttributeImpl* attr, int id, int value){    if (!attr->decl()) createMappedDecl(attr);    attr->decl()->setProperty(id, value, false);}void HTMLElementImpl::addCSSStringProperty(HTMLAttributeImpl* attr, int id, const DOMString &value, CSSPrimitiveValue::UnitTypes type){    if (!attr->decl()) createMappedDecl(attr);    attr->decl()->setStringProperty(id, value, type, false);}void HTMLElementImpl::addCSSImageProperty(HTMLAttributeImpl* attr, int id, const DOMString &URL){    if (!attr->decl()) createMappedDecl(attr);    attr->decl()->setImageProperty(id, URL, false);}void HTMLElementImpl::addCSSLength(HTMLAttributeImpl* attr, int id, const DOMString &value){    // FIXME: This function should not spin up the CSS parser, but should instead just figure out the correct    // length unit and make the appropriate parsed value.    if (!attr->decl()) createMappedDecl(attr);    // strip attribute garbage..    DOMStringImpl* v = value.implementation();    if ( v ) {        unsigned int l = 0;                while ( l < v->l && v->s[l].unicode() <= ' ') l++;                for ( ;l < v->l; l++ ) {            char cc = v->s[l].latin1();            if ( cc > '9' || ( cc < '0' && cc != '*' && cc != '%' && cc != '.') )                break;        }        if ( l != v->l ) {            attr->decl()->setLengthProperty(id, DOMString( v->s, l ), false);            return;        }    }        attr->decl()->setLengthProperty(id, value, false);}/* color parsing that tries to match as close as possible IE 6. */void HTMLElementImpl::addHTMLColor(HTMLAttributeImpl* attr, int id, const DOMString &c){    // this is the only case no color gets applied in IE.    if ( !c.length() )        return;    if (!attr->decl()) createMappedDecl(attr);        if (attr->decl()->setProperty(id, c, false) )        return;        QString color = c.string();    // not something that fits the specs.        // we're emulating IEs color parser here. It maps transparent to black, otherwise it tries to build a rgb value    // out of everyhting you put in. The algorithm is experimentally determined, but seems to work for all test cases I have.        // the length of the color value is rounded up to the next    // multiple of 3. each part of the rgb triple then gets one third    // of the length.    //    // Each triplet is parsed byte by byte, mapping    // each number to a hex value (0-9a-fA-F to their values    // everything else to 0).    //    // The highest non zero digit in all triplets is remembered, and    // used as a normalization point to normalize to values between 0    // and 255.        if ( color.lower() != "transparent" ) {        if ( color[0] == '#' )            color.remove( 0,  1 );        int basicLength = (color.length() + 2) / 3;        if ( basicLength > 1 ) {            // IE ignores colors with three digits or less            // 	    qDebug("trying to fix up color '%s'. basicLength=%d, length=%d",            // 		   color.latin1(), basicLength, color.length() );            int colors[3] = { 0, 0, 0 };            int component = 0;            int pos = 0;            int maxDigit = basicLength-1;            while ( component < 3 ) {                // search forward for digits in the string                int numDigits = 0;                while ( pos < (int)color.length() && numDigits < basicLength ) {                    int hex = toHex( color[pos] );                    colors[component] = (colors[component] << 4);                    if ( hex > 0 ) {                        colors[component] += hex;                        maxDigit = QMIN( maxDigit, numDigits );                    }                    numDigits++;                    pos++;                }                while ( numDigits++ < basicLength )                    colors[component] <<= 4;                component++;            }            maxDigit = basicLength - maxDigit;            // 	    qDebug("color is %x %x %x, maxDigit=%d",  colors[0], colors[1], colors[2], maxDigit );                        // normalize to 00-ff. The highest filled digit counts, minimum is 2 digits            maxDigit -= 2;            colors[0] >>= 4*maxDigit;            colors[1] >>= 4*maxDigit;            colors[2] >>= 4*maxDigit;            // 	    qDebug("normalized color is %x %x %x",  colors[0], colors[1], colors[2] );            // 	assert( colors[0] < 0x100 && colors[1] < 0x100 && colors[2] < 0x100 );                        color.sprintf("#%02x%02x%02x", colors[0], colors[1], colors[2] );            // 	    qDebug( "trying to add fixed color string '%s'", color.latin1() );            if ( attr->decl()->setProperty(id, DOMString(color), false) )                return;        }    }    attr->decl()->setProperty(id, CSS_VAL_BLACK, false);}void HTMLElementImpl::createMappedDecl(HTMLAttributeImpl* attr){    CSSMappedAttributeDeclarationImpl* decl = new CSSMappedAttributeDeclarationImpl(0);    attr->setDecl(decl);    decl->setParent(getDocument()->elementSheet());    decl->setNode(this);    decl->setStrictParsing(false); // Mapped attributes are just always quirky.}DOMString HTMLElementImpl::innerHTML() const{    return toHTML();}DOMString HTMLElementImpl::outerHTML() const{    return recursive_toHTML(true);}DOMString HTMLElementImpl::innerText() const{    Node startContainer(const_cast<HTMLElementImpl *>(this));    long startOffset = 0;    Node endContainer(const_cast<HTMLElementImpl *>(this));    long endOffset = 0;    for (NodeImpl *child = firstChild(); child; child = child->nextSibling()) {	endOffset++;    }    Range innerRange(startContainer, startOffset, endContainer, endOffset);    return plainText(innerRange);}

⌨️ 快捷键说明

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