Merge branch 'feature/inverted-sections' into dev

This commit is contained in:
Justin Hileman
2010-04-26 19:03:09 -04:00
7 changed files with 34 additions and 19 deletions
+24 -11
View File
@@ -106,7 +106,7 @@ class Mustache {
} }
/** /**
* Render boolean and enumerable sections. * Render boolean, enumerable and inverted sections.
* *
* @access protected * @access protected
* @param string $template * @param string $template
@@ -120,23 +120,36 @@ class Mustache {
$otag = $this->prepareRegEx($this->otag); $otag = $this->prepareRegEx($this->otag);
$ctag = $this->prepareRegEx($this->ctag); $ctag = $this->prepareRegEx($this->ctag);
$regex = '/' . $otag . '\\#(.+?)' . $ctag . '\\s*([\\s\\S]+?)' . $otag . '\\/\\1' . $ctag . '\\s*/m'; $regex = '/' . $otag . '(\\^|\\#)(.+?)' . $ctag . '\\s*([\\s\\S]+?)' . $otag . '\\/\\2' . $ctag . '\\s*/m';
$matches = array(); $matches = array();
while (preg_match($regex, $template, $matches, PREG_OFFSET_CAPTURE)) { while (preg_match($regex, $template, $matches, PREG_OFFSET_CAPTURE)) {
$section = $matches[0][0]; $section = $matches[0][0];
$offset = $matches[0][1]; $offset = $matches[0][1];
$tag_name = trim($matches[1][0]); $type = $matches[1][0];
$content = $matches[2][0]; $tag_name = trim($matches[2][0]);
$content = $matches[3][0];
$replace = ''; $replace = '';
$val = $this->getVariable($tag_name, $context); $val = $this->getVariable($tag_name, $context);
if (is_array($val)) { switch($type) {
foreach ($val as $local_context) { // inverted section
$replace .= $this->_render($content, $this->getContext($context, $local_context)); case '^':
} if (empty($val)) {
} else if ($val) { $replace .= $content;
$replace .= $content; }
break;
// regular section
case '#':
if (is_array($val)) {
foreach ($val as $local_context) {
$replace .= $this->_render($content, $this->getContext($context, $local_context));
}
} else if ($val) {
$replace .= $content;
}
break;
} }
$template = substr_replace($template, $replace, $offset, strlen($section)); $template = substr_replace($template, $replace, $offset, strlen($section));
@@ -293,7 +306,7 @@ class Mustache {
$otag = $this->prepareRegEx($this->otag); $otag = $this->prepareRegEx($this->otag);
$ctag = $this->prepareRegEx($this->ctag); $ctag = $this->prepareRegEx($this->ctag);
$this->tagRegEx = '/' . $otag . "(#|\/|=|!|>|\\{|&)?([^\/#]+?)\\1?" . $ctag . "+/"; $this->tagRegEx = '/' . $otag . "(#|\/|=|!|>|\\{|&)?([^\/#\^]+?)\\1?" . $ctag . "+/";
return ''; return '';
} }
-1
View File
@@ -82,7 +82,6 @@ Known Issues
------------ ------------
* Sections don't respect delimiter changes -- `delimiters` example currently fails with an "unclosed section" exception. * Sections don't respect delimiter changes -- `delimiters` example currently fails with an "unclosed section" exception.
* Since `complex` example emulates some fancy swizzling available in Ruby, it fails. Need to convert example to PHPisms (In PHP, Mustache class doesn't maintain current context stack -- available context is passed to methods via params).
* Test coverage is incomplete. * Test coverage is incomplete.
+2 -2
View File
@@ -5,9 +5,9 @@
{{#current}} {{#current}}
<li><strong>{{name}}</strong></li> <li><strong>{{name}}</strong></li>
{{/current}} {{/current}}
{{#isLink}} {{^current}}
<li><a href="{{url}}">{{name}}</a></li> <li><a href="{{url}}">{{name}}</a></li>
{{/isLink}} {{/current}}
{{/item}} {{/item}}
</ul> </ul>
{{/notEmpty}} {{/notEmpty}}
-5
View File
@@ -9,11 +9,6 @@ class Complex extends Mustache {
array('name' => 'blue', 'current' => false, 'url' => '#Blue'), array('name' => 'blue', 'current' => false, 'url' => '#Blue'),
); );
public function isLink() {
// Exploit the fact that the current iteration item is at the top of the context stack.
return $this->getVariable('current', $this->context) != true;
}
public function notEmpty() { public function notEmpty() {
return !($this->isEmpty()); return !($this->isEmpty());
} }
@@ -0,0 +1,5 @@
<?php
class InvertedSection extends Mustache {
public $repo = array();
}
@@ -0,0 +1,2 @@
{{#repo}}<b>{{name}}</b>{{/repo}}
{{^repo}}No repos :({{/repo}}
@@ -0,0 +1 @@
No repos :(