import { ALL as HTML } from "./lib/html"; import { parse } from "./parser"; import { runNoctl, Vm } from "./vm"; import { AsHtml } from "./words"; /** * Basic unit of information, also an "actor" in the programming system */ type Card = { /** Unique identifier */ id: number; /** Key-value properties on the card */ fields: Record; /** Eventually: a markdown string containing code, but for now, just code */ code: string; }; /** * @param state VM state * @param code Script to run * @returns Markup to render / output */ function renderCard(state: Vm, code: string) { const script = parse(code); if (script[0]) { runNoctl(state, script[1], (word) => (state.output += AsHtml(word) + "\n")); } else { state.output = script[1]; } return state.output; } /** * Global state: a single card */ let theCard: Card = { id: 100, fields: {}, code: "", }; const TEXTAREA_STYLE: Partial = { display: "block", width: "100%", }; const codeInput = document.createElement("textarea"); Object.assign(codeInput.style, TEXTAREA_STYLE, { height: "20em" }); codeInput.value = String.raw` h1 "Hello, World!" para [2 + 2] block { This is a paragraph of text, with one [b bold] word. Yes, this means there has to be some magic in text processing... this won't work. } block -red "Beware!" para "All text should be quoted, it's clearer that way. & blockquotes already should contain paragraphs. (maybe normalize nested paragraphs)" block { First block } { Second block Is this markdown-parsed? [button "No we want to render UI" \\{noop}] } { Since we want escapes to work, these blocks [i will] be subject to substitutions, maybe via a relaxed bareWordTmpl. } # A comment para { line endings escaped\ one slash not escaped if \\ two slashes escaped with a slash if \\\ three slashes not escaped with two slashes if \\\\ four slashes escaped with two slashes if \\\\\ five slashes not escaped with three slashes if \\\\\\ six slashes } `.trim(); const rerender = Object.assign(document.createElement("button"), { onclick: () => render(), textContent: "Render", }); const state = document.createElement("pre"); const display = document.createElement("blockquote"); const debugDisplay = document.createElement("pre"); function render() { theCard.code = codeInput.value; const vm: Vm = { mode: "render", commands: { ...HTML }, output: "", }; const html = renderCard(vm, theCard.code); state.textContent = JSON.stringify(theCard, null, 2); display.innerHTML = html; debugDisplay.textContent = html; } render(); document.body.append( fieldInput, codeInput, rerender, state, display, debugDisplay );