Skip to content

Commit 7f38039

Browse files
committed
Add support for extensions
1 parent 27de96b commit 7f38039

File tree

3 files changed

+52
-50
lines changed

3 files changed

+52
-50
lines changed

lib/handle/index.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
exports.blockquote = require('./blockquote')
2+
exports.break = require('./break')
3+
exports.code = require('./code')
4+
exports.definition = require('./definition')
5+
exports.emphasis = require('./emphasis')
6+
exports.hardBreak = require('./break')
7+
exports.heading = require('./heading')
8+
exports.html = require('./html')
9+
exports.image = require('./image')
10+
exports.imageReference = require('./image-reference')
11+
exports.inlineCode = require('./inline-code')
12+
exports.link = require('./link')
13+
exports.linkReference = require('./link-reference')
14+
exports.list = require('./list')
15+
exports.listItem = require('./list-item')
16+
exports.paragraph = require('./paragraph')
17+
exports.root = require('./root')
18+
exports.strong = require('./strong')
19+
exports.text = require('./text')
20+
exports.thematicBreak = require('./thematic-break')

lib/index.js

+24-47
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,27 @@
11
module.exports = toMarkdown
22

33
var zwitch = require('zwitch')
4-
var blockquote = require('./handle/blockquote')
5-
var code = require('./handle/code')
6-
var definition = require('./handle/definition')
7-
var emphasis = require('./handle/emphasis')
8-
var hardBreak = require('./handle/break')
9-
var heading = require('./handle/heading')
10-
var html = require('./handle/html')
11-
var image = require('./handle/image')
12-
var imageReference = require('./handle/image-reference')
13-
var inlineCode = require('./handle/inline-code')
14-
var link = require('./handle/link')
15-
var linkReference = require('./handle/link-reference')
16-
var list = require('./handle/list')
17-
var listItem = require('./handle/list-item')
18-
var paragraph = require('./handle/paragraph')
19-
var root = require('./handle/root')
20-
var strong = require('./handle/strong')
21-
var text = require('./handle/text')
22-
var thematicBreak = require('./handle/thematic-break')
23-
var unsafe = require('./unsafe')
4+
var defaultHandlers = require('./handle')
5+
var defaultUnsafePatterns = require('./unsafe')
246

257
// To do (extension)
268
// - GFM: `tableCellPadding`, `tablePipeAlign`, `stringLength`.
27-
// - Frontmatter: `yaml`, `toml`.
289
// - Footnotes: `footnote`, `footnoteDefinition`, `footnoteReference`.
2910
function toMarkdown(tree, options) {
3011
var settings = options || {}
12+
var extensions = configure(settings)
3113
var stack = []
3214
var handle = zwitch('type', {
3315
invalid: invalid,
3416
unknown: unknown,
35-
handlers: Object.assign(
36-
{
37-
blockquote: blockquote,
38-
break: hardBreak,
39-
code: code,
40-
definition: definition,
41-
emphasis: emphasis,
42-
heading: heading,
43-
html: html,
44-
image: image,
45-
imageReference: imageReference,
46-
inlineCode: inlineCode,
47-
link: link,
48-
linkReference: linkReference,
49-
list: list,
50-
listItem: listItem,
51-
paragraph: paragraph,
52-
root: root,
53-
strong: strong,
54-
text: text,
55-
thematicBreak: thematicBreak
56-
},
57-
settings.handlers
58-
)
17+
handlers: extensions.handlers
5918
})
60-
6119
var context = {
6220
handle: handle,
6321
stack: stack,
6422
enter: enter,
6523
options: settings,
66-
unsafePatterns: unsafe.concat(settings.unsafe || [])
24+
unsafePatterns: extensions.unsafe
6725
}
6826

6927
return handle(tree, null, context, {before: '\n', after: '\n'})
@@ -85,3 +43,22 @@ function invalid(value) {
8543
function unknown(node) {
8644
throw new Error('Cannot handle unknown node `' + node.type + '`')
8745
}
46+
47+
function configure(settings) {
48+
var unsafe = defaultUnsafePatterns
49+
var handlers = Object.assign({}, defaultHandlers)
50+
var extensions = [
51+
{unsafe: settings.unsafe, handlers: settings.handlers}
52+
].concat(settings.extensions || [])
53+
var length = extensions.length
54+
var index = -1
55+
var extension
56+
57+
while (++index < length) {
58+
extension = extensions[index]
59+
unsafe = unsafe.concat(extension.unsafe || [])
60+
handlers = Object.assign(handlers, extension.handlers || {})
61+
}
62+
63+
return {unsafe: unsafe, handlers: handlers}
64+
}

readme.md

+8-3
Original file line numberDiff line numberDiff line change
@@ -133,16 +133,21 @@ they’re empty.
133133

134134
Marker to use to serialize strong (`'*'` or `'_'`, default: `'*'`).
135135

136-
##### Escape options
136+
##### Extension options
137+
138+
###### `options.extensions`
139+
140+
List of extensions (`Array.<ToMarkdownExtension>`).
141+
Each `ToMarkdownExtension` is an object with optional `unsafe` and `handlers`
142+
keys, mapping to the values which can also be passed in directly, documented
143+
below.
137144

138145
###### `options.unsafe`
139146

140147
List of patterns to escape.
141148
Useful for syntax extensions.
142149
Take a look at [`lib/unsafe.js`][unsafe] for examples.
143150

144-
##### Extensions or overwrites options
145-
146151
###### `options.handlers`
147152

148153
Object mapping node types to custom handlers.

0 commit comments

Comments
 (0)