2007-12-29 Nikolas Zimmermann <zimmermann@kde.org>
+ Reviewed by Oliver.
+
+ Refactor SVGAnimationElement::parseValues into a generic function parseDelimitedString.
+ SVGAnimationElement needs to parse semicolon-seperated strings, SVGGlyphElement comma-seperated.
+
+ * svg/SVGAnimationElement.cpp:
+ (WebCore::SVGAnimationElement::parseMappedAttribute):
+ * svg/SVGParserUtilities.cpp:
+ (WebCore::parseDelimitedString):
+ * svg/SVGParserUtilities.h:
+
+2007-12-29 Nikolas Zimmermann <zimmermann@kde.org>
+
Reviewed by Maciej.
Add new helper structure SVGFontData - FontData holds this object as OwnPtr.
}
}
-static void parseValues(Vector<String>& values, const String& value)
-{
- const UChar* ptr = value.characters();
- const UChar* end = ptr + value.length();
- skipOptionalSpaces(ptr, end);
- while (ptr < end) {
- // SMIL 3.2.2 : Leading and trailing white space, and white space before and after semicolon separators, will be ignored.
- const UChar* valueStart = ptr;
- while (ptr < end && *ptr != ';') // careful not to ignore whitespace inside values
- ptr++;
- if (ptr == valueStart)
- break;
-
- // walk backwards from the ; to ignore any whitespace
- const UChar* valueEnd = ptr - 1;
- while (valueStart < valueEnd && isWhitespace(*valueEnd))
- valueEnd--;
-
- values.append(String(valueStart, valueEnd - valueStart + 1));
-
- skipOptionalSpacesOrDelimiter(ptr, end, ';');
- }
-}
-
static void parseKeySplines(Vector<SVGAnimationElement::KeySpline>& keySplines, const String& value)
{
float number = 0.0f;
m_calcMode = CALCMODE_PACED;
} else if (attr->name() == SVGNames::valuesAttr) {
m_values.clear();
- parseValues(m_values, attr->value());
+ m_values = parseDelimitedString(attr->value(), ';');
} else if (attr->name() == SVGNames::keyTimesAttr) {
m_keyTimes.clear();
parseKeyNumbers(m_keyTimes, attr->value());
return builder.build(path, d, process);
}
+Vector<String> parseDelimitedString(const String& input, const char seperator)
+{
+ Vector<String> values;
+
+ const UChar* ptr = input.characters();
+ const UChar* end = ptr + input.length();
+ skipOptionalSpaces(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 && isWhitespace(*inputEnd))
+ inputEnd--;
+
+ values.append(String(inputStart, inputEnd - inputStart + 1));
+ skipOptionalSpacesOrDelimiter(ptr, end, seperator);
+ }
+
+ return values;
+}
+
}
-// vim:ts=4:noet
#endif // ENABLE(SVG)
bool pointsListFromSVGData(SVGPointList* pointsList, const String& points);
bool pathFromSVGData(Path& path, const String& d);
bool pathSegListFromSVGData(SVGPathSegList* pathSegList, const String& d, bool process = false);
+ Vector<String> parseDelimitedString(const String& input, const char seperator);
} // namespace WebCore
#endif // ENABLE(SVG)
#endif
-
-// vim:ts=4:noet