1
1
module . exports = toMarkdown
2
2
3
3
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' )
24
6
25
7
// To do (extension)
26
8
// - GFM: `tableCellPadding`, `tablePipeAlign`, `stringLength`.
27
- // - Frontmatter: `yaml`, `toml`.
28
9
// - Footnotes: `footnote`, `footnoteDefinition`, `footnoteReference`.
29
10
function toMarkdown ( tree , options ) {
30
11
var settings = options || { }
12
+ var extensions = configure ( settings )
31
13
var stack = [ ]
32
14
var handle = zwitch ( 'type' , {
33
15
invalid : invalid ,
34
16
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
59
18
} )
60
-
61
19
var context = {
62
20
handle : handle ,
63
21
stack : stack ,
64
22
enter : enter ,
65
23
options : settings ,
66
- unsafePatterns : unsafe . concat ( settings . unsafe || [ ] )
24
+ unsafePatterns : extensions . unsafe
67
25
}
68
26
69
27
return handle ( tree , null , context , { before : '\n' , after : '\n' } )
@@ -85,3 +43,22 @@ function invalid(value) {
85
43
function unknown ( node ) {
86
44
throw new Error ( 'Cannot handle unknown node `' + node . type + '`' )
87
45
}
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
+ }
0 commit comments