import { parse } from "./parse_tree.ts"; import buildMarkdown from "./parser.ts"; import { collectNodesOfType, findNodeOfType, renderToText, } from "../../plug-api/lib/tree.ts"; import { assertEquals, assertNotEquals } from "../../test_deps.ts"; const sample1 = `--- type: page tags: - hello - world --- # This is a doc Here is a [[wiki link]] and a [[wiki link|alias]]. Supper`; const sampleInvalid1 = `--- name: Zef # This is a doc Supper`; Deno.test("Test parser", () => { const lang = buildMarkdown([]); let tree = parse(lang, sample1); // console.log("tree", JSON.stringify(tree, null, 2)); // Check if rendering back to text works assertEquals(renderToText(tree), sample1); // Find wiki link and wiki link alias const links = collectNodesOfType(tree, "WikiLink"); assertEquals(links.length, 2); const nameNode = findNodeOfType(links[0], "WikiLinkPage"); assertEquals(nameNode?.children![0].text, "wiki link"); // Check if alias is parsed properly const aliasNode = findNodeOfType(links[1], "WikiLinkAlias"); assertEquals(aliasNode?.children![0].text, "alias"); // Find frontmatter let node = findNodeOfType(tree, "FrontMatter"); assertNotEquals(node, undefined); tree = parse(lang, sampleInvalid1); node = findNodeOfType(tree, "FrontMatter"); // console.log("Invalid node", node); assertEquals(node, undefined); }); const directiveSample = ` Before Body line 1 Body line 2 End `; const nestedDirectiveExample = ` Before 1 100 3 End `; Deno.test("Test directive parser", () => { const lang = buildMarkdown([]); let tree = parse(lang, directiveSample); // console.log("tree", JSON.stringify(tree, null, 2)); assertEquals(renderToText(tree), directiveSample); tree = parse(lang, nestedDirectiveExample); // console.log("tree", JSON.stringify(tree, null, 2)); assertEquals(renderToText(tree), nestedDirectiveExample); const orderByExample = ` `; tree = parse(lang, orderByExample); console.log("Tree", JSON.stringify(tree, null, 2)); }); const inlineAttributeSample = ` Hello there [a link](http://zef.plus) [age: 100] [age:: 200] Here's a more [ambiguous: case](http://zef.plus) And one with nested brackets: [array: [1, 2, 3]] `; Deno.test("Test inline attribute syntax", () => { const lang = buildMarkdown([]); const tree = parse(lang, inlineAttributeSample); console.log("Attribute parsed", JSON.stringify(tree, null, 2)); const attributes = collectNodesOfType(tree, "Attribute"); let nameNode = findNodeOfType(attributes[0], "AttributeName"); assertEquals(nameNode?.children![0].text, "age"); let valueNode = findNodeOfType(attributes[0], "AttributeValue"); assertEquals(valueNode?.children![0].text, "100"); nameNode = findNodeOfType(attributes[1], "AttributeName"); assertEquals(nameNode?.children![0].text, "age"); valueNode = findNodeOfType(attributes[1], "AttributeValue"); assertEquals(valueNode?.children![0].text, "200"); nameNode = findNodeOfType(attributes[2], "AttributeName"); assertEquals(nameNode?.children![0].text, "array"); valueNode = findNodeOfType(attributes[2], "AttributeValue"); assertEquals(valueNode?.children![0].text, "[1, 2, 3]"); });