From 5ab5fc69ea759cdd57de98b529955ea33954f801 Mon Sep 17 00:00:00 2001 From: Justin Hileman Date: Thu, 19 Jul 2012 23:14:09 -0700 Subject: [PATCH] Anchor dot notation context: {{ .foo }} 1. Given that {{ . }} resolves as the top of the context stack; 2. And when any falsey segment in a dotted name is encountered, the whole name yields ''; 3. A name like {{ .name }} should imply {{ [top of stack].name }}; 4. Thus, it must resolve as truthy only if a member of the top of the context stack matches name. See mustache/spec#52 --- src/Mustache/Context.php | 7 ++++- test/Mustache/Test/ContextTest.php | 43 ++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/Mustache/Context.php b/src/Mustache/Context.php index db03acc7..f729c879 100644 --- a/src/Mustache/Context.php +++ b/src/Mustache/Context.php @@ -128,7 +128,12 @@ public function findDot($id) { $chunks = explode('.', $id); $first = array_shift($chunks); - $value = $this->findVariableInStack($first, $this->stack); + + if ($first === '') { + $value = $this->last(); + } else { + $value = $this->findVariableInStack($first, $this->stack); + } foreach ($chunks as $chunk) { if ($value === '') { diff --git a/test/Mustache/Test/ContextTest.php b/test/Mustache/Test/ContextTest.php index 864b4489..d0b308f6 100644 --- a/test/Mustache/Test/ContextTest.php +++ b/test/Mustache/Test/ContextTest.php @@ -119,6 +119,49 @@ public function testAccessorPriority() $this->assertEquals('win', $context->find('baz'), 'ArrayAccess stands alone'); $this->assertEquals('win', $context->find('qux'), 'ArrayAccess beats private property'); } + + public function testAnchoredDotNotation() + { + $context = new Mustache_Context(); + + $a = array( + 'name' => 'a', + 'number' => 1, + ); + + $b = array( + 'number' => 2, + 'child' => array( + 'name' => 'baby bee', + ), + ); + + $c = array( + 'name' => 'cee', + ); + + $context->push($a); + $this->assertEquals('a', $context->find('name')); + $this->assertEquals('a', $context->findDot('.name')); + $this->assertEquals(1, $context->find('number')); + $this->assertEquals(1, $context->findDot('.number')); + + $context->push($b); + $this->assertEquals('a', $context->find('name')); + $this->assertEquals(2, $context->find('number')); + $this->assertEquals('', $context->findDot('.name')); + $this->assertEquals(2, $context->findDot('.number')); + $this->assertEquals('baby bee', $context->findDot('child.name')); + $this->assertEquals('baby bee', $context->findDot('.child.name')); + + $context->push($c); + $this->assertEquals('cee', $context->find('name')); + $this->assertEquals('cee', $context->findDot('.name')); + $this->assertEquals(2, $context->find('number')); + $this->assertEquals('', $context->findDot('.number')); + $this->assertEquals('baby bee', $context->findDot('child.name')); + $this->assertEquals('', $context->findDot('.child.name')); + } } class Mustache_Test_TestDummy