1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 12:38:12 +00:00

LibWeb: Generate the CSS::ValueID enum and its helper functions

This commit is contained in:
Andreas Kling 2020-12-15 20:39:09 +01:00
parent 92d8e559ba
commit 17c529e6c5
11 changed files with 421 additions and 550 deletions

View file

@ -30,6 +30,8 @@ set(SOURCES
CSS/StyleSheet.cpp CSS/StyleSheet.cpp
CSS/StyleSheetList.cpp CSS/StyleSheetList.cpp
CSS/StyleValue.cpp CSS/StyleValue.cpp
CSS/ValueID.cpp
CSS/ValueID.h
DOM/CharacterData.cpp DOM/CharacterData.cpp
DOM/CharacterData.idl DOM/CharacterData.idl
DOM/Comment.cpp DOM/Comment.cpp
@ -356,6 +358,24 @@ add_custom_command(
MAIN_DEPENDENCY CSS/Properties.json MAIN_DEPENDENCY CSS/Properties.json
) )
add_custom_command(
OUTPUT CSS/ValueID.h
COMMAND ${write_if_different} CSS/ValueID.h CodeGenerators/Generate_CSS_ValueID_h ${CMAKE_CURRENT_SOURCE_DIR}/CSS/Identifiers.json
VERBATIM
DEPENDS Generate_CSS_ValueID_h
MAIN_DEPENDENCY CSS/Identifiers.json
)
add_custom_target(generate_ValueID.h DEPENDS CSS/ValueID.h)
add_custom_command(
OUTPUT CSS/ValueID.cpp
COMMAND /bin/mkdir -p CSS
COMMAND ${write_if_different} CSS/ValueID.cpp CodeGenerators/Generate_CSS_ValueID_cpp ${CMAKE_CURRENT_SOURCE_DIR}/CSS/Identifiers.json
VERBATIM
DEPENDS Generate_CSS_ValueID_cpp
MAIN_DEPENDENCY CSS/Identifiers.json
)
add_custom_command( add_custom_command(
OUTPUT CSS/DefaultStyleSheetSource.cpp OUTPUT CSS/DefaultStyleSheetSource.cpp
COMMAND ${write_if_different} CSS/DefaultStyleSheetSource.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Scripts/GenerateStyleSheetSource.sh default_stylesheet_source ${CMAKE_CURRENT_SOURCE_DIR}/CSS/Default.css COMMAND ${write_if_different} CSS/DefaultStyleSheetSource.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Scripts/GenerateStyleSheetSource.sh default_stylesheet_source ${CMAKE_CURRENT_SOURCE_DIR}/CSS/Default.css

View file

@ -0,0 +1,119 @@
[
"-libweb-center",
"-libweb-link",
"-libweb-palette-active-link",
"-libweb-palette-active-window-border1",
"-libweb-palette-active-window-border2",
"-libweb-palette-active-window-title",
"-libweb-palette-base",
"-libweb-palette-base-text",
"-libweb-palette-button",
"-libweb-palette-button-text",
"-libweb-palette-desktop-background",
"-libweb-palette-focus-outline",
"-libweb-palette-highlight-window-border1",
"-libweb-palette-highlight-window-border2",
"-libweb-palette-highlight-window-title",
"-libweb-palette-hover-highlight",
"-libweb-palette-inactive-selection",
"-libweb-palette-inactive-selection-text",
"-libweb-palette-inactive-window-border1",
"-libweb-palette-inactive-window-border2",
"-libweb-palette-inactive-window-title",
"-libweb-palette-link",
"-libweb-palette-menu-base",
"-libweb-palette-menu-base-text",
"-libweb-palette-menu-selection",
"-libweb-palette-menu-selection-text",
"-libweb-palette-menu-stripe",
"-libweb-palette-moving-window-border1",
"-libweb-palette-moving-window-border2",
"-libweb-palette-moving-window-title",
"-libweb-palette-rubber-band-border",
"-libweb-palette-rubber-band-fill",
"-libweb-palette-ruler",
"-libweb-palette-ruler-active-text",
"-libweb-palette-ruler-border",
"-libweb-palette-ruler-inactive-text",
"-libweb-palette-selection",
"-libweb-palette-selection-text",
"-libweb-palette-syntax-comment",
"-libweb-palette-syntax-control-keyword",
"-libweb-palette-syntax-identifier",
"-libweb-palette-syntax-keyword",
"-libweb-palette-syntax-number",
"-libweb-palette-syntax-operator",
"-libweb-palette-syntax-preprocessor-statement",
"-libweb-palette-syntax-preprocessor-value",
"-libweb-palette-syntax-punctuation",
"-libweb-palette-syntax-string",
"-libweb-palette-syntax-type",
"-libweb-palette-text-cursor",
"-libweb-palette-threed-highlight",
"-libweb-palette-threed-shadow1",
"-libweb-palette-threed-shadow2",
"-libweb-palette-visited-link",
"-libweb-palette-window",
"-libweb-palette-window-text",
"absolute",
"blink",
"block",
"bold",
"bolder",
"both",
"capitalize",
"center",
"circle",
"dashed",
"decimal",
"disc",
"dotted",
"double",
"fixed",
"full-size-kana",
"full-width",
"groove",
"hidden",
"inline",
"inline-block",
"inset",
"justify",
"large",
"larger",
"left",
"lighter",
"line-through",
"list-item",
"lowercase",
"medium",
"none",
"normal",
"nowrap",
"outset",
"overline",
"pre",
"pre-line",
"pre-wrap",
"relative",
"ridge",
"right",
"small",
"smaller",
"solid",
"square",
"static",
"sticky",
"table",
"table-cell",
"table-footer-group",
"table-header-group",
"table-row",
"table-row-group",
"underline",
"uppercase",
"x-large",
"x-small",
"xx-large",
"xx-small",
"xxx-large"
]

View file

@ -71,119 +71,6 @@ bool ParsingContext::in_quirks_mode() const
} }
static Optional<CSS::ValueID> value_id_for_palette_string(const StringView& string)
{
if (string.equals_ignoring_case("desktop-background"))
return CSS::ValueID::VendorSpecificPaletteDesktopBackground;
if (string.equals_ignoring_case("active-window-border1"))
return CSS::ValueID::VendorSpecificPaletteActiveWindowBorder1;
if (string.equals_ignoring_case("active-window-border2"))
return CSS::ValueID::VendorSpecificPaletteActiveWindowBorder2;
if (string.equals_ignoring_case("active-window-title"))
return CSS::ValueID::VendorSpecificPaletteActiveWindowTitle;
if (string.equals_ignoring_case("inactive-window-border1"))
return CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder1;
if (string.equals_ignoring_case("inactive-window-border2"))
return CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder2;
if (string.equals_ignoring_case("inactive-window-title"))
return CSS::ValueID::VendorSpecificPaletteInactiveWindowTitle;
if (string.equals_ignoring_case("moving-window-border1"))
return CSS::ValueID::VendorSpecificPaletteMovingWindowBorder1;
if (string.equals_ignoring_case("moving-window-border2"))
return CSS::ValueID::VendorSpecificPaletteMovingWindowBorder2;
if (string.equals_ignoring_case("moving-window-title"))
return CSS::ValueID::VendorSpecificPaletteMovingWindowTitle;
if (string.equals_ignoring_case("highlight-window-border1"))
return CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder1;
if (string.equals_ignoring_case("highlight-window-border2"))
return CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder2;
if (string.equals_ignoring_case("highlight-window-title"))
return CSS::ValueID::VendorSpecificPaletteHighlightWindowTitle;
if (string.equals_ignoring_case("menu-stripe"))
return CSS::ValueID::VendorSpecificPaletteMenuStripe;
if (string.equals_ignoring_case("menu-base"))
return CSS::ValueID::VendorSpecificPaletteMenuBase;
if (string.equals_ignoring_case("menu-base-text"))
return CSS::ValueID::VendorSpecificPaletteMenuBaseText;
if (string.equals_ignoring_case("menu-selection"))
return CSS::ValueID::VendorSpecificPaletteMenuSelection;
if (string.equals_ignoring_case("menu-selection-text"))
return CSS::ValueID::VendorSpecificPaletteMenuSelectionText;
if (string.equals_ignoring_case("window"))
return CSS::ValueID::VendorSpecificPaletteWindow;
if (string.equals_ignoring_case("window-text"))
return CSS::ValueID::VendorSpecificPaletteWindowText;
if (string.equals_ignoring_case("button"))
return CSS::ValueID::VendorSpecificPaletteButton;
if (string.equals_ignoring_case("button-text"))
return CSS::ValueID::VendorSpecificPaletteButtonText;
if (string.equals_ignoring_case("base"))
return CSS::ValueID::VendorSpecificPaletteBase;
if (string.equals_ignoring_case("base-text"))
return CSS::ValueID::VendorSpecificPaletteBaseText;
if (string.equals_ignoring_case("threed-highlight"))
return CSS::ValueID::VendorSpecificPaletteThreedHighlight;
if (string.equals_ignoring_case("threed-shadow1"))
return CSS::ValueID::VendorSpecificPaletteThreedShadow1;
if (string.equals_ignoring_case("threed-shadow2"))
return CSS::ValueID::VendorSpecificPaletteThreedShadow2;
if (string.equals_ignoring_case("hover-highlight"))
return CSS::ValueID::VendorSpecificPaletteHoverHighlight;
if (string.equals_ignoring_case("selection"))
return CSS::ValueID::VendorSpecificPaletteSelection;
if (string.equals_ignoring_case("selection-text"))
return CSS::ValueID::VendorSpecificPaletteSelectionText;
if (string.equals_ignoring_case("inactive-selection"))
return CSS::ValueID::VendorSpecificPaletteInactiveSelection;
if (string.equals_ignoring_case("inactive-selection-text"))
return CSS::ValueID::VendorSpecificPaletteInactiveSelectionText;
if (string.equals_ignoring_case("rubber-band-fill"))
return CSS::ValueID::VendorSpecificPaletteRubberBandFill;
if (string.equals_ignoring_case("rubber-band-border"))
return CSS::ValueID::VendorSpecificPaletteRubberBandBorder;
if (string.equals_ignoring_case("link"))
return CSS::ValueID::VendorSpecificPaletteLink;
if (string.equals_ignoring_case("active-link"))
return CSS::ValueID::VendorSpecificPaletteActiveLink;
if (string.equals_ignoring_case("visited-link"))
return CSS::ValueID::VendorSpecificPaletteVisitedLink;
if (string.equals_ignoring_case("ruler"))
return CSS::ValueID::VendorSpecificPaletteRuler;
if (string.equals_ignoring_case("ruler-border"))
return CSS::ValueID::VendorSpecificPaletteRulerBorder;
if (string.equals_ignoring_case("ruler-active-text"))
return CSS::ValueID::VendorSpecificPaletteRulerActiveText;
if (string.equals_ignoring_case("ruler-inactive-text"))
return CSS::ValueID::VendorSpecificPaletteRulerInactiveText;
if (string.equals_ignoring_case("text-cursor"))
return CSS::ValueID::VendorSpecificPaletteTextCursor;
if (string.equals_ignoring_case("focus-outline"))
return CSS::ValueID::VendorSpecificPaletteFocusOutline;
if (string.equals_ignoring_case("syntax-comment"))
return CSS::ValueID::VendorSpecificPaletteSyntaxComment;
if (string.equals_ignoring_case("syntax-number"))
return CSS::ValueID::VendorSpecificPaletteSyntaxNumber;
if (string.equals_ignoring_case("syntax-string"))
return CSS::ValueID::VendorSpecificPaletteSyntaxString;
if (string.equals_ignoring_case("syntax-type"))
return CSS::ValueID::VendorSpecificPaletteSyntaxType;
if (string.equals_ignoring_case("syntax-punctuation"))
return CSS::ValueID::VendorSpecificPaletteSyntaxPunctuation;
if (string.equals_ignoring_case("syntax-operator"))
return CSS::ValueID::VendorSpecificPaletteSyntaxOperator;
if (string.equals_ignoring_case("syntax-keyword"))
return CSS::ValueID::VendorSpecificPaletteSyntaxKeyword;
if (string.equals_ignoring_case("syntax-control-keyword"))
return CSS::ValueID::VendorSpecificPaletteSyntaxControlKeyword;
if (string.equals_ignoring_case("syntax-identifier"))
return CSS::ValueID::VendorSpecificPaletteSyntaxIdentifier;
if (string.equals_ignoring_case("syntax-preprocessor-statement"))
return CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorStatement;
if (string.equals_ignoring_case("syntax-preprocessor-value"))
return CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorValue;
return {};
}
static Optional<Color> parse_css_color(const CSS::ParsingContext&, const StringView& view) static Optional<Color> parse_css_color(const CSS::ParsingContext&, const StringView& view)
{ {
if (view.equals_ignoring_case("transparent")) if (view.equals_ignoring_case("transparent"))
@ -342,141 +229,6 @@ static bool takes_integer_value(CSS::PropertyID property_id)
return property_id == CSS::PropertyID::ZIndex || property_id == CSS::PropertyID::FontWeight; return property_id == CSS::PropertyID::ZIndex || property_id == CSS::PropertyID::FontWeight;
} }
static Optional<CSS::ValueID> value_id_from_string(const String& string)
{
// FIXME: Handle all identifiers
// FIXME: Generate this code
if (string.equals_ignoring_case("bold"))
return CSS::ValueID::Bold;
if (string.equals_ignoring_case("bolder"))
return CSS::ValueID::Bolder;
if (string.equals_ignoring_case("center"))
return CSS::ValueID::Center;
if (string.equals_ignoring_case("justify"))
return CSS::ValueID::Justify;
if (string.equals_ignoring_case("large"))
return CSS::ValueID::Large;
if (string.equals_ignoring_case("larger"))
return CSS::ValueID::Larger;
if (string.equals_ignoring_case("left"))
return CSS::ValueID::Left;
if (string.equals_ignoring_case("lighter"))
return CSS::ValueID::Lighter;
if (string.equals_ignoring_case("medium"))
return CSS::ValueID::Medium;
if (string.equals_ignoring_case("normal"))
return CSS::ValueID::Normal;
if (string.equals_ignoring_case("small"))
return CSS::ValueID::Small;
if (string.equals_ignoring_case("right"))
return CSS::ValueID::Right;
if (string.equals_ignoring_case("smaller"))
return CSS::ValueID::Smaller;
if (string.equals_ignoring_case("x-large"))
return CSS::ValueID::XLarge;
if (string.equals_ignoring_case("x-small"))
return CSS::ValueID::XSmall;
if (string.equals_ignoring_case("xx-large"))
return CSS::ValueID::XxLarge;
if (string.equals_ignoring_case("xx-small"))
return CSS::ValueID::XxSmall;
if (string.equals_ignoring_case("xxx-large"))
return CSS::ValueID::XxxLarge;
if (string.equals_ignoring_case("-libweb-center"))
return CSS::ValueID::VendorSpecificCenter;
if (string.equals_ignoring_case("-libweb-link"))
return CSS::ValueID::VendorSpecificLink;
if (string.equals_ignoring_case("static"))
return CSS::ValueID::Static;
if (string.equals_ignoring_case("relative"))
return CSS::ValueID::Relative;
if (string.equals_ignoring_case("absolute"))
return CSS::ValueID::Absolute;
if (string.equals_ignoring_case("fixed"))
return CSS::ValueID::Fixed;
if (string.equals_ignoring_case("sticky"))
return CSS::ValueID::Sticky;
if (string.equals_ignoring_case("none"))
return CSS::ValueID::None;
if (string.equals_ignoring_case("both"))
return CSS::ValueID::Both;
if (string.equals_ignoring_case("hidden"))
return CSS::ValueID::Hidden;
if (string.equals_ignoring_case("dotted"))
return CSS::ValueID::Dotted;
if (string.equals_ignoring_case("dashed"))
return CSS::ValueID::Dashed;
if (string.equals_ignoring_case("solid"))
return CSS::ValueID::Solid;
if (string.equals_ignoring_case("double"))
return CSS::ValueID::Double;
if (string.equals_ignoring_case("groove"))
return CSS::ValueID::Groove;
if (string.equals_ignoring_case("ridge"))
return CSS::ValueID::Ridge;
if (string.equals_ignoring_case("inset"))
return CSS::ValueID::Inset;
if (string.equals_ignoring_case("outset"))
return CSS::ValueID::Outset;
if (string.equals_ignoring_case("nowrap"))
return CSS::ValueID::Nowrap;
if (string.equals_ignoring_case("pre"))
return CSS::ValueID::Pre;
if (string.equals_ignoring_case("pre-line"))
return CSS::ValueID::PreLine;
if (string.equals_ignoring_case("pre-wrap"))
return CSS::ValueID::PreWrap;
if (string.equals_ignoring_case("block"))
return CSS::ValueID::Block;
if (string.equals_ignoring_case("inline"))
return CSS::ValueID::Inline;
if (string.equals_ignoring_case("inline-block"))
return CSS::ValueID::InlineBlock;
if (string.equals_ignoring_case("list-item"))
return CSS::ValueID::ListItem;
if (string.equals_ignoring_case("table"))
return CSS::ValueID::Table;
if (string.equals_ignoring_case("table-row"))
return CSS::ValueID::TableRow;
if (string.equals_ignoring_case("table-cell"))
return CSS::ValueID::TableCell;
if (string.equals_ignoring_case("table-row-group"))
return CSS::ValueID::TableRowGroup;
if (string.equals_ignoring_case("table-header-group"))
return CSS::ValueID::TableHeaderGroup;
if (string.equals_ignoring_case("table-footer-group"))
return CSS::ValueID::TableFooterGroup;
if (string.equals_ignoring_case("underline"))
return CSS::ValueID::Underline;
if (string.equals_ignoring_case("overline"))
return CSS::ValueID::Overline;
if (string.equals_ignoring_case("line-through"))
return CSS::ValueID::LineThrough;
if (string.equals_ignoring_case("blink"))
return CSS::ValueID::Blink;
if (string.equals_ignoring_case("capitalize"))
return CSS::ValueID::Capitalize;
if (string.equals_ignoring_case("uppercase"))
return CSS::ValueID::Uppercase;
if (string.equals_ignoring_case("lowercase"))
return CSS::ValueID::Lowercase;
if (string.equals_ignoring_case("full-width"))
return CSS::ValueID::FullWidth;
if (string.equals_ignoring_case("full-size-kana"))
return CSS::ValueID::FullSizeKana;
if (string.equals_ignoring_case("disc"))
return CSS::ValueID::Disc;
if (string.equals_ignoring_case("circle"))
return CSS::ValueID::Circle;
if (string.equals_ignoring_case("square"))
return CSS::ValueID::Square;
if (string.equals_ignoring_case("decimal"))
return CSS::ValueID::Decimal;
if (string.starts_with("-libweb-palette-", CaseSensitivity::CaseInsensitive))
return value_id_for_palette_string(string.substring_view(16, string.length() - 16));
return {};
}
RefPtr<CSS::StyleValue> parse_css_value(const CSS::ParsingContext& context, const StringView& string, CSS::PropertyID property_id) RefPtr<CSS::StyleValue> parse_css_value(const CSS::ParsingContext& context, const StringView& string, CSS::PropertyID property_id)
{ {
bool is_bad_length = false; bool is_bad_length = false;
@ -500,9 +252,9 @@ RefPtr<CSS::StyleValue> parse_css_value(const CSS::ParsingContext& context, cons
if (string.equals_ignoring_case("auto")) if (string.equals_ignoring_case("auto"))
return CSS::LengthStyleValue::create(CSS::Length::make_auto()); return CSS::LengthStyleValue::create(CSS::Length::make_auto());
auto value_id = value_id_from_string(string); auto value_id = CSS::value_id_from_string(string);
if (value_id.has_value()) if (value_id != CSS::ValueID::Invalid)
return CSS::IdentifierStyleValue::create(value_id.value()); return CSS::IdentifierStyleValue::create(value_id);
auto color = parse_css_color(context, string); auto color = parse_css_color(context, string);
if (color.has_value()) if (color.has_value())

View file

@ -281,8 +281,8 @@ Optional<CSS::TextAlign> StyleProperties::text_align() const
return CSS::TextAlign::Right; return CSS::TextAlign::Right;
case CSS::ValueID::Justify: case CSS::ValueID::Justify:
return CSS::TextAlign::Justify; return CSS::TextAlign::Justify;
case CSS::ValueID::VendorSpecificCenter: case CSS::ValueID::LibwebCenter:
return CSS::TextAlign::VendorSpecificCenter; return CSS::TextAlign::LibwebCenter;
default: default:
return {}; return {};
} }

View file

@ -47,241 +47,124 @@ StyleValue::~StyleValue()
String IdentifierStyleValue::to_string() const String IdentifierStyleValue::to_string() const
{ {
switch (id()) { return CSS::string_from_value_id(m_id);
case CSS::ValueID::Invalid:
return "(invalid)";
case CSS::ValueID::VendorSpecificLink:
return "-libweb-link";
case CSS::ValueID::VendorSpecificCenter:
return "-libweb-center";
case CSS::ValueID::VendorSpecificPaletteDesktopBackground:
return "-libweb-palette-desktop-background";
case CSS::ValueID::VendorSpecificPaletteActiveWindowBorder1:
return "-libweb-palette-active-window-border1";
case CSS::ValueID::VendorSpecificPaletteActiveWindowBorder2:
return "-libweb-palette-active-window-border2";
case CSS::ValueID::VendorSpecificPaletteActiveWindowTitle:
return "-libweb-palette-active-window-title";
case CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder1:
return "-libweb-palette-inactive-window-border1";
case CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder2:
return "-libweb-palette-inactive-window-border2";
case CSS::ValueID::VendorSpecificPaletteInactiveWindowTitle:
return "-libweb-palette-inactive-window-title";
case CSS::ValueID::VendorSpecificPaletteMovingWindowBorder1:
return "-libweb-palette-moving-window-border1";
case CSS::ValueID::VendorSpecificPaletteMovingWindowBorder2:
return "-libweb-palette-moving-window-border2";
case CSS::ValueID::VendorSpecificPaletteMovingWindowTitle:
return "-libweb-palette-moving-window-title";
case CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder1:
return "-libweb-palette-highlight-window-border1";
case CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder2:
return "-libweb-palette-highlight-window-border2";
case CSS::ValueID::VendorSpecificPaletteHighlightWindowTitle:
return "-libweb-palette-highlight-window-title";
case CSS::ValueID::VendorSpecificPaletteMenuStripe:
return "-libweb-palette-menu-stripe";
case CSS::ValueID::VendorSpecificPaletteMenuBase:
return "-libweb-palette-menu-base";
case CSS::ValueID::VendorSpecificPaletteMenuBaseText:
return "-libweb-palette-menu-base-text";
case CSS::ValueID::VendorSpecificPaletteMenuSelection:
return "-libweb-palette-menu-selection";
case CSS::ValueID::VendorSpecificPaletteMenuSelectionText:
return "-libweb-palette-menu-selection-text";
case CSS::ValueID::VendorSpecificPaletteWindow:
return "-libweb-palette-window";
case CSS::ValueID::VendorSpecificPaletteWindowText:
return "-libweb-palette-window-text";
case CSS::ValueID::VendorSpecificPaletteButton:
return "-libweb-palette-button";
case CSS::ValueID::VendorSpecificPaletteButtonText:
return "-libweb-palette-button-text";
case CSS::ValueID::VendorSpecificPaletteBase:
return "-libweb-palette-base";
case CSS::ValueID::VendorSpecificPaletteBaseText:
return "-libweb-palette-base-text";
case CSS::ValueID::VendorSpecificPaletteThreedHighlight:
return "-libweb-palette-threed-highlight";
case CSS::ValueID::VendorSpecificPaletteThreedShadow1:
return "-libweb-palette-threed-shadow1";
case CSS::ValueID::VendorSpecificPaletteThreedShadow2:
return "-libweb-palette-threed-shadow2";
case CSS::ValueID::VendorSpecificPaletteHoverHighlight:
return "-libweb-palette-hover-highlight";
case CSS::ValueID::VendorSpecificPaletteSelection:
return "-libweb-palette-selection";
case CSS::ValueID::VendorSpecificPaletteSelectionText:
return "-libweb-palette-selection-text";
case CSS::ValueID::VendorSpecificPaletteInactiveSelection:
return "-libweb-palette-inactive-selection";
case CSS::ValueID::VendorSpecificPaletteInactiveSelectionText:
return "-libweb-palette-inactive-selection-text";
case CSS::ValueID::VendorSpecificPaletteRubberBandFill:
return "-libweb-palette-rubber-band-fill";
case CSS::ValueID::VendorSpecificPaletteRubberBandBorder:
return "-libweb-palette-rubber-band-border";
case CSS::ValueID::VendorSpecificPaletteLink:
return "-libweb-palette-link";
case CSS::ValueID::VendorSpecificPaletteActiveLink:
return "-libweb-palette-active-link";
case CSS::ValueID::VendorSpecificPaletteVisitedLink:
return "-libweb-palette-visited-link";
case CSS::ValueID::VendorSpecificPaletteRuler:
return "-libweb-palette-ruler";
case CSS::ValueID::VendorSpecificPaletteRulerBorder:
return "-libweb-palette-ruler-border";
case CSS::ValueID::VendorSpecificPaletteRulerActiveText:
return "-libweb-palette-ruler-active-text";
case CSS::ValueID::VendorSpecificPaletteRulerInactiveText:
return "-libweb-palette-ruler-inactive-text";
case CSS::ValueID::VendorSpecificPaletteTextCursor:
return "-libweb-palette-text-cursor";
case CSS::ValueID::VendorSpecificPaletteFocusOutline:
return "-libweb-palette-focus-outline";
case CSS::ValueID::VendorSpecificPaletteSyntaxComment:
return "-libweb-palette-syntax-comment";
case CSS::ValueID::VendorSpecificPaletteSyntaxNumber:
return "-libweb-palette-syntax-number";
case CSS::ValueID::VendorSpecificPaletteSyntaxString:
return "-libweb-palette-syntax-string";
case CSS::ValueID::VendorSpecificPaletteSyntaxType:
return "-libweb-palette-syntax-type";
case CSS::ValueID::VendorSpecificPaletteSyntaxPunctuation:
return "-libweb-palette-syntax-punctuation";
case CSS::ValueID::VendorSpecificPaletteSyntaxOperator:
return "-libweb-palette-syntax-operator";
case CSS::ValueID::VendorSpecificPaletteSyntaxKeyword:
return "-libweb-palette-syntax-keyword";
case CSS::ValueID::VendorSpecificPaletteSyntaxControlKeyword:
return "-libweb-palette-syntax-control-keyword";
case CSS::ValueID::VendorSpecificPaletteSyntaxIdentifier:
return "-libweb-palette-syntax-identifier";
case CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorStatement:
return "-libweb-palette-syntax-preprocessor-statement";
case CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorValue:
return "-libweb-palette-syntax-preprocessor-value";
default:
return String::formatted("-fixme-css-value-id-{}", (int)id());
}
} }
Color IdentifierStyleValue::to_color(const DOM::Document& document) const Color IdentifierStyleValue::to_color(const DOM::Document& document) const
{ {
if (id() == CSS::ValueID::VendorSpecificLink) if (id() == CSS::ValueID::LibwebLink)
return document.link_color(); return document.link_color();
ASSERT(document.page()); ASSERT(document.page());
auto palette = document.page()->palette(); auto palette = document.page()->palette();
switch (id()) { switch (id()) {
case CSS::ValueID::VendorSpecificPaletteDesktopBackground: case CSS::ValueID::LibwebPaletteDesktopBackground:
return palette.color(ColorRole::DesktopBackground); return palette.color(ColorRole::DesktopBackground);
case CSS::ValueID::VendorSpecificPaletteActiveWindowBorder1: case CSS::ValueID::LibwebPaletteActiveWindowBorder1:
return palette.color(ColorRole::ActiveWindowBorder1); return palette.color(ColorRole::ActiveWindowBorder1);
case CSS::ValueID::VendorSpecificPaletteActiveWindowBorder2: case CSS::ValueID::LibwebPaletteActiveWindowBorder2:
return palette.color(ColorRole::ActiveWindowBorder2); return palette.color(ColorRole::ActiveWindowBorder2);
case CSS::ValueID::VendorSpecificPaletteActiveWindowTitle: case CSS::ValueID::LibwebPaletteActiveWindowTitle:
return palette.color(ColorRole::ActiveWindowTitle); return palette.color(ColorRole::ActiveWindowTitle);
case CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder1: case CSS::ValueID::LibwebPaletteInactiveWindowBorder1:
return palette.color(ColorRole::InactiveWindowBorder1); return palette.color(ColorRole::InactiveWindowBorder1);
case CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder2: case CSS::ValueID::LibwebPaletteInactiveWindowBorder2:
return palette.color(ColorRole::InactiveWindowBorder2); return palette.color(ColorRole::InactiveWindowBorder2);
case CSS::ValueID::VendorSpecificPaletteInactiveWindowTitle: case CSS::ValueID::LibwebPaletteInactiveWindowTitle:
return palette.color(ColorRole::InactiveWindowTitle); return palette.color(ColorRole::InactiveWindowTitle);
case CSS::ValueID::VendorSpecificPaletteMovingWindowBorder1: case CSS::ValueID::LibwebPaletteMovingWindowBorder1:
return palette.color(ColorRole::MovingWindowBorder1); return palette.color(ColorRole::MovingWindowBorder1);
case CSS::ValueID::VendorSpecificPaletteMovingWindowBorder2: case CSS::ValueID::LibwebPaletteMovingWindowBorder2:
return palette.color(ColorRole::MovingWindowBorder2); return palette.color(ColorRole::MovingWindowBorder2);
case CSS::ValueID::VendorSpecificPaletteMovingWindowTitle: case CSS::ValueID::LibwebPaletteMovingWindowTitle:
return palette.color(ColorRole::MovingWindowTitle); return palette.color(ColorRole::MovingWindowTitle);
case CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder1: case CSS::ValueID::LibwebPaletteHighlightWindowBorder1:
return palette.color(ColorRole::HighlightWindowBorder1); return palette.color(ColorRole::HighlightWindowBorder1);
case CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder2: case CSS::ValueID::LibwebPaletteHighlightWindowBorder2:
return palette.color(ColorRole::HighlightWindowBorder2); return palette.color(ColorRole::HighlightWindowBorder2);
case CSS::ValueID::VendorSpecificPaletteHighlightWindowTitle: case CSS::ValueID::LibwebPaletteHighlightWindowTitle:
return palette.color(ColorRole::HighlightWindowTitle); return palette.color(ColorRole::HighlightWindowTitle);
case CSS::ValueID::VendorSpecificPaletteMenuStripe: case CSS::ValueID::LibwebPaletteMenuStripe:
return palette.color(ColorRole::MenuStripe); return palette.color(ColorRole::MenuStripe);
case CSS::ValueID::VendorSpecificPaletteMenuBase: case CSS::ValueID::LibwebPaletteMenuBase:
return palette.color(ColorRole::MenuBase); return palette.color(ColorRole::MenuBase);
case CSS::ValueID::VendorSpecificPaletteMenuBaseText: case CSS::ValueID::LibwebPaletteMenuBaseText:
return palette.color(ColorRole::MenuBaseText); return palette.color(ColorRole::MenuBaseText);
case CSS::ValueID::VendorSpecificPaletteMenuSelection: case CSS::ValueID::LibwebPaletteMenuSelection:
return palette.color(ColorRole::MenuSelection); return palette.color(ColorRole::MenuSelection);
case CSS::ValueID::VendorSpecificPaletteMenuSelectionText: case CSS::ValueID::LibwebPaletteMenuSelectionText:
return palette.color(ColorRole::MenuSelectionText); return palette.color(ColorRole::MenuSelectionText);
case CSS::ValueID::VendorSpecificPaletteWindow: case CSS::ValueID::LibwebPaletteWindow:
return palette.color(ColorRole::Window); return palette.color(ColorRole::Window);
case CSS::ValueID::VendorSpecificPaletteWindowText: case CSS::ValueID::LibwebPaletteWindowText:
return palette.color(ColorRole::WindowText); return palette.color(ColorRole::WindowText);
case CSS::ValueID::VendorSpecificPaletteButton: case CSS::ValueID::LibwebPaletteButton:
return palette.color(ColorRole::Button); return palette.color(ColorRole::Button);
case CSS::ValueID::VendorSpecificPaletteButtonText: case CSS::ValueID::LibwebPaletteButtonText:
return palette.color(ColorRole::ButtonText); return palette.color(ColorRole::ButtonText);
case CSS::ValueID::VendorSpecificPaletteBase: case CSS::ValueID::LibwebPaletteBase:
return palette.color(ColorRole::Base); return palette.color(ColorRole::Base);
case CSS::ValueID::VendorSpecificPaletteBaseText: case CSS::ValueID::LibwebPaletteBaseText:
return palette.color(ColorRole::BaseText); return palette.color(ColorRole::BaseText);
case CSS::ValueID::VendorSpecificPaletteThreedHighlight: case CSS::ValueID::LibwebPaletteThreedHighlight:
return palette.color(ColorRole::ThreedHighlight); return palette.color(ColorRole::ThreedHighlight);
case CSS::ValueID::VendorSpecificPaletteThreedShadow1: case CSS::ValueID::LibwebPaletteThreedShadow1:
return palette.color(ColorRole::ThreedShadow1); return palette.color(ColorRole::ThreedShadow1);
case CSS::ValueID::VendorSpecificPaletteThreedShadow2: case CSS::ValueID::LibwebPaletteThreedShadow2:
return palette.color(ColorRole::ThreedShadow2); return palette.color(ColorRole::ThreedShadow2);
case CSS::ValueID::VendorSpecificPaletteHoverHighlight: case CSS::ValueID::LibwebPaletteHoverHighlight:
return palette.color(ColorRole::HoverHighlight); return palette.color(ColorRole::HoverHighlight);
case CSS::ValueID::VendorSpecificPaletteSelection: case CSS::ValueID::LibwebPaletteSelection:
return palette.color(ColorRole::Selection); return palette.color(ColorRole::Selection);
case CSS::ValueID::VendorSpecificPaletteSelectionText: case CSS::ValueID::LibwebPaletteSelectionText:
return palette.color(ColorRole::SelectionText); return palette.color(ColorRole::SelectionText);
case CSS::ValueID::VendorSpecificPaletteInactiveSelection: case CSS::ValueID::LibwebPaletteInactiveSelection:
return palette.color(ColorRole::InactiveSelection); return palette.color(ColorRole::InactiveSelection);
case CSS::ValueID::VendorSpecificPaletteInactiveSelectionText: case CSS::ValueID::LibwebPaletteInactiveSelectionText:
return palette.color(ColorRole::InactiveSelectionText); return palette.color(ColorRole::InactiveSelectionText);
case CSS::ValueID::VendorSpecificPaletteRubberBandFill: case CSS::ValueID::LibwebPaletteRubberBandFill:
return palette.color(ColorRole::RubberBandFill); return palette.color(ColorRole::RubberBandFill);
case CSS::ValueID::VendorSpecificPaletteRubberBandBorder: case CSS::ValueID::LibwebPaletteRubberBandBorder:
return palette.color(ColorRole::RubberBandBorder); return palette.color(ColorRole::RubberBandBorder);
case CSS::ValueID::VendorSpecificPaletteLink: case CSS::ValueID::LibwebPaletteLink:
return palette.color(ColorRole::Link); return palette.color(ColorRole::Link);
case CSS::ValueID::VendorSpecificPaletteActiveLink: case CSS::ValueID::LibwebPaletteActiveLink:
return palette.color(ColorRole::ActiveLink); return palette.color(ColorRole::ActiveLink);
case CSS::ValueID::VendorSpecificPaletteVisitedLink: case CSS::ValueID::LibwebPaletteVisitedLink:
return palette.color(ColorRole::VisitedLink); return palette.color(ColorRole::VisitedLink);
case CSS::ValueID::VendorSpecificPaletteRuler: case CSS::ValueID::LibwebPaletteRuler:
return palette.color(ColorRole::Ruler); return palette.color(ColorRole::Ruler);
case CSS::ValueID::VendorSpecificPaletteRulerBorder: case CSS::ValueID::LibwebPaletteRulerBorder:
return palette.color(ColorRole::RulerBorder); return palette.color(ColorRole::RulerBorder);
case CSS::ValueID::VendorSpecificPaletteRulerActiveText: case CSS::ValueID::LibwebPaletteRulerActiveText:
return palette.color(ColorRole::RulerActiveText); return palette.color(ColorRole::RulerActiveText);
case CSS::ValueID::VendorSpecificPaletteRulerInactiveText: case CSS::ValueID::LibwebPaletteRulerInactiveText:
return palette.color(ColorRole::RulerInactiveText); return palette.color(ColorRole::RulerInactiveText);
case CSS::ValueID::VendorSpecificPaletteTextCursor: case CSS::ValueID::LibwebPaletteTextCursor:
return palette.color(ColorRole::TextCursor); return palette.color(ColorRole::TextCursor);
case CSS::ValueID::VendorSpecificPaletteFocusOutline: case CSS::ValueID::LibwebPaletteFocusOutline:
return palette.color(ColorRole::FocusOutline); return palette.color(ColorRole::FocusOutline);
case CSS::ValueID::VendorSpecificPaletteSyntaxComment: case CSS::ValueID::LibwebPaletteSyntaxComment:
return palette.color(ColorRole::SyntaxComment); return palette.color(ColorRole::SyntaxComment);
case CSS::ValueID::VendorSpecificPaletteSyntaxNumber: case CSS::ValueID::LibwebPaletteSyntaxNumber:
return palette.color(ColorRole::SyntaxNumber); return palette.color(ColorRole::SyntaxNumber);
case CSS::ValueID::VendorSpecificPaletteSyntaxString: case CSS::ValueID::LibwebPaletteSyntaxString:
return palette.color(ColorRole::SyntaxString); return palette.color(ColorRole::SyntaxString);
case CSS::ValueID::VendorSpecificPaletteSyntaxType: case CSS::ValueID::LibwebPaletteSyntaxType:
return palette.color(ColorRole::SyntaxType); return palette.color(ColorRole::SyntaxType);
case CSS::ValueID::VendorSpecificPaletteSyntaxPunctuation: case CSS::ValueID::LibwebPaletteSyntaxPunctuation:
return palette.color(ColorRole::SyntaxPunctuation); return palette.color(ColorRole::SyntaxPunctuation);
case CSS::ValueID::VendorSpecificPaletteSyntaxOperator: case CSS::ValueID::LibwebPaletteSyntaxOperator:
return palette.color(ColorRole::SyntaxOperator); return palette.color(ColorRole::SyntaxOperator);
case CSS::ValueID::VendorSpecificPaletteSyntaxKeyword: case CSS::ValueID::LibwebPaletteSyntaxKeyword:
return palette.color(ColorRole::SyntaxKeyword); return palette.color(ColorRole::SyntaxKeyword);
case CSS::ValueID::VendorSpecificPaletteSyntaxControlKeyword: case CSS::ValueID::LibwebPaletteSyntaxControlKeyword:
return palette.color(ColorRole::SyntaxControlKeyword); return palette.color(ColorRole::SyntaxControlKeyword);
case CSS::ValueID::VendorSpecificPaletteSyntaxIdentifier: case CSS::ValueID::LibwebPaletteSyntaxIdentifier:
return palette.color(ColorRole::SyntaxIdentifier); return palette.color(ColorRole::SyntaxIdentifier);
case CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorStatement: case CSS::ValueID::LibwebPaletteSyntaxPreprocessorStatement:
return palette.color(ColorRole::SyntaxPreprocessorStatement); return palette.color(ColorRole::SyntaxPreprocessorStatement);
case CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorValue: case CSS::ValueID::LibwebPaletteSyntaxPreprocessorValue:
return palette.color(ColorRole::SyntaxPreprocessorValue); return palette.color(ColorRole::SyntaxPreprocessorValue);
default: default:
return {}; return {};

View file

@ -36,132 +36,12 @@
#include <LibGfx/Color.h> #include <LibGfx/Color.h>
#include <LibWeb/CSS/Length.h> #include <LibWeb/CSS/Length.h>
#include <LibWeb/CSS/PropertyID.h> #include <LibWeb/CSS/PropertyID.h>
#include <LibWeb/CSS/ValueID.h>
#include <LibWeb/Forward.h> #include <LibWeb/Forward.h>
#include <LibWeb/Loader/ImageResource.h> #include <LibWeb/Loader/ImageResource.h>
namespace Web::CSS { namespace Web::CSS {
enum class ValueID {
Invalid,
VendorSpecificLink,
VendorSpecificPaletteDesktopBackground,
VendorSpecificPaletteActiveWindowBorder1,
VendorSpecificPaletteActiveWindowBorder2,
VendorSpecificPaletteActiveWindowTitle,
VendorSpecificPaletteInactiveWindowBorder1,
VendorSpecificPaletteInactiveWindowBorder2,
VendorSpecificPaletteInactiveWindowTitle,
VendorSpecificPaletteMovingWindowBorder1,
VendorSpecificPaletteMovingWindowBorder2,
VendorSpecificPaletteMovingWindowTitle,
VendorSpecificPaletteHighlightWindowBorder1,
VendorSpecificPaletteHighlightWindowBorder2,
VendorSpecificPaletteHighlightWindowTitle,
VendorSpecificPaletteMenuStripe,
VendorSpecificPaletteMenuBase,
VendorSpecificPaletteMenuBaseText,
VendorSpecificPaletteMenuSelection,
VendorSpecificPaletteMenuSelectionText,
VendorSpecificPaletteWindow,
VendorSpecificPaletteWindowText,
VendorSpecificPaletteButton,
VendorSpecificPaletteButtonText,
VendorSpecificPaletteBase,
VendorSpecificPaletteBaseText,
VendorSpecificPaletteThreedHighlight,
VendorSpecificPaletteThreedShadow1,
VendorSpecificPaletteThreedShadow2,
VendorSpecificPaletteHoverHighlight,
VendorSpecificPaletteSelection,
VendorSpecificPaletteSelectionText,
VendorSpecificPaletteInactiveSelection,
VendorSpecificPaletteInactiveSelectionText,
VendorSpecificPaletteRubberBandFill,
VendorSpecificPaletteRubberBandBorder,
VendorSpecificPaletteLink,
VendorSpecificPaletteActiveLink,
VendorSpecificPaletteVisitedLink,
VendorSpecificPaletteRuler,
VendorSpecificPaletteRulerBorder,
VendorSpecificPaletteRulerActiveText,
VendorSpecificPaletteRulerInactiveText,
VendorSpecificPaletteTextCursor,
VendorSpecificPaletteFocusOutline,
VendorSpecificPaletteSyntaxComment,
VendorSpecificPaletteSyntaxNumber,
VendorSpecificPaletteSyntaxString,
VendorSpecificPaletteSyntaxType,
VendorSpecificPaletteSyntaxPunctuation,
VendorSpecificPaletteSyntaxOperator,
VendorSpecificPaletteSyntaxKeyword,
VendorSpecificPaletteSyntaxControlKeyword,
VendorSpecificPaletteSyntaxIdentifier,
VendorSpecificPaletteSyntaxPreprocessorStatement,
VendorSpecificPaletteSyntaxPreprocessorValue,
Center,
Left,
Right,
Justify,
VendorSpecificCenter,
Bold,
Bolder,
Large,
Larger,
Lighter,
Medium,
Normal,
Small,
Smaller,
XLarge,
XSmall,
XxLarge,
XxSmall,
XxxLarge,
Static,
Relative,
Absolute,
Fixed,
Sticky,
Both,
None,
Hidden,
Dotted,
Dashed,
Solid,
Double,
Groove,
Ridge,
Inset,
Outset,
Nowrap,
Pre,
PreLine,
PreWrap,
Block,
Inline,
InlineBlock,
ListItem,
Table,
TableRow,
TableCell,
TableHeaderGroup,
TableRowGroup,
TableFooterGroup,
Underline,
Overline,
LineThrough,
Blink,
Capitalize,
Uppercase,
Lowercase,
FullWidth,
FullSizeKana,
Disc,
Circle,
Square,
Decimal,
};
enum class Position { enum class Position {
Static, Static,
Relative, Relative,
@ -175,7 +55,7 @@ enum class TextAlign {
Center, Center,
Right, Right,
Justify, Justify,
VendorSpecificCenter, LibwebCenter,
}; };
enum class TextDecorationLine { enum class TextDecorationLine {

View file

@ -1,7 +1,11 @@
add_executable(Generate_CSS_PropertyID_h Generate_CSS_PropertyID_h.cpp) add_executable(Generate_CSS_PropertyID_h Generate_CSS_PropertyID_h.cpp)
add_executable(Generate_CSS_PropertyID_cpp Generate_CSS_PropertyID_cpp.cpp) add_executable(Generate_CSS_PropertyID_cpp Generate_CSS_PropertyID_cpp.cpp)
add_executable(Generate_CSS_ValueID_h Generate_CSS_ValueID_h.cpp)
add_executable(Generate_CSS_ValueID_cpp Generate_CSS_ValueID_cpp.cpp)
add_executable(WrapperGenerator WrapperGenerator.cpp) add_executable(WrapperGenerator WrapperGenerator.cpp)
target_compile_options(WrapperGenerator PUBLIC -g) target_compile_options(WrapperGenerator PUBLIC -g)
target_link_libraries(Generate_CSS_PropertyID_h LagomCore) target_link_libraries(Generate_CSS_PropertyID_h LagomCore)
target_link_libraries(Generate_CSS_PropertyID_cpp LagomCore) target_link_libraries(Generate_CSS_PropertyID_cpp LagomCore)
target_link_libraries(Generate_CSS_ValueID_h LagomCore)
target_link_libraries(Generate_CSS_ValueID_cpp LagomCore)
target_link_libraries(WrapperGenerator LagomCore) target_link_libraries(WrapperGenerator LagomCore)

View file

@ -0,0 +1,115 @@
/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <AK/ByteBuffer.h>
#include <AK/JsonObject.h>
#include <AK/SourceGenerator.h>
#include <AK/StringBuilder.h>
#include <LibCore/File.h>
#include <ctype.h>
#include <stdio.h>
static String title_casify(const String& dashy_name)
{
auto parts = dashy_name.split('-');
StringBuilder builder;
for (auto& part : parts) {
if (part.is_empty())
continue;
builder.append(toupper(part[0]));
if (part.length() == 1)
continue;
builder.append(part.substring_view(1, part.length() - 1));
}
return builder.to_string();
}
int main(int argc, char** argv)
{
if (argc != 2) {
warnln("usage: {} <path/to/CSS/Identifiers.json>", argv[0]);
return 1;
}
auto file = Core::File::construct(argv[1]);
if (!file->open(Core::IODevice::ReadOnly))
return 1;
auto json = JsonValue::from_string(file->read_all());
ASSERT(json.has_value());
ASSERT(json.value().is_array());
StringBuilder builder;
SourceGenerator generator { builder };
generator.append(R"~~~(
#include <AK/Assertions.h>
#include <LibWeb/CSS/ValueID.h>
namespace Web::CSS {
ValueID value_id_from_string(const StringView& string)
{
)~~~");
json.value().as_array().for_each([&](auto& name) {
auto member_generator = generator.fork();
member_generator.set("name", name.to_string());
member_generator.set("name:titlecase", title_casify(name.to_string()));
member_generator.append(R"~~~(
if (string.equals_ignoring_case("@name@"))
return ValueID::@name:titlecase@;
)~~~");
});
generator.append(R"~~~(
return ValueID::Invalid;
}
const char* string_from_value_id(ValueID value_id) {
switch (value_id) {
)~~~");
json.value().as_array().for_each([&](auto& name) {
auto member_generator = generator.fork();
member_generator.set("name", name.to_string());
member_generator.set("name:titlecase", title_casify(name.to_string()));
member_generator.append(R"~~~(
case ValueID::@name:titlecase@:
return "@name@";
)~~~");
});
generator.append(R"~~~(
default:
return "(invalid CSS::ValueID)";
}
}
} // namespace Web::CSS
)~~~");
outln("{}", generator.as_string_view());
}

View file

@ -0,0 +1,98 @@
/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <AK/ByteBuffer.h>
#include <AK/JsonObject.h>
#include <AK/SourceGenerator.h>
#include <AK/StringBuilder.h>
#include <LibCore/File.h>
#include <ctype.h>
#include <stdio.h>
static String title_casify(const String& dashy_name)
{
auto parts = dashy_name.split('-');
StringBuilder builder;
for (auto& part : parts) {
if (part.is_empty())
continue;
builder.append(toupper(part[0]));
if (part.length() == 1)
continue;
builder.append(part.substring_view(1, part.length() - 1));
}
return builder.to_string();
}
int main(int argc, char** argv)
{
if (argc != 2) {
warnln("usage: {} <path/to/CSS/Identifiers.json>", argv[0]);
return 1;
}
auto file = Core::File::construct(argv[1]);
if (!file->open(Core::IODevice::ReadOnly))
return 1;
auto json = JsonValue::from_string(file->read_all());
ASSERT(json.has_value());
ASSERT(json.value().is_array());
StringBuilder builder;
SourceGenerator generator { builder };
generator.append(R"~~~(
#pragma once
#include <AK/StringView.h>
#include <AK/Traits.h>
namespace Web::CSS {
enum class ValueID {
Invalid,
)~~~");
json.value().as_array().for_each([&](auto& name) {
auto member_generator = generator.fork();
member_generator.set("name:titlecase", title_casify(name.to_string()));
member_generator.append(R"~~~(
@name:titlecase@,
)~~~");
});
generator.append(R"~~~(
};
ValueID value_id_from_string(const StringView&);
const char* string_from_value_id(ValueID);
}
)~~~");
outln("{}", generator.as_string_view());
}

View file

@ -536,7 +536,7 @@ void BlockFormattingContext::place_block_level_non_replaced_element_in_normal_fl
+ box_model.padding.left + box_model.padding.left
+ box_model.offset.left; + box_model.offset.left;
if (containing_block.style().text_align() == CSS::TextAlign::VendorSpecificCenter) { if (containing_block.style().text_align() == CSS::TextAlign::LibwebCenter) {
x = (containing_block.width() / 2) - child_box.width() / 2; x = (containing_block.width() / 2) - child_box.width() / 2;
} }

View file

@ -127,7 +127,7 @@ void InlineFormattingContext::run(Box&, LayoutMode layout_mode)
switch (text_align) { switch (text_align) {
case CSS::TextAlign::Center: case CSS::TextAlign::Center:
case CSS::TextAlign::VendorSpecificCenter: case CSS::TextAlign::LibwebCenter:
x_offset += excess_horizontal_space / 2; x_offset += excess_horizontal_space / 2;
break; break;
case CSS::TextAlign::Right: case CSS::TextAlign::Right: