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
+
});
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4