|
12 | 12 | * Dependencies.
|
13 | 13 | */
|
14 | 14 |
|
15 |
| -var Ware = require('ware'); |
16 |
| -var VFile = require('vfile'); |
17 |
| -var extend = require('extend.js'); |
18 |
| -var parser = require('./lib/parse.js'); |
19 |
| -var stringifier = require('./lib/stringify.js'); |
20 |
| -var utilities = require('./lib/utilities.js'); |
| 15 | +var unified = require('unified'); |
| 16 | +var Parser = require('./lib/parse.js'); |
| 17 | +var Compiler = require('./lib/stringify.js'); |
21 | 18 |
|
22 | 19 | /*
|
23 |
| - * Methods. |
| 20 | + * Exports. |
24 | 21 | */
|
25 | 22 |
|
26 |
| -var Parser = parser.Parser; |
27 |
| -var parseProto = Parser.prototype; |
28 |
| -var Compiler = stringifier.Compiler; |
29 |
| -var compileProto = Compiler.prototype; |
30 |
| - |
31 |
| -/** |
32 |
| - * Throws if passed an exception. |
33 |
| - * |
34 |
| - * Here until the following PR is merged into |
35 |
| - * segmentio/ware: |
36 |
| - * |
37 |
| - * https://github.com/segmentio/ware/pull/21 |
38 |
| - * |
39 |
| - * @param {Error?} exception |
40 |
| - */ |
41 |
| -function fail(exception) { |
42 |
| - if (exception) { |
43 |
| - throw exception; |
44 |
| - } |
45 |
| -} |
46 |
| - |
47 |
| -/** |
48 |
| - * Create a custom, cloned, Parser. |
49 |
| - * |
50 |
| - * @return {Function} |
51 |
| - */ |
52 |
| -function constructParser() { |
53 |
| - var customProto; |
54 |
| - var expressions; |
55 |
| - var key; |
56 |
| - |
57 |
| - /** |
58 |
| - * Extensible prototype. |
59 |
| - */ |
60 |
| - function CustomProto() {} |
61 |
| - |
62 |
| - CustomProto.prototype = parseProto; |
63 |
| - |
64 |
| - customProto = new CustomProto(); |
65 |
| - |
66 |
| - /** |
67 |
| - * Extensible constructor. |
68 |
| - */ |
69 |
| - function CustomParser() { |
70 |
| - Parser.apply(this, arguments); |
71 |
| - } |
72 |
| - |
73 |
| - CustomParser.prototype = customProto; |
74 |
| - |
75 |
| - /* |
76 |
| - * Construct new objects for things that plugin's |
77 |
| - * might modify. |
78 |
| - */ |
79 |
| - |
80 |
| - customProto.blockTokenizers = extend({}, parseProto.blockTokenizers); |
81 |
| - customProto.blockMethods = extend([], parseProto.blockMethods); |
82 |
| - customProto.inlineTokenizers = extend({}, parseProto.inlineTokenizers); |
83 |
| - customProto.inlineMethods = extend([], parseProto.inlineMethods); |
84 |
| - |
85 |
| - expressions = parseProto.expressions; |
86 |
| - customProto.expressions = {}; |
87 |
| - |
88 |
| - for (key in expressions) { |
89 |
| - customProto.expressions[key] = extend({}, expressions[key]); |
90 |
| - } |
91 |
| - |
92 |
| - return CustomParser; |
93 |
| -} |
94 |
| - |
95 |
| -/** |
96 |
| - * Create a custom, cloned, Compiler. |
97 |
| - * |
98 |
| - * @return {Function} |
99 |
| - */ |
100 |
| -function constructCompiler() { |
101 |
| - var customProto; |
102 |
| - |
103 |
| - /** |
104 |
| - * Extensible prototype. |
105 |
| - */ |
106 |
| - function CustomProto() {} |
107 |
| - |
108 |
| - CustomProto.prototype = compileProto; |
109 |
| - |
110 |
| - customProto = new CustomProto(); |
111 |
| - |
112 |
| - /** |
113 |
| - * Extensible constructor. |
114 |
| - */ |
115 |
| - function CustomCompiler() { |
116 |
| - Compiler.apply(this, arguments); |
117 |
| - } |
118 |
| - |
119 |
| - CustomCompiler.prototype = customProto; |
120 |
| - |
121 |
| - return CustomCompiler; |
122 |
| -} |
123 |
| - |
124 |
| -/** |
125 |
| - * Construct an MDAST instance. |
126 |
| - * |
127 |
| - * @constructor {MDAST} |
128 |
| - */ |
129 |
| -function MDAST() { |
130 |
| - var self = this; |
131 |
| - |
132 |
| - if (!(self instanceof MDAST)) { |
133 |
| - return new MDAST(); |
134 |
| - } |
135 |
| - |
136 |
| - self.ware = new Ware(); |
137 |
| - self.attachers = []; |
138 |
| - |
139 |
| - self.Parser = constructParser(); |
140 |
| - self.Compiler = constructCompiler(); |
141 |
| -} |
142 |
| - |
143 |
| -/** |
144 |
| - * Attach a plugin. |
145 |
| - * |
146 |
| - * @param {Function|Array.<Function>} attach |
147 |
| - * @param {Object?} [options] |
148 |
| - * @param {FileSet?} [fileSet] - Optional file-set, |
149 |
| - * passed by the CLI. |
150 |
| - * @return {MDAST} |
151 |
| - */ |
152 |
| -function use(attach, options, fileSet) { |
153 |
| - var self = this; |
154 |
| - var index; |
155 |
| - var transformer; |
156 |
| - |
157 |
| - if (!(self instanceof MDAST)) { |
158 |
| - self = new MDAST(); |
159 |
| - } |
160 |
| - |
161 |
| - /* |
162 |
| - * Multiple attachers. |
163 |
| - */ |
164 |
| - |
165 |
| - if ('length' in attach && typeof attach !== 'function') { |
166 |
| - index = -1; |
167 |
| - |
168 |
| - while (attach[++index]) { |
169 |
| - self.use(attach[index], options, fileSet); |
170 |
| - } |
171 |
| - |
172 |
| - return self; |
173 |
| - } |
174 |
| - |
175 |
| - /* |
176 |
| - * Single plugin. |
177 |
| - */ |
178 |
| - |
179 |
| - if (self.attachers.indexOf(attach) === -1) { |
180 |
| - transformer = attach(self, options, fileSet); |
181 |
| - |
182 |
| - self.attachers.push(attach); |
183 |
| - |
184 |
| - if (transformer) { |
185 |
| - self.ware.use(transformer); |
186 |
| - } |
187 |
| - } |
188 |
| - |
189 |
| - return self; |
190 |
| -} |
191 |
| - |
192 |
| -/** |
193 |
| - * Apply transformers to `node`. |
194 |
| - * |
195 |
| - * @param {Node} ast |
196 |
| - * @param {VFile?} [file] |
197 |
| - * @param {Function?} [done] |
198 |
| - * @return {Node} - `ast`. |
199 |
| - */ |
200 |
| -function run(ast, file, done) { |
201 |
| - var self = this; |
202 |
| - |
203 |
| - if (typeof file === 'function') { |
204 |
| - done = file; |
205 |
| - file = null; |
206 |
| - } |
207 |
| - |
208 |
| - file = new VFile(file); |
209 |
| - |
210 |
| - done = typeof done === 'function' ? done : fail; |
211 |
| - |
212 |
| - if (typeof ast !== 'object' && typeof ast.type !== 'string') { |
213 |
| - utilities.raise(ast, 'ast'); |
214 |
| - } |
215 |
| - |
216 |
| - /* |
217 |
| - * Only run when this is an instance of MDAST. |
218 |
| - */ |
219 |
| - |
220 |
| - if (self.ware) { |
221 |
| - self.ware.run(ast, file, done); |
222 |
| - } else { |
223 |
| - done(null, ast, file); |
224 |
| - } |
225 |
| - |
226 |
| - return ast; |
227 |
| -} |
228 |
| - |
229 |
| -/** |
230 |
| - * Wrapper to pass a file to `parser`. |
231 |
| - */ |
232 |
| -function parse(value, options) { |
233 |
| - var file = new VFile(value); |
234 |
| - var ast = file.namespace('mdast').ast = parser.call(this, file, options); |
235 |
| - |
236 |
| - return ast; |
237 |
| -} |
238 |
| - |
239 |
| -/** |
240 |
| - * Wrapper to pass a file to `stringifier`. |
241 |
| - */ |
242 |
| -function stringify(ast, file, options) { |
243 |
| - if (options === null || options === undefined) { |
244 |
| - options = file; |
245 |
| - file = null; |
246 |
| - } |
247 |
| - |
248 |
| - if (!file && ast && !ast.type) { |
249 |
| - file = ast; |
250 |
| - ast = null; |
251 |
| - } |
252 |
| - |
253 |
| - file = new VFile(file); |
254 |
| - |
255 |
| - if (!ast) { |
256 |
| - ast = file.namespace('mdast').ast || ast; |
257 |
| - } |
258 |
| - |
259 |
| - return stringifier.call(this, ast, file, options); |
260 |
| -} |
261 |
| - |
262 |
| -/** |
263 |
| - * Parse a value and apply transformers. |
264 |
| - * |
265 |
| - * @param {string|VFile} value |
266 |
| - * @param {Object?} [options] |
267 |
| - * @param {Function?} [done] |
268 |
| - * @return {string?} |
269 |
| - */ |
270 |
| -function process(value, options, done) { |
271 |
| - var file = new VFile(value); |
272 |
| - var self = this instanceof MDAST ? this : new MDAST(); |
273 |
| - var result = null; |
274 |
| - var ast; |
275 |
| - |
276 |
| - if (typeof options === 'function') { |
277 |
| - done = options; |
278 |
| - options = null; |
279 |
| - } |
280 |
| - |
281 |
| - if (!options) { |
282 |
| - options = {}; |
283 |
| - } |
284 |
| - |
285 |
| - /** |
286 |
| - * Invoked when `run` completes. Hoists `result` into |
287 |
| - * the upper scope to return something for sync |
288 |
| - * operations. |
289 |
| - */ |
290 |
| - function callback(exception) { |
291 |
| - if (exception) { |
292 |
| - (done || fail)(exception); |
293 |
| - } else { |
294 |
| - result = self.stringify(ast, file, options); |
295 |
| - |
296 |
| - if (done) { |
297 |
| - done(null, result, file); |
298 |
| - } |
299 |
| - } |
300 |
| - } |
301 |
| - |
302 |
| - ast = self.parse(file, options); |
303 |
| - |
304 |
| - self.run(ast, file, callback); |
305 |
| - |
306 |
| - return result; |
307 |
| -} |
308 |
| - |
309 |
| -/* |
310 |
| - * Methods. |
311 |
| - */ |
312 |
| - |
313 |
| -var proto = MDAST.prototype; |
314 |
| - |
315 |
| -proto.use = use; |
316 |
| -proto.parse = parse; |
317 |
| -proto.run = run; |
318 |
| -proto.stringify = stringify; |
319 |
| -proto.process = process; |
320 |
| - |
321 |
| -/* |
322 |
| - * Functions. |
323 |
| - */ |
324 |
| - |
325 |
| -MDAST.use = use; |
326 |
| -MDAST.parse = parse; |
327 |
| -MDAST.run = run; |
328 |
| -MDAST.stringify = stringify; |
329 |
| -MDAST.process = process; |
330 |
| - |
331 |
| -/* |
332 |
| - * Expose `mdast`. |
333 |
| - */ |
334 |
| - |
335 |
| -module.exports = MDAST; |
| 23 | +module.exports = unified({ |
| 24 | + 'name': 'mdast', |
| 25 | + 'type': 'ast', |
| 26 | + 'Parser': Parser, |
| 27 | + 'Compiler': Compiler |
| 28 | +}); |
0 commit comments