Index: Source/core/css/CSSMarkup.cpp |
diff --git a/Source/core/css/CSSMarkup.cpp b/Source/core/css/CSSMarkup.cpp |
index 182a6049aaf829ce01f2d2acd621722cfd9c6600..c5326afa96418b42b3f9dff642fbb05c7018365b 100644 |
--- a/Source/core/css/CSSMarkup.cpp |
+++ b/Source/core/css/CSSMarkup.cpp |
@@ -29,6 +29,7 @@ |
#include "wtf/HexNumber.h" |
#include "wtf/text/StringBuffer.h" |
+#include "wtf/text/StringBuilder.h" |
namespace blink { |
@@ -186,4 +187,65 @@ String quoteCSSURLIfNeeded(const String& string) |
return isCSSTokenizerURL(string) ? string : quoteCSSString(string); |
} |
+static void serializeCharacter(UChar32 c, StringBuilder& appendTo) |
+{ |
+ appendTo.append('\\'); |
+ appendTo.append(c); |
+} |
+ |
+static void serializeCharacterAsCodePoint(UChar32 c, StringBuilder& appendTo) |
+{ |
+ appendTo.append('\\'); |
+ appendUnsignedAsHex(c, appendTo, Lowercase); |
+ appendTo.append(' '); |
+} |
+ |
+void serializeIdentifier(const String& identifier, StringBuilder& appendTo) |
+{ |
+ bool isFirst = true; |
+ bool isSecond = false; |
+ bool isFirstCharHyphen = false; |
+ unsigned index = 0; |
+ while (index < identifier.length()) { |
+ UChar32 c = identifier.characterStartingAt(index); |
+ index += U16_LENGTH(c); |
+ |
+ if (c <= 0x1f || (0x30 <= c && c <= 0x39 && (isFirst || (isSecond && isFirstCharHyphen)))) |
+ serializeCharacterAsCodePoint(c, appendTo); |
+ else if (c == 0x2d && isSecond && isFirstCharHyphen) |
+ serializeCharacter(c, appendTo); |
+ else if (0x80 <= c || c == 0x2d || c == 0x5f || (0x30 <= c && c <= 0x39) || (0x41 <= c && c <= 0x5a) || (0x61 <= c && c <= 0x7a)) |
+ appendTo.append(c); |
+ else |
+ serializeCharacter(c, appendTo); |
+ |
+ if (isFirst) { |
+ isFirst = false; |
+ isSecond = true; |
+ isFirstCharHyphen = (c == 0x2d); |
+ } else if (isSecond) { |
+ isSecond = false; |
+ } |
+ } |
+} |
+ |
+void serializeString(const String& string, StringBuilder& appendTo) |
+{ |
+ appendTo.append('\"'); |
+ |
+ unsigned index = 0; |
+ while (index < string.length()) { |
+ UChar32 c = string.characterStartingAt(index); |
+ index += U16_LENGTH(c); |
+ if (c <= 0x1f) |
+ serializeCharacterAsCodePoint(c, appendTo); |
+ else if (c == 0x22 || c == 0x5c) |
+ serializeCharacter(c, appendTo); |
+ else |
+ appendTo.append(c); |
+ } |
+ |
+ appendTo.append('\"'); |
+} |
+ |
} // namespace blink |