mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 17:17:44 +00:00
LibGUI: Remove GML prefix in favor of proper namespace
Prefixes are very much a C thing which we don't need in C++. This commit moves all GML-related classes in LibGUI into the GUI::GML namespace, a change somewhat overdue.
This commit is contained in:
parent
89201b682b
commit
4931c88b13
17 changed files with 129 additions and 125 deletions
101
Userland/Libraries/LibGUI/GML/Formatter.cpp
Normal file
101
Userland/Libraries/LibGUI/GML/Formatter.cpp
Normal file
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
|
||||
* Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include "Formatter.h"
|
||||
#include "Parser.h"
|
||||
#include <AK/JsonObject.h>
|
||||
#include <AK/JsonValue.h>
|
||||
#include <AK/StringBuilder.h>
|
||||
|
||||
namespace GUI::GML {
|
||||
|
||||
static String format_gml_object(const JsonObject& node, size_t indentation = 0, bool is_inline = false)
|
||||
{
|
||||
StringBuilder builder;
|
||||
|
||||
auto indent = [&builder](size_t indentation) {
|
||||
for (size_t i = 0; i < indentation; ++i)
|
||||
builder.append(" ");
|
||||
};
|
||||
|
||||
struct Property {
|
||||
String key;
|
||||
JsonValue value;
|
||||
};
|
||||
Vector<Property> properties;
|
||||
node.for_each_member([&](auto& key, auto& value) {
|
||||
if (key != "class" && key != "layout" && key != "children")
|
||||
properties.append({ key, value });
|
||||
return IterationDecision::Continue;
|
||||
});
|
||||
|
||||
if (!is_inline)
|
||||
indent(indentation);
|
||||
builder.append('@');
|
||||
builder.append(node.get("class").as_string());
|
||||
builder.append(" {\n");
|
||||
|
||||
for (auto& property : properties) {
|
||||
indent(indentation + 1);
|
||||
builder.append(property.key);
|
||||
builder.append(": ");
|
||||
if (property.value.is_array()) {
|
||||
// custom array serialization as AK's doesn't pretty-print
|
||||
// objects and arrays (we only care about arrays (for now))
|
||||
builder.append("[");
|
||||
auto first = true;
|
||||
property.value.as_array().for_each([&](auto& value) {
|
||||
if (!first)
|
||||
builder.append(", ");
|
||||
first = false;
|
||||
value.serialize(builder);
|
||||
});
|
||||
builder.append("]");
|
||||
} else {
|
||||
property.value.serialize(builder);
|
||||
}
|
||||
builder.append("\n");
|
||||
}
|
||||
|
||||
if (node.has("layout")) {
|
||||
auto layout = node.get("layout").as_object();
|
||||
if (!properties.is_empty())
|
||||
builder.append("\n");
|
||||
indent(indentation + 1);
|
||||
builder.append("layout: ");
|
||||
builder.append(format_gml_object(move(layout), indentation + 1, true));
|
||||
}
|
||||
|
||||
if (node.has("children")) {
|
||||
auto children = node.get("children").as_array();
|
||||
auto first = properties.is_empty() && !node.has("layout");
|
||||
children.for_each([&](auto& value) {
|
||||
if (!first)
|
||||
builder.append("\n");
|
||||
first = false;
|
||||
builder.append(format_gml_object(value.as_object(), indentation + 1));
|
||||
});
|
||||
}
|
||||
|
||||
indent(indentation);
|
||||
builder.append("}\n");
|
||||
|
||||
return builder.to_string();
|
||||
}
|
||||
|
||||
String format_gml(StringView string)
|
||||
{
|
||||
// FIXME: Preserve comments somehow, they're not contained
|
||||
// in the JSON object returned by parse_gml()
|
||||
auto ast = parse_gml(string);
|
||||
if (ast.is_null())
|
||||
return {};
|
||||
VERIFY(ast.is_object());
|
||||
return format_gml_object(ast.as_object());
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue