2023-07-02 09:25:32 +00:00
|
|
|
import { traverseTree } from "../../plug-api/lib/tree.ts";
|
2023-08-28 15:12:15 +00:00
|
|
|
import { editor, markdown, space } from "$sb/syscalls.ts";
|
2023-07-02 09:25:32 +00:00
|
|
|
|
|
|
|
export async function brokenLinksCommand() {
|
|
|
|
const pageName = "BROKEN LINKS";
|
|
|
|
await editor.flashNotification("Scanning your space...");
|
|
|
|
const allPages = await space.listPages();
|
|
|
|
const allPagesMap = new Map(allPages.map((p) => [p.name, true]));
|
|
|
|
const brokenLinks: { page: string; link: string; pos: number }[] = [];
|
|
|
|
for (const pageMeta of allPages) {
|
|
|
|
const text = await space.readPage(pageMeta.name);
|
|
|
|
const tree = await markdown.parseMarkdown(text);
|
|
|
|
traverseTree(tree, (tree) => {
|
|
|
|
if (tree.type === "WikiLinkPage") {
|
|
|
|
// Add the prefix in the link text
|
2023-11-03 11:01:33 +00:00
|
|
|
const [pageName] = tree.children![0].text!.split(/[@$]/);
|
2023-08-29 19:17:29 +00:00
|
|
|
if (pageName.startsWith("!")) {
|
2023-07-02 09:25:32 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
pageName && !pageName.startsWith("{{")
|
|
|
|
) {
|
|
|
|
if (!allPagesMap.has(pageName)) {
|
|
|
|
brokenLinks.push({
|
|
|
|
page: pageMeta.name,
|
|
|
|
link: pageName,
|
|
|
|
pos: tree.from!,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (tree.type === "PageRef") {
|
|
|
|
const pageName = tree.children![0].text!.slice(2, -2);
|
2023-08-29 19:17:29 +00:00
|
|
|
if (pageName.startsWith("!")) {
|
2023-07-02 09:25:32 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (!allPagesMap.has(pageName)) {
|
|
|
|
brokenLinks.push({
|
|
|
|
page: pageMeta.name,
|
|
|
|
link: pageName,
|
|
|
|
pos: tree.from!,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
const lines: string[] = [];
|
|
|
|
for (const brokenLink of brokenLinks) {
|
|
|
|
lines.push(
|
|
|
|
`* [[${brokenLink.page}@${brokenLink.pos}]]: ${brokenLink.link}`,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
await space.writePage(pageName, lines.join("\n"));
|
|
|
|
await editor.navigate(pageName);
|
|
|
|
}
|