You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.6 KiB
131 lines
4.6 KiB
import { describe, it, expect } from "vitest"; |
|
import { parseAdvancedmarkup } from "../../src/lib/utils/markup/advancedMarkupParser"; |
|
|
|
function stripWS(str: string) { |
|
return str.replace(/\s+/g, " ").trim(); |
|
} |
|
|
|
describe("Advanced Markup Parser", () => { |
|
it("parses headers (ATX and Setext)", async () => { |
|
const input = "# H1\nText\n\nH2\n====\n"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(stripWS(output)).toContain("H1"); |
|
expect(stripWS(output)).toContain("H2"); |
|
}); |
|
|
|
it("parses bold, italic, and strikethrough", async () => { |
|
const input = |
|
"*bold* **bold** _italic_ __italic__ ~strikethrough~ ~~strikethrough~~"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<strong>bold</strong>"); |
|
expect(output).toContain("<em>italic</em>"); |
|
expect(output).toContain('<del class="line-through">strikethrough</del>'); |
|
}); |
|
|
|
it("parses blockquotes", async () => { |
|
const input = "> quote"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<blockquote"); |
|
expect(output).toContain("quote"); |
|
}); |
|
|
|
it("parses multi-line blockquotes", async () => { |
|
const input = "> quote\n> quote"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<blockquote"); |
|
expect(output).toContain("quote"); |
|
expect(output).toContain("quote"); |
|
}); |
|
|
|
it("parses unordered lists", async () => { |
|
const input = "* a\n* b"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<ul"); |
|
expect(output).toContain("a"); |
|
expect(output).toContain("b"); |
|
}); |
|
|
|
it("parses ordered lists", async () => { |
|
const input = "1. one\n2. two"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<ol"); |
|
expect(output).toContain("one"); |
|
expect(output).toContain("two"); |
|
}); |
|
|
|
it("parses links and images", async () => { |
|
const input = "[link](https://example.com) "; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<a"); |
|
expect(output).toContain("<img"); |
|
}); |
|
|
|
it("parses hashtags", async () => { |
|
const input = "#hashtag"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("text-primary-600"); |
|
expect(output).toContain("#hashtag"); |
|
}); |
|
|
|
it("parses nostr identifiers", async () => { |
|
const input = |
|
"npub1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain( |
|
"./events?id=npub1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", |
|
); |
|
}); |
|
|
|
it("parses emoji shortcodes", async () => { |
|
const input = "hello :smile:"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toMatch(/😄|:smile:/); |
|
}); |
|
|
|
it("parses wikilinks", async () => { |
|
const input = "[[Test Page|display]]"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("wikilink"); |
|
expect(output).toContain("display"); |
|
}); |
|
|
|
it("parses tables (with and without headers)", async () => { |
|
const input = `| Syntax | Description |\n|--------|-------------|\n| Header | Title |\n| Paragraph | Text |\n\n| a | b |\n| c | d |`; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<table"); |
|
expect(output).toContain("Header"); |
|
expect(output).toContain("a"); |
|
}); |
|
|
|
it("parses code blocks (with and without language)", async () => { |
|
const input = "```js\nconsole.log(1);\n```\n```\nno lang\n```"; |
|
const output = await parseAdvancedmarkup(input); |
|
const textOnly = output.replace(/<[^>]+>/g, ""); |
|
expect(output).toContain("<pre"); |
|
expect(textOnly).toContain("console.log(1);"); |
|
expect(textOnly).toContain("no lang"); |
|
}); |
|
|
|
it("parses horizontal rules", async () => { |
|
const input = "---"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<hr"); |
|
}); |
|
|
|
it("parses footnotes (references and section)", async () => { |
|
const input = "Here is a footnote[^1].\n\n[^1]: This is the footnote."; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("Footnotes"); |
|
expect(output).toContain("This is the footnote"); |
|
expect(output).toContain("fn-1"); |
|
}); |
|
|
|
it("parses unordered lists with '-' as bullet", async () => { |
|
const input = "- item one\n- item two\n - nested item\n- item three"; |
|
const output = await parseAdvancedmarkup(input); |
|
expect(output).toContain("<ul"); |
|
expect(output).toContain("item one"); |
|
expect(output).toContain("nested item"); |
|
expect(output).toContain("item three"); |
|
}); |
|
});
|
|
|