umakantp / jsmart

jSmart is Smarty Javascript Template Engine, port of the PHP Smarty Template Engine
MIT License
134 stars 35 forks source link

Incorrect evalution order #30

Open irok opened 6 years ago

irok commented 6 years ago

The following code seems to be working properly.

jSmart = require('jsmart');
data = {
  array: [1, 2, 3],
  count: (array) => array.length
};

tmpl = new jSmart('{count($array)}');
console.log(tmpl.fetch(data));    // -> 3

tmpl = new jSmart('{if count($array)}OK{else}NG{/if}');
console.log(tmpl.fetch(data));    // -> OK

However, the following code does not work as expected.

tmpl = new jSmart('{if count($array) > 0}OK{else}NG{/if}');
console.log(tmpl.fetch(data));    // -> NG

Apparently, it seems that count modifier is working instead of my count method.

tmpl = new jSmart('{count($array)}');
console.log(tmpl.fetch({
  array: [1, 2, 3],
  count: (array) => 'My count method'
}));
// -> 3

Can I use my count method?

irok commented 6 years ago

My count method worked as follows.

jSmart = require('jsmart');
delete jSmart.prototype.modifiers.count;    // disable count modifier

tmpl = new jSmart('{count($array)}');
console.log(tmpl.fetch({
  array: [1, 2, 3],
  count: (array) => 'My count method'
}));
// -> My count method

But, another problem was discovered.

jSmart = require('jsmart');
delete jSmart.prototype.modifiers.count;

data = {
  array: [1, 2, 3],
  count: (arg) => JSON.stringify({
    typeof: typeof arg,
    value: arg
  })
};

tmpl = new jSmart('{count($array)}');
console.log(tmpl.fetch(data));
// -> {"typeof":"object","value":[1,2,3]}

There is no problem so far.

tmpl = new jSmart('{count($array) > 0}');
console.log(tmpl.fetch(data));
// -> {"typeof":"boolean","value":false}

Why become a boolean?

tmpl = new jSmart('{count($array) == $array}');
console.log(tmpl.fetch(data));
// -> {"typeof":"boolean","value":true}

true!? It seems that there is an error in the evaluation order. Can you fix it?