Esempio n. 1
0
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');
}
Esempio n. 2
0
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;
}