Skip to content

Commit

Permalink
Fix mapping of references without definitions
Browse files Browse the repository at this point in the history
* CommonMark seems to have changed in that it now always maps
  undefined references back to markdown

Closes GH-20.
Closes GH-21.
  • Loading branch information
rubys authored and wooorm committed Aug 5, 2018
1 parent a91a8ca commit 742a780
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 116 deletions.
20 changes: 0 additions & 20 deletions lib/failsafe.js

This file was deleted.

14 changes: 10 additions & 4 deletions lib/handlers/image-reference.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,22 @@
module.exports = imageReference

var normalize = require('mdurl/encode')
var failsafe = require('../failsafe')
var revert = require('../revert')

/* Transform a reference to an image. */
function imageReference(h, node) {
var def = h.definition(node.identifier)
var props = {src: normalize((def && def.url) || ''), alt: node.alt}
var props

if (def && def.title !== null && def.title !== undefined) {
if (!def) {
return revert(h, node)
}

props = {src: normalize(def.url || ''), alt: node.alt}

if (def.title !== null && def.title !== undefined) {
props.title = def.title
}

return failsafe(h, node, def) || h(node, 'img', props)
return h(node, 'img', props)
}
14 changes: 10 additions & 4 deletions lib/handlers/link-reference.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,23 @@
module.exports = linkReference

var normalize = require('mdurl/encode')
var failsafe = require('../failsafe')
var revert = require('../revert')
var all = require('../all')

/* Transform a reference to a link. */
function linkReference(h, node) {
var def = h.definition(node.identifier)
var props = {href: normalize((def && def.url) || '')}
var props

if (def && def.title !== null && def.title !== undefined) {
if (!def) {
return revert(h, node)
}

props = {href: normalize(def.url || '')}

if (def.title !== null && def.title !== undefined) {
props.title = def.title
}

return failsafe(h, node, def) || h(node, 'a', props, all(h, node))
return h(node, 'a', props, all(h, node))
}
44 changes: 44 additions & 0 deletions lib/revert.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
'use strict'

module.exports = revert

var u = require('unist-builder')
var all = require('./all')

/* Return the content of a reference without definition as markdown. */
function revert(h, node) {
var subtype = node.referenceType
var suffix = ']'
var contents
var head
var tail

if (subtype === 'collapsed') {
suffix += '[]'
} else if (subtype === 'full') {
suffix += '[' + node.identifier + ']'
}

if (node.type === 'imageReference') {
return u('text', '![' + node.alt + suffix)
}

contents = all(h, node)
head = contents[0]

if (head && head.type === 'text') {
head.value = '[' + head.value
} else {
contents.unshift(u('text', '['))
}

tail = contents[contents.length - 1]

if (tail && tail.type === 'text') {
tail.value += suffix
} else {
contents.push(u('text', suffix))
}

return contents
}
35 changes: 5 additions & 30 deletions test/image-reference.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,7 @@ var to = require('..')

test('ImageReference', function(t) {
t.deepEqual(
to(
u('imageReference', {
identifier: 'charlie',
alt: 'charlie'
})
),
to(u('imageReference', {identifier: 'charlie', alt: 'charlie'})),
u('text', '![charlie]'),
'should fall back on `imageReference`s without definition'
)
Expand All @@ -24,18 +19,8 @@ test('ImageReference', function(t) {
alt: 'golf'
})
),
u(
'element',
{
tagName: 'img',
properties: {
src: '',
alt: 'golf'
}
},
[]
),
'should not fall back on full `imageReference`s'
u('text', '![golf][foxtrot]'),
'should fall back on full `imageReference`s'
)

t.deepEqual(
Expand All @@ -46,18 +31,8 @@ test('ImageReference', function(t) {
alt: 'india'
})
),
u(
'element',
{
tagName: 'img',
properties: {
src: '',
alt: 'india'
}
},
[]
),
'should not fall back on collapsed `imageReference`s'
u('text', '![india][]'),
'should fall back on collapsed `imageReference`s'
)

t.deepEqual(
Expand Down
85 changes: 27 additions & 58 deletions test/link-reference.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,77 +6,49 @@ var to = require('..')

test('LinkReference', function(t) {
t.deepEqual(
to(
u(
'linkReference',
{
identifier: 'bravo'
},
[u('text', 'bravo')]
)
),
[u('text', '['), u('text', 'bravo'), u('text', ']')],
to(u('linkReference', {identifier: 'bravo'}, [u('text', 'bravo')])),
[u('text', '[bravo]')],
'should fall back on `linkReference`s without definition'
)

t.deepEqual(
to(
u(
'linkReference',
{
identifier: 'delta',
referenceType: 'full'
},
[u('text', 'echo')]
)
),
u(
'element',
{
tagName: 'a',
properties: {
href: ''
}
},
[u('text', 'echo')]
u('linkReference', {identifier: 'delta', referenceType: 'full'}, [
u('text', 'echo')
])
),
'should not fall back on full `linkReference`s'
[u('text', '[echo][delta]')],
'should fall back on full `linkReference`s'
)

t.deepEqual(
to(
u(
'linkReference',
{
identifier: 'hotel',
referenceType: 'collapsed'
},
[u('text', 'hotel')]
)
u('linkReference', {identifier: 'hotel', referenceType: 'collapsed'}, [
u('text', 'hotel')
])
),
u(
'element',
{
tagName: 'a',
properties: {
href: ''
}
},
[u('text', 'hotel')]
[u('text', '[hotel][]')],
'should fall back on collapsed `linkReference`s'
)

t.deepEqual(
to(
u('linkReference', {identifier: 'bravo', referenceType: 'full'}, [
u('inlineCode', 'alpha')
])
),
'should not fall back on collapsed `linkReference`s'
[
u('text', '['),
u('element', {tagName: 'code', properties: {}}, [u('text', 'alpha')]),
u('text', '][bravo]')
],
'should support link references with non-text content'
)

t.deepEqual(
to(
u('paragraph', [
u(
'linkReference',
{
identifier: 'juliett'
},
[u('text', 'kilo')]
),
u('linkReference', {identifier: 'juliett'}, [u('text', 'kilo')]),
u('definition', {
identifier: 'juliett',
url: 'http://kilo.lima/mike',
Expand All @@ -89,10 +61,7 @@ test('LinkReference', function(t) {
'element',
{
tagName: 'a',
properties: {
href: 'http://kilo.lima/mike',
title: 'november'
}
properties: {href: 'http://kilo.lima/mike', title: 'november'}
},
[u('text', 'kilo')]
)
Expand Down

0 comments on commit 742a780

Please sign in to comment.