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 55: Section names not looked up properly
2 people starred this issue and may be notified of changes. Back to list
Status:  Started
Owner:  sroussey


 
Reported by micah.st...@gmail.com, Mar 4, 2010
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');

Mar 5, 2010
Project Member #1 sroussey
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.
Owner: sroussey
Mar 25, 2010
Project Member #2 sroussey
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. 
Status: Started
Aug 18, 2010
#3 nadir.se...@gmail.com
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.

Powered by Google Project Hosting