Blob Blame History Raw
diff --git a/lib/extglob.js b/lib/extglob.js
index 015f928..8b3ec04 100644
--- a/lib/extglob.js
+++ b/lib/extglob.js
@@ -22,6 +22,9 @@ var parsers = require('./parsers');
 function Extglob(options) {
   this.options = extend({source: 'extglob'}, options);
   this.snapdragon = this.options.snapdragon || new Snapdragon(this.options);
+
+  this.snapdragon.use(capture())
+
   this.snapdragon.patterns = this.snapdragon.patterns || {};
   this.compiler = this.snapdragon.compiler;
   this.parser = this.snapdragon.parser;
diff --git a/lib/parsers.js b/lib/parsers.js
index 2ba7352..670e44a 100644
--- a/lib/parsers.js
+++ b/lib/parsers.js
@@ -31,7 +31,7 @@ function parsers(extglob) {
      * Extglob open: "*("
      */
 
-    .capture('paren.open', function() {
+    .set('paren.open', function() {
       var parsed = this.parsed;
       var pos = this.position();
       var m = this.match(/^([!@*?+])?\(/);
@@ -72,7 +72,7 @@ function parsers(extglob) {
      * Extglob close: ")"
      */
 
-    .capture('paren.close', function() {
+    .set('paren.close', function() {
       var parsed = this.parsed;
       var pos = this.position();
       var m = this.match(/^\)/);
@@ -103,7 +103,7 @@ function parsers(extglob) {
      * Escape: "\\."
      */
 
-    .capture('escape', function() {
+    .set('escape', function() {
       var pos = this.position();
       var m = this.match(/^\\(.)/);
       if (!m) return;
@@ -119,7 +119,7 @@ function parsers(extglob) {
      * Question marks: "?"
      */
 
-    .capture('qmark', function() {
+    .set('qmark', function() {
       var parsed = this.parsed;
       var pos = this.position();
       var m = this.match(/^\?+(?!\()/);
@@ -137,10 +137,47 @@ function parsers(extglob) {
      * Character parsers
      */
 
-    .capture('star', /^\*(?!\()/)
-    .capture('plus', /^\+(?!\()/)
-    .capture('dot', /^\./)
-    .capture('text', not);
+    .set('star', function() {
+      var parsed = this.parse;
+      var pos = this.position();
+      var m = this.match(/^\*(?!\()/);
+      if (!m) return;
+      return pos({
+        type: 'star',
+        val: m[0]
+      });
+    })
+    .set('plus', function() {
+      var parsed = this.parse;
+      var pos = this.position();
+      var m = this.match(/^\+(?!\()/);
+      if (!m) return;
+      return pos({
+        type: 'star',
+        val: m[0]
+      });
+    })
+    .set('dot', function() { 
+      var parsed = this.parse;
+      var pos = this.position();
+      var m = this.match(/^\./);
+      if (!m) return;
+      return pos({
+        type: 'dot',
+        val: m[0]
+      });
+    })
+    .set('text', function() {
+      var pos = this.position();
+      var m = this.match(not);
+      if (!m || !m[0]) return;
+
+      return pos({
+        type: 'text',
+        val: m[0]
+      });
+    });
+
 };
 
 /**