Robustness and federation sync
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
import { renderToText } from "./tree.ts";
|
||||
import wikiMarkdownLang from "../../common/markdown_parser/parser.ts";
|
||||
import { assert, assertEquals } from "../../test_deps.ts";
|
||||
import { parse } from "../../common/markdown_parser/parse_tree.ts";
|
||||
import { removeQueries } from "./query.ts";
|
||||
import { parseMarkdown } from "$sb/lib/test_utils.ts";
|
||||
|
||||
const queryRemovalTest = `
|
||||
# Heading
|
||||
@@ -14,8 +13,7 @@ End
|
||||
`;
|
||||
|
||||
Deno.test("White out queries", () => {
|
||||
const lang = wikiMarkdownLang([]);
|
||||
const mdTree = parse(lang, queryRemovalTest);
|
||||
const mdTree = parseMarkdown(queryRemovalTest);
|
||||
removeQueries(mdTree);
|
||||
const text = renderToText(mdTree);
|
||||
// Same length? We should be good
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
import { resolvePath } from "$sb/lib/resolve.ts";
|
||||
import {
|
||||
federatedPathToUrl,
|
||||
resolvePath,
|
||||
rewritePageRefs,
|
||||
} from "$sb/lib/resolve.ts";
|
||||
import { assertEquals } from "../../test_deps.ts";
|
||||
import { parseMarkdown } from "$sb/lib/test_utils.ts";
|
||||
import { renderToText } from "$sb/lib/tree.ts";
|
||||
|
||||
Deno.test("Test URL resolver", () => {
|
||||
assertEquals(resolvePath("test", "some page"), "some page");
|
||||
@@ -17,4 +23,67 @@ Deno.test("Test URL resolver", () => {
|
||||
resolvePath("!silverbullet.md", "test/image.png", true),
|
||||
"https://silverbullet.md/test/image.png",
|
||||
);
|
||||
|
||||
assertEquals(
|
||||
resolvePath("!silverbullet.md", "bla@123"),
|
||||
"!silverbullet.md/bla@123",
|
||||
);
|
||||
assertEquals(resolvePath("somewhere", "bla@123"), "bla@123");
|
||||
|
||||
assertEquals(
|
||||
federatedPathToUrl("!silverbullet.md"),
|
||||
"https://silverbullet.md",
|
||||
);
|
||||
assertEquals(
|
||||
federatedPathToUrl("!silverbullet.md/index"),
|
||||
"https://silverbullet.md/index",
|
||||
);
|
||||
});
|
||||
|
||||
Deno.test("Test rewritePageRefs", () => {
|
||||
let tree = parseMarkdown(`
|
||||
This is a [[local link]] and [[local link|with alias]].
|
||||
|
||||
<!-- #query page render [[template/page]] -->
|
||||
<!-- /query -->
|
||||
|
||||
<!-- #use [[template/use-template]] {} -->
|
||||
|
||||
<!-- /use -->
|
||||
|
||||
<!-- #include [[template/include-template]] {} -->
|
||||
|
||||
<!-- /include -->
|
||||
`);
|
||||
rewritePageRefs(tree, "!silverbullet.md");
|
||||
let rewrittenText = renderToText(tree);
|
||||
|
||||
assertEquals(
|
||||
rewrittenText,
|
||||
`
|
||||
This is a [[!silverbullet.md/local link]] and [[!silverbullet.md/local link|with alias]].
|
||||
|
||||
<!-- #query page render [[!silverbullet.md/template/page]] -->
|
||||
<!-- /query -->
|
||||
|
||||
<!-- #use [[!silverbullet.md/template/use-template]] {} -->
|
||||
|
||||
<!-- /use -->
|
||||
|
||||
<!-- #include [[!silverbullet.md/template/include-template]] {} -->
|
||||
|
||||
<!-- /include -->
|
||||
`,
|
||||
);
|
||||
|
||||
tree = parseMarkdown(
|
||||
`This is a [[local link]] and [[local link|with alias]].`,
|
||||
);
|
||||
// Now test the default case without federated links
|
||||
rewritePageRefs(tree, "index");
|
||||
rewrittenText = renderToText(tree);
|
||||
assertEquals(
|
||||
rewrittenText,
|
||||
`This is a [[local link]] and [[local link|with alias]].`,
|
||||
);
|
||||
});
|
||||
|
||||
+47
-6
@@ -1,3 +1,5 @@
|
||||
import { findNodeOfType, ParseTree, traverseTree } from "$sb/lib/tree.ts";
|
||||
|
||||
export function resolvePath(
|
||||
currentPage: string,
|
||||
pathToResolve: string,
|
||||
@@ -6,12 +8,7 @@ export function resolvePath(
|
||||
if (isFederationPath(currentPage) && !isFederationPath(pathToResolve)) {
|
||||
let domainPart = currentPage.split("/")[0];
|
||||
if (fullUrl) {
|
||||
domainPart = domainPart.substring(1);
|
||||
if (domainPart.startsWith("localhost")) {
|
||||
domainPart = "http://" + domainPart;
|
||||
} else {
|
||||
domainPart = "https://" + domainPart;
|
||||
}
|
||||
domainPart = federatedPathToUrl(domainPart);
|
||||
}
|
||||
return `${domainPart}/${pathToResolve}`;
|
||||
} else {
|
||||
@@ -19,6 +16,50 @@ export function resolvePath(
|
||||
}
|
||||
}
|
||||
|
||||
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, templatePath: 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(templatePath, 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(templatePath, pageRefName)}]]`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
if (n.type === "WikiLinkPage") {
|
||||
n.children![0].text = resolvePath(templatePath, n.children![0].text!);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
import wikiMarkdownLang from "../../common/markdown_parser/parser.ts";
|
||||
import type { ParseTree } from "$sb/lib/tree.ts";
|
||||
import { parse } from "../../common/markdown_parser/parse_tree.ts";
|
||||
|
||||
export function parseMarkdown(text: string): ParseTree {
|
||||
const lang = wikiMarkdownLang([]);
|
||||
return parse(lang, text);
|
||||
}
|
||||
Reference in New Issue
Block a user