2020-01-18 09:38:21 +01:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
|
|
*
|
2021-04-22 01:24:48 -07:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
2020-01-18 09:38:21 +01:00
|
|
|
*/
|
|
|
|
|
2020-11-15 13:11:21 +01:00
|
|
|
#include <AK/ByteBuffer.h>
|
2019-11-18 11:12:58 +01:00
|
|
|
#include <AK/JsonObject.h>
|
2020-10-23 18:37:35 +02:00
|
|
|
#include <AK/SourceGenerator.h>
|
2019-11-18 11:12:58 +01:00
|
|
|
#include <AK/StringBuilder.h>
|
2020-02-06 15:04:03 +01:00
|
|
|
#include <LibCore/File.h>
|
2019-11-18 11:12:58 +01:00
|
|
|
#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) {
|
2020-10-23 18:37:35 +02:00
|
|
|
warnln("usage: {} <path/to/CSS/Properties.json>", argv[0]);
|
2019-11-18 11:12:58 +01:00
|
|
|
return 1;
|
|
|
|
}
|
2020-02-02 12:34:39 +01:00
|
|
|
auto file = Core::File::construct(argv[1]);
|
2021-05-12 13:56:43 +04:30
|
|
|
if (!file->open(Core::OpenMode::ReadOnly))
|
2019-11-18 11:12:58 +01:00
|
|
|
return 1;
|
|
|
|
|
|
|
|
auto json = JsonValue::from_string(file->read_all());
|
2021-02-23 20:42:32 +01:00
|
|
|
VERIFY(json.has_value());
|
|
|
|
VERIFY(json.value().is_object());
|
2019-11-18 11:12:58 +01:00
|
|
|
|
2020-10-23 18:37:35 +02:00
|
|
|
StringBuilder builder;
|
|
|
|
SourceGenerator generator { builder };
|
|
|
|
|
|
|
|
generator.append(R"~~~(
|
|
|
|
#include <AK/Assertions.h>
|
|
|
|
#include <LibWeb/CSS/PropertyID.h>
|
|
|
|
|
|
|
|
namespace Web::CSS {
|
2019-11-18 11:12:58 +01:00
|
|
|
|
2020-10-23 18:37:35 +02:00
|
|
|
PropertyID property_id_from_string(const StringView& string)
|
|
|
|
{
|
|
|
|
)~~~");
|
2019-11-18 11:12:58 +01:00
|
|
|
|
2020-06-10 21:40:27 -07:00
|
|
|
json.value().as_object().for_each_member([&](auto& name, auto& value) {
|
2021-02-23 20:42:32 +01:00
|
|
|
VERIFY(value.is_object());
|
2020-10-23 18:37:35 +02:00
|
|
|
|
|
|
|
auto member_generator = generator.fork();
|
|
|
|
member_generator.set("name", name);
|
|
|
|
member_generator.set("name:titlecase", title_casify(name));
|
|
|
|
member_generator.append(R"~~~(
|
|
|
|
if (string.equals_ignoring_case("@name@"))
|
|
|
|
return PropertyID::@name:titlecase@;
|
|
|
|
)~~~");
|
2019-11-18 11:12:58 +01:00
|
|
|
});
|
|
|
|
|
2020-10-23 18:37:35 +02:00
|
|
|
generator.append(R"~~~(
|
|
|
|
return PropertyID::Invalid;
|
|
|
|
}
|
2019-11-18 11:12:58 +01:00
|
|
|
|
2020-10-23 18:37:35 +02:00
|
|
|
const char* string_from_property_id(PropertyID property_id) {
|
|
|
|
switch (property_id) {
|
|
|
|
)~~~");
|
2019-11-18 11:12:58 +01:00
|
|
|
|
2020-06-10 21:40:27 -07:00
|
|
|
json.value().as_object().for_each_member([&](auto& name, auto& value) {
|
2021-02-23 20:42:32 +01:00
|
|
|
VERIFY(value.is_object());
|
2020-10-23 18:37:35 +02:00
|
|
|
|
|
|
|
auto member_generator = generator.fork();
|
|
|
|
member_generator.set("name", name);
|
|
|
|
member_generator.set("name:titlecase", title_casify(name));
|
|
|
|
member_generator.append(R"~~~(
|
|
|
|
case PropertyID::@name:titlecase@:
|
|
|
|
return "@name@";
|
|
|
|
)~~~");
|
2019-11-18 11:12:58 +01:00
|
|
|
});
|
|
|
|
|
2020-10-23 18:37:35 +02:00
|
|
|
generator.append(R"~~~(
|
|
|
|
default:
|
|
|
|
return "(invalid CSS::PropertyID)";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-05 10:12:37 -04:00
|
|
|
bool is_pseudo_property(PropertyID property_id)
|
|
|
|
{
|
|
|
|
switch (property_id) {
|
|
|
|
)~~~");
|
|
|
|
|
|
|
|
json.value().as_object().for_each_member([&](auto& name, auto& value) {
|
|
|
|
VERIFY(value.is_object());
|
|
|
|
|
|
|
|
auto pseudo = value.as_object().get_or("pseudo", false);
|
|
|
|
VERIFY(pseudo.is_bool());
|
|
|
|
|
|
|
|
if (pseudo.as_bool()) {
|
|
|
|
auto member_generator = generator.fork();
|
|
|
|
member_generator.set("name:titlecase", title_casify(name));
|
|
|
|
member_generator.append(R"~~~(
|
|
|
|
case PropertyID::@name:titlecase@:
|
|
|
|
return true;
|
|
|
|
)~~~");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
generator.append(R"~~~(
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-23 18:37:35 +02:00
|
|
|
} // namespace Web::CSS
|
2021-04-05 10:12:37 -04:00
|
|
|
|
2020-10-23 18:37:35 +02:00
|
|
|
)~~~");
|
|
|
|
|
|
|
|
outln("{}", generator.as_string_view());
|
2019-11-18 11:12:58 +01:00
|
|
|
}
|