bool SkSVGAttributeParser::parseColor(SkSVGColorType* color) {
SkColor c;
+ // consume preceding whitespace
+ this->parseWSToken();
+
// TODO: rgb(...)
+ bool parsedValue = false;
if (this->parseHexColorToken(&c) || this->parseNamedColorToken(&c)) {
*color = SkSVGColorType(c);
- return true;
+ parsedValue = true;
+
+ // consume trailing whitespace
+ this->parseWSToken();
}
- return false;
+ return parsedValue && this->parseEOSToken();
}
// https://www.w3.org/TR/SVG/types.html#DataTypeNumber
return true;
}
+SkString TrimmedString(const char* first, const char* last) {
+ SkASSERT(first);
+ SkASSERT(last);
+ SkASSERT(first <= last);
+
+ while (first <= last && *first <= ' ') { first++; }
+ while (first <= last && *last <= ' ') { last--; }
+
+ SkASSERT(last - first + 1 >= 0);
+ return SkString(first, SkTo<size_t>(last - first + 1));
+}
+
// Breaks a "foo: bar; baz: ..." string into key:value pairs.
class StyleIterator {
public:
const char* valueSep = strchr(fPos, ':');
if (valueSep && valueSep < sep) {
- name.set(fPos, valueSep - fPos);
- value.set(valueSep + 1, sep - valueSep - 1);
+ name = TrimmedString(fPos, valueSep - 1);
+ value = TrimmedString(valueSep + 1, sep - 1);
}
fPos = *sep ? sep + 1 : nullptr;