This source file includes following definitions.
- parseDimension
- parseDimension
- parseListOfDimensions
#include "config.h"
#include "core/html/HTMLDimension.h"
#include "wtf/MathExtras.h"
#include "wtf/text/WTFString.h"
namespace WebCore {
template <typename CharacterType>
static HTMLDimension parseDimension(const CharacterType* characters, size_t lastParsedIndex, size_t endOfCurrentToken)
{
HTMLDimension::HTMLDimensionType type = HTMLDimension::Absolute;
double value = 0.;
while (lastParsedIndex < endOfCurrentToken && isASCIISpace((characters[lastParsedIndex])))
++lastParsedIndex;
if (lastParsedIndex >= endOfCurrentToken)
return HTMLDimension(value, HTMLDimension::Relative);
size_t position = lastParsedIndex;
while (position < endOfCurrentToken && isASCIIDigit(characters[position]))
++position;
if (position > lastParsedIndex) {
bool ok = false;
unsigned integerValue = charactersToUIntStrict(characters + lastParsedIndex, position - lastParsedIndex, &ok);
ASSERT(ok);
value += integerValue;
if (position < endOfCurrentToken && characters[position] == '.') {
++position;
Vector<CharacterType> fractionNumbers;
while (position < endOfCurrentToken && (isASCIIDigit(characters[position]) || isASCIISpace(characters[position]))) {
if (isASCIIDigit(characters[position]))
fractionNumbers.append(characters[position]);
++position;
}
if (fractionNumbers.size()) {
double fractionValue = charactersToUIntStrict(fractionNumbers.data(), fractionNumbers.size(), &ok);
ASSERT(ok);
value += fractionValue / pow(10., static_cast<double>(fractionNumbers.size()));
}
}
}
while (position < endOfCurrentToken && isASCIISpace(characters[position]))
++position;
if (position < endOfCurrentToken) {
if (characters[position] == '*')
type = HTMLDimension::Relative;
else if (characters[position] == '%')
type = HTMLDimension::Percentage;
}
return HTMLDimension(value, type);
}
static HTMLDimension parseDimension(const String& rawToken, size_t lastParsedIndex, size_t endOfCurrentToken)
{
if (rawToken.is8Bit())
return parseDimension<LChar>(rawToken.characters8(), lastParsedIndex, endOfCurrentToken);
return parseDimension<UChar>(rawToken.characters16(), lastParsedIndex, endOfCurrentToken);
}
Vector<HTMLDimension> parseListOfDimensions(const String& input)
{
static const char comma = ',';
String trimmedString = input;
if (trimmedString.endsWith(comma))
trimmedString.truncate(trimmedString.length() - 1);
if (trimmedString.isEmpty())
return Vector<HTMLDimension>();
Vector<HTMLDimension> parsedDimensions;
size_t lastParsedIndex = 0;
while (true) {
size_t nextComma = trimmedString.find(comma, lastParsedIndex);
if (nextComma == kNotFound)
break;
parsedDimensions.append(parseDimension(trimmedString, lastParsedIndex, nextComma));
lastParsedIndex = nextComma + 1;
}
parsedDimensions.append(parseDimension(trimmedString, lastParsedIndex, trimmedString.length()));
return parsedDimensions;
}
}