Explorar el Código

LibWeb: Add a whole bunch of rule classes for the new CSS parser

Original work by @stelar7.
Andreas Kling hace 4 años
padre
commit
ad152bfa59

+ 1 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -16,6 +16,7 @@ set(SOURCES
     CSS/DefaultStyleSheetSource.cpp
     CSS/Length.cpp
     CSS/Parser/DeprecatedCSSParser.cpp
+    CSS/Parser/StyleRules.cpp
     CSS/Parser/Token.cpp
     CSS/Parser/Tokenizer.cpp
     CSS/PropertyID.cpp

+ 46 - 0
Userland/Libraries/LibWeb/CSS/Parser/AtStyleRule.h

@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2020-2021, SerenityOS developers
+ * 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.
+ */
+
+#pragma once
+
+#include <AK/String.h>
+#include <LibWeb/CSS/Parser/QualifiedStyleRule.h>
+
+namespace Web::CSS {
+
+class AtStyleRule : public QualifiedStyleRule {
+    friend class Parser;
+
+public:
+    AtStyleRule();
+    ~AtStyleRule();
+    String to_string() const;
+
+private:
+    String m_name;
+};
+
+}

+ 55 - 0
Userland/Libraries/LibWeb/CSS/Parser/DeclarationOrAtRule.h

@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2020-2021, SerenityOS developers
+ * 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.
+ */
+
+#pragma once
+
+#include <LibWeb/CSS/Parser/AtStyleRule.h>
+#include <LibWeb/CSS/Parser/StyleDeclarationRule.h>
+
+namespace Web::CSS {
+
+class DeclarationOrAtRule {
+    friend class Parser;
+
+public:
+    explicit DeclarationOrAtRule(AtStyleRule at);
+    explicit DeclarationOrAtRule(StyleDeclarationRule declaration);
+    ~DeclarationOrAtRule();
+
+    enum class DeclarationType {
+        At,
+        Declaration,
+    };
+
+    String to_string() const;
+
+private:
+    DeclarationType m_type;
+    AtStyleRule m_at;
+    StyleDeclarationRule m_declaration;
+};
+
+}

+ 49 - 0
Userland/Libraries/LibWeb/CSS/Parser/QualifiedStyleRule.h

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2020-2021, SerenityOS developers
+ * 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.
+ */
+
+#pragma once
+
+#include <AK/Vector.h>
+#include <LibWeb/CSS/Parser/StyleBlockRule.h>
+
+namespace Web::CSS {
+
+class StyleComponentValueRule;
+
+class QualifiedStyleRule {
+    friend class Parser;
+
+public:
+    QualifiedStyleRule();
+    ~QualifiedStyleRule();
+    String to_string() const;
+
+private:
+    Vector<String> m_prelude;
+    StyleBlockRule m_block;
+};
+
+}

+ 48 - 0
Userland/Libraries/LibWeb/CSS/Parser/StyleBlockRule.h

@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2020-2021, SerenityOS developers
+ * 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.
+ */
+
+#pragma once
+
+#include <AK/Vector.h>
+#include <LibWeb/CSS/Parser/Token.h>
+
+namespace Web::CSS {
+
+class StyleBlockRule {
+    friend class Parser;
+
+public:
+    StyleBlockRule();
+    ~StyleBlockRule();
+
+    String to_string() const;
+
+private:
+    Token m_token;
+    Vector<String> m_values;
+};
+
+}

+ 56 - 0
Userland/Libraries/LibWeb/CSS/Parser/StyleComponentValueRule.h

@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2020-2021, SerenityOS developers
+ * 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.
+ */
+
+#pragma once
+
+#include <LibWeb/CSS/Parser/Token.h>
+#include <LibWeb/CSS/Parser/StyleBlockRule.h>
+#include <LibWeb/CSS/Parser/StyleFunctionRule.h>
+
+namespace Web::CSS {
+
+class StyleComponentValueRule {
+    friend class Parser;
+
+public:
+    enum class ComponentType {
+        Token,
+        Function,
+        Block
+    };
+
+    explicit StyleComponentValueRule(ComponentType);
+    ~StyleComponentValueRule();
+
+    String to_string() const;
+
+private:
+    ComponentType m_type;
+    Token m_token;
+    StyleFunctionRule m_function;
+    StyleBlockRule m_block;
+};
+}

+ 50 - 0
Userland/Libraries/LibWeb/CSS/Parser/StyleDeclarationRule.h

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2020-2021, SerenityOS developers
+ * 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.
+ */
+
+#pragma once
+
+#include <AK/String.h>
+#include <AK/Vector.h>
+#include <LibWeb/CSS/Parser/StyleComponentValueRule.h>
+
+namespace Web::CSS {
+
+class StyleDeclarationRule {
+    friend class Parser;
+
+public:
+    StyleDeclarationRule();
+    ~StyleDeclarationRule();
+
+    String to_string() const;
+
+private:
+    String m_name;
+    Vector<StyleComponentValueRule> m_values;
+    bool m_important { false };
+};
+
+}

+ 50 - 0
Userland/Libraries/LibWeb/CSS/Parser/StyleFunctionRule.h

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2020-2021, SerenityOS developers
+ * 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.
+ */
+
+#pragma once
+
+#include <AK/String.h>
+#include <AK/Vector.h>
+
+namespace Web::CSS {
+
+class StyleComponentValueRule;
+
+class StyleFunctionRule {
+    friend class Parser;
+
+public:
+    StyleFunctionRule();
+    ~StyleFunctionRule();
+
+    String to_string() const;
+
+private:
+    String m_name;
+    Vector<String> m_values;
+};
+
+}

+ 188 - 0
Userland/Libraries/LibWeb/CSS/Parser/StyleRules.cpp

@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2020-2021, SerenityOS developers
+ * 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 <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() { }
+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_raw(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();
+}
+}