Jelajahi Sumber

Clean up $options code.

* Add a nice descriptive comment to the constructor.
* Add test coverage for `_setOptions`.
* Fix a couple of bugs exposed by said tests.
Justin Hileman 14 tahun lalu
induk
melakukan
ebfe6495bb
2 mengubah file dengan 83 tambahan dan 5 penghapusan
  1. 23 5
      Mustache.php
  2. 60 0
      test/MustacheTest.php

+ 23 - 5
Mustache.php

@@ -112,6 +112,23 @@ class Mustache {
 	 * This method accepts a $template string and a $view object. Optionally, pass an associative
 	 * array of partials as well.
 	 *
+	 * Passing an $options array allows overriding certain Mustache options during instantiation:
+	 *
+	 *     $options = array(
+	 *         // `charset` -- must be supported by `htmlspecialentities()`. defaults to 'UTF-8'
+	 *         'charset' => 'ISO-8859-1',
+	 *
+	 *         // opening and closing delimiters, as an array or a space-separated string
+	 *         'delimiters' => '<% %>',
+	 *
+	 *         // an array of pragmas to enable
+	 *         'pragmas' => array(
+	 *             Mustache::PRAGMA_UNESCAPED,
+	 *             Mustache::PRAGMA_DOT_NOTATION,
+	 *             Mustache::PRAGMA_IMPLICIT_ITERATOR
+	 *         ),
+	 *     );
+	 *
 	 * @access public
 	 * @param string $template (default: null)
 	 * @param mixed $view (default: null)
@@ -127,7 +144,7 @@ class Mustache {
 	}
 
 	/**
-	 * _setOptions function.
+	 * Helper function for setting options from constructor args.
 	 *
 	 * @access protected
 	 * @param array $options
@@ -143,19 +160,20 @@ class Mustache {
 			if (!is_array($delims)) {
 				$delims = array_map('trim', explode(' ', $delims, 2));
 			}
-			$this->_otag = preg_quote($delims[0]);
-			$this->_ctag = preg_quote($delims[1]);
+			$this->_otag = $delims[0];
+			$this->_ctag = $delims[1];
 		}
 
 		if (isset($options['pragmas'])) {
-			foreach ($pragmas as $pragma_name) {
+			foreach ($options['pragmas'] as $pragma_name) {
 				if (!in_array($pragma_name, $this->_pragmasImplemented)) {
 					throw new MustacheException('Unknown pragma: ' . $pragma_name, MustacheException::UNKNOWN_PRAGMA);
 				}
 			}
-			$this->_pragmas = $pragmas;
+			$this->_pragmas = $options['pragmas'];
 		}
 	}
+
 	/**
 	 * Mustache class clone method.
 	 *

+ 60 - 0
test/MustacheTest.php

@@ -72,6 +72,54 @@ class MustacheTest extends PHPUnit_Framework_TestCase {
 		$this->assertEquals($output, $m4->render($template));
 	}
 
+	/**
+	 * @dataProvider constructorOptions
+	 */
+	public function testConstructorOptions($options, $charset, $delimiters, $pragmas) {
+		$mustache = new MustacheExposedOptionsStub(null, null, null, $options);
+		$this->assertEquals($charset,    $mustache->getCharset());
+		$this->assertEquals($delimiters, $mustache->getDelimiters());
+		$this->assertEquals($pragmas,    $mustache->getPragmas());
+	}
+
+	public function constructorOptions() {
+		return array(
+			array(
+				array(),
+				'UTF-8',
+				array('{{', '}}'),
+				array(),
+			),
+			array(
+				array(
+					'charset'    => 'UTF-8',
+					'delimiters' => '<< >>',
+					'pragmas'    => array(Mustache::PRAGMA_UNESCAPED)
+				),
+				'UTF-8',
+				array('<<', '>>'),
+				array(Mustache::PRAGMA_UNESCAPED),
+			),
+			array(
+				array(
+					'charset'    => 'cp866',
+					'delimiters' => array('[[[[', ']]]]'),
+					'pragmas'    => array(Mustache::PRAGMA_DOT_NOTATION, Mustache::PRAGMA_IMPLICIT_ITERATOR)
+				),
+				'cp866',
+				array('[[[[', ']]]]'),
+				array(Mustache::PRAGMA_DOT_NOTATION, Mustache::PRAGMA_IMPLICIT_ITERATOR),
+			),
+		);
+	}
+
+	/**
+	 * @expectedException MustacheException
+	 */
+	public function testConstructorInvalidPragmaOptionsThrowExceptions() {
+		$mustache = new Mustache(null, null, null, array('pragmas' => array('banana phone')));
+	}
+
 	/**
 	 * Test __toString() function.
 	 *
@@ -366,4 +414,16 @@ class MustacheTest extends PHPUnit_Framework_TestCase {
 		$m = new Mustache($template, $view);
 		$this->assertEquals('{{win}}', $m->render());
 	}
+}
+
+class MustacheExposedOptionsStub extends Mustache {
+	public function getPragmas() {
+		return $this->_pragmas;
+	}
+	public function getCharset() {
+		return $this->_charset;
+	}
+	public function getDelimiters() {
+		return array($this->_otag, $this->_ctag);
+	}
 }