Skip to content

Commit

Permalink
nearly passing with a clunky state env parser, array issues
Browse files Browse the repository at this point in the history
  • Loading branch information
James Halliday committed May 13, 2013
1 parent 7a0cf79 commit d6d6416
Showing 1 changed file with 41 additions and 8 deletions.
49 changes: 41 additions & 8 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,52 @@ exports.parse = function parse (s, env) {
var match = s.match(chunker);
if (!match) return [];
if (!env) env = {};
return match.map(function (s) {
return [].concat.apply([], match.map(function (s) {
if (/^'/.test(s)) {
return s
.replace(/^'|'$/g, '')
.replace(/\\(["'\\$`(){}!#&*|])/g, '$1')
;
}
else if (/^"/.test(s) && typeof env === 'function') {
var res = [];
s = s.replace(/^"|"$/g, '');

var begin = 0, bracket = false;
for (var i = 0; i < s.length; i++) {
if (s.charAt(i) !== '$' || s.charAt(i-1) === '\\') continue;
if (s.charAt(i+1) === '{') {
i ++;
bracket = true;
}
if (/^[*@#?$!0_-]$/.test(s.charAt(i+1))
&& (!bracket || (bracket && s.charAt(i+2) === '}'))) {
res.push(s.slice(begin, i));
var r = env(s.charAt(i+1));
if (typeof r === 'object') res.push(r);
else res[res.length-1] += r;
i ++;
if (bracket) i++;
begin = i + 1;
continue;
}
for (var j=i+1; j < s.length && /\w/.test(s.charAt(j)); j++);
if (j-(i+1) > 1) {
res.push(s.slice(begin, i));
var r = env(s.slice(i+1, j));
if (typeof r === 'object') res.push(r);
else res[res.length-1] += r;
begin = j;
}
}
res.push(s.slice(begin));
return res.map(function (c) {
if (typeof c === 'object') return c;
return c.replace(/\\([ "'\\$`(){}!#&*|])/g, '$1');
});
}
else if (/^"/.test(s)) {
return s
.replace(/^"|"$/g, '')
return s.replace(/^"|"$/g, '')
.replace(/(^|[^\\])\$(\w+|[*@#?$!0_-])/g, getVar)
.replace(/(^|[^\\])\${(\w+|[*@#?$!0_-])}/g, getVar)
.replace(/\\([ "'\\$`(){}!#&*|])/g, '$1')
Expand All @@ -54,12 +90,9 @@ exports.parse = function parse (s, env) {
return parse('"' + s + '"', env);
}
);
});
}));

function getVar (_, pre, key) {
if (typeof env === 'function') {
return pre + String(env(key) || '');
}
else return pre + String(env[key] || '');
return pre + String(env[key] || '');
}
};

0 comments on commit d6d6416

Please sign in to comment.