diff --git a/Meta/CMake/libweb_generators.cmake b/Meta/CMake/libweb_generators.cmake index 200716be80..7421cbb955 100644 --- a/Meta/CMake/libweb_generators.cmake +++ b/Meta/CMake/libweb_generators.cmake @@ -18,6 +18,15 @@ function (generate_css_implementation) arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/Enums.json" ) + invoke_generator( + "MathFunctions.cpp" + Lagom::GenerateCSSMathFunctions + "${LIBWEB_INPUT_FOLDER}/CSS/MathFunctions.json" + "CSS/MathFunctions.h" + "CSS/MathFunctions.cpp" + arguments -j "${LIBWEB_INPUT_FOLDER}/CSS/MathFunctions.json" + ) + invoke_generator( "MediaFeatureID.cpp" Lagom::GenerateCSSMediaFeatureID diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/CMakeLists.txt b/Meta/Lagom/Tools/CodeGenerators/LibWeb/CMakeLists.txt index 45b4cd368c..36bf2da12b 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/CMakeLists.txt +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/CMakeLists.txt @@ -2,6 +2,7 @@ set(SOURCES "") # avoid pulling SOURCES from parent scope lagom_tool(GenerateCSSEasingFunctions SOURCES GenerateCSSEasingFunctions.cpp LIBS LibMain) lagom_tool(GenerateCSSEnums SOURCES GenerateCSSEnums.cpp LIBS LibMain) +lagom_tool(GenerateCSSMathFunctions SOURCES GenerateCSSMathFunctions.cpp LIBS LibMain) lagom_tool(GenerateCSSMediaFeatureID SOURCES GenerateCSSMediaFeatureID.cpp LIBS LibMain) lagom_tool(GenerateCSSPropertyID SOURCES GenerateCSSPropertyID.cpp LIBS LibMain) lagom_tool(GenerateCSSTransformFunctions SOURCES GenerateCSSTransformFunctions.cpp LIBS LibMain) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSMathFunctions.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSMathFunctions.cpp new file mode 100644 index 0000000000..1092517ffc --- /dev/null +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSMathFunctions.cpp @@ -0,0 +1,384 @@ +/* + * Copyright (c) 2022-2023, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "GeneratorUtil.h" +#include +#include +#include +#include + +ErrorOr generate_header_file(JsonObject& functions_data, Core::File& file); +ErrorOr generate_implementation_file(JsonObject& functions_data, Core::File& file); + +ErrorOr serenity_main(Main::Arguments arguments) +{ + StringView generated_header_path; + StringView generated_implementation_path; + StringView identifiers_json_path; + + Core::ArgsParser args_parser; + args_parser.add_option(generated_header_path, "Path to the MathFunctions header file to generate", "generated-header-path", 'h', "generated-header-path"); + args_parser.add_option(generated_implementation_path, "Path to the MathFunctions implementation file to generate", "generated-implementation-path", 'c', "generated-implementation-path"); + args_parser.add_option(identifiers_json_path, "Path to the JSON file to read from", "json-path", 'j', "json-path"); + args_parser.parse(arguments); + + auto json = TRY(read_entire_file_as_json(identifiers_json_path)); + VERIFY(json.is_object()); + auto math_functions_data = json.as_object(); + + auto generated_header_file = TRY(Core::File::open(generated_header_path, Core::File::OpenMode::Write)); + auto generated_implementation_file = TRY(Core::File::open(generated_implementation_path, Core::File::OpenMode::Write)); + + TRY(generate_header_file(math_functions_data, *generated_header_file)); + TRY(generate_implementation_file(math_functions_data, *generated_implementation_file)); + + return 0; +} + +ErrorOr generate_header_file(JsonObject& functions_data, Core::File& file) +{ + StringBuilder builder; + SourceGenerator generator { builder }; + + TRY(generator.try_append(R"~~~( +// This file is generated by GenerateCSSMathFunctions.cpp + +#pragma once + +namespace Web::CSS { + +enum class MathFunction { +)~~~")); + + TRY(functions_data.try_for_each_member([&](auto& name, auto&) -> ErrorOr { + auto member_generator = TRY(generator.fork()); + TRY(member_generator.set("name:titlecase", TRY(title_casify(name)))); + TRY(member_generator.try_appendln(" @name:titlecase@,"sv)); + return {}; + })); + + TRY(generator.try_append(R"~~~( +}; + +} +)~~~")); + + TRY(file.write_until_depleted(generator.as_string_view().bytes())); + return {}; +} + +ErrorOr generate_calculation_type_check(StringView calculation_variable_name, StringView parameter_types) +{ + StringBuilder builder; + auto allowed_types = parameter_types.split_view('|'); + bool first_type_check = true; + for (auto const& allowed_type_name : allowed_types) { + if (!first_type_check) + TRY(builder.try_append(" || "sv)); + first_type_check = false; + + if (allowed_type_name == ""sv) { + TRY(builder.try_appendff("{}.{}", calculation_variable_name, "matches_angle()"sv)); + } else if (allowed_type_name == ""sv) { + TRY(builder.try_appendff("{}.{}", calculation_variable_name, "matches_dimension()"sv)); + } else if (allowed_type_name == ""sv) { + TRY(builder.try_appendff("{}.{}", calculation_variable_name, "matches_flex()"sv)); + } else if (allowed_type_name == ""sv) { + TRY(builder.try_appendff("{}.{}", calculation_variable_name, "matches_frequency()"sv)); + } else if (allowed_type_name == ""sv) { + TRY(builder.try_appendff("{}.{}", calculation_variable_name, "matches_length()"sv)); + } else if (allowed_type_name == ""sv) { + TRY(builder.try_appendff("{}.{}", calculation_variable_name, "matches_number()"sv)); + } else if (allowed_type_name == ""sv) { + TRY(builder.try_appendff("{}.{}", calculation_variable_name, "matches_percentage()"sv)); + } else if (allowed_type_name == ""sv) { + TRY(builder.try_appendff("{}.{}", calculation_variable_name, "matches_resolution()"sv)); + } else if (allowed_type_name == "