Projekt

Obecné

Profil

Stáhnout (1.69 KB) Statistiky
| Větev: | Revize:
1
'use strict';
2

    
3
/**
4
 * Module dependencies
5
 */
6

    
7
var Snapdragon = require('snapdragon');
8
var define = require('define-property');
9
var extend = require('extend-shallow');
10

    
11
/**
12
 * Local dependencies
13
 */
14

    
15
var compilers = require('./compilers');
16
var parsers = require('./parsers');
17

    
18
/**
19
 * Customize Snapdragon parser and renderer
20
 */
21

    
22
function Extglob(options) {
23
  this.options = extend({source: 'extglob'}, options);
24
  this.snapdragon = this.options.snapdragon || new Snapdragon(this.options);
25
  this.snapdragon.patterns = this.snapdragon.patterns || {};
26
  this.compiler = this.snapdragon.compiler;
27
  this.parser = this.snapdragon.parser;
28

    
29
  compilers(this.snapdragon);
30
  parsers(this.snapdragon);
31

    
32
  /**
33
   * Override Snapdragon `.parse` method
34
   */
35

    
36
  define(this.snapdragon, 'parse', function(str, options) {
37
    var parsed = Snapdragon.prototype.parse.apply(this, arguments);
38
    parsed.input = str;
39

    
40
    // escape unmatched brace/bracket/parens
41
    var last = this.parser.stack.pop();
42
    if (last && this.options.strict !== true) {
43
      var node = last.nodes[0];
44
      node.val = '\\' + node.val;
45
      var sibling = node.parent.nodes[1];
46
      if (sibling.type === 'star') {
47
        sibling.loose = true;
48
      }
49
    }
50

    
51
    // add non-enumerable parser reference
52
    define(parsed, 'parser', this.parser);
53
    return parsed;
54
  });
55

    
56
  /**
57
   * Decorate `.parse` method
58
   */
59

    
60
  define(this, 'parse', function(ast, options) {
61
    return this.snapdragon.parse.apply(this.snapdragon, arguments);
62
  });
63

    
64
  /**
65
   * Decorate `.compile` method
66
   */
67

    
68
  define(this, 'compile', function(ast, options) {
69
    return this.snapdragon.compile.apply(this.snapdragon, arguments);
70
  });
71

    
72
}
73

    
74
/**
75
 * Expose `Extglob`
76
 */
77

    
78
module.exports = Extglob;
(2-2/4)