1
|
# snapdragon-util [](https://www.npmjs.com/package/snapdragon-util) [](https://npmjs.org/package/snapdragon-util) [](https://npmjs.org/package/snapdragon-util) [](https://travis-ci.org/jonschlinkert/snapdragon-util)
|
2
|
|
3
|
> Utilities for the snapdragon parser/compiler.
|
4
|
|
5
|
<details>
|
6
|
<summary><strong>Table of Contents</strong></summary>
|
7
|
|
8
|
- [Install](#install)
|
9
|
- [Usage](#usage)
|
10
|
- [API](#api)
|
11
|
- [Release history](#release-history)
|
12
|
* [[3.0.0] - 2017-05-01](#300---2017-05-01)
|
13
|
* [[0.1.0]](#010)
|
14
|
- [About](#about)
|
15
|
|
16
|
</details>
|
17
|
|
18
|
## Install
|
19
|
|
20
|
Install with [npm](https://www.npmjs.com/):
|
21
|
|
22
|
```sh
|
23
|
$ npm install --save snapdragon-util
|
24
|
```
|
25
|
|
26
|
Install with [yarn](https://yarnpkg.com):
|
27
|
|
28
|
```sh
|
29
|
$ yarn add snapdragon-util
|
30
|
```
|
31
|
|
32
|
## Usage
|
33
|
|
34
|
```js
|
35
|
var util = require('snapdragon-util');
|
36
|
```
|
37
|
|
38
|
## API
|
39
|
|
40
|
### [.isNode](index.js#L21)
|
41
|
|
42
|
Returns true if the given value is a node.
|
43
|
|
44
|
**Params**
|
45
|
|
46
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
47
|
* `returns` **{Boolean}**
|
48
|
|
49
|
**Example**
|
50
|
|
51
|
```js
|
52
|
var Node = require('snapdragon-node');
|
53
|
var node = new Node({type: 'foo'});
|
54
|
console.log(utils.isNode(node)); //=> true
|
55
|
console.log(utils.isNode({})); //=> false
|
56
|
```
|
57
|
|
58
|
### [.noop](index.js#L37)
|
59
|
|
60
|
Emit an empty string for the given `node`.
|
61
|
|
62
|
**Params**
|
63
|
|
64
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
65
|
* `returns` **{undefined}**
|
66
|
|
67
|
**Example**
|
68
|
|
69
|
```js
|
70
|
// do nothing for beginning-of-string
|
71
|
snapdragon.compiler.set('bos', utils.noop);
|
72
|
```
|
73
|
|
74
|
### [.identity](index.js#L53)
|
75
|
|
76
|
Appdend `node.val` to `compiler.output`, exactly as it was created by the parser.
|
77
|
|
78
|
**Params**
|
79
|
|
80
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
81
|
* `returns` **{undefined}**
|
82
|
|
83
|
**Example**
|
84
|
|
85
|
```js
|
86
|
snapdragon.compiler.set('text', utils.identity);
|
87
|
```
|
88
|
|
89
|
### [.append](index.js#L76)
|
90
|
|
91
|
Previously named `.emit`, this method appends the given `val` to `compiler.output` for the given node. Useful when you know what value should be appended advance, regardless of the actual value of `node.val`.
|
92
|
|
93
|
**Params**
|
94
|
|
95
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
96
|
* `returns` **{Function}**: Returns a compiler middleware function.
|
97
|
|
98
|
**Example**
|
99
|
|
100
|
```js
|
101
|
snapdragon.compiler
|
102
|
.set('i', function(node) {
|
103
|
this.mapVisit(node);
|
104
|
})
|
105
|
.set('i.open', utils.append('<i>'))
|
106
|
.set('i.close', utils.append('</i>'))
|
107
|
```
|
108
|
|
109
|
### [.toNoop](index.js#L99)
|
110
|
|
111
|
Used in compiler middleware, this onverts an AST node into an empty `text` node and deletes `node.nodes` if it exists. The advantage of this method is that, as opposed to completely removing the node, indices will not need to be re-calculated in sibling nodes, and nothing is appended to the output.
|
112
|
|
113
|
**Params**
|
114
|
|
115
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
116
|
* `nodes` **{Array}**: Optionally pass a new `nodes` value, to replace the existing `node.nodes` array.
|
117
|
|
118
|
**Example**
|
119
|
|
120
|
```js
|
121
|
utils.toNoop(node);
|
122
|
// convert `node.nodes` to the given value instead of deleting it
|
123
|
utils.toNoop(node, []);
|
124
|
```
|
125
|
|
126
|
### [.visit](index.js#L128)
|
127
|
|
128
|
Visit `node` with the given `fn`. The built-in `.visit` method in snapdragon automatically calls registered compilers, this allows you to pass a visitor function.
|
129
|
|
130
|
**Params**
|
131
|
|
132
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
133
|
* `fn` **{Function}**
|
134
|
* `returns` **{Object}**: returns the node after recursively visiting all child nodes.
|
135
|
|
136
|
**Example**
|
137
|
|
138
|
```js
|
139
|
snapdragon.compiler.set('i', function(node) {
|
140
|
utils.visit(node, function(childNode) {
|
141
|
// do stuff with "childNode"
|
142
|
return childNode;
|
143
|
});
|
144
|
});
|
145
|
```
|
146
|
|
147
|
### [.mapVisit](index.js#L155)
|
148
|
|
149
|
Map [visit](#visit) the given `fn` over `node.nodes`. This is called by [visit](#visit), use this method if you do not want `fn` to be called on the first node.
|
150
|
|
151
|
**Params**
|
152
|
|
153
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
154
|
* `options` **{Object}**
|
155
|
* `fn` **{Function}**
|
156
|
* `returns` **{Object}**: returns the node
|
157
|
|
158
|
**Example**
|
159
|
|
160
|
```js
|
161
|
snapdragon.compiler.set('i', function(node) {
|
162
|
utils.mapVisit(node, function(childNode) {
|
163
|
// do stuff with "childNode"
|
164
|
return childNode;
|
165
|
});
|
166
|
});
|
167
|
```
|
168
|
|
169
|
### [.addOpen](index.js#L194)
|
170
|
|
171
|
Unshift an `*.open` node onto `node.nodes`.
|
172
|
|
173
|
**Params**
|
174
|
|
175
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
176
|
* `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node).
|
177
|
* `filter` **{Function}**: Optionaly specify a filter function to exclude the node.
|
178
|
* `returns` **{Object}**: Returns the created opening node.
|
179
|
|
180
|
**Example**
|
181
|
|
182
|
```js
|
183
|
var Node = require('snapdragon-node');
|
184
|
snapdragon.parser.set('brace', function(node) {
|
185
|
var match = this.match(/^{/);
|
186
|
if (match) {
|
187
|
var parent = new Node({type: 'brace'});
|
188
|
utils.addOpen(parent, Node);
|
189
|
console.log(parent.nodes[0]):
|
190
|
// { type: 'brace.open', val: '' };
|
191
|
|
192
|
// push the parent "brace" node onto the stack
|
193
|
this.push(parent);
|
194
|
|
195
|
// return the parent node, so it's also added to the AST
|
196
|
return brace;
|
197
|
}
|
198
|
});
|
199
|
```
|
200
|
|
201
|
### [.addClose](index.js#L244)
|
202
|
|
203
|
Push a `*.close` node onto `node.nodes`.
|
204
|
|
205
|
**Params**
|
206
|
|
207
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
208
|
* `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node).
|
209
|
* `filter` **{Function}**: Optionaly specify a filter function to exclude the node.
|
210
|
* `returns` **{Object}**: Returns the created closing node.
|
211
|
|
212
|
**Example**
|
213
|
|
214
|
```js
|
215
|
var Node = require('snapdragon-node');
|
216
|
snapdragon.parser.set('brace', function(node) {
|
217
|
var match = this.match(/^}/);
|
218
|
if (match) {
|
219
|
var parent = this.parent();
|
220
|
if (parent.type !== 'brace') {
|
221
|
throw new Error('missing opening: ' + '}');
|
222
|
}
|
223
|
|
224
|
utils.addClose(parent, Node);
|
225
|
console.log(parent.nodes[parent.nodes.length - 1]):
|
226
|
// { type: 'brace.close', val: '' };
|
227
|
|
228
|
// no need to return a node, since the parent
|
229
|
// was already added to the AST
|
230
|
return;
|
231
|
}
|
232
|
});
|
233
|
```
|
234
|
|
235
|
### [.wrapNodes](index.js#L274)
|
236
|
|
237
|
Wraps the given `node` with `*.open` and `*.close` nodes.
|
238
|
|
239
|
**Params**
|
240
|
|
241
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
242
|
* `Node` **{Function}**: (required) Node constructor function from [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node).
|
243
|
* `filter` **{Function}**: Optionaly specify a filter function to exclude the node.
|
244
|
* `returns` **{Object}**: Returns the node
|
245
|
|
246
|
### [.pushNode](index.js#L299)
|
247
|
|
248
|
Push the given `node` onto `parent.nodes`, and set `parent` as `node.parent.
|
249
|
|
250
|
**Params**
|
251
|
|
252
|
* `parent` **{Object}**
|
253
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
254
|
* `returns` **{Object}**: Returns the child node
|
255
|
|
256
|
**Example**
|
257
|
|
258
|
```js
|
259
|
var parent = new Node({type: 'foo'});
|
260
|
var node = new Node({type: 'bar'});
|
261
|
utils.pushNode(parent, node);
|
262
|
console.log(parent.nodes[0].type) // 'bar'
|
263
|
console.log(node.parent.type) // 'foo'
|
264
|
```
|
265
|
|
266
|
### [.unshiftNode](index.js#L325)
|
267
|
|
268
|
Unshift `node` onto `parent.nodes`, and set `parent` as `node.parent.
|
269
|
|
270
|
**Params**
|
271
|
|
272
|
* `parent` **{Object}**
|
273
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
274
|
* `returns` **{undefined}**
|
275
|
|
276
|
**Example**
|
277
|
|
278
|
```js
|
279
|
var parent = new Node({type: 'foo'});
|
280
|
var node = new Node({type: 'bar'});
|
281
|
utils.unshiftNode(parent, node);
|
282
|
console.log(parent.nodes[0].type) // 'bar'
|
283
|
console.log(node.parent.type) // 'foo'
|
284
|
```
|
285
|
|
286
|
### [.popNode](index.js#L354)
|
287
|
|
288
|
Pop the last `node` off of `parent.nodes`. The advantage of using this method is that it checks for `node.nodes` and works with any version of `snapdragon-node`.
|
289
|
|
290
|
**Params**
|
291
|
|
292
|
* `parent` **{Object}**
|
293
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
294
|
* `returns` **{Number|Undefined}**: Returns the length of `node.nodes` or undefined.
|
295
|
|
296
|
**Example**
|
297
|
|
298
|
```js
|
299
|
var parent = new Node({type: 'foo'});
|
300
|
utils.pushNode(parent, new Node({type: 'foo'}));
|
301
|
utils.pushNode(parent, new Node({type: 'bar'}));
|
302
|
utils.pushNode(parent, new Node({type: 'baz'}));
|
303
|
console.log(parent.nodes.length); //=> 3
|
304
|
utils.popNode(parent);
|
305
|
console.log(parent.nodes.length); //=> 2
|
306
|
```
|
307
|
|
308
|
### [.shiftNode](index.js#L382)
|
309
|
|
310
|
Shift the first `node` off of `parent.nodes`. The advantage of using this method is that it checks for `node.nodes` and works with any version of `snapdragon-node`.
|
311
|
|
312
|
**Params**
|
313
|
|
314
|
* `parent` **{Object}**
|
315
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
316
|
* `returns` **{Number|Undefined}**: Returns the length of `node.nodes` or undefined.
|
317
|
|
318
|
**Example**
|
319
|
|
320
|
```js
|
321
|
var parent = new Node({type: 'foo'});
|
322
|
utils.pushNode(parent, new Node({type: 'foo'}));
|
323
|
utils.pushNode(parent, new Node({type: 'bar'}));
|
324
|
utils.pushNode(parent, new Node({type: 'baz'}));
|
325
|
console.log(parent.nodes.length); //=> 3
|
326
|
utils.shiftNode(parent);
|
327
|
console.log(parent.nodes.length); //=> 2
|
328
|
```
|
329
|
|
330
|
### [.removeNode](index.js#L409)
|
331
|
|
332
|
Remove the specified `node` from `parent.nodes`.
|
333
|
|
334
|
**Params**
|
335
|
|
336
|
* `parent` **{Object}**
|
337
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
338
|
* `returns` **{Object|undefined}**: Returns the removed node, if successful, or undefined if it does not exist on `parent.nodes`.
|
339
|
|
340
|
**Example**
|
341
|
|
342
|
```js
|
343
|
var parent = new Node({type: 'abc'});
|
344
|
var foo = new Node({type: 'foo'});
|
345
|
utils.pushNode(parent, foo);
|
346
|
utils.pushNode(parent, new Node({type: 'bar'}));
|
347
|
utils.pushNode(parent, new Node({type: 'baz'}));
|
348
|
console.log(parent.nodes.length); //=> 3
|
349
|
utils.removeNode(parent, foo);
|
350
|
console.log(parent.nodes.length); //=> 2
|
351
|
```
|
352
|
|
353
|
### [.isType](index.js#L443)
|
354
|
|
355
|
Returns true if `node.type` matches the given `type`. Throws a `TypeError` if `node` is not an instance of `Node`.
|
356
|
|
357
|
**Params**
|
358
|
|
359
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
360
|
* `type` **{String}**
|
361
|
* `returns` **{Boolean}**
|
362
|
|
363
|
**Example**
|
364
|
|
365
|
```js
|
366
|
var Node = require('snapdragon-node');
|
367
|
var node = new Node({type: 'foo'});
|
368
|
console.log(utils.isType(node, 'foo')); // false
|
369
|
console.log(utils.isType(node, 'bar')); // true
|
370
|
```
|
371
|
|
372
|
### [.hasType](index.js#L486)
|
373
|
|
374
|
Returns true if the given `node` has the given `type` in `node.nodes`. Throws a `TypeError` if `node` is not an instance of `Node`.
|
375
|
|
376
|
**Params**
|
377
|
|
378
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
379
|
* `type` **{String}**
|
380
|
* `returns` **{Boolean}**
|
381
|
|
382
|
**Example**
|
383
|
|
384
|
```js
|
385
|
var Node = require('snapdragon-node');
|
386
|
var node = new Node({
|
387
|
type: 'foo',
|
388
|
nodes: [
|
389
|
new Node({type: 'bar'}),
|
390
|
new Node({type: 'baz'})
|
391
|
]
|
392
|
});
|
393
|
console.log(utils.hasType(node, 'xyz')); // false
|
394
|
console.log(utils.hasType(node, 'baz')); // true
|
395
|
```
|
396
|
|
397
|
### [.firstOfType](index.js#L519)
|
398
|
|
399
|
Returns the first node from `node.nodes` of the given `type`
|
400
|
|
401
|
**Params**
|
402
|
|
403
|
* `nodes` **{Array}**
|
404
|
* `type` **{String}**
|
405
|
* `returns` **{Object|undefined}**: Returns the first matching node or undefined.
|
406
|
|
407
|
**Example**
|
408
|
|
409
|
```js
|
410
|
var node = new Node({
|
411
|
type: 'foo',
|
412
|
nodes: [
|
413
|
new Node({type: 'text', val: 'abc'}),
|
414
|
new Node({type: 'text', val: 'xyz'})
|
415
|
]
|
416
|
});
|
417
|
|
418
|
var textNode = utils.firstOfType(node.nodes, 'text');
|
419
|
console.log(textNode.val);
|
420
|
//=> 'abc'
|
421
|
```
|
422
|
|
423
|
### [.findNode](index.js#L556)
|
424
|
|
425
|
Returns the node at the specified index, or the first node of the given `type` from `node.nodes`.
|
426
|
|
427
|
**Params**
|
428
|
|
429
|
* `nodes` **{Array}**
|
430
|
* `type` **{String|Number}**: Node type or index.
|
431
|
* `returns` **{Object}**: Returns a node or undefined.
|
432
|
|
433
|
**Example**
|
434
|
|
435
|
```js
|
436
|
var node = new Node({
|
437
|
type: 'foo',
|
438
|
nodes: [
|
439
|
new Node({type: 'text', val: 'abc'}),
|
440
|
new Node({type: 'text', val: 'xyz'})
|
441
|
]
|
442
|
});
|
443
|
|
444
|
var nodeOne = utils.findNode(node.nodes, 'text');
|
445
|
console.log(nodeOne.val);
|
446
|
//=> 'abc'
|
447
|
|
448
|
var nodeTwo = utils.findNode(node.nodes, 1);
|
449
|
console.log(nodeTwo.val);
|
450
|
//=> 'xyz'
|
451
|
```
|
452
|
|
453
|
### [.isOpen](index.js#L584)
|
454
|
|
455
|
Returns true if the given node is an "*.open" node.
|
456
|
|
457
|
**Params**
|
458
|
|
459
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
460
|
* `returns` **{Boolean}**
|
461
|
|
462
|
**Example**
|
463
|
|
464
|
```js
|
465
|
var Node = require('snapdragon-node');
|
466
|
var brace = new Node({type: 'brace'});
|
467
|
var open = new Node({type: 'brace.open'});
|
468
|
var close = new Node({type: 'brace.close'});
|
469
|
|
470
|
console.log(utils.isOpen(brace)); // false
|
471
|
console.log(utils.isOpen(open)); // true
|
472
|
console.log(utils.isOpen(close)); // false
|
473
|
```
|
474
|
|
475
|
### [.isClose](index.js#L607)
|
476
|
|
477
|
Returns true if the given node is a "*.close" node.
|
478
|
|
479
|
**Params**
|
480
|
|
481
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
482
|
* `returns` **{Boolean}**
|
483
|
|
484
|
**Example**
|
485
|
|
486
|
```js
|
487
|
var Node = require('snapdragon-node');
|
488
|
var brace = new Node({type: 'brace'});
|
489
|
var open = new Node({type: 'brace.open'});
|
490
|
var close = new Node({type: 'brace.close'});
|
491
|
|
492
|
console.log(utils.isClose(brace)); // false
|
493
|
console.log(utils.isClose(open)); // false
|
494
|
console.log(utils.isClose(close)); // true
|
495
|
```
|
496
|
|
497
|
### [.hasOpen](index.js#L633)
|
498
|
|
499
|
Returns true if `node.nodes` **has** an `.open` node
|
500
|
|
501
|
**Params**
|
502
|
|
503
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
504
|
* `returns` **{Boolean}**
|
505
|
|
506
|
**Example**
|
507
|
|
508
|
```js
|
509
|
var Node = require('snapdragon-node');
|
510
|
var brace = new Node({
|
511
|
type: 'brace',
|
512
|
nodes: []
|
513
|
});
|
514
|
|
515
|
var open = new Node({type: 'brace.open'});
|
516
|
console.log(utils.hasOpen(brace)); // false
|
517
|
|
518
|
brace.pushNode(open);
|
519
|
console.log(utils.hasOpen(brace)); // true
|
520
|
```
|
521
|
|
522
|
### [.hasClose](index.js#L663)
|
523
|
|
524
|
Returns true if `node.nodes` **has** a `.close` node
|
525
|
|
526
|
**Params**
|
527
|
|
528
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
529
|
* `returns` **{Boolean}**
|
530
|
|
531
|
**Example**
|
532
|
|
533
|
```js
|
534
|
var Node = require('snapdragon-node');
|
535
|
var brace = new Node({
|
536
|
type: 'brace',
|
537
|
nodes: []
|
538
|
});
|
539
|
|
540
|
var close = new Node({type: 'brace.close'});
|
541
|
console.log(utils.hasClose(brace)); // false
|
542
|
|
543
|
brace.pushNode(close);
|
544
|
console.log(utils.hasClose(brace)); // true
|
545
|
```
|
546
|
|
547
|
### [.hasOpenAndClose](index.js#L697)
|
548
|
|
549
|
Returns true if `node.nodes` has both `.open` and `.close` nodes
|
550
|
|
551
|
**Params**
|
552
|
|
553
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
554
|
* `returns` **{Boolean}**
|
555
|
|
556
|
**Example**
|
557
|
|
558
|
```js
|
559
|
var Node = require('snapdragon-node');
|
560
|
var brace = new Node({
|
561
|
type: 'brace',
|
562
|
nodes: []
|
563
|
});
|
564
|
|
565
|
var open = new Node({type: 'brace.open'});
|
566
|
var close = new Node({type: 'brace.close'});
|
567
|
console.log(utils.hasOpen(brace)); // false
|
568
|
console.log(utils.hasClose(brace)); // false
|
569
|
|
570
|
brace.pushNode(open);
|
571
|
brace.pushNode(close);
|
572
|
console.log(utils.hasOpen(brace)); // true
|
573
|
console.log(utils.hasClose(brace)); // true
|
574
|
```
|
575
|
|
576
|
### [.addType](index.js#L719)
|
577
|
|
578
|
Push the given `node` onto the `state.inside` array for the given type. This array is used as a specialized "stack" for only the given `node.type`.
|
579
|
|
580
|
**Params**
|
581
|
|
582
|
* `state` **{Object}**: The `compiler.state` object or custom state object.
|
583
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
584
|
* `returns` **{Array}**: Returns the `state.inside` stack for the given type.
|
585
|
|
586
|
**Example**
|
587
|
|
588
|
```js
|
589
|
var state = { inside: {}};
|
590
|
var node = new Node({type: 'brace'});
|
591
|
utils.addType(state, node);
|
592
|
console.log(state.inside);
|
593
|
//=> { brace: [{type: 'brace'}] }
|
594
|
```
|
595
|
|
596
|
### [.removeType](index.js#L759)
|
597
|
|
598
|
Remove the given `node` from the `state.inside` array for the given type. This array is used as a specialized "stack" for only the given `node.type`.
|
599
|
|
600
|
**Params**
|
601
|
|
602
|
* `state` **{Object}**: The `compiler.state` object or custom state object.
|
603
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
604
|
* `returns` **{Array}**: Returns the `state.inside` stack for the given type.
|
605
|
|
606
|
**Example**
|
607
|
|
608
|
```js
|
609
|
var state = { inside: {}};
|
610
|
var node = new Node({type: 'brace'});
|
611
|
utils.addType(state, node);
|
612
|
console.log(state.inside);
|
613
|
//=> { brace: [{type: 'brace'}] }
|
614
|
utils.removeType(state, node);
|
615
|
//=> { brace: [] }
|
616
|
```
|
617
|
|
618
|
### [.isEmpty](index.js#L788)
|
619
|
|
620
|
Returns true if `node.val` is an empty string, or `node.nodes` does not contain any non-empty text nodes.
|
621
|
|
622
|
**Params**
|
623
|
|
624
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
625
|
* `fn` **{Function}**
|
626
|
* `returns` **{Boolean}**
|
627
|
|
628
|
**Example**
|
629
|
|
630
|
```js
|
631
|
var node = new Node({type: 'text'});
|
632
|
utils.isEmpty(node); //=> true
|
633
|
node.val = 'foo';
|
634
|
utils.isEmpty(node); //=> false
|
635
|
```
|
636
|
|
637
|
### [.isInsideType](index.js#L833)
|
638
|
|
639
|
Returns true if the `state.inside` stack for the given type exists and has one or more nodes on it.
|
640
|
|
641
|
**Params**
|
642
|
|
643
|
* `state` **{Object}**
|
644
|
* `type` **{String}**
|
645
|
* `returns` **{Boolean}**
|
646
|
|
647
|
**Example**
|
648
|
|
649
|
```js
|
650
|
var state = { inside: {}};
|
651
|
var node = new Node({type: 'brace'});
|
652
|
console.log(utils.isInsideType(state, 'brace')); //=> false
|
653
|
utils.addType(state, node);
|
654
|
console.log(utils.isInsideType(state, 'brace')); //=> true
|
655
|
utils.removeType(state, node);
|
656
|
console.log(utils.isInsideType(state, 'brace')); //=> false
|
657
|
```
|
658
|
|
659
|
### [.isInside](index.js#L867)
|
660
|
|
661
|
Returns true if `node` is either a child or grand-child of the given `type`, or `state.inside[type]` is a non-empty array.
|
662
|
|
663
|
**Params**
|
664
|
|
665
|
* `state` **{Object}**: Either the `compiler.state` object, if it exists, or a user-supplied state object.
|
666
|
* `node` **{Object}**: Instance of [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node)
|
667
|
* `type` **{String}**: The `node.type` to check for.
|
668
|
* `returns` **{Boolean}**
|
669
|
|
670
|
**Example**
|
671
|
|
672
|
```js
|
673
|
var state = { inside: {}};
|
674
|
var node = new Node({type: 'brace'});
|
675
|
var open = new Node({type: 'brace.open'});
|
676
|
console.log(utils.isInside(state, open, 'brace')); //=> false
|
677
|
utils.pushNode(node, open);
|
678
|
console.log(utils.isInside(state, open, 'brace')); //=> true
|
679
|
```
|
680
|
|
681
|
### [.last](index.js#L915)
|
682
|
|
683
|
Get the last `n` element from the given `array`. Used for getting
|
684
|
a node from `node.nodes.`
|
685
|
|
686
|
**Params**
|
687
|
|
688
|
* `array` **{Array}**
|
689
|
* `n` **{Number}**
|
690
|
* `returns` **{undefined}**
|
691
|
|
692
|
### [.arrayify](index.js#L935)
|
693
|
|
694
|
Cast the given `val` to an array.
|
695
|
|
696
|
**Params**
|
697
|
|
698
|
* `val` **{any}**
|
699
|
* `returns` **{Array}**
|
700
|
|
701
|
**Example**
|
702
|
|
703
|
```js
|
704
|
console.log(utils.arraify(''));
|
705
|
//=> []
|
706
|
console.log(utils.arraify('foo'));
|
707
|
//=> ['foo']
|
708
|
console.log(utils.arraify(['foo']));
|
709
|
//=> ['foo']
|
710
|
```
|
711
|
|
712
|
### [.stringify](index.js#L948)
|
713
|
|
714
|
Convert the given `val` to a string by joining with `,`. Useful
|
715
|
for creating a cheerio/CSS/DOM-style selector from a list of strings.
|
716
|
|
717
|
**Params**
|
718
|
|
719
|
* `val` **{any}**
|
720
|
* `returns` **{Array}**
|
721
|
|
722
|
### [.trim](index.js#L961)
|
723
|
|
724
|
Ensure that the given value is a string and call `.trim()` on it,
|
725
|
or return an empty string.
|
726
|
|
727
|
**Params**
|
728
|
|
729
|
* `str` **{String}**
|
730
|
* `returns` **{String}**
|
731
|
|
732
|
## Release history
|
733
|
|
734
|
Changelog entries are classified using the following labels from [keep-a-changelog](https://github.com/olivierlacan/keep-a-changelog):
|
735
|
|
736
|
* `added`: for new features
|
737
|
* `changed`: for changes in existing functionality
|
738
|
* `deprecated`: for once-stable features removed in upcoming releases
|
739
|
* `removed`: for deprecated features removed in this release
|
740
|
* `fixed`: for any bug fixes
|
741
|
|
742
|
Custom labels used in this changelog:
|
743
|
|
744
|
* `dependencies`: bumps dependencies
|
745
|
* `housekeeping`: code re-organization, minor edits, or other changes that don't fit in one of the other categories.
|
746
|
|
747
|
### [3.0.0] - 2017-05-01
|
748
|
|
749
|
**Changed**
|
750
|
|
751
|
* `.emit` was renamed to [.append](#append)
|
752
|
* `.addNode` was renamed to [.pushNode](#pushNode)
|
753
|
* `.getNode` was renamed to [.findNode](#findNode)
|
754
|
* `.isEmptyNodes` was renamed to [.isEmpty](#isEmpty): also now works with `node.nodes` and/or `node.val`
|
755
|
|
756
|
**Added**
|
757
|
|
758
|
* [.identity](#identity)
|
759
|
* [.removeNode](#removeNode)
|
760
|
* [.shiftNode](#shiftNode)
|
761
|
* [.popNode](#popNode)
|
762
|
|
763
|
### [0.1.0]
|
764
|
|
765
|
First release.
|
766
|
|
767
|
## About
|
768
|
|
769
|
### Contributing
|
770
|
|
771
|
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
|
772
|
|
773
|
Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards.
|
774
|
|
775
|
### Building docs
|
776
|
|
777
|
_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
|
778
|
|
779
|
To generate the readme, run the following command:
|
780
|
|
781
|
```sh
|
782
|
$ npm install -g verbose/verb#dev verb-generate-readme && verb
|
783
|
```
|
784
|
|
785
|
### Running tests
|
786
|
|
787
|
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
|
788
|
|
789
|
```sh
|
790
|
$ npm install && npm test
|
791
|
```
|
792
|
|
793
|
### Author
|
794
|
|
795
|
**Jon Schlinkert**
|
796
|
|
797
|
* [github/jonschlinkert](https://github.com/jonschlinkert)
|
798
|
* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
|
799
|
|
800
|
### License
|
801
|
|
802
|
Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert).
|
803
|
Released under the [MIT License](LICENSE).
|
804
|
|
805
|
***
|
806
|
|
807
|
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 01, 2017._
|