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

📄 cssparser.cpp

📁 monqueror一个很具有参考价值的源玛
💻 CPP
📖 第 1 页 / 共 4 页
字号:
                relation = CSSSelector::Child;                curP++;                curP = parseSpace(curP, endP);            }            //if(selecStack)            //    selecStack->print();            startP = curP;        }        else        {            curP++;        }    }    return(selecStack);}QList<CSSSelector> *StyleBaseImpl::parseSelector(const QChar *curP, const QChar *endP){#ifdef CSS_DEBUG//    kdDebug( 6080 ) << "selector is \'" << QString(curP, endP-curP) << "\'" << endl;#endif    QList<CSSSelector> *slist  = 0;    const QChar *startP;    while (curP < endP)    {        startP = curP;        curP = parseToChar(curP, endP, ',', false);        if (!curP)            curP = endP;        CSSSelector *selector = parseSelector1(startP, curP);        if (selector)        {            if (!slist)            {                slist = new QList<CSSSelector>;                slist->setAutoDelete(true);            }            slist->append(selector);        }        else        {#ifdef CSS_DEBUG//            kdDebug( 6080 ) << "invalid selector" << endl;#endif            // invalid selector, delete            delete slist;            return 0;        }        curP++;    }    return slist;}void StyleBaseImpl::parseProperty(const QChar *curP, const QChar *endP, QList<CSSProperty> *propList){    bool important = false;    const QChar *colon;    // Get rid of space in front of the declaration    curP = parseSpace(curP, endP);    if (!curP)        return;    // Search for the required colon or white space    colon = parseToChar(curP, endP, ':', true);    if (!colon)        return;    QString propName( curP, colon - curP );#ifdef CSS_DEBUG//    kdDebug( 6080 ) << "Property-name = \"" << propName << "\"" << endl;#endif    // May have only reached white space before    if (*colon != ':')    {        // Search for the required colon        colon = parseToChar(curP, endP, ':', false);        if (!colon)            return;    }    curP = colon+1;    // remove space in front of the value    while(curP < endP && *curP == ' ')        curP++;    if ( curP >= endP )        return;    // search for !important    const QChar *exclam = parseToChar(curP, endP, '!', false);    if(exclam)    {        //const QChar *imp = parseSpace(exclam+1, endP);        QString s(exclam+1, endP - exclam - 1);        s = s.stripWhiteSpace();        s.lower();        if(s != "important")            return;        important = true;        endP = exclam;#ifdef CSS_DEBUG//        kdDebug( 6080 ) << "important property!" << endl;#endif    }    // remove space after the value;    while (endP > curP)    {        if (!isspace(*(endP-1)))            break;        endP--;    }    QString propVal( curP , endP - curP );#ifdef CSS_DEBUG//    kdDebug( 6080 ) << "Property-value = \"" << propVal.latin1() << "\"" << endl;#endif    const struct props *propPtr = findProp(propName.lower().ascii(), propName.length());    if (!propPtr)    {#ifdef CSS_DEBUG//        kdDebug( 6080 ) << "Unknown property" << propName << endl;#endif         return;    }    unsigned int numProps = propList->count();    if(!parseValue(curP, endP, propPtr->id, important, propList)) {#ifdef CSS_DEBUG//        kdDebug(6080) << "invalid property, removing added properties from propList" << endl;#endif        while(propList->count() > numProps)            propList->removeLast();    }}QList<CSSProperty> *StyleBaseImpl::parseProperties(const QChar *curP, const QChar *endP){    QList<CSSProperty> *propList=0;    propList = new QList<CSSProperty>;    propList->setAutoDelete(true);    while (curP < endP)    {        const QChar *startP = curP;        curP = parseToChar(curP, endP, ';', false);        if (!curP)            curP = endP;#ifdef CSS_DEBUG        QString propVal( startP , curP - startP );//        kdDebug( 6080 ) << "Property = \"" << propVal.latin1() << "\"" << endl;#endif        parseProperty(startP, curP, propList);        curP++;    }    if(!propList->isEmpty())        return propList;#ifdef CSS_DEBUG//    kdDebug( 6080 ) << "empty property list" << endl;#endif    delete propList;    return 0;}bool StyleBaseImpl::parseValue(const QChar *curP, const QChar *endP, int propId, bool important,                                        QList<CSSProperty> *propList){    QString value(curP, endP - curP);    value = value.lower();    const char *val = value.ascii();    //kdDebug() << "parseValue: '" << value << "'" << endl;    CSSValueImpl *parsedValue = 0;    if(!strcmp(val, "inherit"))    {        // inherited value        parsedValue = new CSSInheritedValueImpl();        goto end;    }    switch(propId)    {    case CSS_PROP_AZIMUTH:    case CSS_PROP_BACKGROUND_ATTACHMENT:    case CSS_PROP_BACKGROUND_REPEAT:    case CSS_PROP_BORDER_TOP_STYLE:    case CSS_PROP_BORDER_RIGHT_STYLE:    case CSS_PROP_BORDER_BOTTOM_STYLE:    case CSS_PROP_BORDER_LEFT_STYLE:    case CSS_PROP_BORDER_COLLAPSE:    case CSS_PROP_CAPTION_SIDE:    case CSS_PROP_CLEAR:    case CSS_PROP_CLIP:    case CSS_PROP_CONTENT:    case CSS_PROP_COUNTER_INCREMENT:    case CSS_PROP_COUNTER_RESET:    case CSS_PROP_CUE_AFTER:    case CSS_PROP_CUE_BEFORE:    case CSS_PROP_CURSOR:    case CSS_PROP_DIRECTION:    case CSS_PROP_DISPLAY:    case CSS_PROP_ELEVATION:    case CSS_PROP_EMPTY_CELLS:    case CSS_PROP_FLOAT:    case CSS_PROP_FONT_SIZE:    case CSS_PROP_FONT_SIZE_ADJUST:    case CSS_PROP_FONT_STRETCH:    case CSS_PROP_FONT_STYLE:    case CSS_PROP_FONT_VARIANT:    case CSS_PROP_FONT_WEIGHT:    case CSS_PROP_LETTER_SPACING:    case CSS_PROP_LINE_HEIGHT:    case CSS_PROP_LIST_STYLE_POSITION:    case CSS_PROP_LIST_STYLE_TYPE:    case CSS_PROP_MARGIN_TOP:    case CSS_PROP_MARGIN_RIGHT:    case CSS_PROP_MARGIN_BOTTOM:    case CSS_PROP_MARGIN_LEFT:    case CSS_PROP_MAX_HEIGHT:    case CSS_PROP_MAX_WIDTH:    case CSS_PROP_OUTLINE_STYLE:    case CSS_PROP_OUTLINE_WIDTH:    case CSS_PROP_OVERFLOW:    case CSS_PROP_PAGE:    case CSS_PROP_PAGE_BREAK_AFTER:    case CSS_PROP_PAGE_BREAK_BEFORE:    case CSS_PROP_PAGE_BREAK_INSIDE:    case CSS_PROP_PITCH:    case CSS_PROP_PLAY_DURING:    case CSS_PROP_POSITION:    case CSS_PROP_QUOTES:    case CSS_PROP_SIZE:    case CSS_PROP_SPEAK:    case CSS_PROP_SPEAK_HEADER:    case CSS_PROP_SPEAK_NUMERAL:    case CSS_PROP_SPEAK_PUNCTUATION:    case CSS_PROP_SPEECH_RATE:    case CSS_PROP_TABLE_LAYOUT:    case CSS_PROP_TEXT_ALIGN:        //case CSS_PROP_TEXT_DECORATION:    case CSS_PROP_TEXT_TRANSFORM:    case CSS_PROP_UNICODE_BIDI:    case CSS_PROP_VERTICAL_ALIGN:    case CSS_PROP_VISIBILITY:    case CSS_PROP_VOICE_FAMILY:    case CSS_PROP_VOLUME:    case CSS_PROP_WHITE_SPACE:    case CSS_PROP_WORD_SPACING:    case CSS_PROP_Z_INDEX:    case CSS_PROP_WIDTH:    case CSS_PROP_LEFT:    case CSS_PROP_RIGHT:    case CSS_PROP_TOP:    case CSS_PROP_BOTTOM:    {        //kdDebug( 6080 ) << "parseValue: value = " << val << endl;        const struct css_value *cssval = findValue(val, value.length());        if (cssval)        {            //kdDebug( 6080 ) << "got value " << cssval->id << endl;            parsedValue = new CSSPrimitiveValueImpl(cssval->id);            goto end;            // ### FIXME: should check if the identifier makes sense with the property        }    }    default:        break;    }    // we don't have an identifier.    switch(propId)    {// ident only properties    case CSS_PROP_BACKGROUND_ATTACHMENT:    case CSS_PROP_BACKGROUND_REPEAT:    case CSS_PROP_BORDER_COLLAPSE:    case CSS_PROP_BORDER_TOP_STYLE:    case CSS_PROP_BORDER_RIGHT_STYLE:    case CSS_PROP_BORDER_BOTTOM_STYLE:    case CSS_PROP_BORDER_LEFT_STYLE:    case CSS_PROP_CAPTION_SIDE:    case CSS_PROP_CLEAR:    case CSS_PROP_DIRECTION:    case CSS_PROP_DISPLAY:    case CSS_PROP_EMPTY_CELLS:    case CSS_PROP_FLOAT:    case CSS_PROP_FONT_STRETCH:    case CSS_PROP_FONT_STYLE:    case CSS_PROP_FONT_VARIANT:    case CSS_PROP_FONT_WEIGHT:    case CSS_PROP_LIST_STYLE_POSITION:    case CSS_PROP_LIST_STYLE_TYPE:    case CSS_PROP_OUTLINE_STYLE:    case CSS_PROP_OVERFLOW:    case CSS_PROP_PAGE:    case CSS_PROP_PAGE_BREAK_AFTER:    case CSS_PROP_PAGE_BREAK_BEFORE:    case CSS_PROP_PAGE_BREAK_INSIDE:    case CSS_PROP_PAUSE_AFTER:    case CSS_PROP_PAUSE_BEFORE:    case CSS_PROP_POSITION:    case CSS_PROP_SPEAK:    case CSS_PROP_SPEAK_HEADER:    case CSS_PROP_SPEAK_NUMERAL:    case CSS_PROP_SPEAK_PUNCTUATION:    case CSS_PROP_TABLE_LAYOUT:    case CSS_PROP_TEXT_TRANSFORM:    case CSS_PROP_UNICODE_BIDI:    case CSS_PROP_VISIBILITY:    case CSS_PROP_WHITE_SPACE:        break;// special properties (css_extensions)    case CSS_PROP_AZIMUTH:        // CSS2Azimuth      break;    case CSS_PROP_BACKGROUND_POSITION:      {	int properties[2] = { CSS_PROP_KONQ_BGPOS_X, CSS_PROP_KONQ_BGPOS_Y };	return 	parseShortHand(curP, endP, properties, 2, important, propList);      }      break;    case CSS_PROP_KONQ_BGPOS_X:    case CSS_PROP_KONQ_BGPOS_Y:      {        const struct css_value *cssval = findValue(val, value.length());	int val = -1;        if (cssval)        {	  switch( cssval->id ) {	  case CSS_VAL_TOP:	  case CSS_VAL_LEFT:	    val = 0;	    break;	  case CSS_VAL_CENTER:	    val = 50;	    break;	  case CSS_VAL_BOTTOM:	  case CSS_VAL_RIGHT:	    val = 100;	    break;	  default:	    break;	  }	}	if(val == -1)	  parsedValue = parseUnit(curP, endP, PERCENT | NUMBER);	else if(!parsedValue)	  parsedValue = new CSSPrimitiveValueImpl(val, CSSPrimitiveValue::CSS_PERCENTAGE);        break;      }    case CSS_PROP_CURSOR:        // CSS2Cursor        // ### should also support URI, but let's ignore that for now.        break;    case CSS_PROP_PLAY_DURING:        // CSS2PlayDuring    case CSS_PROP_TEXT_SHADOW:        // list of CSS2TextShadow        break;    case CSS_PROP_BORDER_SPACING: // should be able to have two values        parsedValue = parseUnit(curP, endP, LENGTH);        break;// colors || inherit    case CSS_PROP_BACKGROUND_COLOR:    case CSS_PROP_BORDER_TOP_COLOR:    case CSS_PROP_BORDER_RIGHT_COLOR:    case CSS_PROP_BORDER_BOTTOM_COLOR:    case CSS_PROP_BORDER_LEFT_COLOR:    case CSS_PROP_COLOR:    case CSS_PROP_TEXT_DECORATION_COLOR:    case CSS_PROP_OUTLINE_COLOR:    {        QString value(curP, endP - curP);        value = value.stripWhiteSpace();        //kdDebug(6080) << "parsing color " << value << endl;        MGColor c( value.ascii() );        //kdDebug( 6080 ) << "color is: " << c.red() << ", " << c.green() << ", " << c.blue() << endl;        parsedValue = new CSSPrimitiveValueImpl(c);        break;    }// uri || inherit    case CSS_PROP_BACKGROUND_IMAGE:    case CSS_PROP_LIST_STYLE_IMAGE:    {        const struct css_value *cssval = findValue(val, value.length());        if (cssval && cssval->id == CSS_VAL_NONE)        {            parsedValue = new CSSImageValueImpl();#ifdef CSS_DEBUG//            kdDebug( 6080 ) << "empty image " << static_cast<CSSImageValueImpl *>(parsedValue)->image() << endl;#endif            break;        }        else        {            DOMString value(curP, endP - curP);            value = khtml::parseURL(value);#ifdef CSS_DEBUG//            kdDebug( 6080 ) << "image, url=" << value.string() << " base=" << baseUrl().string() << endl;#endif            parsedValue = new CSSImageValueImpl(value, baseUrl(), this);            break;        }    }    case CSS_PROP_CUE_AFTER:    case CSS_PROP_CUE_BEFORE:    {        DOMString value(curP, endP - curP);        value = khtml::parseURL(value);        parsedValue = new CSSPrimitiveValueImpl(value, CSSPrimitiveValue::CSS_URI);        break;    }// length    case CSS_PROP_BORDER_TOP_WIDTH:    case CSS_PROP_BORDER_RIGHT_WIDTH:    case CSS_PROP_BORDER_BOTTOM_WIDTH:    case CSS_PROP_BORDER_LEFT_WIDTH:    case CSS_PROP_MARKER_OFFSET:    case CSS_PROP_LETTER_SPACING:    case CSS_PROP_OUTLINE_WIDTH:    case CSS_PROP_WORD_SPACING:        {            const struct css_value *cssval = findValue(val, value.length());            if (cssval) {                if(cssval->id == CSS_VAL_THIN || cssval->id == CSS_VAL_MEDIUM ||                   cssval->id == CSS_VAL_THICK )                    //kdDebug( 6080 ) << "got value " << cssval->id << endl;                    parsedValue = new CSSPrimitiveValueImpl(cssval->id);                break;            }            parsedValue = parseUnit(curP, endP, LENGTH);            break;        }// length, percent    case CSS_PROP_PADDING_TOP:    case CSS_PROP_PADDING_RIGHT:    case CSS_PROP_PADDING_BOTTOM:    case CSS_PROP_PADDING_LEFT:    case CSS_PROP_TEXT_INDENT:    case CSS_PROP_BOTTOM:    case CSS_PROP_FONT_SIZE:    case CSS_PROP_HEIGHT:    case CSS_PROP_LEFT:    case CSS_PROP_MARGIN_TOP:    case CSS_PROP_MARGIN_RIGHT:    case CSS_PROP_MARGIN_BOTTOM:    case CSS_PROP_MARGIN_LEFT:    case CSS_PROP_MAX_HEIGHT:    case CSS_PROP_MAX_WIDTH:    case CSS_PROP_MIN_HEIGHT:    case CSS_PROP_MIN_WIDTH:    case CSS_PROP_RIGHT:    case CSS_PROP_TOP:    case CSS_PROP_VERTICAL_ALIGN:    case CSS_PROP_WIDTH:        parsedValue = parseUnit(curP, endP, LENGTH | PERCENT );        break;// angle    case CSS_PROP_ELEVATION:        parsedValue = parseUnit(curP, endP, ANGLE);        break;// number    case CSS_PROP_FONT_SIZE_ADJUST:    case CSS_PROP_ORPHANS:    case CSS_PROP_PITCH_RANGE:    case CSS_PROP_RICHNESS:    case CSS_PROP_SPEECH_RATE:    case CSS_PROP_STRESS:    case CSS_PROP_WIDOWS:    case CSS_PROP_Z_INDEX:        parsedValue = parseUnit(curP, endP, NUMBER);        break;// length, percent, number    case CSS_PROP_LINE_HEIGHT:        //kdDebug(0) << "line-height: '" << QString(curP, endP-curP) << "'" << endl;        parsedValue = parseUnit(curP, endP, LENGTH | PERCENT | NUMBER);        break;// number, percent    case CSS_PROP_VOLUME:        parsedValue = parseUnit(curP, endP, PERCENT | NUMBER);        break;// frequency    case CSS_PROP_PITCH:        parsedValue = parseUnit(curP, endP, FREQUENCY);        break;// string    case CSS_PROP_TEXT_ALIGN:        // only for table columns.        break;// rect    case CSS_PROP_CLIP:        // rect, ident        break;// lists    case CSS_PROP_CONTENT:        // list of string, uri, counter, attr, i    case CSS_PROP_COUNTER_INCREMENT:        // list of CSS2CounterIncrement    case CSS_PROP_COUNTER_RESET:        // list of CSS2CounterReset    case CSS_PROP_FONT_FAMILY:        // list of strings and ids    {        CSSValueListImpl *list = new CSSValueListImpl;        QString str(curP, endP-curP);        //kdDebug( 6080 ) << "faces: '" << str << "'" << endl;        int pos=0, pos2;        while( 1 )        {            pos2 = str.find(',', pos);            QString face = str.mid(pos, pos2-pos);            face = face.stripWhiteSpace();            if(face.length() == 0) break;

⌨️ 快捷键说明

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