소스 검색

Add inverted section.

Justin Hileman 15 년 전
부모
커밋
fc170fca11

+ 24 - 11
Mustache.php

@@ -106,7 +106,7 @@ class Mustache {
 	}
 
 	/**
-	 * Render boolean and enumerable sections.
+	 * Render boolean, enumerable and inverted sections.
 	 *
 	 * @access protected
 	 * @param string $template
@@ -120,23 +120,36 @@ class Mustache {
 
 		$otag  = $this->prepareRegEx($this->otag);
 		$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();
 		while (preg_match($regex, $template, $matches, PREG_OFFSET_CAPTURE)) {
 			$section  = $matches[0][0];
 			$offset   = $matches[0][1];
-			$tag_name = trim($matches[1][0]);
-			$content  = $matches[2][0];
+			$type     = $matches[1][0];
+			$tag_name = trim($matches[2][0]);
+			$content  = $matches[3][0];
 
 			$replace = '';
 			$val = $this->getVariable($tag_name, $context);
-			if (is_array($val)) {
-				foreach ($val as $local_context) {
-					$replace .= $this->_render($content, $this->getContext($context, $local_context));
-				}
-			} else if ($val) {
-				$replace .= $content;
+			switch($type) {
+				// inverted section
+				case '^':
+					if (empty($val)) {
+						$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));
@@ -293,7 +306,7 @@ class Mustache {
 
 		$otag  = $this->prepareRegEx($this->otag);
 		$ctag  = $this->prepareRegEx($this->ctag);
-		$this->tagRegEx = '/' . $otag . "(#|\/|=|!|>|\\{|&)?([^\/#]+?)\\1?" . $ctag . "+/";
+		$this->tagRegEx = '/' . $otag . "(#|\/|=|!|>|\\{|&)?([^\/#\^]+?)\\1?" . $ctag . "+/";
 		return '';
 	}
 

+ 5 - 0
examples/inverted_section/InvertedSection.php

@@ -0,0 +1,5 @@
+<?php
+
+class InvertedSection extends Mustache {
+	public $repo = array();
+}

+ 2 - 0
examples/inverted_section/inverted_section.mustache

@@ -0,0 +1,2 @@
+{{#repo}}<b>{{name}}</b>{{/repo}}
+{{^repo}}No repos :({{/repo}}

+ 1 - 0
examples/inverted_section/inverted_section.txt

@@ -0,0 +1 @@
+No repos :(