From 6d20f7aa8ec91dc0d56ac9a0c204c4199d4f55e5 Mon Sep 17 00:00:00 2001 From: harttle Date: Mon, 24 Oct 2016 23:11:37 +0800 Subject: [PATCH] rename expression.js -> syntax.js --- index.js | 10 ++--- src/expression.js | 55 -------------------------- src/filter.js | 4 +- src/operators.js | 13 ++++++ src/render.js | 4 +- src/syntax.js | 66 +++++++++++++++++++++++++------ src/tag.js | 4 +- test/{expression.js => syntax.js} | 6 +-- 8 files changed, 81 insertions(+), 81 deletions(-) delete mode 100644 src/expression.js create mode 100644 src/operators.js rename test/{expression.js => syntax.js} (93%) diff --git a/index.js b/index.js index 3bf00f7a5..59602ab1f 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ const lexical = require('./src/lexical.js'); const Tag = require('./src/tag.js'); const Filter = require('./src/filter.js'); const Template = require('./src/parser'); -const Expression = require('./src/expression.js'); +const Syntax = require('./src/syntax.js'); const tags = require('./tags'); const filters = require('./filters'); const Promise = require('any-promise'); @@ -127,9 +127,9 @@ function resolvePath(root, path) { } factory.lexical = lexical; -factory.isTruthy = Expression.isTruthy; -factory.isFalsy = Expression.isFalsy; -factory.evalExp = Expression.evalExp; -factory.evalValue = Expression.evalValue; +factory.isTruthy = Syntax.isTruthy; +factory.isFalsy = Syntax.isFalsy; +factory.evalExp = Syntax.evalExp; +factory.evalValue = Syntax.evalValue; module.exports = factory; diff --git a/src/expression.js b/src/expression.js deleted file mode 100644 index dbf2bbfaf..000000000 --- a/src/expression.js +++ /dev/null @@ -1,55 +0,0 @@ -const syntax = require('./syntax.js'); -const lexical = require('./lexical.js'); - -function evalExp(exp, scope) { - if (!scope) throw new Error('unable to evalExp: scope undefined'); - var operatorREs = lexical.operators, - match; - for (var i = 0; i < operatorREs.length; i++) { - var operatorRE = operatorREs[i]; - var expRE = new RegExp(`^(${lexical.quoteBalanced.source})(${operatorRE.source})(${lexical.quoteBalanced.source})$`); - if (match = exp.match(expRE)) { - var l = evalExp(match[1], scope); - var op = syntax.operators[match[2].trim()]; - var r = evalExp(match[3], scope); - return op(l, r); - } - } - - if (match = exp.match(lexical.rangeLine)) { - var low = evalValue(match[1], scope), - high = evalValue(match[2], scope); - var range = []; - for (var j = low; j <= high; j++) { - range.push(j); - } - return range; - } - - return evalValue(exp, scope); -} - -function evalValue(str, scope) { - str = str && str.trim(); - if (!str) return undefined; - - if (lexical.isLiteral(str)) { - return lexical.parseLiteral(str); - } - if (lexical.isVariable(str)) { - return scope.get(str); - } -} - -function isTruthy(val) { - if (val instanceof Array) return !!val.length; - return !!val; -} - -function isFalsy(val) { - return !isTruthy(val); -} - -module.exports = { - evalExp, evalValue, isTruthy, isFalsy -}; diff --git a/src/filter.js b/src/filter.js index f5995780b..cd5fb7752 100644 --- a/src/filter.js +++ b/src/filter.js @@ -1,5 +1,5 @@ const lexical = require('./lexical.js'); -const Exp = require('./expression.js'); +const Syntax = require('./syntax.js'); var valueRE = new RegExp(`${lexical.value.source}`, 'g'); @@ -8,7 +8,7 @@ module.exports = function() { var _filterInstance = { render: function(output, scope) { - var args = this.args.map(arg => Exp.evalValue(arg, scope)); + var args = this.args.map(arg => Syntax.evalValue(arg, scope)); args.unshift(output); return this.filter.apply(null, args); }, diff --git a/src/operators.js b/src/operators.js new file mode 100644 index 000000000..e233416e2 --- /dev/null +++ b/src/operators.js @@ -0,0 +1,13 @@ +var operators = { + '==': (l, r) => l == r, + '!=': (l, r) => l != r, + '>': (l, r) => l > r, + '<': (l, r) => l < r, + '>=': (l, r) => l >= r, + '<=': (l, r) => l <= r, + 'contains': (l, r) => l.indexOf(r) > -1, + 'and': (l, r) => l && r, + 'or': (l, r) => l || r +}; + +module.exports = operators; diff --git a/src/render.js b/src/render.js index e0ec1cce4..ebfc89d38 100644 --- a/src/render.js +++ b/src/render.js @@ -1,4 +1,4 @@ -const Exp = require('./expression.js'); +const Syntax = require('./syntax.js'); const Promise = require('any-promise'); var render = { @@ -89,7 +89,7 @@ var render = { evalOutput: function(template, scope, opts) { if(!scope) throw new Error('unable to evalOutput: scope undefined'); - var val = Exp.evalExp(template.initial, scope); + var val = Syntax.evalExp(template.initial, scope); template.filters.some(filter => { if (filter.error) { if (opts.strict_filters) { diff --git a/src/syntax.js b/src/syntax.js index a48ef9054..42637000d 100644 --- a/src/syntax.js +++ b/src/syntax.js @@ -1,13 +1,55 @@ -var operators = { - '==': (l, r) => l == r, - '!=': (l, r) => l != r, - '>': (l, r) => l > r, - '<': (l, r) => l < r, - '>=': (l, r) => l >= r, - '<=': (l, r) => l <= r, - 'contains': (l, r) => l.indexOf(r) > -1, - 'and': (l, r) => l && r, - 'or': (l, r) => l || r -}; +const operators = require('./operators.js'); +const lexical = require('./lexical.js'); -exports.operators = operators; +function evalExp(exp, scope) { + if (!scope) throw new Error('unable to evalExp: scope undefined'); + var operatorREs = lexical.operators, + match; + for (var i = 0; i < operatorREs.length; i++) { + var operatorRE = operatorREs[i]; + var expRE = new RegExp(`^(${lexical.quoteBalanced.source})(${operatorRE.source})(${lexical.quoteBalanced.source})$`); + if (match = exp.match(expRE)) { + var l = evalExp(match[1], scope); + var op = operators[match[2].trim()]; + var r = evalExp(match[3], scope); + return op(l, r); + } + } + + if (match = exp.match(lexical.rangeLine)) { + var low = evalValue(match[1], scope), + high = evalValue(match[2], scope); + var range = []; + for (var j = low; j <= high; j++) { + range.push(j); + } + return range; + } + + return evalValue(exp, scope); +} + +function evalValue(str, scope) { + str = str && str.trim(); + if (!str) return undefined; + + if (lexical.isLiteral(str)) { + return lexical.parseLiteral(str); + } + if (lexical.isVariable(str)) { + return scope.get(str); + } +} + +function isTruthy(val) { + if (val instanceof Array) return !!val.length; + return !!val; +} + +function isFalsy(val) { + return !isTruthy(val); +} + +module.exports = { + evalExp, evalValue, isTruthy, isFalsy +}; diff --git a/src/tag.js b/src/tag.js index 1e4e11546..1388e21a9 100644 --- a/src/tag.js +++ b/src/tag.js @@ -1,6 +1,6 @@ const lexical = require('./lexical.js'); const Promise = require('any-promise'); -const Exp = require('./expression.js'); +const Syntax = require('./syntax.js'); function hash(markup, scope) { var obj = {}, match; @@ -8,7 +8,7 @@ function hash(markup, scope) { while (match = lexical.hashCapture.exec(markup)) { var k = match[1], v = match[2]; - obj[k] = Exp.evalValue(v, scope); + obj[k] = Syntax.evalValue(v, scope); } return obj; } diff --git a/test/expression.js b/test/syntax.js similarity index 93% rename from test/expression.js rename to test/syntax.js index ee9265722..75f2b37a7 100644 --- a/test/expression.js +++ b/test/syntax.js @@ -1,10 +1,10 @@ const chai = require("chai"); const expect = chai.expect; -var expression = require('../src/expression.js'); +var syntax = require('../src/syntax.js'); var Scope = require('../src/scope.js'); -var evalExp = expression.evalExp; -var evalValue = expression.evalValue; +var evalExp = syntax.evalExp; +var evalValue = syntax.evalValue; describe('expression', function() { var scope;