mdast-util-wiki-link
Version:
Parse and render wiki-style links
222 lines (190 loc) • 6.48 kB
text/typescript
import assert from 'assert'
import { fromMarkdown } from 'mdast-util-from-markdown'
import toMarkdown from 'mdast-util-to-markdown'
import visit from 'unist-util-visit'
import {Node, Data} from 'unist'
import { syntax } from 'micromark-extension-wiki-link'
import * as wikiLink from '../src'
interface WikiLinkHProperties {
className: string;
href: string;
[key: string]: unknown;
}
interface WikiLinkData extends Data {
exists: boolean;
permalink: string;
hProperties: WikiLinkHProperties;
hChildren: Array<{value: string}>
}
interface WikiLinkNode extends Node {
data: WikiLinkData;
}
function assertWikiLink(obj: Node): asserts obj is WikiLinkNode {
if (!obj.data || obj.data.exists === undefined || obj.data.permalink === undefined) {
throw new Error('Not a wiki link')
}
}
describe('mdast-util-wiki-link', () => {
describe('fromMarkdown', () => {
test('parses a wiki link that has a matching permalink', () => {
const ast = fromMarkdown('[[Wiki Link]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown({
permalinks: ['wiki_link']
})
]
})
visit(ast, 'wikiLink', (node: Node) => {
assertWikiLink(node)
assert.equal(node.data.exists, true)
assert.equal(node.data.permalink, 'wiki_link')
assert.equal(node.data.hName, 'a')
assert.equal(node.data.hProperties.className, 'internal')
assert.equal(node.data.hProperties.href, '#/page/wiki_link')
assert.equal(node.data.hChildren[0].value, 'Wiki Link')
})
})
test('parses a wiki link that has no matching permalink', () => {
const ast = fromMarkdown('[[New Page]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown({
permalinks: []
})
]
})
visit(ast, 'wikiLink', (node: Node) => {
assertWikiLink(node)
assert.equal(node.data.exists, false)
assert.equal(node.data.permalink, 'new_page')
assert.equal(node.data.hName, 'a')
assert.equal(node.data.hProperties.className, 'internal new')
assert.equal(node.data.hProperties.href, '#/page/new_page')
assert.equal(node.data.hChildren[0].value, 'New Page')
})
})
test('handles wiki links with aliases', () => {
const ast = fromMarkdown('[[Real Page:Page Alias]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown({
permalinks: []
})
]
})
visit(ast, 'wikiLink', (node: Node) => {
assertWikiLink(node)
assert.equal(node.data.exists, false)
assert.equal(node.data.permalink, 'real_page')
assert.equal(node.data.hName, 'a')
assert.equal(node.data.alias, 'Page Alias')
assert.equal(node.value, 'Real Page')
assert.equal(node.data.hProperties.className, 'internal new')
assert.equal(node.data.hProperties.href, '#/page/real_page')
assert.equal(node.data.hChildren[0].value, 'Page Alias')
})
})
describe('configuration options', () => {
test('uses pageResolver', () => {
const identity = (name: string) => [name]
const ast = fromMarkdown('[[A Page]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown({
pageResolver: identity,
permalinks: ['A Page']
})
]
})
visit(ast, 'wikiLink', (node: Node) => {
assertWikiLink(node)
assert.equal(node.data.exists, true)
assert.equal(node.data.permalink, 'A Page')
assert.equal(node.data.hProperties.href, '#/page/A Page')
})
})
test('uses newClassName', () => {
const ast = fromMarkdown('[[A Page]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown({
newClassName: 'new_page'
})
]
})
visit(ast, 'wikiLink', (node: Node) => {
assertWikiLink(node)
assert.equal(node.data.hProperties.className, 'internal new_page')
})
})
test('uses hrefTemplate', () => {
const ast = fromMarkdown('[[A Page]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown({
hrefTemplate: (permalink: string | undefined) => permalink || ""
})
]
})
visit(ast, 'wikiLink', (node: Node) => {
assertWikiLink(node)
assert.equal(node.data.hProperties.href, 'a_page')
})
})
test('uses wikiLinkClassName', () => {
const ast = fromMarkdown('[[A Page]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown({
wikiLinkClassName: 'wiki_link',
permalinks: ['a_page']
})
]
})
visit(ast, 'wikiLink', (node: Node) => {
assertWikiLink(node)
assert.equal(node.data.hProperties.className, 'wiki_link')
})
})
})
})
describe('toMarkdown', () => {
test('stringifies wiki links', () => {
const ast = fromMarkdown('[[Wiki Link]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown()
]
})
const stringified = toMarkdown(ast, { extensions: [wikiLink.toMarkdown()] }).trim()
assert.equal(stringified, '[[Wiki Link]]')
})
test('stringifies aliased wiki links', () => {
const ast = fromMarkdown('[[Real Page:Page Alias]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown()
]
})
const stringified = toMarkdown(ast, { extensions: [wikiLink.toMarkdown()] }).trim()
assert.equal(stringified, '[[Real Page:Page Alias]]')
})
describe('configuration options', () => {
test('uses aliasDivider', () => {
const ast = fromMarkdown('[[Real Page:Page Alias]]', {
extensions: [syntax()],
mdastExtensions: [
wikiLink.fromMarkdown()
]
})
const stringified = toMarkdown(ast, {
extensions: [
wikiLink.toMarkdown({ aliasDivider: '|' })
]
}).trim()
assert.equal(stringified, '[[Real Page|Page Alias]]')
})
})
})
})