(...args: MarkedExtension<ParserOutput, RendererOutput>[])
| 74 | } |
| 75 | |
| 76 | use(...args: MarkedExtension<ParserOutput, RendererOutput>[]) { |
| 77 | const extensions: MarkedOptions<ParserOutput, RendererOutput>['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} }; |
| 78 | |
| 79 | args.forEach((pack) => { |
| 80 | // copy options to new object |
| 81 | const opts = { ...pack } as MarkedOptions<ParserOutput, RendererOutput>; |
| 82 | |
| 83 | // set async to true if it was set to true before |
| 84 | opts.async = this.defaults.async || opts.async || false; |
| 85 | |
| 86 | // ==-- Parse "addon" extensions --== // |
| 87 | if (pack.extensions) { |
| 88 | pack.extensions.forEach((ext) => { |
| 89 | if (!ext.name) { |
| 90 | throw new Error('extension name required'); |
| 91 | } |
| 92 | if ('renderer' in ext) { // Renderer extensions |
| 93 | const prevRenderer = extensions.renderers[ext.name]; |
| 94 | if (prevRenderer) { |
| 95 | // Replace extension with func to run new extension but fall back if false |
| 96 | extensions.renderers[ext.name] = function(...args) { |
| 97 | let ret = ext.renderer.apply(this, args); |
| 98 | if (ret === false) { |
| 99 | ret = prevRenderer.apply(this, args); |
| 100 | } |
| 101 | return ret; |
| 102 | }; |
| 103 | } else { |
| 104 | extensions.renderers[ext.name] = ext.renderer; |
| 105 | } |
| 106 | } |
| 107 | if ('tokenizer' in ext) { // Tokenizer Extensions |
| 108 | if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) { |
| 109 | throw new Error("extension level must be 'block' or 'inline'"); |
| 110 | } |
| 111 | const extLevel = extensions[ext.level]; |
| 112 | if (extLevel) { |
| 113 | extLevel.unshift(ext.tokenizer); |
| 114 | } else { |
| 115 | extensions[ext.level] = [ext.tokenizer]; |
| 116 | } |
| 117 | if (ext.start) { // Function to check for start of token |
| 118 | if (ext.level === 'block') { |
| 119 | if (extensions.startBlock) { |
| 120 | extensions.startBlock.push(ext.start); |
| 121 | } else { |
| 122 | extensions.startBlock = [ext.start]; |
| 123 | } |
| 124 | } else if (ext.level === 'inline') { |
| 125 | if (extensions.startInline) { |
| 126 | extensions.startInline.push(ext.start); |
| 127 | } else { |
| 128 | extensions.startInline = [ext.start]; |
| 129 | } |
| 130 | } |
| 131 | } |
| 132 | } |
| 133 | if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens |
no outgoing calls
no test coverage detected