11module . exports = toMarkdown
22
33var 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`.
2910function 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) {
8543function 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+ }
0 commit comments