1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 23:17:45 +00:00

LibWeb: Move <display-foo> definitions into Enums.json

This eliminates a fair bit of boilerplate.
This commit is contained in:
Sam Atkins 2023-09-04 17:39:15 +01:00 committed by Sam Atkins
parent 3b0980c89f
commit 125d161b3f
10 changed files with 182 additions and 313 deletions

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -8,6 +9,7 @@
#include <AK/Assertions.h>
#include <AK/String.h>
#include <LibWeb/CSS/Enums.h>
namespace Web::CSS {
@ -35,41 +37,6 @@ public:
VERIFY_NOT_REACHED();
}
enum class Outside {
Block,
Inline,
RunIn,
};
enum class Inside {
Flow,
FlowRoot,
Table,
Flex,
Grid,
Ruby,
};
enum class Internal {
TableRowGroup,
TableHeaderGroup,
TableFooterGroup,
TableRow,
TableCell,
TableColumnGroup,
TableColumn,
TableCaption,
RubyBase,
RubyText,
RubyBaseContainer,
RubyTextContainer,
};
enum class Box {
Contents,
None,
};
enum class ListItem {
No,
Yes,
@ -82,35 +49,35 @@ public:
};
bool is_internal() const { return m_type == Type::Internal; }
Internal internal() const
DisplayInternal internal() const
{
VERIFY(is_internal());
return m_value.internal;
}
bool is_table_column() const { return is_internal() && internal() == Internal::TableColumn; }
bool is_table_row_group() const { return is_internal() && internal() == Internal::TableRowGroup; }
bool is_table_header_group() const { return is_internal() && internal() == Internal::TableHeaderGroup; }
bool is_table_footer_group() const { return is_internal() && internal() == Internal::TableFooterGroup; }
bool is_table_row() const { return is_internal() && internal() == Internal::TableRow; }
bool is_table_cell() const { return is_internal() && internal() == Internal::TableCell; }
bool is_table_column_group() const { return is_internal() && internal() == Internal::TableColumnGroup; }
bool is_table_caption() const { return is_internal() && internal() == Internal::TableCaption; }
bool is_table_column() const { return is_internal() && internal() == DisplayInternal::TableColumn; }
bool is_table_row_group() const { return is_internal() && internal() == DisplayInternal::TableRowGroup; }
bool is_table_header_group() const { return is_internal() && internal() == DisplayInternal::TableHeaderGroup; }
bool is_table_footer_group() const { return is_internal() && internal() == DisplayInternal::TableFooterGroup; }
bool is_table_row() const { return is_internal() && internal() == DisplayInternal::TableRow; }
bool is_table_cell() const { return is_internal() && internal() == DisplayInternal::TableCell; }
bool is_table_column_group() const { return is_internal() && internal() == DisplayInternal::TableColumnGroup; }
bool is_table_caption() const { return is_internal() && internal() == DisplayInternal::TableCaption; }
bool is_none() const { return m_type == Type::Box && m_value.box == Box::None; }
bool is_contents() const { return m_type == Type::Box && m_value.box == Box::Contents; }
bool is_none() const { return m_type == Type::Box && m_value.box == DisplayBox::None; }
bool is_contents() const { return m_type == Type::Box && m_value.box == DisplayBox::Contents; }
Type type() const { return m_type; }
bool is_outside_and_inside() const { return m_type == Type::OutsideAndInside; }
Outside outside() const
DisplayOutside outside() const
{
VERIFY(is_outside_and_inside());
return m_value.outside_inside.outside;
}
bool is_block_outside() const { return is_outside_and_inside() && outside() == Outside::Block; }
bool is_inline_outside() const { return is_outside_and_inside() && outside() == Outside::Inline; }
bool is_block_outside() const { return is_outside_and_inside() && outside() == DisplayOutside::Block; }
bool is_inline_outside() const { return is_outside_and_inside() && outside() == DisplayOutside::Inline; }
bool is_inline_block() const { return is_inline_outside() && is_flow_root_inside(); }
ListItem list_item() const
@ -121,18 +88,18 @@ public:
bool is_list_item() const { return is_outside_and_inside() && list_item() == ListItem::Yes; }
Inside inside() const
DisplayInside inside() const
{
VERIFY(is_outside_and_inside());
return m_value.outside_inside.inside;
}
bool is_flow_inside() const { return is_outside_and_inside() && inside() == Inside::Flow; }
bool is_flow_root_inside() const { return is_outside_and_inside() && inside() == Inside::FlowRoot; }
bool is_table_inside() const { return is_outside_and_inside() && inside() == Inside::Table; }
bool is_flex_inside() const { return is_outside_and_inside() && inside() == Inside::Flex; }
bool is_grid_inside() const { return is_outside_and_inside() && inside() == Inside::Grid; }
bool is_ruby_inside() const { return is_outside_and_inside() && inside() == Inside::Ruby; }
bool is_flow_inside() const { return is_outside_and_inside() && inside() == DisplayInside::Flow; }
bool is_flow_root_inside() const { return is_outside_and_inside() && inside() == DisplayInside::FlowRoot; }
bool is_table_inside() const { return is_outside_and_inside() && inside() == DisplayInside::Table; }
bool is_flex_inside() const { return is_outside_and_inside() && inside() == DisplayInside::Flex; }
bool is_grid_inside() const { return is_outside_and_inside() && inside() == DisplayInside::Grid; }
bool is_ruby_inside() const { return is_outside_and_inside() && inside() == DisplayInside::Ruby; }
enum class Short {
None,
@ -158,44 +125,44 @@ public:
{
switch (short_) {
case Short::None:
return Display { Box::None };
return Display { DisplayBox::None };
case Short::Contents:
return Display { Box::Contents };
return Display { DisplayBox::Contents };
case Short::Block:
return Display { Outside::Block, Inside::Flow };
return Display { DisplayOutside::Block, DisplayInside::Flow };
case Short::Inline:
return Display { Outside::Inline, Inside::Flow };
return Display { DisplayOutside::Inline, DisplayInside::Flow };
case Short::Flow:
return Display { Outside::Block, Inside::Flow };
return Display { DisplayOutside::Block, DisplayInside::Flow };
case Short::FlowRoot:
return Display { Outside::Block, Inside::FlowRoot };
return Display { DisplayOutside::Block, DisplayInside::FlowRoot };
case Short::InlineBlock:
return Display { Outside::Inline, Inside::FlowRoot };
return Display { DisplayOutside::Inline, DisplayInside::FlowRoot };
case Short::RunIn:
return Display { Outside::RunIn, Inside::Flow };
return Display { DisplayOutside::RunIn, DisplayInside::Flow };
case Short::ListItem:
return Display { Outside::Block, Inside::Flow, ListItem::Yes };
return Display { DisplayOutside::Block, DisplayInside::Flow, ListItem::Yes };
case Short::InlineListItem:
return Display { Outside::Inline, Inside::Flow, ListItem::Yes };
return Display { DisplayOutside::Inline, DisplayInside::Flow, ListItem::Yes };
case Short::Flex:
return Display { Outside::Block, Inside::Flex };
return Display { DisplayOutside::Block, DisplayInside::Flex };
case Short::InlineFlex:
return Display { Outside::Inline, Inside::Flex };
return Display { DisplayOutside::Inline, DisplayInside::Flex };
case Short::Grid:
return Display { Outside::Block, Inside::Grid };
return Display { DisplayOutside::Block, DisplayInside::Grid };
case Short::InlineGrid:
return Display { Outside::Inline, Inside::Grid };
return Display { DisplayOutside::Inline, DisplayInside::Grid };
case Short::Ruby:
return Display { Outside::Inline, Inside::Ruby };
return Display { DisplayOutside::Inline, DisplayInside::Ruby };
case Short::Table:
return Display { Outside::Block, Inside::Table };
return Display { DisplayOutside::Block, DisplayInside::Table };
case Short::InlineTable:
return Display { Outside::Inline, Inside::Table };
return Display { DisplayOutside::Inline, DisplayInside::Table };
}
VERIFY_NOT_REACHED();
}
Display(Outside outside, Inside inside)
Display(DisplayOutside outside, DisplayInside inside)
: m_type(Type::OutsideAndInside)
{
m_value.outside_inside = {
@ -205,7 +172,7 @@ public:
};
}
Display(Outside outside, Inside inside, ListItem list_item)
Display(DisplayOutside outside, DisplayInside inside, ListItem list_item)
: m_type(Type::OutsideAndInside)
{
m_value.outside_inside = {
@ -215,13 +182,13 @@ public:
};
}
explicit Display(Internal internal)
explicit Display(DisplayInternal internal)
: m_type(Type::Internal)
{
m_value.internal = internal;
}
explicit Display(Box box)
explicit Display(DisplayBox box)
: m_type(Type::Box)
{
m_value.box = box;
@ -231,12 +198,12 @@ private:
Type m_type {};
union {
struct {
Outside outside;
Inside inside;
DisplayOutside outside;
DisplayInside inside;
ListItem list_item;
} outside_inside;
Internal internal;
Box box;
DisplayInternal internal;
DisplayBox box;
} m_value {};
};