41 if (!spans.is_array()) {
42 qWarning(
"render_signature_spans: expected JSON array, got %s",
48 for (
const auto &s : spans) {
49 const auto role = s.value(
"role",
"");
50 const auto text = s.value(
"text",
"");
51 const bool hasHref = s.contains(
"href");
52 const auto href = s.value(
"href",
"");
54 if (role ==
"extra") {
55 result += R"(<code class="details extra" translate="no">)";
56 if (s.contains(
"children") && s[
"children"].is_array()) {
57 for (
const auto &c : s[
"children"]) {
58 if (c.value(
"role",
"") ==
"external-ref")
59 result +=
"<a href=\"" + c.value(
"href",
"") +
"\">"
60 + escapeHtml(c.value(
"text",
"")) +
"</a>";
62 result += escapeHtml(c.value(
"text",
""));
65 result += escapeHtml(text);
68 }
else if (role ==
"type") {
69 result += R"(<span class="type">)";
71 result +=
"<a href=\"" + href +
"\">";
72 result += escapeHtml(text);
76 }
else if (role ==
"name") {
77 result += R"(<span class="name">)";
79 result +=
"<a href=\"" + href +
"\">";
80 result += escapeHtml(text);
84 }
else if (role ==
"parameter") {
85 result +=
"<i>" + escapeHtml(text) +
"</i>";
86 }
else if (role ==
"external-ref") {
87 result +=
"<a href=\"" + href +
"\">" + escapeHtml(text) +
"</a>";
88 }
else if (role ==
"template-decl") {
89 result += R"(<span class="template-decl">)";
90 if (s.contains(
"children") && s[
"children"].is_array()) {
91 for (
const auto &c : s[
"children"]) {
92 if (c.value(
"role",
"") ==
"type")
93 result += R"(<span class="type">)" + escapeHtml(c.value(
"text",
""))
96 result += escapeHtml(c.value(
"text",
""));
101 result += escapeHtml(text);
109 env.add_callback(
"escape_html", 1, [](inja::Arguments &args) {
110 return escapeHtml(args.at(0)->get<std::string>());
113 env.add_callback(
"render_signature_spans", 1, [](inja::Arguments &args) {
114 return renderSignatureSpans(*args.at(0));
117 env.add_callback(
"escape_md_table", 1, [](inja::Arguments &args) {
118 auto input = args.at(0)->get<std::string>();
120 buffer.reserve(input.size() + input.size() / 8);
121 for (
char c : input) {
223nlohmann::json InjaBridge::toInjaJson(
const QJsonObject &obj)
225 nlohmann::json result = nlohmann::json::object();
227 for (
const auto &[key, value] : obj.asKeyValueRange())
228 result[key.toString().toUtf8().toStdString()] = toInjaJson(value);
262QString InjaBridge::render(
const QString &templateStr,
const QJsonObject &data)
264 inja::Environment env;
269 env.set_line_statement(
"%!");
270 env.set_trim_blocks(
true);
271 env.set_lstrip_blocks(
true);
272 registerCallbacks(env);
273 nlohmann::json jsonData = toInjaJson(data);
275 std::string templateUtf8 = templateStr.toUtf8().toStdString();
276 std::string resultUtf8 = env.render(templateUtf8, jsonData);
278 return QString::fromUtf8(resultUtf8.c_str());
296QString InjaBridge::render(
const QString &templateStr,
const QJsonObject &data,
297 const IncludeCallback &includeCallback)
299 inja::Environment env;
300 env.set_line_statement(
"%!");
301 env.set_trim_blocks(
true);
302 env.set_lstrip_blocks(
true);
303 registerCallbacks(env);
304 env.set_search_included_templates_in_files(
false);
305 env.set_include_callback(
306 [&includeCallback, &env](
const std::filesystem::path & ,
307 const std::string &name) -> inja::Template {
308 QString content = includeCallback(QString::fromStdString(name));
309 if (content.isEmpty()) {
311 inja::FileError(
"include not found: '" + name +
"'"));
313 return env.parse(content.toUtf8().toStdString());
316 nlohmann::json jsonData = toInjaJson(data);
317 std::string templateUtf8 = templateStr.toUtf8().toStdString();
318 std::string resultUtf8 = env.render(templateUtf8, jsonData);
320 return QString::fromUtf8(resultUtf8.c_str());
332QString InjaBridge::renderFile(
const QString &templatePath,
const QJsonObject &data)
334 inja::Environment env;
335 env.set_line_statement(
"%!");
336 env.set_trim_blocks(
true);
337 env.set_lstrip_blocks(
true);
338 registerCallbacks(env);
339 nlohmann::json jsonData = toInjaJson(data);
341 std::string pathUtf8 = templatePath.toUtf8().toStdString();
342 std::string resultUtf8 = env.render_file(pathUtf8, jsonData);
344 return QString::fromUtf8(resultUtf8.c_str());