Browse Source

Added link reference 'definition' token type

pull/1055/head
Harsha Teja Kanna 8 months ago
parent
commit
8425cb23e1
  1. 2
      lib/renderer.mjs
  2. 15
      lib/rules_block/reference.mjs
  3. 68
      test/misc.mjs

2
lib/renderer.mjs

@ -187,7 +187,7 @@ Renderer.prototype.renderToken = function renderToken (tokens, idx, options) {
// - a
// >
//
if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {
if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden && tokens[idx - 1].type !== 'definition') {
result += '\n'
}

15
lib/rules_block/reference.mjs

@ -190,7 +190,8 @@ export default function reference (state, startLine, _endLine, silent) {
return false
}
const label = normalizeReference(str.slice(1, labelEnd))
const label_raw = str.slice(1, labelEnd)
const label = normalizeReference(label_raw)
if (!label) {
// CommonMark 0.20 disallows empty labels
return false
@ -208,5 +209,17 @@ export default function reference (state, startLine, _endLine, silent) {
}
state.line = nextLine
const token = state.push('definition', '', 0)
token.meta = {
label: label_raw,
destination: href,
title
}
token.map = [startLine, state.line]
token.block = true
token.hidden = true
token.children = []
return true
}

68
test/misc.mjs

@ -472,3 +472,71 @@ describe('Token attributes', function () {
assert.strictEqual(t.attrGet('myattr'), 'myvalue')
})
})
describe('Definition', function () {
function type_filter (tokens, type) {
return tokens.filter(function (t) { return t.type === type })
}
it('Should not render link reference definition', function () {
const md = markdownit()
assert.strictEqual(
md.render('[foo]: /url "title"\n\n[foo]', {}),
'<p><a href="/url" title="title">foo</a></p>\n'
)
})
it('Should not render newline after link reference definition', function () {
const md = markdownit()
assert.strictEqual(
md.render('[foo]: /url "title"\nbar', {}),
'<p>bar</p>\n'
)
})
it('Should add meta to link reference definition', function () {
const md = markdownit()
let tokens = md.parse('[foo]: /url "title"\n\n[foo]', {})
assert.strictEqual(type_filter(tokens, 'definition').length, 1)
tokens = type_filter(tokens, 'definition')
assert.deepEqual(
tokens[0].meta,
{ label: 'foo', destination: '/url', title: 'title' }
)
})
it('Should add sourcemap info to link reference definition token', function () {
const md = markdownit()
let tokens = md.parse("[foo]: /url '\ntitle\nline1\nline2\n'\n\n[foo]", {})
assert.strictEqual(type_filter(tokens, 'definition').length, 1)
tokens = type_filter(tokens, 'definition')
assert.deepEqual(
tokens[0].map,
[0, 5]
)
assert.deepEqual(
tokens[0].meta,
{ label: 'foo', destination: '/url', title: '\ntitle\nline1\nline2\n' }
)
})
it('Empty link destination should be empty string in the link reference definition token', function () {
const md = markdownit()
let tokens = md.parse('[foo]: <>\n\n[foo]', {})
assert.strictEqual(type_filter(tokens, 'definition').length, 1)
tokens = type_filter(tokens, 'definition')
assert.deepEqual(
tokens[0].map,
[0, 1]
)
assert.deepEqual(
tokens[0].meta,
{ label: 'foo', destination: '', title: '' }
)
})
})

Loading…
Cancel
Save