static inline bool mightBeRGB(const CharacterType* characters, unsigned length) { if (length < 4) return false; return characters[3] == '(' && isASCIIAlphaCaselessEqual(characters[0], 'r') && isASCIIAlphaCaselessEqual(characters[1], 'g') && isASCIIAlphaCaselessEqual(characters[2], 'b'); }
bool CSSSelectorParser::consumeANPlusB(CSSParserTokenRange& range, std::pair<int, int>& result) { const CSSParserToken& token = range.consume(); if (token.type() == NumberToken && token.numericValueType() == IntegerValueType) { result = std::make_pair(0, static_cast<int>(token.numericValue())); return true; } if (token.type() == IdentToken) { if (equalIgnoringASCIICase(token.value(), "odd")) { result = std::make_pair(2, 1); return true; } if (equalIgnoringASCIICase(token.value(), "even")) { result = std::make_pair(2, 0); return true; } } // The 'n' will end up as part of an ident or dimension. For a valid <an+b>, // this will store a string of the form 'n', 'n-', or 'n-123'. String nString; if (token.type() == DelimiterToken && token.delimiter() == '+' && range.peek().type() == IdentToken) { result.first = 1; nString = range.consume().value().toString(); } else if (token.type() == DimensionToken && token.numericValueType() == IntegerValueType) { result.first = token.numericValue(); nString = token.value().toString(); } else if (token.type() == IdentToken) { if (token.value()[0] == '-') { result.first = -1; nString = token.value().toString().substring(1); } else { result.first = 1; nString = token.value().toString(); } } range.consumeWhitespace(); if (nString.isEmpty() || !isASCIIAlphaCaselessEqual(nString[0], 'n')) return false; if (nString.length() > 1 && nString[1] != '-') return false; if (nString.length() > 2) { bool valid; result.second = nString.substring(1).toIntStrict(&valid); return valid; } NumericSign sign = nString.length() == 1 ? NoSign : MinusSign; if (sign == NoSign && range.peek().type() == DelimiterToken) { char delimiterSign = range.consumeIncludingWhitespace().delimiter(); if (delimiterSign == '+') sign = PlusSign; else if (delimiterSign == '-') sign = MinusSign; else return false; } if (sign == NoSign && range.peek().type() != NumberToken) { result.second = 0; return true; } const CSSParserToken& b = range.consume(); if (b.type() != NumberToken || b.numericValueType() != IntegerValueType) return false; if ((b.numericSign() == NoSign) == (sign == NoSign)) return false; result.second = b.numericValue(); if (sign == MinusSign) result.second = -result.second; return true; }