String IntersectionObserver::rootMargin() const { StringBuilder stringBuilder; appendLength(stringBuilder, m_topMargin); stringBuilder.append(' '); appendLength(stringBuilder, m_rightMargin); stringBuilder.append(' '); appendLength(stringBuilder, m_bottomMargin); stringBuilder.append(' '); appendLength(stringBuilder, m_leftMargin); return stringBuilder.toString(); }
bool SizesCalcParser::calcToReversePolishNotation(CSSParserTokenIterator start, CSSParserTokenIterator end) { // This method implements the shunting yard algorithm, to turn the calc syntax into a reverse polish notation. // http://en.wikipedia.org/wiki/Shunting-yard_algorithm Vector<CSSParserToken> stack; for (CSSParserTokenIterator it = start; it != end; ++it) { CSSParserTokenType type = it->type(); switch (type) { case NumberToken: appendNumber(*it); break; case DimensionToken: if (!CSSPrimitiveValue::isLength(it->unitType()) || !appendLength(*it)) return false; break; case DelimiterToken: if (!handleOperator(stack, *it)) return false; break; case FunctionToken: if (it->value() != "calc") return false; // "calc(" is the same as "(" case LeftParenthesisToken: // If the token is a left parenthesis, then push it onto the stack. stack.append(*it); break; case RightParenthesisToken: // If the token is a right parenthesis: // Until the token at the top of the stack is a left parenthesis, pop operators off the stack onto the output queue. while (!stack.isEmpty() && stack.last().type() != LeftParenthesisToken && stack.last().type() != FunctionToken) { appendOperator(stack.last()); stack.removeLast(); } // If the stack runs out without finding a left parenthesis, then there are mismatched parentheses. if (stack.isEmpty()) return false; // Pop the left parenthesis from the stack, but not onto the output queue. stack.removeLast(); break; case CommentToken: case WhitespaceToken: case EOFToken: break; case HashToken: case UrlToken: case BadUrlToken: case PercentageToken: case UnicodeRangeToken: case IdentToken: case CommaToken: case ColonToken: case SemicolonToken: case LeftBraceToken: case LeftBracketToken: case RightBraceToken: case RightBracketToken: case StringToken: case BadStringToken: return false; } } // When there are no more tokens to read: // While there are still operator tokens in the stack: while (!stack.isEmpty()) { // If the operator token on the top of the stack is a parenthesis, then there are mismatched parentheses. CSSParserTokenType type = stack.last().type(); if (type == LeftParenthesisToken || type == FunctionToken) return false; // Pop the operator onto the output queue. appendOperator(stack.last()); stack.removeLast(); } return true; }
bool SizesCalcParser::calcToReversePolishNotation(CSSParserTokenRange range) { // This method implements the shunting yard algorithm, to turn the calc syntax into a reverse polish notation. // http://en.wikipedia.org/wiki/Shunting-yard_algorithm Vector<CSSParserToken> stack; while (!range.atEnd()) { const CSSParserToken& token = range.consume(); switch (token.type()) { case NumberToken: appendNumber(token); break; case DimensionToken: if (!CSSPrimitiveValue::isLength(token.unitType()) || !appendLength(token)) return false; break; case DelimiterToken: if (!handleOperator(stack, token)) return false; break; case FunctionToken: if (!token.valueEqualsIgnoringCase("calc")) return false; // "calc(" is the same as "(" case LeftParenthesisToken: // If the token is a left parenthesis, then push it onto the stack. stack.append(token); break; case RightParenthesisToken: // If the token is a right parenthesis: // Until the token at the top of the stack is a left parenthesis, pop operators off the stack onto the output queue. while (!stack.isEmpty() && stack.last().type() != LeftParenthesisToken && stack.last().type() != FunctionToken) { appendOperator(stack.last()); stack.removeLast(); } // If the stack runs out without finding a left parenthesis, then there are mismatched parentheses. if (stack.isEmpty()) return false; // Pop the left parenthesis from the stack, but not onto the output queue. stack.removeLast(); break; case WhitespaceToken: case EOFToken: break; case CommentToken: ASSERT_NOT_REACHED(); case CDOToken: case CDCToken: case AtKeywordToken: case HashToken: case UrlToken: case BadUrlToken: case PercentageToken: case IncludeMatchToken: case DashMatchToken: case PrefixMatchToken: case SuffixMatchToken: case SubstringMatchToken: case ColumnToken: case UnicodeRangeToken: case IdentToken: case CommaToken: case ColonToken: case SemicolonToken: case LeftBraceToken: case LeftBracketToken: case RightBraceToken: case RightBracketToken: case StringToken: case BadStringToken: return false; } } // When there are no more tokens to read: // While there are still operator tokens in the stack: while (!stack.isEmpty()) { // If the operator token on the top of the stack is a parenthesis, then there are mismatched parentheses. CSSParserTokenType type = stack.last().type(); if (type == LeftParenthesisToken || type == FunctionToken) return false; // Pop the operator onto the output queue. appendOperator(stack.last()); stack.removeLast(); } return true; }