New issue 68 by bharbu...@gmail.com: HTML formatter doesn't work for
numeric values
http://code.google.com/p/json-template/issues/detail?id=68
What steps will reproduce the problem?
1. Put a JSON numeric value in the variables to use.
2. Use the {{{'html'}}} formatter.
What is the expected output? What do you see instead?
This will produce a {{{TypeError}}} exception, since it tries to call
{{{replace}}} on the value. Turning the number into a string would be more
meaningful.
What version of the product are you using? On what operating system?
The latest at this time:
http://code.google.com/p/json-template/source/browse/javascript/json-template.js?r=baeee0fc6efadd5b02d3b967ffccefb4e3e92219
Please provide any additional information below.
There is an example here: http://jsfiddle.net/vUhG5/
The following fails:
{{{
var testData = {
var_a: '10001',
var_b: 10002
};
var t = jsontemplate.fromString('var_a={var_a} and var_b={var_b}', {
default_formatter: 'html' });
var txt = t.expand(testData);
}}}
The error is within function {{{HtmlEscape}}}, at line 55: {{{var_b}}} is
not a string and doesn't have a {{{replace}}} method.
Doing {{{s.toString().replace(...)....}}} instead of {{{s.replace(...)}}}
should fix the problem.
The same issue applies to {{{HtmlTagEscape}}} just below, of course.
I think you should be able to use
{foo|str|html}
now. That will convert the number to a string and them to html.
There might be some behavior change warranted -- I did tweak this in the
Python version I think.
(Although, you don't need to ever escape numbers in HTML... so leaving it
out altogether works too)
Thank you. This works indeed, but this is mainly a problem when relying on
the default_formatter. I may have missed something in the documentation,
but I haven't seen a "post_formatter", which would be applied to anything,
after any specific formatter.
> Although, you don't need to ever escape numbers in HTML... so leaving it
> out altogether works too
This works if I know in advance that it's going to be a number and not an
arbitrary string with some characters that need to be escaped.
I was considering using { default_formatter: 'html' } as a short-cut for
putting "|html" after each variable name.
If you don't know whether your data is { foo: 1 } or { foo: '<escape me>'
}, at the moment, it seems you have to put "|str|html" behind every
variable ("str|html" doesn't work as a default formatter).
In addition, I would also like the flexibility to change the
default_formatter (admittedly, more as a "post-processor" formatter, which
isn't what it's meant for) independently of the template itself, depending
on what the target output would be. Even if I knew that foo was a number in
advance, "foo|str" would replace the default formatter, not apply it before
passing it to the html formatter.
(Ultimately, I think this is a bug in the HTML formatters because they
expect a string as an input, which numbers are not, despite being valid
JSON tokens.)