Skip to content

Commit 742a780

Browse files
rubyswooorm
authored andcommitted
Fix mapping of references without definitions
* CommonMark seems to have changed in that it now always maps undefined references back to markdown Closes GH-20. Closes GH-21.
1 parent a91a8ca commit 742a780

File tree

6 files changed

+96
-116
lines changed

6 files changed

+96
-116
lines changed

lib/failsafe.js

Lines changed: 0 additions & 20 deletions
This file was deleted.

lib/handlers/image-reference.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,22 @@
33
module.exports = imageReference
44

55
var normalize = require('mdurl/encode')
6-
var failsafe = require('../failsafe')
6+
var revert = require('../revert')
77

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

13-
if (def && def.title !== null && def.title !== undefined) {
13+
if (!def) {
14+
return revert(h, node)
15+
}
16+
17+
props = {src: normalize(def.url || ''), alt: node.alt}
18+
19+
if (def.title !== null && def.title !== undefined) {
1420
props.title = def.title
1521
}
1622

17-
return failsafe(h, node, def) || h(node, 'img', props)
23+
return h(node, 'img', props)
1824
}

lib/handlers/link-reference.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,23 @@
33
module.exports = linkReference
44

55
var normalize = require('mdurl/encode')
6-
var failsafe = require('../failsafe')
6+
var revert = require('../revert')
77
var all = require('../all')
88

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

14-
if (def && def.title !== null && def.title !== undefined) {
14+
if (!def) {
15+
return revert(h, node)
16+
}
17+
18+
props = {href: normalize(def.url || '')}
19+
20+
if (def.title !== null && def.title !== undefined) {
1521
props.title = def.title
1622
}
1723

18-
return failsafe(h, node, def) || h(node, 'a', props, all(h, node))
24+
return h(node, 'a', props, all(h, node))
1925
}

lib/revert.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'use strict'
2+
3+
module.exports = revert
4+
5+
var u = require('unist-builder')
6+
var all = require('./all')
7+
8+
/* Return the content of a reference without definition as markdown. */
9+
function revert(h, node) {
10+
var subtype = node.referenceType
11+
var suffix = ']'
12+
var contents
13+
var head
14+
var tail
15+
16+
if (subtype === 'collapsed') {
17+
suffix += '[]'
18+
} else if (subtype === 'full') {
19+
suffix += '[' + node.identifier + ']'
20+
}
21+
22+
if (node.type === 'imageReference') {
23+
return u('text', '![' + node.alt + suffix)
24+
}
25+
26+
contents = all(h, node)
27+
head = contents[0]
28+
29+
if (head && head.type === 'text') {
30+
head.value = '[' + head.value
31+
} else {
32+
contents.unshift(u('text', '['))
33+
}
34+
35+
tail = contents[contents.length - 1]
36+
37+
if (tail && tail.type === 'text') {
38+
tail.value += suffix
39+
} else {
40+
contents.push(u('text', suffix))
41+
}
42+
43+
return contents
44+
}

test/image-reference.js

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,7 @@ var to = require('..')
66

77
test('ImageReference', function(t) {
88
t.deepEqual(
9-
to(
10-
u('imageReference', {
11-
identifier: 'charlie',
12-
alt: 'charlie'
13-
})
14-
),
9+
to(u('imageReference', {identifier: 'charlie', alt: 'charlie'})),
1510
u('text', '![charlie]'),
1611
'should fall back on `imageReference`s without definition'
1712
)
@@ -24,18 +19,8 @@ test('ImageReference', function(t) {
2419
alt: 'golf'
2520
})
2621
),
27-
u(
28-
'element',
29-
{
30-
tagName: 'img',
31-
properties: {
32-
src: '',
33-
alt: 'golf'
34-
}
35-
},
36-
[]
37-
),
38-
'should not fall back on full `imageReference`s'
22+
u('text', '![golf][foxtrot]'),
23+
'should fall back on full `imageReference`s'
3924
)
4025

4126
t.deepEqual(
@@ -46,18 +31,8 @@ test('ImageReference', function(t) {
4631
alt: 'india'
4732
})
4833
),
49-
u(
50-
'element',
51-
{
52-
tagName: 'img',
53-
properties: {
54-
src: '',
55-
alt: 'india'
56-
}
57-
},
58-
[]
59-
),
60-
'should not fall back on collapsed `imageReference`s'
34+
u('text', '![india][]'),
35+
'should fall back on collapsed `imageReference`s'
6136
)
6237

6338
t.deepEqual(

test/link-reference.js

Lines changed: 27 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,77 +6,49 @@ var to = require('..')
66

77
test('LinkReference', function(t) {
88
t.deepEqual(
9-
to(
10-
u(
11-
'linkReference',
12-
{
13-
identifier: 'bravo'
14-
},
15-
[u('text', 'bravo')]
16-
)
17-
),
18-
[u('text', '['), u('text', 'bravo'), u('text', ']')],
9+
to(u('linkReference', {identifier: 'bravo'}, [u('text', 'bravo')])),
10+
[u('text', '[bravo]')],
1911
'should fall back on `linkReference`s without definition'
2012
)
2113

2214
t.deepEqual(
2315
to(
24-
u(
25-
'linkReference',
26-
{
27-
identifier: 'delta',
28-
referenceType: 'full'
29-
},
30-
[u('text', 'echo')]
31-
)
32-
),
33-
u(
34-
'element',
35-
{
36-
tagName: 'a',
37-
properties: {
38-
href: ''
39-
}
40-
},
41-
[u('text', 'echo')]
16+
u('linkReference', {identifier: 'delta', referenceType: 'full'}, [
17+
u('text', 'echo')
18+
])
4219
),
43-
'should not fall back on full `linkReference`s'
20+
[u('text', '[echo][delta]')],
21+
'should fall back on full `linkReference`s'
4422
)
4523

4624
t.deepEqual(
4725
to(
48-
u(
49-
'linkReference',
50-
{
51-
identifier: 'hotel',
52-
referenceType: 'collapsed'
53-
},
54-
[u('text', 'hotel')]
55-
)
26+
u('linkReference', {identifier: 'hotel', referenceType: 'collapsed'}, [
27+
u('text', 'hotel')
28+
])
5629
),
57-
u(
58-
'element',
59-
{
60-
tagName: 'a',
61-
properties: {
62-
href: ''
63-
}
64-
},
65-
[u('text', 'hotel')]
30+
[u('text', '[hotel][]')],
31+
'should fall back on collapsed `linkReference`s'
32+
)
33+
34+
t.deepEqual(
35+
to(
36+
u('linkReference', {identifier: 'bravo', referenceType: 'full'}, [
37+
u('inlineCode', 'alpha')
38+
])
6639
),
67-
'should not fall back on collapsed `linkReference`s'
40+
[
41+
u('text', '['),
42+
u('element', {tagName: 'code', properties: {}}, [u('text', 'alpha')]),
43+
u('text', '][bravo]')
44+
],
45+
'should support link references with non-text content'
6846
)
6947

7048
t.deepEqual(
7149
to(
7250
u('paragraph', [
73-
u(
74-
'linkReference',
75-
{
76-
identifier: 'juliett'
77-
},
78-
[u('text', 'kilo')]
79-
),
51+
u('linkReference', {identifier: 'juliett'}, [u('text', 'kilo')]),
8052
u('definition', {
8153
identifier: 'juliett',
8254
url: 'http://kilo.lima/mike',
@@ -89,10 +61,7 @@ test('LinkReference', function(t) {
8961
'element',
9062
{
9163
tagName: 'a',
92-
properties: {
93-
href: 'http://kilo.lima/mike',
94-
title: 'november'
95-
}
64+
properties: {href: 'http://kilo.lima/mike', title: 'november'}
9665
},
9766
[u('text', 'kilo')]
9867
)

0 commit comments

Comments
 (0)