sisal
Version:
An 11ty plugin that integrates Ligature and Wander.
85 lines (79 loc) • 2.26 kB
JavaScript
import markdownit from 'markdown-it'
import { run } from "@ligature/ligature";
import he from "he";
function printNetwork(n) {
let res = "{\n"
for (let [e,a,v] of n) {
res = res + " " + printValue(e) + " " + printValue(a) + " " + printValue(v) + ",\n"
}
return res + "}"
}
function printValue(value) {
if (value.type == 'element') {
return value.value
} else if (value.type == 'literal') {
return value.value
} else if (value.type == 'network') {
return printNetwork(value.value)
} else if (value.type == 'quote') {
throw "???"
} else if (value.type == 'variable') {
return value.value
} else {
throw "should never reach"
}
}
const md = markdownit()
function createUiComponent(buffer) {
return [
{
name: "write",
doc: "Write a value.",
action: (args) => {
if (args.length == 1) {
buffer.push(printValue(args[0]))
} else {
throw "Illegal call to write."
}
}
},
{
name: "md",
doc: "Write markdown content.",
action: (args) => {
if (args.length == 1) {
buffer.push(md.render(args[0].value))
} else {
throw "Illegal call to md."
}
}
}
]
}
export default function sisalPlugin(eleventyConfig, pluginOptions) {
eleventyConfig.addDataExtension("wander", (contents) => {
let res = run(contents, [])
if (res.type == "resultset") {
let mappedRes = res.value.map(resultSet => Object.fromEntries(resultSet))
return mappedRes
}
});
eleventyConfig.addMarkdownHighlighter((str, lang) => {
if (lang != undefined && lang === "wander") {
let result = run(str, [])
return "<span class='code'>" + he.encode(str) + "</span>\n<hr>\nResult:\n" + he.encode(printValue(result))
} else {
return he.encode(str)
}
})
eleventyConfig.addTemplateFormats("wander.template")
eleventyConfig.addExtension("wander.template", {
compile: async (inputContent) => {
return async () => {
var buffer = [];
run(inputContent, createUiComponent(buffer))
return buffer.join("")
};
},
});
}