diff --git a/dist/dust-core-1.0.0.js b/dist/dust-core-1.0.0.js index 58a5ba6c..9c8d1345 100644 --- a/dist/dust-core-1.0.0.js +++ b/dist/dust-core-1.0.0.js @@ -160,7 +160,6 @@ Context.prototype.getPath = function(cur, down) { len = down.length; if (cur && len === 0) return ctx.head; - if (!ctx.isObject) return undefined; ctx = ctx.head; var i = 0; while(ctx && i < len) { diff --git a/dist/dust-full-1.0.0.js b/dist/dust-full-1.0.0.js index 11a20d63..d431b3cf 100644 --- a/dist/dust-full-1.0.0.js +++ b/dist/dust-full-1.0.0.js @@ -160,7 +160,6 @@ Context.prototype.getPath = function(cur, down) { len = down.length; if (cur && len === 0) return ctx.head; - if (!ctx.isObject) return undefined; ctx = ctx.head; var i = 0; while(ctx && i < len) { @@ -1136,8 +1135,8 @@ var parser = (function(){ "integer": parse_integer, "path": parse_path, "key": parse_key, - "nestedKey": parse_nestedKey, "array": parse_array, + "array_part": parse_array_part, "inline": parse_inline, "inline_part": parse_inline_part, "buffer": parse_buffer, @@ -2282,7 +2281,7 @@ var parser = (function(){ result0 = parse_key(); result0 = result0 !== null ? result0 : ""; if (result0 !== null) { - result2 = parse_nestedKey(); + result2 = parse_array_part(); if (result2 === null) { result2 = parse_array(); } @@ -2290,7 +2289,7 @@ var parser = (function(){ result1 = []; while (result2 !== null) { result1.push(result2); - result2 = parse_nestedKey(); + result2 = parse_array_part(); if (result2 === null) { result2 = parse_array(); } @@ -2313,7 +2312,7 @@ var parser = (function(){ d = d[0]; if (k && d) { d.unshift(k); - return [false, d];; + return [false, d]; } return [true, d]; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); @@ -2323,6 +2322,7 @@ var parser = (function(){ } if (result0 === null) { pos0 = clone(pos); + pos1 = clone(pos); if (input.charCodeAt(pos.offset) === 46) { result0 = "."; advance(pos, 1); @@ -2333,7 +2333,35 @@ var parser = (function(){ } } if (result0 !== null) { - result0 = (function(offset, line, column) { return [true, []] })(pos0.offset, pos0.line, pos0.column); + result1 = []; + result2 = parse_array_part(); + if (result2 === null) { + result2 = parse_array(); + } + while (result2 !== null) { + result1.push(result2); + result2 = parse_array_part(); + if (result2 === null) { + result2 = parse_array(); + } + } + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = clone(pos1); + } + } else { + result0 = null; + pos = clone(pos1); + } + if (result0 !== null) { + result0 = (function(offset, line, column, d) { + if (d.length > 0) { + return [true, d[0]]; + } + return [true, []] + })(pos0.offset, pos0.line, pos0.column, result0[1]); } if (result0 === null) { pos = clone(pos0); @@ -2408,7 +2436,7 @@ var parser = (function(){ return result0; } - function parse_nestedKey() { + function parse_array() { var result0, result1, result2; var pos0, pos1, pos2, pos3; @@ -2417,72 +2445,74 @@ var parser = (function(){ pos1 = clone(pos); pos2 = clone(pos); pos3 = clone(pos); - if (input.charCodeAt(pos.offset) === 46) { - result1 = "."; + if (input.charCodeAt(pos.offset) === 91) { + result0 = "["; advance(pos, 1); } else { - result1 = null; + result0 = null; if (reportFailures === 0) { - matchFailed("\".\""); + matchFailed("\"[\""); } } - if (result1 !== null) { - result2 = parse_key(); + if (result0 !== null) { + if (/^[0-9]/.test(input.charAt(pos.offset))) { + result2 = input.charAt(pos.offset); + advance(pos, 1); + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("[0-9]"); + } + } if (result2 !== null) { - result1 = [result1, result2]; + result1 = []; + while (result2 !== null) { + result1.push(result2); + if (/^[0-9]/.test(input.charAt(pos.offset))) { + result2 = input.charAt(pos.offset); + advance(pos, 1); + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("[0-9]"); + } + } + } } else { result1 = null; - pos = clone(pos3); } - } else { - result1 = null; - pos = clone(pos3); - } - if (result1 !== null) { - result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); - } - if (result1 === null) { - pos = clone(pos2); - } - if (result1 !== null) { - result0 = []; - while (result1 !== null) { - result0.push(result1); - pos2 = clone(pos); - pos3 = clone(pos); - if (input.charCodeAt(pos.offset) === 46) { - result1 = "."; + if (result1 !== null) { + if (input.charCodeAt(pos.offset) === 93) { + result2 = "]"; advance(pos, 1); } else { - result1 = null; + result2 = null; if (reportFailures === 0) { - matchFailed("\".\""); + matchFailed("\"]\""); } } - if (result1 !== null) { - result2 = parse_key(); - if (result2 !== null) { - result1 = [result1, result2]; - } else { - result1 = null; - pos = clone(pos3); - } + if (result2 !== null) { + result0 = [result0, result1, result2]; } else { - result1 = null; + result0 = null; pos = clone(pos3); } - if (result1 !== null) { - result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); - } - if (result1 === null) { - pos = clone(pos2); - } + } else { + result0 = null; + pos = clone(pos3); } } else { result0 = null; + pos = clone(pos3); } if (result0 !== null) { - result1 = parse_array(); + result0 = (function(offset, line, column, a) {return a.join('')})(pos2.offset, pos2.line, pos2.column, result0[1]); + } + if (result0 === null) { + pos = clone(pos2); + } + if (result0 !== null) { + result1 = parse_array_part(); result1 = result1 !== null ? result1 : ""; if (result1 !== null) { result0 = [result0, result1]; @@ -2495,19 +2525,19 @@ var parser = (function(){ pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, line, column, d, a) { if (a) { return d.concat(a); } else { return d; } })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); + result0 = (function(offset, line, column, i, nk) { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { - matchFailed("nestedKey"); + matchFailed("array"); } return result0; } - function parse_array() { + function parse_array_part() { var result0, result1, result2; var pos0, pos1, pos2, pos3; @@ -2516,74 +2546,72 @@ var parser = (function(){ pos1 = clone(pos); pos2 = clone(pos); pos3 = clone(pos); - if (input.charCodeAt(pos.offset) === 91) { - result0 = "["; + if (input.charCodeAt(pos.offset) === 46) { + result1 = "."; advance(pos, 1); } else { - result0 = null; + result1 = null; if (reportFailures === 0) { - matchFailed("\"[\""); + matchFailed("\".\""); } } - if (result0 !== null) { - if (/^[0-9]/.test(input.charAt(pos.offset))) { - result2 = input.charAt(pos.offset); - advance(pos, 1); - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } + if (result1 !== null) { + result2 = parse_key(); if (result2 !== null) { - result1 = []; - while (result2 !== null) { - result1.push(result2); - if (/^[0-9]/.test(input.charAt(pos.offset))) { - result2 = input.charAt(pos.offset); - advance(pos, 1); - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } + result1 = [result1, result2]; } else { result1 = null; + pos = clone(pos3); } - if (result1 !== null) { - if (input.charCodeAt(pos.offset) === 93) { - result2 = "]"; + } else { + result1 = null; + pos = clone(pos3); + } + if (result1 !== null) { + result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); + } + if (result1 === null) { + pos = clone(pos2); + } + if (result1 !== null) { + result0 = []; + while (result1 !== null) { + result0.push(result1); + pos2 = clone(pos); + pos3 = clone(pos); + if (input.charCodeAt(pos.offset) === 46) { + result1 = "."; advance(pos, 1); } else { - result2 = null; + result1 = null; if (reportFailures === 0) { - matchFailed("\"]\""); + matchFailed("\".\""); } } - if (result2 !== null) { - result0 = [result0, result1, result2]; + if (result1 !== null) { + result2 = parse_key(); + if (result2 !== null) { + result1 = [result1, result2]; + } else { + result1 = null; + pos = clone(pos3); + } } else { - result0 = null; + result1 = null; pos = clone(pos3); } - } else { - result0 = null; - pos = clone(pos3); + if (result1 !== null) { + result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); + } + if (result1 === null) { + pos = clone(pos2); + } } } else { result0 = null; - pos = clone(pos3); - } - if (result0 !== null) { - result0 = (function(offset, line, column, a) {return a.join('')})(pos2.offset, pos2.line, pos2.column, result0[1]); - } - if (result0 === null) { - pos = clone(pos2); } if (result0 !== null) { - result1 = parse_nestedKey(); + result1 = parse_array(); result1 = result1 !== null ? result1 : ""; if (result1 !== null) { result0 = [result0, result1]; @@ -2596,14 +2624,14 @@ var parser = (function(){ pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, line, column, i, nk) { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); + result0 = (function(offset, line, column, d, a) { if (a) { return d.concat(a); } else { return d; } })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { - matchFailed("array"); + matchFailed("array_part"); } return result0; } diff --git a/lib/parser.js b/lib/parser.js index 61d816fc..d7353e6b 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -57,8 +57,8 @@ var parser = (function(){ "integer": parse_integer, "path": parse_path, "key": parse_key, - "nested_key": parse_nested_key, "array": parse_array, + "array_part": parse_array_part, "inline": parse_inline, "inline_part": parse_inline_part, "buffer": parse_buffer, @@ -1203,7 +1203,7 @@ var parser = (function(){ result0 = parse_key(); result0 = result0 !== null ? result0 : ""; if (result0 !== null) { - result2 = parse_nested_key(); + result2 = parse_array_part(); if (result2 === null) { result2 = parse_array(); } @@ -1211,7 +1211,7 @@ var parser = (function(){ result1 = []; while (result2 !== null) { result1.push(result2); - result2 = parse_nested_key(); + result2 = parse_array_part(); if (result2 === null) { result2 = parse_array(); } @@ -1256,13 +1256,13 @@ var parser = (function(){ } if (result0 !== null) { result1 = []; - result2 = parse_nested_key(); + result2 = parse_array_part(); if (result2 === null) { result2 = parse_array(); } while (result2 !== null) { result1.push(result2); - result2 = parse_nested_key(); + result2 = parse_array_part(); if (result2 === null) { result2 = parse_array(); } @@ -1278,7 +1278,7 @@ var parser = (function(){ pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, line, column, d) { + result0 = (function(offset, line, column, d) { if (d.length > 0) { return [true, d[0]]; } @@ -1358,7 +1358,7 @@ var parser = (function(){ return result0; } - function parse_nested_key() { + function parse_array() { var result0, result1, result2; var pos0, pos1, pos2, pos3; @@ -1367,72 +1367,74 @@ var parser = (function(){ pos1 = clone(pos); pos2 = clone(pos); pos3 = clone(pos); - if (input.charCodeAt(pos.offset) === 46) { - result1 = "."; + if (input.charCodeAt(pos.offset) === 91) { + result0 = "["; advance(pos, 1); } else { - result1 = null; + result0 = null; if (reportFailures === 0) { - matchFailed("\".\""); + matchFailed("\"[\""); } } - if (result1 !== null) { - result2 = parse_key(); + if (result0 !== null) { + if (/^[0-9]/.test(input.charAt(pos.offset))) { + result2 = input.charAt(pos.offset); + advance(pos, 1); + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("[0-9]"); + } + } if (result2 !== null) { - result1 = [result1, result2]; + result1 = []; + while (result2 !== null) { + result1.push(result2); + if (/^[0-9]/.test(input.charAt(pos.offset))) { + result2 = input.charAt(pos.offset); + advance(pos, 1); + } else { + result2 = null; + if (reportFailures === 0) { + matchFailed("[0-9]"); + } + } + } } else { result1 = null; - pos = clone(pos3); } - } else { - result1 = null; - pos = clone(pos3); - } - if (result1 !== null) { - result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); - } - if (result1 === null) { - pos = clone(pos2); - } - if (result1 !== null) { - result0 = []; - while (result1 !== null) { - result0.push(result1); - pos2 = clone(pos); - pos3 = clone(pos); - if (input.charCodeAt(pos.offset) === 46) { - result1 = "."; + if (result1 !== null) { + if (input.charCodeAt(pos.offset) === 93) { + result2 = "]"; advance(pos, 1); } else { - result1 = null; + result2 = null; if (reportFailures === 0) { - matchFailed("\".\""); + matchFailed("\"]\""); } } - if (result1 !== null) { - result2 = parse_key(); - if (result2 !== null) { - result1 = [result1, result2]; - } else { - result1 = null; - pos = clone(pos3); - } + if (result2 !== null) { + result0 = [result0, result1, result2]; } else { - result1 = null; + result0 = null; pos = clone(pos3); } - if (result1 !== null) { - result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); - } - if (result1 === null) { - pos = clone(pos2); - } + } else { + result0 = null; + pos = clone(pos3); } } else { result0 = null; + pos = clone(pos3); } if (result0 !== null) { - result1 = parse_array(); + result0 = (function(offset, line, column, a) {return a.join('')})(pos2.offset, pos2.line, pos2.column, result0[1]); + } + if (result0 === null) { + pos = clone(pos2); + } + if (result0 !== null) { + result1 = parse_array_part(); result1 = result1 !== null ? result1 : ""; if (result1 !== null) { result0 = [result0, result1]; @@ -1445,19 +1447,19 @@ var parser = (function(){ pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, line, column, d, a) { if (a) { return d.concat(a); } else { return d; } })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); + result0 = (function(offset, line, column, i, nk) { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { - matchFailed("nested_key"); + matchFailed("array"); } return result0; } - function parse_array() { + function parse_array_part() { var result0, result1, result2; var pos0, pos1, pos2, pos3; @@ -1466,74 +1468,72 @@ var parser = (function(){ pos1 = clone(pos); pos2 = clone(pos); pos3 = clone(pos); - if (input.charCodeAt(pos.offset) === 91) { - result0 = "["; + if (input.charCodeAt(pos.offset) === 46) { + result1 = "."; advance(pos, 1); } else { - result0 = null; + result1 = null; if (reportFailures === 0) { - matchFailed("\"[\""); + matchFailed("\".\""); } } - if (result0 !== null) { - if (/^[0-9]/.test(input.charAt(pos.offset))) { - result2 = input.charAt(pos.offset); - advance(pos, 1); - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } + if (result1 !== null) { + result2 = parse_key(); if (result2 !== null) { - result1 = []; - while (result2 !== null) { - result1.push(result2); - if (/^[0-9]/.test(input.charAt(pos.offset))) { - result2 = input.charAt(pos.offset); - advance(pos, 1); - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } + result1 = [result1, result2]; } else { result1 = null; + pos = clone(pos3); } - if (result1 !== null) { - if (input.charCodeAt(pos.offset) === 93) { - result2 = "]"; + } else { + result1 = null; + pos = clone(pos3); + } + if (result1 !== null) { + result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); + } + if (result1 === null) { + pos = clone(pos2); + } + if (result1 !== null) { + result0 = []; + while (result1 !== null) { + result0.push(result1); + pos2 = clone(pos); + pos3 = clone(pos); + if (input.charCodeAt(pos.offset) === 46) { + result1 = "."; advance(pos, 1); } else { - result2 = null; + result1 = null; if (reportFailures === 0) { - matchFailed("\"]\""); + matchFailed("\".\""); } } - if (result2 !== null) { - result0 = [result0, result1, result2]; + if (result1 !== null) { + result2 = parse_key(); + if (result2 !== null) { + result1 = [result1, result2]; + } else { + result1 = null; + pos = clone(pos3); + } } else { - result0 = null; + result1 = null; pos = clone(pos3); } - } else { - result0 = null; - pos = clone(pos3); + if (result1 !== null) { + result1 = (function(offset, line, column, k) {return k})(pos2.offset, pos2.line, pos2.column, result1[1]); + } + if (result1 === null) { + pos = clone(pos2); + } } } else { result0 = null; - pos = clone(pos3); } if (result0 !== null) { - result0 = (function(offset, line, column, a) {return a.join('')})(pos2.offset, pos2.line, pos2.column, result0[1]); - } - if (result0 === null) { - pos = clone(pos2); - } - if (result0 !== null) { - result1 = parse_nested_key(); + result1 = parse_array(); result1 = result1 !== null ? result1 : ""; if (result1 !== null) { result0 = [result0, result1]; @@ -1546,14 +1546,14 @@ var parser = (function(){ pos = clone(pos1); } if (result0 !== null) { - result0 = (function(offset, line, column, i, nk) { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); + result0 = (function(offset, line, column, d, a) { if (a) { return d.concat(a); } else { return d; } })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]); } if (result0 === null) { pos = clone(pos0); } reportFailures--; if (reportFailures === 0 && result0 === null) { - matchFailed("array"); + matchFailed("array_part"); } return result0; } diff --git a/src/dust.pegjs b/src/dust.pegjs index df614c61..60b4bddf 100644 --- a/src/dust.pegjs +++ b/src/dust.pegjs @@ -109,7 +109,7 @@ integer "integer" path is defined as matching a key plus one or more characters of key preceded by a dot ---------------------------------------------------------------------------------------------------------------------------------------*/ path "path" - = k:key? d:(nested_key / array)+ { + = k:key? d:(array_part / array)+ { d = d[0]; if (k && d) { d.unshift(k); @@ -117,7 +117,7 @@ path "path" } return [true, d]; } - / "." d:(nested_key / array)* { + / "." d:(array_part / array)* { if (d.length > 0) { return [true, d[0]]; } @@ -130,12 +130,12 @@ path "path" key "key" = h:[a-zA-Z_$] t:[0-9a-zA-Z_$]* { return h + t.join('') } - -nested_key "nested_key" - = d:("." k:key {return k})+ a:(array)? { if (a) { return d.concat(a); } else { return d; } } array "array" - = i:("[" a:([0-9]+) "]" {return a.join('')}) nk: nested_key? { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; } + = i:("[" a:([0-9]+) "]" {return a.join('')}) nk: array_part? { if(nk) { nk.unshift(i); } else {nk = [i] } return nk; } + +array_part "array_part" + = d:("." k:key {return k})+ a:(array)? { if (a) { return d.concat(a); } else { return d; } } /*------------------------------------------------------------------------------------------------------------------------------------- inline params is defined as matching two double quotes or double quotes plus literal followed by closing double quotes or