Skip to content

Commit cc8ec32

Browse files
committed
.
0 parents  commit cc8ec32

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+3893
-0
lines changed

.editorconfig

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
root = true
2+
3+
[*]
4+
indent_style = space
5+
indent_size = 2
6+
end_of_line = lf
7+
charset = utf-8
8+
trim_trailing_whitespace = true
9+
insert_final_newline = true

.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.DS_Store
2+
*.log
3+
.nyc_output/
4+
coverage/
5+
node_modules/
6+
yarn.lock
7+
mdast-util-to-markdown.min.js

.npmrc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package-lock=false

.prettierignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
coverage/
2+
*.json
3+
*.md

.remarkignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
test/

.travis.yml

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
language: node_js
2+
node_js:
3+
- lts/dubnium
4+
- node
5+
after_script: bash <(curl -s https://codecov.io/bash)

index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require('./lib')

lib/handle/blockquote.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = blockquote
2+
3+
var flow = require('../util/container-flow')
4+
var indentLines = require('../util/indent-lines')
5+
6+
function blockquote(node, _, context) {
7+
var exit = context.enter('blockquote')
8+
var value = indentLines(flow(node, context), map)
9+
exit()
10+
return value
11+
}
12+
13+
function map(line, index, blank) {
14+
return (blank ? '>' : '> ') + line
15+
}

lib/handle/break.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = hardBreak
2+
hardBreak.peek = hardBreakPeek
3+
4+
function hardBreak() {
5+
return '\\\n'
6+
}
7+
8+
function hardBreakPeek() {
9+
return '\\'
10+
}

lib/handle/code.js

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
module.exports = code
2+
3+
var repeat = require('repeat-string')
4+
var streak = require('longest-streak')
5+
var indentLines = require('../util/indent-lines')
6+
var safe = require('../util/safe')
7+
var formatCodeAsIndented = require('../util/format-code-as-indented')
8+
9+
function code(node, _, context) {
10+
var marker = context.options.fence || '`'
11+
var raw = node.value || ''
12+
var suffix = marker === '`' ? 'GraveAccent' : 'Tilde'
13+
var value
14+
var fence
15+
var exit
16+
var exitInfo
17+
18+
if (formatCodeAsIndented(node, context)) {
19+
exit = context.enter('codeIndented')
20+
value = indentLines(raw, map)
21+
} else {
22+
fence = repeat(marker, Math.max(streak(raw, marker) + 1, 3))
23+
exit = context.enter('codeFenced')
24+
value = fence
25+
26+
if (node.lang) {
27+
exitInfo = context.enter('codeFencedLang' + suffix)
28+
value += safe(context, node.lang, {
29+
before: '`',
30+
after: ' ',
31+
encode: ['`']
32+
})
33+
exitInfo()
34+
}
35+
36+
if (node.lang && node.meta) {
37+
exitInfo = context.enter('codeFencedMeta' + suffix)
38+
value +=
39+
' ' +
40+
safe(context, node.meta, {
41+
before: ' ',
42+
after: '\n',
43+
encode: ['`']
44+
})
45+
exitInfo()
46+
}
47+
48+
value += '\n'
49+
50+
if (raw) {
51+
value += raw + '\n'
52+
}
53+
54+
value += fence
55+
}
56+
57+
exit()
58+
return value
59+
}
60+
61+
function map(line, _, blank) {
62+
return (blank ? '' : ' ') + line
63+
}

lib/handle/definition.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
module.exports = definition
2+
3+
var association = require('../util/association')
4+
var checkQuote = require('../util/check-quote')
5+
var safe = require('../util/safe')
6+
7+
function definition(node, _, context) {
8+
var quote = checkQuote(context)
9+
var suffix = quote === '"' ? 'Quote' : 'Apostrophe'
10+
var url = node.url || ''
11+
var title = node.title || ''
12+
var exit = context.enter('definition')
13+
var subexit = context.enter('label')
14+
var value =
15+
'[' + safe(context, association(node), {before: '[', after: ']'}) + ']: '
16+
17+
subexit()
18+
19+
if (
20+
// If there’s no url, or…
21+
!url ||
22+
// If there’s whitespace, enclosed is prettier.
23+
/[ \t\r\n]/.test(url)
24+
) {
25+
subexit = context.enter('destinationLiteral')
26+
value += '<' + safe(context, url, {before: '<', after: '>'}) + '>'
27+
} else {
28+
// No whitespace, raw is prettier.
29+
subexit = context.enter('destinationRaw')
30+
value += safe(context, url, {before: ' ', after: ' '})
31+
}
32+
33+
subexit()
34+
35+
if (title) {
36+
subexit = context.enter('title' + suffix)
37+
value +=
38+
' ' + quote + safe(context, title, {before: quote, after: quote}) + quote
39+
subexit()
40+
}
41+
42+
exit()
43+
44+
return value
45+
}

lib/handle/emphasis.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module.exports = emphasis
2+
emphasis.peek = emphasisPeek
3+
4+
var checkEmphasis = require('../util/check-emphasis')
5+
var phrasing = require('../util/container-phrasing')
6+
7+
// To do: there are cases where emphasis cannot “form” depending on the
8+
// previous or next character of sequences.
9+
// There’s no way around that though, except for injecting zero-width stuff.
10+
// Do we need to safeguard against that?
11+
function emphasis(node, _, context) {
12+
var marker = checkEmphasis(context)
13+
var exit = context.enter('emphasis')
14+
var value = phrasing(node, context, {before: marker, after: marker})
15+
exit()
16+
return marker + value + marker
17+
}
18+
19+
function emphasisPeek(node, _, context) {
20+
return context.options.emphasis || '*'
21+
}

lib/handle/heading.js

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
module.exports = heading
2+
3+
var repeat = require('repeat-string')
4+
var phrasing = require('../util/container-phrasing')
5+
var formatHeadingAsSetext = require('../util/format-heading-as-setext')
6+
7+
function heading(node, _, context) {
8+
var rank = Math.max(Math.min(6, node.depth || 1), 1)
9+
var value
10+
var exit
11+
var subexit
12+
var sequence
13+
14+
if (formatHeadingAsSetext(node, context)) {
15+
exit = context.enter('headingSetext')
16+
subexit = context.enter('phrasing')
17+
value = phrasing(node, context, {before: '\n', after: '\n'})
18+
subexit()
19+
exit()
20+
21+
return (
22+
value +
23+
'\n' +
24+
repeat(
25+
rank === 1 ? '=' : '-',
26+
// The whole size…
27+
value.length -
28+
// Minus the position of the character after the last EOL (or
29+
// 0 if there is none)…
30+
(Math.max(value.lastIndexOf('\r'), value.lastIndexOf('\n')) + 1)
31+
)
32+
)
33+
}
34+
35+
sequence = repeat('#', rank)
36+
exit = context.enter('headingAtx')
37+
subexit = context.enter('phrasing')
38+
value = phrasing(node, context, {before: '\n', after: '\n'})
39+
value = value ? sequence + ' ' + value : sequence
40+
if (context.options.closeAtx) {
41+
value += ' ' + sequence
42+
}
43+
44+
subexit()
45+
exit()
46+
47+
return value
48+
}

lib/handle/html.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = html
2+
html.peek = htmlPeek
3+
4+
function html(node) {
5+
return node.value || ''
6+
}
7+
8+
function htmlPeek() {
9+
return '<'
10+
}

lib/handle/image-reference.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module.exports = imageReference
2+
imageReference.peek = imageReferencePeek
3+
4+
var association = require('../util/association')
5+
var safe = require('../util/safe')
6+
7+
function imageReference(node, _, context) {
8+
var type = node.referenceType
9+
var exit = context.enter('imageReference')
10+
var subexit = context.enter('label')
11+
var alt = safe(context, node.alt, {before: '[', after: ']'})
12+
var reference
13+
14+
subexit()
15+
16+
subexit = context.enter('reference')
17+
reference = safe(context, association(node), {before: '[', after: ']'})
18+
subexit()
19+
20+
exit()
21+
22+
if (type !== 'full' && alt && alt === reference) {
23+
return '![' + alt + ']' + (type === 'shortcut' ? '' : '[]')
24+
}
25+
26+
return '![' + alt + '][' + reference + ']'
27+
}
28+
29+
function imageReferencePeek() {
30+
return '!'
31+
}

lib/handle/image.js

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
module.exports = image
2+
image.peek = imagePeek
3+
4+
var checkQuote = require('../util/check-quote')
5+
var safe = require('../util/safe')
6+
7+
function image(node, _, context) {
8+
var quote = checkQuote(context)
9+
var suffix = quote === '"' ? 'Quote' : 'Apostrophe'
10+
var url = node.url || ''
11+
var title = node.title || ''
12+
var exit = context.enter('image')
13+
var subexit = context.enter('label')
14+
var value = '![' + safe(context, node.alt, {before: '[', after: ']'}) + ']('
15+
16+
subexit()
17+
18+
if (
19+
// If there’s no url but there is a title…
20+
(!url && title) ||
21+
// Or if there’s markdown whitespace or an eol, enclose.
22+
/[ \t\r\n]/.test(url)
23+
) {
24+
subexit = context.enter('destinationLiteral')
25+
value += '<' + safe(context, url, {before: '<', after: '>'}) + '>'
26+
} else {
27+
// No whitespace, raw is prettier.
28+
subexit = context.enter('destinationRaw')
29+
value += safe(context, url, {before: '(', after: title ? ' ' : ')'})
30+
}
31+
32+
subexit()
33+
34+
if (title) {
35+
subexit = context.enter('title' + suffix)
36+
value +=
37+
' ' + quote + safe(context, title, {before: quote, after: quote}) + quote
38+
subexit()
39+
}
40+
41+
value += ')'
42+
exit()
43+
44+
return value
45+
}
46+
47+
function imagePeek() {
48+
return '!'
49+
}

lib/handle/inline-code.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module.exports = inlineCode
2+
inlineCode.peek = inlineCodePeek
3+
4+
function inlineCode(node) {
5+
var value = node.value || ''
6+
var sequence = '`'
7+
var pad = ''
8+
9+
// If there is a single grave accent on its own in the code, use a fence of
10+
// two.
11+
// If there are two in a row, use one.
12+
while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) {
13+
sequence += '`'
14+
}
15+
16+
// If this is not just spaces or eols (tabs don’t count), and either the
17+
// first or last character are a space, eol, or tick, then pad with spaces.
18+
if (
19+
/[^ \r\n]/.test(value) &&
20+
(/[ \r\n`]/.test(value.charAt(0)) ||
21+
/[ \r\n`]/.test(value.charAt(value.length - 1)))
22+
) {
23+
pad = ' '
24+
}
25+
26+
return sequence + pad + value + pad + sequence
27+
}
28+
29+
function inlineCodePeek() {
30+
return '`'
31+
}

lib/handle/link-reference.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module.exports = linkReference
2+
linkReference.peek = linkReferencePeek
3+
4+
var association = require('../util/association')
5+
var safe = require('../util/safe')
6+
var phrasing = require('../util/container-phrasing')
7+
8+
function linkReference(node, _, context) {
9+
var type = node.referenceType
10+
var exit = context.enter('linkReference')
11+
var subexit = context.enter('label')
12+
var text = phrasing(node, context, {before: '[', after: ']'})
13+
var reference
14+
15+
subexit()
16+
17+
subexit = context.enter('reference')
18+
reference = safe(context, association(node), {before: '[', after: ']'})
19+
subexit()
20+
21+
exit()
22+
23+
if (type !== 'full' && text && text === reference) {
24+
return '[' + text + ']' + (type === 'shortcut' ? '' : '[]')
25+
}
26+
27+
return '[' + text + '][' + reference + ']'
28+
}
29+
30+
function linkReferencePeek() {
31+
return '['
32+
}

0 commit comments

Comments
 (0)