diff options
| -rw-r--r-- | luigi-template.js | 35 | ||||
| -rw-r--r-- | test.js | 12 | 
2 files changed, 28 insertions, 19 deletions
| diff --git a/luigi-template.js b/luigi-template.js index 2073a0f..df7e150 100644 --- a/luigi-template.js +++ b/luigi-template.js @@ -116,9 +116,7 @@ LuigiTemplate = (function() {          return a.reduce(fn, iv);        };      } else { -      return function(a, fn, iv) { -        var r = iv; - +      return function(a, fn, r) {          each(a, function(v, i) {            r = fn(r, v, i, a);          }); @@ -132,7 +130,7 @@ LuigiTemplate = (function() {    var trim = (function() {      if (String.prototype.trim) {        return function(s) { -        return s.trim(); +        return (s || '').trim();        };      } else {        var re = /^\s+|\s+$/g; @@ -197,8 +195,8 @@ LuigiTemplate = (function() {    };    var RES = { -    actions:  /%\{\s*([^\s\|\}]+)\s*((\s*\|(\s*[^\s\|\}]+)+)*)\s*\}|([^%]|%)/g, -    filter:   /(\S+)((\s*\S+)*)\s*/g, +    actions: /%\{\s*([^\s\|\}]+)\s*((\s*\|(\s*[^\s\|\}]+)+)*)\s*\}|([^%]+|%)/g, +    filter:   /(\S+)((\s*\S+)*)\s*/,      delim_filters: /\s*\|\s*/,      delim_args:    /\s+/    }; @@ -237,9 +235,11 @@ LuigiTemplate = (function() {        if (!m)          throw new Error('invalid filter: ' + f); +      var as = trim(m[2]); +        r.push({          name: m[1], -        args: trim(m[2]).split(RES.delim_args) +        args: as.length ? as.split(RES.delim_args) : []        });      }); @@ -255,13 +255,22 @@ LuigiTemplate = (function() {    function run(o) {      var i, l, f, fs, me = this; -    return map(this.actions, function(row) { -      if (!row.key in o) -        throw new Error('missing key: ' + row.key) +    print(JSON.stringify(this.actions)); -      return reduce(row.filters, function(r, f) { -        return FILTERS[f.name](r, f.args, o, this); -      }, o[row.key]); +    return map(this.actions, function(row) { +      if (row.type == 'text') { +        return row.text; +      } else if (row.type == 'action') { +        if (!row.key in o) +          throw new Error('missing key: ' + row.key) + +        return reduce(row.filters, function(r, f) { +          return FILTERS[f.name](r, f.args, o, this); +        }, o[row.key]); +      } else { +        /* never reached */ +        throw new Error('BUG: invalid type: ' + row.type); +      }      }).join('');    } @@ -25,21 +25,21 @@ var template_str = [    "%{greet}, %{name}!",    // test filters and filters with parameters -  "Your name hashes to: %{name|hash(sha1)|uc}", +  "Your name uppercase is: %{name|uc}",    // test custom filter    "Your custom filtered name is: %{name|custom}",    // test custom filter with arguments -  "Your custom_args name is: %{name|custom_args(foo,bar,baz)}", +  "Your custom_args name is: %{name|custom_args foo bar baz}",    // test whitespace in filters -  "random test: %{name | hash( sha512 ) | uc }", +  "random test: %{name | lc }",    // test pluralize filter -  'pluralize test (0): %{count_0} %{count_0 | pluralize(item)}', -  'pluralize test (1): %{count_1} %{count_1 | pluralize(item)}', -  'pluralize test (10): %{count_10} %{count_10 | pluralize(item)}', +  'pluralize test (0): %{count_0} item%{count_0 | s}', +  'pluralize test (1): %{count_1} item%{count_1 | s}', +  'pluralize test (10): %{count_10} item%{count_10 | s}',    // terminating newline    '' | 
