});
const getReferenceFromPath = (path) =>
- /Sources\/([A-Z][0-9A-Za-z]*\/[A-Z][0-9A-Za-z]*)\.djot$/u.exec(path)
- ?.[1]?.replace?.("/", ":");
+ /Sources\/([A-Z][0-9A-Za-z]*(?:\/[A-Z][0-9A-Za-z]*)+)\.djot$/u
+ .exec(path)?.[1]?.replace?.("/", ":"); // only replaces first slash
const listOfInternalLinks = (references, wrapper = ($) => $) => ({
tag: "bullet_list",
const links_section = [];
if (internalLinks.size || externalLinks.size) {
links_section.push(
- rawBlock`<footer>`,
rawBlock`<nav id="links">`,
{
tag: "heading",
}
links_section.push(
rawBlock`</nav>`,
- rawBlock`</footer>`,
);
} else {
/* do nothing */
}
- e.children.push(...links_section);
+ e.children.push(
+ rawBlock`<footer>`,
+ rawBlock`${"\uFFFF"}`, // footnote placeholder
+ ...links_section,
+ rawBlock`</footer>`,
+ );
},
},
hard_break: {
e.attributes ??= {};
const { attributes, reference, destination } = e;
if (
- /^(?:[A-Z][0-9A-Za-z]*|[@#])?:(?:[A-Z][0-9A-Za-z]*)?$/u
+ /^(?:[A-Z][0-9A-Za-z]*|[@#])?:(?:[A-Z][0-9A-Za-z]*(?:\/[A-Z][0-9A-Za-z]*)*)?$/u
.test(reference ?? "")
) {
const [namespacePrefix, pageName] = splitReference(
const resolvedReference = pageName == ""
? `Namespace:${expandedNamespace}`
: `${expandedNamespace}:${pageName}`;
- this.#internalLinks.add(resolvedReference);
e.reference = resolvedReference;
attributes["data-realm"] = "internal";
attributes["data-pagename"] = pageName;
attributes["data-namespace"] = expandedNamespace;
+ if (
+ resolvedReference.startsWith("Editor:") &&
+ (attributes.class ?? "").split(/\s/gu).includes("sig")
+ ) {
+ // This is a special internal link; do not record it.
+ /* do nothing */
+ } else {
+ // This is a non‐special internal link; record it.
+ internalLinks.add(resolvedReference);
+ }
} else {
attributes["data-realm"] = "external";
const remote = destination ??
`GitWikiWeb: git cat-file returned nonzero exit code: ${catstatus.code}.`,
);
} else {
+ const reference = `${namespace}:${pageName}`;
const page = new GitWikiWebPage(
namespace,
pageName,
source,
config,
);
- const reference = `${namespace}:${pageName}`;
pages.set(reference, page);
requiredButMissingPages.delete(reference);
}
},
};
});
+ const renderedAST = djot.renderAST(ast);
const doc = getDOM(template);
- const result = getDOM(`${djot.renderHTML(ast)}`);
+ const result = getDOM(djot.renderHTML(ast, {
+ overrides: {
+ raw_block: (node, context) => {
+ if (node.format == "html" && node.text == "\uFFFF") {
+ if (context.nextFootnoteIndex > 1) {
+ const result = context.renderNotes(ast.footnotes);
+ context.nextFootnoteIndex = 1;
+ return result;
+ } else {
+ return "";
+ }
+ } else {
+ return context.renderAstNodeDefault(node);
+ }
+ },
+ },
+ }));
const headElement = domutils.findOne(
(node) => node.name == "head",
doc,
"GitWikiWeb: Template did not include a <gitwikiweb-content> element.",
);
} else {
- for (const node of result) {
+ for (const node of [...result]) {
domutils.prepend(contentElement, node);
}
domutils.removeElement(contentElement);
{ createNew: true },
),
);
+ promises.push(
+ Deno.writeTextFile(
+ `${DESTINATION}/${pageRef}/index.ast`,
+ renderedAST,
+ { createNew: true },
+ ),
+ );
promises.push(
Deno.writeTextFile(
`${DESTINATION}/${pageRef}/source.djot`,