From 5eb240582303bbbc589fce8a3798aacb5cdf20bc Mon Sep 17 00:00:00 2001 From: Zef Hemel Date: Sun, 9 Feb 2025 17:57:59 +0100 Subject: [PATCH] Fixes #1234 --- plugs/markdown/api.ts | 2 +- plugs/template/util.ts | 39 +++++++++++------------------------- web/cm_plugins/lua_widget.ts | 2 +- 3 files changed, 14 insertions(+), 29 deletions(-) diff --git a/plugs/markdown/api.ts b/plugs/markdown/api.ts index 39223a71..c830041c 100644 --- a/plugs/markdown/api.ts +++ b/plugs/markdown/api.ts @@ -119,7 +119,7 @@ export async function expandCodeWidgets( result = result.markdown; } - const markdown = renderExpressionResult(result); + const markdown = await renderExpressionResult(result); return await parseMarkdown(markdown); } }); diff --git a/plugs/template/util.ts b/plugs/template/util.ts index 89e3d801..72789d14 100644 --- a/plugs/template/util.ts +++ b/plugs/template/util.ts @@ -1,9 +1,9 @@ import type { PageMeta } from "../../plug-api/types.ts"; import { space, system, template } from "@silverbulletmd/silverbullet/syscalls"; import { cleanTemplate } from "./plug_api.ts"; -import { LuaTable } from "$common/space_lua/runtime.ts"; +import { LuaTable, luaToString } from "$common/space_lua/runtime.ts"; -export function defaultJsonTransformer(v: any): string { +export async function defaultJsonTransformer(v: any): Promise { if (v === undefined) { return ""; } @@ -11,33 +11,18 @@ export function defaultJsonTransformer(v: any): string { return v.replaceAll("\n", " ").replaceAll("|", "\\|"); } if (Array.isArray(v)) { - return v.map(defaultJsonTransformer).join(", "); + return (await Promise.all(v.map(defaultJsonTransformer))).join(", "); } else if (v && typeof v === "object") { - return Object.entries(v).map(([k, v]: [string, any]) => - `${k}: ${defaultJsonTransformer(v)}` - ).join(", "); + return luaToString(v); } return "" + v; } -export function jsonObjectToMDTable( - obj: Record, - valueTransformer: (v: any) => string = defaultJsonTransformer, -): string { - const lines = []; - lines.push("| Key | Value |"); - lines.push("| --- | --- |"); - for (const [k, v] of Object.entries(obj)) { - lines.push(`| ${k} | ${valueTransformer(v)} |`); - } - return lines.join("\n"); -} - // Nicely format an array of JSON objects as a Markdown table -export function jsonToMDTable( +export async function jsonToMDTable( jsonArray: any[], - valueTransformer: (v: any) => string = defaultJsonTransformer, -): string { + valueTransformer: (v: any) => Promise = defaultJsonTransformer, +): Promise { const headers = new Set(); for (const entry of jsonArray) { for (const k of Object.keys(entry)) { @@ -66,7 +51,7 @@ export function jsonToMDTable( for (const val of jsonArray) { const el = []; for (const prop of headerList) { - const s = valueTransformer(val[prop]); + const s = await valueTransformer(val[prop]); el.push(s); } lines.push("|" + el.join("|") + "|"); @@ -93,7 +78,7 @@ export async function renderQueryTemplate( }); } -export function renderExpressionResult(result: any): string { +export function renderExpressionResult(result: any): Promise { if (result instanceof LuaTable) { result = result.toJS(); } @@ -109,15 +94,15 @@ export function renderExpressionResult(result: any): string { JSON.stringify(result) }`, ); - return JSON.stringify(result); + return Promise.resolve(JSON.stringify(result)); } } else if (typeof result === "object" && result.constructor === Object) { // if result is a plain object, render as a markdown table return jsonToMDTable([result]); } else if (Array.isArray(result)) { // Not-object array, let's render it as a markdown list - return result.map((item) => `- ${item}`).join("\n"); + return Promise.resolve(result.map((item) => `- ${item}`).join("\n")); } else { - return "" + result; + return Promise.resolve("" + result); } } diff --git a/web/cm_plugins/lua_widget.ts b/web/cm_plugins/lua_widget.ts index 44b2bc2f..6f472b7a 100644 --- a/web/cm_plugins/lua_widget.ts +++ b/web/cm_plugins/lua_widget.ts @@ -99,7 +99,7 @@ export class LuaWidget extends WidgetType { // If there is a markdown key, use it, otherwise render the objects as a markdown table let mdContent = widgetContent.markdown; if (!mdContent) { - mdContent = renderExpressionResult(widgetContent); + mdContent = await renderExpressionResult(widgetContent); } let mdTree = parse( extendedMarkdownLanguage,