mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 05:27:46 +00:00
LibWeb: Add stop-color as a CSS property
(This is to set the color of a stop for an SVG gradient)
This commit is contained in:
parent
f099ee3d47
commit
297d8eebcd
7 changed files with 86 additions and 2 deletions
|
@ -66,6 +66,30 @@ Optional<float> AttributeParser::parse_length(StringView input)
|
|||
return {};
|
||||
}
|
||||
|
||||
float NumberPercentage::resolve_relative_to(float length)
|
||||
{
|
||||
if (!m_is_percentage)
|
||||
return m_value;
|
||||
return m_value * length;
|
||||
}
|
||||
|
||||
Optional<NumberPercentage> AttributeParser::parse_number_percentage(StringView input)
|
||||
{
|
||||
AttributeParser parser { input };
|
||||
parser.parse_whitespace();
|
||||
if (parser.match_number()) {
|
||||
float number = parser.parse_number();
|
||||
bool is_percentage = parser.match('%');
|
||||
if (is_percentage)
|
||||
parser.consume();
|
||||
parser.parse_whitespace();
|
||||
if (parser.done())
|
||||
return NumberPercentage(number, is_percentage);
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Optional<float> AttributeParser::parse_positive_length(StringView input)
|
||||
{
|
||||
// FIXME: Where this is used, the spec usually (always?) says "A negative value is an error (see Error processing)."
|
||||
|
@ -482,11 +506,10 @@ Optional<Vector<Transform>> AttributeParser::parse_transform()
|
|||
m_lexer.consume_specific(',');
|
||||
consume_whitespace();
|
||||
};
|
||||
|
||||
// FIXME: AttributeParser currently does not handle invalid parses in most cases (e.g. parse_number()) and just crashes.
|
||||
auto parse_optional_number = [&](float default_value = 0.0f) {
|
||||
consume_comma_whitespace();
|
||||
if (m_lexer.next_is(isdigit))
|
||||
if (match_number())
|
||||
return parse_number();
|
||||
return default_value;
|
||||
};
|
||||
|
@ -586,6 +609,11 @@ bool AttributeParser::match_coordinate() const
|
|||
return match_length();
|
||||
}
|
||||
|
||||
bool AttributeParser::match_number() const
|
||||
{
|
||||
return match_length();
|
||||
}
|
||||
|
||||
bool AttributeParser::match_length() const
|
||||
{
|
||||
return !done() && (isdigit(ch()) || ch() == '-' || ch() == '+' || ch() == '.');
|
||||
|
|
|
@ -88,12 +88,40 @@ struct PreserveAspectRatio {
|
|||
MeetOrSlice meet_or_slice { MeetOrSlice::Meet };
|
||||
};
|
||||
|
||||
class NumberPercentage {
|
||||
public:
|
||||
NumberPercentage(float value, bool is_percentage)
|
||||
: m_value(is_percentage ? value / 100 : value)
|
||||
, m_is_percentage(is_percentage)
|
||||
{
|
||||
}
|
||||
|
||||
static NumberPercentage create_percentage(float value)
|
||||
{
|
||||
return NumberPercentage(value, true);
|
||||
}
|
||||
|
||||
static NumberPercentage create_number(float value)
|
||||
{
|
||||
return NumberPercentage(value, false);
|
||||
}
|
||||
|
||||
float resolve_relative_to(float length);
|
||||
|
||||
float value() { return m_value; }
|
||||
|
||||
private:
|
||||
float m_value;
|
||||
bool m_is_percentage { false };
|
||||
};
|
||||
|
||||
class AttributeParser final {
|
||||
public:
|
||||
~AttributeParser() = default;
|
||||
|
||||
static Optional<float> parse_coordinate(StringView input);
|
||||
static Optional<float> parse_length(StringView input);
|
||||
static Optional<NumberPercentage> parse_number_percentage(StringView input);
|
||||
static Optional<float> parse_positive_length(StringView input);
|
||||
static Vector<Gfx::FloatPoint> parse_points(StringView input);
|
||||
static Vector<PathInstruction> parse_path_data(StringView input);
|
||||
|
@ -137,6 +165,7 @@ private:
|
|||
bool match_comma_whitespace() const;
|
||||
bool match_coordinate() const;
|
||||
bool match_length() const;
|
||||
bool match_number() const;
|
||||
bool match(char c) const { return !done() && ch() == c; }
|
||||
|
||||
bool done() const { return m_lexer.is_eof(); }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue