void SVGLengthList::parse(const String& value, SVGLengthMode mode) { clear(); ExceptionCode ec = 0; const UChar* ptr = value.deprecatedCharacters(); const UChar* end = ptr + value.length(); while (ptr < end) { const UChar* start = ptr; while (ptr < end && *ptr != ',' && !isSVGSpace(*ptr)) ptr++; if (ptr == start) break; SVGLength length(mode); String valueString(start, ptr - start); if (valueString.isEmpty()) return; length.setValueAsString(valueString, ec); if (ec) return; append(length); skipOptionalSVGSpacesOrDelimiter(ptr, end); } }
static Vector<String> genericParseDelimitedString(const CharType*& ptr, const CharType* end, const char seperator) { Vector<String> values; skipOptionalSVGSpaces(ptr, end); while (ptr < end) { // Leading and trailing white space, and white space before and after semicolon separators, will be ignored. const CharType* inputStart = ptr; while (ptr < end && *ptr != seperator) // careful not to ignore whitespace inside inputs ptr++; if (ptr == inputStart) break; // walk backwards from the ; to ignore any whitespace const CharType* inputEnd = ptr - 1; while (inputStart < inputEnd && isSVGSpace(*inputEnd)) inputEnd--; values.append(String(inputStart, inputEnd - inputStart + 1)); skipOptionalSVGSpacesOrDelimiter(ptr, end, seperator); } return values; }
bool parseGlyphName(const String& input, HashSet<String>& values) { // FIXME: Parsing error detection is missing. values.clear(); const UChar* ptr = input.characters(); const UChar* end = ptr + input.length(); skipOptionalSVGSpaces(ptr, end); while (ptr < end) { // Leading and trailing white space, and white space before and after separators, will be ignored. const UChar* inputStart = ptr; while (ptr < end && *ptr != ',') ++ptr; if (ptr == inputStart) break; // walk backwards from the ; to ignore any whitespace const UChar* inputEnd = ptr - 1; while (inputStart < inputEnd && isSVGSpace(*inputEnd)) --inputEnd; values.add(String(inputStart, inputEnd - inputStart + 1)); skipOptionalSVGSpacesOrDelimiter(ptr, end, ','); } return true; }
Vector<String> parseDelimitedString(const String& input, const char seperator) { Vector<String> values; auto upconvertedCharacters = StringView(input).upconvertedCharacters(); const UChar* ptr = upconvertedCharacters; const UChar* end = ptr + input.length(); skipOptionalSVGSpaces(ptr, end); while (ptr < end) { // Leading and trailing white space, and white space before and after semicolon separators, will be ignored. const UChar* inputStart = ptr; while (ptr < end && *ptr != seperator) // careful not to ignore whitespace inside inputs ptr++; if (ptr == inputStart) break; // walk backwards from the ; to ignore any whitespace const UChar* inputEnd = ptr - 1; while (inputStart < inputEnd && isSVGSpace(*inputEnd)) inputEnd--; values.append(String(inputStart, inputEnd - inputStart + 1)); skipOptionalSVGSpacesOrDelimiter(ptr, end, seperator); } return values; }
void SVGStringList::parse(const String& data, UChar delimiter) { // TODO : more error checking/reporting clear(); const UChar* ptr = data.deprecatedCharacters(); const UChar* end = ptr + data.length(); while (ptr < end) { const UChar* start = ptr; while (ptr < end && *ptr != delimiter && !isSVGSpace(*ptr)) ptr++; if (ptr == start) break; append(String(start, ptr - start)); skipOptionalSVGSpacesOrDelimiter(ptr, end, delimiter); } }
static bool parseGlyphName(const CharType*& ptr, const CharType* end, HashSet<String>& values) { skipOptionalSVGSpaces(ptr, end); while (ptr < end) { // Leading and trailing white space, and white space before and after separators, will be ignored. const CharType* inputStart = ptr; while (ptr < end && *ptr != ',') ++ptr; if (ptr == inputStart) break; // walk backwards from the ; to ignore any whitespace const CharType* inputEnd = ptr - 1; while (inputStart < inputEnd && isSVGSpace(*inputEnd)) --inputEnd; values.add(String(inputStart, inputEnd - inputStart + 1)); skipOptionalSVGSpacesOrDelimiter(ptr, end, ','); } return true; }
void SVGLengthListValues::parse(const String& value, SVGLengthMode mode) { clear(); auto upconvertedCharacters = StringView(value).upconvertedCharacters(); const UChar* ptr = upconvertedCharacters; const UChar* end = ptr + value.length(); while (ptr < end) { const UChar* start = ptr; while (ptr < end && *ptr != ',' && !isSVGSpace(*ptr)) ptr++; if (ptr == start) break; SVGLengthValue length(mode); String valueString(start, ptr - start); if (valueString.isEmpty()) return; if (length.setValueAsString(valueString).hasException()) return; append(length); skipOptionalSVGSpacesOrDelimiter(ptr, end); } }