My favorites | Sign in
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Search
for
  Advanced search   Search tips   Subscriptions
Issue 68: HTML formatter doesn't work for numeric values
1 person starred this issue and may be notified of changes. Back to list
Status:  New
Owner:  ----


 
Reported by bharbu...@gmail.com, Jan 13, 2012
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: https://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.
Jan 13, 2012
Project Member #1 andyc...@gmail.com
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)
Jan 13, 2012
#2 bharbu...@gmail.com
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.)

Powered by Google Project Hosting