njuptxiaot / json-template

Automatically exported from code.google.com/p/json-template
0 stars 0 forks source link

Section names not looked up properly #55

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
Given this data: {"a":{"b":{"c":1}},"d":2}
Try processing Template 1:

{.section a.b}{c}{.end}

Or Template 2:

{.section a}{.section d}{@}{.end}{.end}

I expect template 1 to output "1" and template 2 to output "2".  Instead, 
template 1 yields "EXCEPTION: UndefinedVariable: c is not defined", and 
template 2 yields "null".

I'm using sroussey's PHP version of JSON Template pulled this evening from 
his repo here:

https://sroussey-json-template.googlecode.com/hg/

But I think the problem affects more than the PHP version, it's at least 
present in the python version as well.

This diff against sroussey-json-template fixes the PHP version:

diff -r b9d923fb113e php/jsontemplate.php
--- a/php/jsontemplate.php  Mon Oct 12 23:49:51 2009 -0700
+++ b/php/jsontemplate.php  Thu Mar 04 22:20:02 2010 -0800
@@ -372,24 +372,10 @@

    function PushSection($name)
    {
-       $end = end($this->stack);
-       $new_context=null;
-       if(is_array($end)){
-           if(isset($end[$name])){
-               $new_context = $end[$name];
-           }
-       }elseif(is_object($end)){
-           // since json_decode returns StdClass
-           // check if scope is an object
-           if(property_exists($end,$name)){
-               $new_context = $end->$name;
-           } else if (method_exists($end,$getter="get$name")){
-               $new_context = $end->$getter();
-           } else if (method_exists($end,'__get')){
-               try {
-                   $new_context = $end->$name;
-               } catch (exception $e){}
-           }
+       try {
+           $new_context = $this->Lookup($name);
+       } catch(JsonTemplateUndefinedVariable $e) {
+           $new_context = null;
        }
        $this->name_stack[] = $name;
        $this->stack[] = $new_context;
@@ -653,7 +639,7 @@
 class JsonTemplateModule
 {

-   public $section_re = '/^(?:(repeated)\s+)?(section)\s+(@|[A-Za-z0-
9_-]+)(?:\b(.*))?$/';
+   public $section_re = '/^(?:(repeated)\s+)?(section)\s+(@|[A-Za-z0-
9_-]+(\.[A-Za-z0-9_-]+)*)(?:\b(.*))?$/';
    public $if_re = '/^if\s+(@|[A-Za-z0-9_-]+)(\?)?(?:\b(.*?))?\s*$/';
    public $option_re = '/^([a-zA-Z\-]+):\s*(.*)/';
    public $option_names = array('meta','format-char','default-formatter');

Original issue reported on code.google.com by micah.st...@gmail.com on 5 Mar 2010 at 6:44

GoogleCodeExporter commented 8 years ago
I haven't contributed back the changes I've made recently. I think a fix for 
this is 
one of them (and it is elsewhere in the code). I'll get on this next week.

Original comment by sroussey on 5 Mar 2010 at 8:40

GoogleCodeExporter commented 8 years ago
I'm not on my normal PC, so I don't have the test harness setup, so I pushed a 
change 
to the sroussey-json-template repo. There were many logic errors, particularly 
with 
scopes. I wish I had update the repo as I fixed them, but instead they are all 
in one 
big change. I'm checking on the JS version that I use, and will update that as 
well if 
warranted. 

Original comment by sroussey on 26 Mar 2010 at 2:21

GoogleCodeExporter commented 8 years ago
I believe this issue affects more than just the PHP and Python, it seams to be 
present as well I believe.

While using JSON-Template I've had issues with higher level names not being 
looked up properly in the same way described. One time I rewrote the logic of a 
template in a somewhat unintuitive way to get around it. Now I appear to have 
run into another one which will be more trouble. I may have to switch template 
systems.

Original comment by nadir.se...@gmail.com on 19 Aug 2010 at 3:03