ladybird/Userland/Libraries/LibWeb/CSS/Parser/StyleRules.cpp
Sam Atkins 89bfde29dc LibWeb: Convert some CSS parser *Rule classes to using pointers
Previously these were all passed around by value, but some of them
(StyleComponentValueRule and StyleBlockRule) want to include each
other as fields, so this had to change.
2021-07-11 23:19:56 +02:00

172 lines
4 KiB
C++

/*
* Copyright (c) 2020-2021, the SerenityOS developers.
* Copyright (c) 2021, Sam Atkins <atkinssj@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/CSS/Parser/AtStyleRule.h>
#include <LibWeb/CSS/Parser/DeclarationOrAtRule.h>
#include <LibWeb/CSS/Parser/QualifiedStyleRule.h>
#include <LibWeb/CSS/Parser/StyleBlockRule.h>
#include <LibWeb/CSS/Parser/StyleComponentValueRule.h>
#include <LibWeb/CSS/Parser/StyleDeclarationRule.h>
#include <LibWeb/CSS/Parser/StyleFunctionRule.h>
namespace Web::CSS {
AtStyleRule::AtStyleRule() { }
AtStyleRule::~AtStyleRule() { }
DeclarationOrAtRule::DeclarationOrAtRule(AtStyleRule at)
: m_type(DeclarationType::At)
, m_at(move(at))
{
}
DeclarationOrAtRule::DeclarationOrAtRule(StyleDeclarationRule declaration)
: m_type(DeclarationType::Declaration)
, m_declaration(move(declaration))
{
}
DeclarationOrAtRule::~DeclarationOrAtRule() { }
QualifiedStyleRule::QualifiedStyleRule() { }
QualifiedStyleRule::~QualifiedStyleRule() { }
StyleBlockRule::StyleBlockRule() { }
StyleBlockRule::~StyleBlockRule() { }
StyleComponentValueRule::StyleComponentValueRule(ComponentType type)
: m_type(type)
{
}
StyleComponentValueRule::~StyleComponentValueRule() { }
StyleDeclarationRule::StyleDeclarationRule() { }
StyleDeclarationRule::~StyleDeclarationRule() { }
StyleFunctionRule::StyleFunctionRule(String name)
: m_name(name)
{
}
StyleFunctionRule::~StyleFunctionRule() { }
template<class SeparatorType, class CollectionType>
void append_with_to_string(StringBuilder& builder, SeparatorType& separator, CollectionType& collection)
{
bool first = true;
for (auto& item : collection) {
if (first)
first = false;
else
builder.append(separator);
builder.append(item.to_string());
}
}
template<class SeparatorType, class CollectionType>
void append_raw(StringBuilder& builder, SeparatorType& separator, CollectionType& collection)
{
bool first = true;
for (auto& item : collection) {
if (first)
first = false;
else
builder.append(separator);
builder.append(item);
}
}
String AtStyleRule::to_string() const
{
StringBuilder builder;
builder.append("@");
builder.append(m_name);
builder.append(QualifiedStyleRule::to_string());
return builder.to_string();
}
String DeclarationOrAtRule::to_string() const
{
StringBuilder builder;
switch (m_type) {
default:
case DeclarationType::At:
builder.append(m_at.to_string());
break;
case DeclarationType::Declaration:
builder.append(m_declaration.to_string());
break;
}
return builder.to_string();
}
String QualifiedStyleRule::to_string() const
{
StringBuilder builder;
append_with_to_string(builder, " ", m_prelude);
builder.append(m_block->to_string());
return builder.to_string();
}
String StyleBlockRule::to_string() const
{
StringBuilder builder;
builder.append(m_token.bracket_string());
append_raw(builder, ", ", m_values);
builder.append(m_token.bracket_mirror_string());
return builder.to_string();
}
String StyleComponentValueRule::to_string() const
{
StringBuilder builder;
switch (m_type) {
case ComponentType::Token:
builder.append(m_token.to_string());
break;
case ComponentType::Function:
builder.append(m_function->to_string());
break;
case ComponentType::Block:
builder.append(m_block->to_string());
break;
}
return builder.to_string();
}
String StyleDeclarationRule::to_string() const
{
StringBuilder builder;
builder.append(m_name);
builder.append(": ");
append_with_to_string(builder, " ", m_values);
if (m_important)
builder.append(" !important");
return builder.to_string();
}
String StyleFunctionRule::to_string() const
{
StringBuilder builder;
builder.append(m_name);
builder.append("(");
append_raw(builder, ", ", m_values);
builder.append(")");
return builder.to_string();
}
}