prettier-plugin-slidev
Version:
A prettier plugin for Slidev
112 lines (111 loc) • 2.54 kB
JavaScript
import { parse as l } from "@slidev/parser";
import { doc as c } from "prettier";
const d = "slidev-ast", p = {
astFormat: d,
locStart(t) {
if (t.type !== "markdown")
throw new Error("not implemented");
return 0;
},
locEnd(t) {
if (t.type !== "markdown")
throw new Error("not implemented");
return t.raw.length;
},
async parse(t) {
const { slides: e, raw: n } = await l(t);
return {
type: "markdown",
raw: n,
slides: e.map((s, i) => ({
type: "slide",
info: Object.assign(s, {
isFirstSlide: i === 0
})
}))
};
}
}, { join: u, line: a, hardline: r } = c.builders, w = {
print(t, e, n, s) {
const i = t.getNode();
if (!i)
throw new Error("Node is null");
if (i.type === "markdown")
return u([r, "---", r], t.map(n, "slides"));
if (i.type === "slide")
return S(i.info);
throw new Error(`Unknown node type: ${i}`);
},
embed(t) {
const e = t.getNode();
return e.type === "slide" ? (n) => y(e.info, n) : null;
}
};
async function y(t, e) {
return [
...await f(t, e),
...await g(t, e),
...m(t)
];
}
async function f(t, e) {
var o;
const n = ((o = t.frontmatterRaw) == null ? void 0 : o.trim()) ?? "";
if (n.length === 0)
return t.isFirstSlide ? [] : [r];
const s = await e(n, {
parser: "yaml"
}), i = t.content.trim() ? [r] : [];
return t.frontmatterStyle === "yaml" ? [r, "```yaml", r, s, r, "```", r, i] : [t.isFirstSlide ? ["---", r] : [], s, r, "---", r, i];
}
async function g(t, e) {
return t.content.trim().length === 0 ? [] : [
await e(t.content, {
parser: "markdown"
}),
r
];
}
function m(t) {
return t.note ? [r, "<!--", a, t.note.trim(), a, "-->", r] : [];
}
function S(t) {
return [
...h(t),
...E(t),
...m(t)
];
}
function h(t) {
var s;
const e = ((s = t.frontmatterRaw) == null ? void 0 : s.trim()) ?? "";
if (e.length === 0)
return t.isFirstSlide ? [] : [r];
const n = t.content.trim() ? [r] : [];
return t.frontmatterStyle === "yaml" ? [r, "```yaml", r, e, r, "```", r, n] : [t.isFirstSlide ? ["---", r] : [], e, r, "---", r, n];
}
function E(t) {
return t.content.trim().length === 0 ? [] : [
t.content,
r
];
}
const N = {
languages: [
{
name: "slidev",
parsers: ["slidev"],
extensions: [".md"],
vscodeLanguageIds: ["markdown"]
}
],
parsers: {
slidev: p
},
printers: {
[d]: w
}
};
export {
N as default
};