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 `; 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]"); }); const multiStatusTaskExample = ` * [ ] Task 1 - [x] Task 2 * [TODO] Task 3 `; Deno.test("Test multi-status tasks", () => { const lang = buildMarkdown([]); const tree = parse(lang, multiStatusTaskExample); // console.log("Tasks parsed", JSON.stringify(tree, null, 2)); const tasks = collectNodesOfType(tree, "Task"); assertEquals(tasks.length, 3); // Check " " checkbox state parsing assertEquals(tasks[0].children![0].children![1].text, " "); assertEquals(tasks[1].children![0].children![1].text, "x"); assertEquals(tasks[2].children![0].children![1].text, "TODO"); });