69 lines
1.8 KiB
TypeScript
69 lines
1.8 KiB
TypeScript
import { findNodeOfType, ParseTree, traverseTree } from "$sb/lib/tree.ts";
|
|
|
|
export function resolvePath(
|
|
currentPage: string,
|
|
pathToResolve: string,
|
|
fullUrl = false,
|
|
): string {
|
|
if (isFederationPath(currentPage) && !isFederationPath(pathToResolve)) {
|
|
let domainPart = currentPage.split("/")[0];
|
|
if (fullUrl) {
|
|
domainPart = federatedPathToUrl(domainPart);
|
|
}
|
|
return `${domainPart}/${pathToResolve}`;
|
|
} else {
|
|
return pathToResolve;
|
|
}
|
|
}
|
|
|
|
export function federatedPathToUrl(path: string): string {
|
|
path = path.substring(1);
|
|
if (path.startsWith("localhost")) {
|
|
path = "http://" + path;
|
|
} else {
|
|
path = "https://" + path;
|
|
}
|
|
return path;
|
|
}
|
|
|
|
export function isFederationPath(path: string) {
|
|
return path.startsWith("!");
|
|
}
|
|
|
|
export function rewritePageRefs(tree: ParseTree, containerPageName: string) {
|
|
traverseTree(tree, (n): boolean => {
|
|
if (n.type === "DirectiveStart") {
|
|
const pageRef = findNodeOfType(n, "PageRef")!;
|
|
if (pageRef) {
|
|
const pageRefName = pageRef.children![0].text!.slice(2, -2);
|
|
pageRef.children![0].text = `[[${
|
|
resolvePath(containerPageName, pageRefName)
|
|
}]]`;
|
|
}
|
|
const directiveText = n.children![0].text;
|
|
// #use or #import
|
|
if (directiveText) {
|
|
const match = /\[\[(.+)\]\]/.exec(directiveText);
|
|
if (match) {
|
|
const pageRefName = match[1];
|
|
n.children![0].text = directiveText.replace(
|
|
match[0],
|
|
`[[${resolvePath(containerPageName, pageRefName)}]]`,
|
|
);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
if (n.type === "WikiLinkPage") {
|
|
n.children![0].text = resolvePath(
|
|
containerPageName,
|
|
n.children![0].text!,
|
|
);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
});
|
|
}
|