43 if (!spans.is_array()) {
44 qWarning(
"render_signature_spans: expected JSON array, got %s",
50 for (
const auto &s : spans) {
51 const auto role = s.value(
"role",
"");
52 const auto text = s.value(
"text",
"");
53 const bool hasHref = s.contains(
"href");
54 const auto href = s.value(
"href",
"");
56 if (role ==
"extra") {
57 result += R"(<code class="details extra" translate="no">)";
58 if (s.contains(
"children") && s[
"children"].is_array()) {
59 for (
const auto &c : s[
"children"]) {
60 if (c.value(
"role",
"") ==
"external-ref")
61 result +=
"<a href=\"" + c.value(
"href",
"") +
"\">"
62 + escapeHtml(c.value(
"text",
"")) +
"</a>";
64 result += escapeHtml(c.value(
"text",
""));
67 result += escapeHtml(text);
70 }
else if (role ==
"type") {
71 result += R"(<span class="type">)";
73 result +=
"<a href=\"" + href +
"\">";
74 result += escapeHtml(text);
78 }
else if (role ==
"name") {
79 result += R"(<span class="name">)";
81 result +=
"<a href=\"" + href +
"\">";
82 result += escapeHtml(text);
86 }
else if (role ==
"parameter") {
87 result +=
"<i>" + escapeHtml(text) +
"</i>";
88 }
else if (role ==
"external-ref") {
89 result +=
"<a href=\"" + href +
"\">" + escapeHtml(text) +
"</a>";
90 }
else if (role ==
"template-decl") {
91 result += R"(<span class="template-decl">)";
92 result += escapeHtml(text);
93 if (s.contains(
"children") && s[
"children"].is_array()) {
94 for (
const auto &c : s[
"children"]) {
95 if (c.value(
"role",
"") ==
"type")
96 result += R"(<span class="type">)" + escapeHtml(c.value(
"text",
""))
99 result += escapeHtml(c.value(
"text",
""));
104 result += escapeHtml(text);
112 env.add_callback(
"escape_html", 1, [](inja::Arguments &args) {
113 return escapeHtml(args.at(0)->get<std::string>());
116 env.add_callback(
"render_signature_spans", 1, [](inja::Arguments &args) {
117 return renderSignatureSpans(*args.at(0));
127 env.add_callback(
"list_separator", 2, [](inja::Arguments &args) {
128 const auto pos = args.at(0)->get<qsizetype>();
129 const auto total = args.at(1)->get<qsizetype>();
130 return TextUtils::separator(pos, total).toStdString();
133 env.add_callback(
"escape_md_table", 1, [](inja::Arguments &args) {
134 auto input = args.at(0)->get<std::string>();
136 buffer.reserve(input.size() + input.size() / 8);
137 for (
char c : input) {
161 env.add_callback(
"is_odd", 1, [](inja::Arguments &args) {
162 return args.at(0)->get<qsizetype>() % 2 != 0;
249nlohmann::json InjaBridge::toInjaJson(
const QJsonObject &obj)
251 nlohmann::json result = nlohmann::json::object();
253 for (
const auto &[key, value] : obj.asKeyValueRange())
254 result[key.toString().toUtf8().toStdString()] = toInjaJson(value);
288QString InjaBridge::render(
const QString &templateStr,
const QJsonObject &data)
290 inja::Environment env;
295 env.set_line_statement(
"%!");
296 env.set_trim_blocks(
true);
297 env.set_lstrip_blocks(
true);
298 registerCallbacks(env);
299 nlohmann::json jsonData = toInjaJson(data);
301 std::string templateUtf8 = templateStr.toUtf8().toStdString();
302 std::string resultUtf8 = env.render(templateUtf8, jsonData);
304 return QString::fromUtf8(resultUtf8.c_str());
322QString InjaBridge::render(
const QString &templateStr,
const QJsonObject &data,
323 const IncludeCallback &includeCallback)
325 inja::Environment env;
326 env.set_line_statement(
"%!");
327 env.set_trim_blocks(
true);
328 env.set_lstrip_blocks(
true);
329 registerCallbacks(env);
330 env.set_search_included_templates_in_files(
false);
331 env.set_include_callback(
332 [&includeCallback, &env](
const std::filesystem::path & ,
333 const std::string &name) -> inja::Template {
334 QString content = includeCallback(QString::fromStdString(name));
335 if (content.isEmpty()) {
337 inja::FileError(
"include not found: '" + name +
"'"));
339 return env.parse(content.toUtf8().toStdString());
342 nlohmann::json jsonData = toInjaJson(data);
343 std::string templateUtf8 = templateStr.toUtf8().toStdString();
344 std::string resultUtf8 = env.render(templateUtf8, jsonData);
346 return QString::fromUtf8(resultUtf8.c_str());
358QString InjaBridge::renderFile(
const QString &templatePath,
const QJsonObject &data)
360 inja::Environment env;
361 env.set_line_statement(
"%!");
362 env.set_trim_blocks(
true);
363 env.set_lstrip_blocks(
true);
364 registerCallbacks(env);
365 nlohmann::json jsonData = toInjaJson(data);
367 std::string pathUtf8 = templatePath.toUtf8().toStdString();
368 std::string resultUtf8 = env.render_file(pathUtf8, jsonData);
370 return QString::fromUtf8(resultUtf8.c_str());