String CSSCustomIdentValue::customCSSText() const { if (isKnownPropertyID()) return getPropertyNameAtomicString(m_propertyId); StringBuilder builder; serializeIdentifier(m_string, builder); return builder.toString(); }
String CSSNamespaceRule::cssText() const { StringBuilder result; result.append("@namespace "); serializeIdentifier(prefix(), result); if (!prefix().isEmpty()) result.append(" "); result.append("url("); result.append(serializeString(namespaceURI())); result.append(");"); return result.toString(); }
void CSSParserToken::serialize(StringBuilder& builder) const { // This is currently only used for @supports CSSOM. To keep our implementation // simple we handle some of the edge cases incorrectly (see comments below). switch (type()) { case IdentToken: serializeIdentifier(value(), builder); break; case FunctionToken: serializeIdentifier(value(), builder); return builder.append('('); case AtKeywordToken: builder.append('@'); serializeIdentifier(value(), builder); break; case HashToken: // This will always serialize as a hash-token with 'id' type instead of // preserving the type of the input. builder.append('#'); serializeIdentifier(value(), builder); break; case UrlToken: builder.append("url("); serializeIdentifier(value(), builder); return builder.append(")"); case DelimiterToken: if (delimiter() == '\\') return builder.append("\\\n"); return builder.append(delimiter()); case NumberToken: // These won't properly preserve the NumericValueType flag return builder.appendNumber(numericValue()); case PercentageToken: builder.appendNumber(numericValue()); return builder.append('%'); case DimensionToken: // This will incorrectly serialize e.g. 4e3e2 as 4000e2 builder.appendNumber(numericValue()); serializeIdentifier(value(), builder); break; case UnicodeRangeToken: return builder.append(String::format("U+%X-%X", unicodeRangeStart(), unicodeRangeEnd())); case StringToken: return serializeString(value(), builder); case IncludeMatchToken: return builder.append("~="); case DashMatchToken: return builder.append("|="); case PrefixMatchToken: return builder.append("^="); case SuffixMatchToken: return builder.append("$="); case SubstringMatchToken: return builder.append("*="); case ColumnToken: return builder.append("||"); case CDOToken: return builder.append("<!--"); case CDCToken: return builder.append("-->"); case BadStringToken: return builder.append("'\n"); case BadUrlToken: return builder.append("url(()"); case WhitespaceToken: return builder.append(' '); case ColonToken: return builder.append(':'); case SemicolonToken: return builder.append(';'); case CommaToken: return builder.append(','); case LeftParenthesisToken: return builder.append('('); case RightParenthesisToken: return builder.append(')'); case LeftBracketToken: return builder.append('['); case RightBracketToken: return builder.append(']'); case LeftBraceToken: return builder.append('{'); case RightBraceToken: return builder.append('}'); case EOFToken: case CommentToken: ASSERT_NOT_REACHED(); return; } }
String CSSSelector::selectorText(const String& rightSide) const { StringBuilder str; if (m_match == CSSSelector::Tag && !m_tagIsForNamespaceRule) { str.append(tagQName().localName()); } const CSSSelector* cs = this; while (true) { if (cs->m_match == CSSSelector::Id) { str.append('#'); serializeIdentifier(cs->value(), str); } else if (cs->m_match == CSSSelector::Class) { str.append('.'); serializeIdentifier(cs->value(), str); } else if (cs->m_match == CSSSelector::PseudoClass) { str.append(':'); str.append(cs->value()); switch (cs->pseudoType()) { case PseudoLang: str.append(cs->argument()); str.append(')'); break; case PseudoHost: { if (cs->selectorList()) { const CSSSelector* firstSubSelector = cs->selectorList()->first(); for (const CSSSelector* subSelector = firstSubSelector; subSelector; subSelector = CSSSelectorList::next(*subSelector)) { if (subSelector != firstSubSelector) str.append(','); str.append(subSelector->selectorText()); } str.append(')'); } break; } default: break; } } else if (cs->m_match == CSSSelector::PseudoElement) { str.appendLiteral("::"); str.append(cs->value()); } else if (cs->isAttributeSelector()) { str.append('['); str.append(cs->attribute().localName()); if (cs->m_match == CSSSelector::Exact) str.append('='); if (cs->m_match != CSSSelector::Set) { serializeString(cs->value(), str); if (cs->attributeMatchType() == CaseInsensitive) str.appendLiteral(" i"); } str.append(']'); } if (!cs->tagHistory()) break; cs = cs->tagHistory(); } return str.toString() + rightSide; }
String DOMCSSNamespace::escape(const String& ident) { StringBuilder builder; serializeIdentifier(ident, builder); return builder.toString(); }