HTMLParserIdioms.h [plain text]
#pragma once
#include <unicode/uchar.h>
#include <wtf/Expected.h>
#include <wtf/text/StringView.h>
namespace WebCore {
class Decimal;
class QualifiedName;
template<typename CharacterType> bool isHTMLSpace(CharacterType);
template<typename CharacterType> bool isNotHTMLSpace(CharacterType);
template<typename CharacterType> bool isComma(CharacterType);
template<typename CharacterType> bool isHTMLSpaceOrComma(CharacterType);
bool isHTMLLineBreak(UChar);
bool isHTMLSpaceButNotLineBreak(UChar);
static const unsigned maxHTMLNonNegativeInteger = 2147483647;
WEBCORE_EXPORT String stripLeadingAndTrailingHTMLSpaces(const String&);
String serializeForNumberType(const Decimal&);
String serializeForNumberType(double);
Decimal parseToDecimalForNumberType(const String&);
Decimal parseToDecimalForNumberType(const String&, const Decimal& fallbackValue);
double parseToDoubleForNumberType(const String&);
double parseToDoubleForNumberType(const String&, double fallbackValue);
enum class HTMLIntegerParsingError { NegativeOverflow, PositiveOverflow, Other };
WEBCORE_EXPORT Expected<int, HTMLIntegerParsingError> parseHTMLInteger(StringView);
WEBCORE_EXPORT Expected<unsigned, HTMLIntegerParsingError> parseHTMLNonNegativeInteger(StringView);
Optional<int> parseValidHTMLNonNegativeInteger(StringView);
Optional<double> parseValidHTMLFloatingPointNumber(StringView);
Vector<double> parseHTMLListOfOfFloatingPointNumberValues(StringView);
bool parseMetaHTTPEquivRefresh(const StringView&, double& delay, String& url);
String parseCORSSettingsAttribute(const AtomString&);
bool threadSafeMatch(const QualifiedName&, const QualifiedName&);
AtomString parseHTMLHashNameReference(StringView);
template<typename CharacterType> inline bool isHTMLSpace(CharacterType character)
{
return character <= ' ' && (character == ' ' || character == '\n' || character == '\t' || character == '\r' || character == '\f');
}
template<typename CharacterType> inline bool isNotHTMLSpace(CharacterType character)
{
return !isHTMLSpace(character);
}
inline bool isHTMLLineBreak(UChar character)
{
return character <= '\r' && (character == '\n' || character == '\r');
}
template<typename CharacterType> inline bool isComma(CharacterType character)
{
return character == ',';
}
template<typename CharacterType> inline bool isHTMLSpaceOrComma(CharacterType character)
{
return isComma(character) || isHTMLSpace(character);
}
inline bool isHTMLSpaceButNotLineBreak(UChar character)
{
return isHTMLSpace(character) && !isHTMLLineBreak(character);
}
inline unsigned limitToOnlyHTMLNonNegativeNumbersGreaterThanZero(unsigned value, unsigned defaultValue = 1)
{
return (value > 0 && value <= maxHTMLNonNegativeInteger) ? value : defaultValue;
}
inline unsigned limitToOnlyHTMLNonNegativeNumbersGreaterThanZero(StringView stringValue, unsigned defaultValue = 1)
{
ASSERT(defaultValue > 0);
ASSERT(defaultValue <= maxHTMLNonNegativeInteger);
auto optionalValue = parseHTMLNonNegativeInteger(stringValue);
unsigned value = optionalValue && optionalValue.value() ? optionalValue.value() : defaultValue;
ASSERT(value > 0);
ASSERT(value <= maxHTMLNonNegativeInteger);
return value;
}
inline unsigned limitToOnlyHTMLNonNegative(unsigned value, unsigned defaultValue = 0)
{
ASSERT(defaultValue <= maxHTMLNonNegativeInteger);
return value <= maxHTMLNonNegativeInteger ? value : defaultValue;
}
inline unsigned limitToOnlyHTMLNonNegative(StringView stringValue, unsigned defaultValue = 0)
{
ASSERT(defaultValue <= maxHTMLNonNegativeInteger);
unsigned value = parseHTMLNonNegativeInteger(stringValue).value_or(defaultValue);
ASSERT(value <= maxHTMLNonNegativeInteger);
return value;
}
inline unsigned clampHTMLNonNegativeIntegerToRange(StringView stringValue, unsigned min, unsigned max, unsigned defaultValue = 0)
{
ASSERT(defaultValue >= min);
ASSERT(defaultValue <= max);
auto optionalValue = parseHTMLNonNegativeInteger(stringValue);
if (optionalValue)
return std::min(std::max(optionalValue.value(), min), max);
return optionalValue.error() == HTMLIntegerParsingError::PositiveOverflow ? max : defaultValue;
}
}