Fixes #559
This commit is contained in:
parent
b9bc3b1298
commit
7fec3fe587
@ -104,7 +104,7 @@ export async function extractFrontmatter(
|
||||
// Updates the front matter of a markdown document and returns the text as a rendered string
|
||||
export async function prepareFrontmatterDispatch(
|
||||
tree: ParseTree,
|
||||
data: Record<string, any>,
|
||||
data: string | Record<string, any>,
|
||||
): Promise<any> {
|
||||
let dispatchData: any = null;
|
||||
await traverseTreeAsync(tree, async (t) => {
|
||||
@ -114,14 +114,20 @@ export async function prepareFrontmatterDispatch(
|
||||
const yamlText = renderToText(bodyNode);
|
||||
|
||||
try {
|
||||
const parsedYaml = await YAML.parse(yamlText) as any;
|
||||
const newData = { ...parsedYaml, ...data };
|
||||
let frontmatterText = "";
|
||||
if (typeof data === "string") {
|
||||
frontmatterText = yamlText + data + "\n";
|
||||
} else {
|
||||
const parsedYaml = await YAML.parse(yamlText) as any;
|
||||
const newData = { ...parsedYaml, ...data };
|
||||
frontmatterText = await YAML.stringify(newData);
|
||||
}
|
||||
// Patch inline
|
||||
dispatchData = {
|
||||
changes: {
|
||||
from: bodyNode.from,
|
||||
to: bodyNode.to,
|
||||
insert: await YAML.stringify(newData),
|
||||
insert: frontmatterText,
|
||||
},
|
||||
};
|
||||
} catch (e: any) {
|
||||
@ -133,12 +139,19 @@ export async function prepareFrontmatterDispatch(
|
||||
});
|
||||
if (!dispatchData) {
|
||||
// If we didn't find frontmatter, let's add it
|
||||
let frontmatterText = "";
|
||||
if (typeof data === "string") {
|
||||
frontmatterText = data + "\n";
|
||||
} else {
|
||||
frontmatterText = await YAML.stringify(data);
|
||||
}
|
||||
const fullFrontmatterText = "---\n" + frontmatterText +
|
||||
"---\n";
|
||||
dispatchData = {
|
||||
changes: {
|
||||
from: 0,
|
||||
to: 0,
|
||||
insert: "---\n" + await YAML.stringify(data) +
|
||||
"---\n",
|
||||
insert: fullFrontmatterText,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ export async function templateDirectiveRenderer(
|
||||
|
||||
// if it's a template injection (not a literal "include")
|
||||
if (directive === "use") {
|
||||
newBody = await renderTemplate(newBody, pageMeta, parsedArgs);
|
||||
newBody = (await renderTemplate(newBody, pageMeta, parsedArgs)).text;
|
||||
|
||||
// Recursively render directives
|
||||
const tree = await markdown.parseMarkdown(newBody);
|
||||
|
@ -16,7 +16,7 @@ export async function renderTemplate(
|
||||
templateText: string,
|
||||
pageMeta: PageMeta,
|
||||
data: any = {},
|
||||
): Promise<string> {
|
||||
): Promise<{ frontmatter?: string; text: string }> {
|
||||
const tree = await markdown.parseMarkdown(templateText);
|
||||
const frontmatter: Partial<TemplateObject> = await extractFrontmatter(tree, {
|
||||
removeFrontmatterSection: true,
|
||||
@ -24,15 +24,20 @@ export async function renderTemplate(
|
||||
});
|
||||
templateText = renderToText(tree).trimStart();
|
||||
// If a 'frontmatter' key was specified in the frontmatter, use that as the frontmatter
|
||||
let frontmatterText: string | undefined;
|
||||
if (frontmatter.frontmatter) {
|
||||
if (typeof frontmatter.frontmatter === "string") {
|
||||
templateText = "---\n" + frontmatter.frontmatter + "---\n" + templateText;
|
||||
frontmatterText = frontmatter.frontmatter;
|
||||
} else {
|
||||
templateText = "---\n" + (await YAML.stringify(frontmatter.frontmatter)) +
|
||||
"---\n" + templateText;
|
||||
frontmatterText = await YAML.stringify(frontmatter.frontmatter);
|
||||
}
|
||||
}
|
||||
return handlebars.renderTemplate(templateText, data, { page: pageMeta });
|
||||
return {
|
||||
frontmatter: frontmatterText,
|
||||
text: await handlebars.renderTemplate(templateText, data, {
|
||||
page: pageMeta,
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -5,7 +5,7 @@ export function renderTemplate(
|
||||
templateText: string,
|
||||
pageMeta: PageMeta,
|
||||
data: any = {},
|
||||
): Promise<string> {
|
||||
): Promise<{ frontmatter?: string; text: string }> {
|
||||
return system.invokeFunction(
|
||||
"template.renderTemplate",
|
||||
templateText,
|
||||
|
@ -1,5 +1,8 @@
|
||||
import { editor, handlebars, markdown, space, YAML } from "$sb/syscalls.ts";
|
||||
import { extractFrontmatter } from "$sb/lib/frontmatter.ts";
|
||||
import {
|
||||
extractFrontmatter,
|
||||
prepareFrontmatterDispatch,
|
||||
} from "$sb/lib/frontmatter.ts";
|
||||
import { renderToText } from "$sb/lib/tree.ts";
|
||||
import { niceDate, niceTime } from "$sb/lib/dates.ts";
|
||||
import { readSettings } from "$sb/lib/settings_page.ts";
|
||||
@ -29,13 +32,26 @@ export async function templateSlashComplete(
|
||||
export async function insertSlashTemplate(slashCompletion: SlashCompletion) {
|
||||
const pageObject = await loadPageObject(slashCompletion.pageName);
|
||||
|
||||
let templateText = await space.readPage(slashCompletion.templatePage);
|
||||
templateText = await renderTemplate(templateText, pageObject);
|
||||
const templateText = await space.readPage(slashCompletion.templatePage);
|
||||
let { frontmatter, text } = await renderTemplate(templateText, pageObject);
|
||||
|
||||
const cursorPos = await editor.getCursor();
|
||||
const carretPos = templateText.indexOf("|^|");
|
||||
templateText = templateText.replace("|^|", "");
|
||||
await editor.insertAtCursor(templateText);
|
||||
|
||||
if (frontmatter) {
|
||||
frontmatter = frontmatter.trim();
|
||||
const pageText = await editor.getText();
|
||||
const tree = await markdown.parseMarkdown(pageText);
|
||||
|
||||
const dispatch = await prepareFrontmatterDispatch(tree, frontmatter);
|
||||
if (cursorPos === 0) {
|
||||
dispatch.selection = { anchor: frontmatter.length + 9 };
|
||||
}
|
||||
await editor.dispatch(dispatch);
|
||||
}
|
||||
|
||||
const carretPos = text.indexOf("|^|");
|
||||
text = text.replace("|^|", "");
|
||||
await editor.insertAtCursor(text);
|
||||
if (carretPos !== -1) {
|
||||
await editor.moveCursor(cursorPos + carretPos);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user