X-Git-Url: https://git.ladys.computer/GitWikiWeb/blobdiff_plain/5428dd106d223e93f02cff3bdb49b136fa040245..38a7374d66f9a54f621aa192dcbbd573396e007a:/build.js
diff --git a/build.js b/build.js
index 8eab7f4..bd8ff27 100644
--- a/build.js
+++ b/build.js
@@ -20,7 +20,7 @@
// export GITWIKIWEB=/srv/git/GitWikiWeb
// git archive --remote=$GITWIKIWEB HEAD build.js \
// | tar -xO \
-// | deno run -A - ~/public/wiki $GITWIKIWEB
+// | deno run -A - ~/public/wiki $GITWIKIWEB current
//
// The directory `~/public/wiki` (or whatever you specify as the first
// argument to `deno run -A -`) **will be deleted** and a new static
@@ -37,7 +37,11 @@
import {
emptyDir,
ensureDir,
-} from "https://deno.land/std@0.195.0/fs/mod.ts";
+} from "https://deno.land/std@0.196.0/fs/mod.ts";
+import {
+ JSON_SCHEMA,
+ parse as parseYaml,
+} from "https://deno.land/std@0.196.0/yaml/mod.ts";
import djot from "npm:@djot/djot@0.2.3";
import { Parser } from "npm:htmlparser2@9.0.0";
import { DomHandler, Element, Text } from "npm:domhandler@5.0.3";
@@ -46,6 +50,7 @@ import domSerializer from "npm:dom-serializer@2.0.0";
const DESTINATION = Deno.args[0] ?? "~/public/wiki";
const REMOTE = Deno.args[1] ?? "/srv/git/GitWikiWeb";
+const REV = Deno.args[2] ?? "HEAD";
const READ_ONLY = {
configurable: false,
@@ -53,6 +58,8 @@ const READ_ONLY = {
writable: false,
};
+const NIL = Object.preventExtensions(Object.create(null));
+
const rawBlock = (strings, ...substitutions) => ({
tag: "raw_block",
format: "html",
@@ -87,7 +94,7 @@ const getDOM = (source) => {
const getRemoteContent = async (pathName) => {
const getArchive = new Deno.Command("git", {
- args: ["archive", `--remote=${REMOTE}`, "HEAD", pathName],
+ args: ["archive", `--remote=${REMOTE}`, REV, pathName],
stdout: "piped",
stderr: "piped",
}).spawn();
@@ -171,7 +178,7 @@ const listOfInternalLinks = (references, wrapper = ($) => $) => ({
),
});
-const diffReferences = async (hash) => {
+const diffReferences = async (hash, againstHead = false) => {
const diff = new Deno.Command("git", {
args: [
"diff-tree",
@@ -180,7 +187,7 @@ const diffReferences = async (hash) => {
"--name-only",
"--no-renames",
"--diff-filter=AM",
- hash,
+ ...(againstHead ? [hash, "HEAD"] : [hash]),
],
stdout: "piped",
stderr: "piped",
@@ -215,7 +222,7 @@ class GitWikiWebPage {
#internalLinks = new Set();
#externalLinks = new Map();
- constructor(namespace, name, ast, source) {
+ constructor(namespace, name, ast, source, config) {
const internalLinks = this.#internalLinks;
const externalLinks = this.#externalLinks;
const sections = Object.create(null);
@@ -295,6 +302,29 @@ class GitWikiWebPage {
e.children.push(...links_section);
},
},
+ emph: {
+ enter: (_) => {},
+ exit: (e) => {
+ const attributes = e.attributes ?? NIL;
+ const { as } = attributes;
+ if (as) {
+ delete attributes.as;
+ if (
+ as == "b" || as == "cite" || as == "i" || as == "u"
+ ) {
+ return [
+ rawInline`<${as}>`,
+ ...e.children,
+ rawInline`${as}>`,
+ ];
+ } else {
+ /* do nothing */
+ }
+ } else {
+ /* do nothing */
+ }
+ },
+ },
hard_break: {
enter: (_) => {
if (titleSoFar != null) {
@@ -446,6 +476,20 @@ class GitWikiWebPage {
},
exit: (_) => {},
},
+ symb: {
+ enter: (e) => {
+ const { alias } = e;
+ const codepoint = /^U\+([0-9A-Fa-f]+)$/u.exec(alias)?.[1];
+ if (codepoint) {
+ return str`${
+ String.fromCodePoint(parseInt(codepoint, 16))
+ }`;
+ } else {
+ const resolved = config.symbols?.[alias];
+ return resolved != null ? str`${resolved}` : e;
+ }
+ },
+ },
};
});
Object.defineProperties(this, {
@@ -470,8 +514,11 @@ class GitWikiWebPage {
}
{
+ const config = await getRemoteContent("config.yaml").then((yaml) =>
+ parseYaml(yaml, { schema: JSON_SCHEMA })
+ );
const ls = new Deno.Command("git", {
- args: ["ls-tree", "-rz", "live"],
+ args: ["ls-tree", "-rz", "HEAD"],
stdout: "piped",
stderr: "piped",
}).spawn();
@@ -543,6 +590,7 @@ class GitWikiWebPage {
console.warn(`Djot(${reference}): ${$.render()}`),
}),
source,
+ config,
);
const reference = `${namespace}:${pageName}`;
pages.set(reference, page);
@@ -564,6 +612,7 @@ class GitWikiWebPage {
console.warn(`Djot(${reference}): ${$.render()}`),
}),
source,
+ config,
);
pages.set(reference, page);
}
@@ -638,7 +687,9 @@ class GitWikiWebPage {
]).then(logErrorsAndCollectResults);
const refs = [];
current = hash;
- for (const ref of (await diffReferences(current))) {
+ for (
+ const ref of (await diffReferences(current, !recency))
+ ) {
if (seen.has(ref)) {
/* do nothing */
} else {
@@ -646,7 +697,7 @@ class GitWikiWebPage {
seen.add(ref);
}
}
- results[recency] = { dateTime, humanReadable, refs };
+ results[recency] = { dateTime, hash, humanReadable, refs };
} while (recency-- > 0 && current && current != commit);
return results;
})(),
@@ -707,14 +758,16 @@ class GitWikiWebPage {
refs,
} = result;
yield* listOfInternalLinks(refs, (link) => ({
- tag: index ? "strong" : "span",
+ tag: index == 0 ? "span" : "strong",
attributes: { "data-recency": `${index}` },
children: [
link,
- str` `,
- rawInline`()`,
+ ...(index == 0 ? [] : [
+ str` `,
+ rawInline`()`,
+ ]),
],
})).children;
} else {
@@ -763,7 +816,7 @@ class GitWikiWebPage {
},
heading: {
enter: (e) => {
- const attributes = e.attributes ?? Object.create(null);
+ const attributes = e.attributes ?? NIL;
if (
isNavigationPage && e.level == 1 &&
attributes?.class == "main"
@@ -806,8 +859,7 @@ class GitWikiWebPage {
}
if (children.length == 0) {
const section =
- pages.get(reference)?.sections?.main ??
- Object.create(null);
+ pages.get(reference)?.sections?.main ?? NIL;
const { v } = attributes;
if (v == null) {
children.push(