📄 cssparser.cpp
字号:
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 + -