1 : <?php
2 : /**
3 : * Text_Template
4 : *
5 : * Copyright (c) 2009, Sebastian Bergmann <sb@sebastian-bergmann.de>.
6 : * All rights reserved.
7 : *
8 : * Redistribution and use in source and binary forms, with or without
9 : * modification, are permitted provided that the following conditions
10 : * are met:
11 : *
12 : * * Redistributions of source code must retain the above copyright
13 : * notice, this list of conditions and the following disclaimer.
14 : *
15 : * * Redistributions in binary form must reproduce the above copyright
16 : * notice, this list of conditions and the following disclaimer in
17 : * the documentation and/or other materials provided with the
18 : * distribution.
19 : *
20 : * * Neither the name of Sebastian Bergmann nor the names of his
21 : * contributors may be used to endorse or promote products derived
22 : * from this software without specific prior written permission.
23 : *
24 : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 : * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 : * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 : * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 : * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 : * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 : * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 : * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 : * POSSIBILITY OF SUCH DAMAGE.
36 : *
37 : * @category Text
38 : * @package Template
39 : * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
40 : * @copyright 2009 Sebastian Bergmann <sb@sebastian-bergmann.de>
41 : * @license http://www.opensource.org/licenses/bsd-license.php BSD License
42 : * @link http://www.phpunit.de/
43 : * @since File available since Release 1.0.0
44 : */
45 :
46 : /**
47 : * A simple template engine.
48 : *
49 : * @category Text
50 : * @package Template
51 : * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
52 : * @copyright 2009 Sebastian Bergmann <sb@sebastian-bergmann.de>
53 : * @license http://www.opensource.org/licenses/bsd-license.php BSD License
54 : * @version Release: 1.0.0
55 : * @link http://www.phpunit.de/
56 : * @since Class available since Release 1.0.0
57 : */
58 : class Text_Template
59 : {
60 : /**
61 : * @var string
62 : */
63 : protected $template = '';
64 :
65 : /**
66 : * @var array
67 : */
68 : protected $values = array();
69 :
70 : /**
71 : * Constructor.
72 : *
73 : * @param string $file
74 : * @throws InvalidArgumentException
75 : */
76 : public function __construct($file = '')
77 : {
78 0 : $this->setFile($file);
79 0 : }
80 :
81 : /**
82 : * Sets the template file.
83 : *
84 : * @param string $file
85 : * @throws InvalidArgumentException
86 : */
87 : public function setFile($file)
88 : {
89 0 : $distFile = $file . '.dist';
90 :
91 0 : if (file_exists($file)) {
92 0 : $this->template = file_get_contents($file);
93 : }
94 :
95 0 : else if (file_exists($distFile)) {
96 0 : $this->template = file_get_contents($distFile);
97 : }
98 :
99 : else {
100 0 : throw new InvalidArgumentException(
101 : 'Template file could not be loaded.'
102 0 : );
103 : }
104 0 : }
105 :
106 : /**
107 : * Sets one or more template variables.
108 : *
109 : * @param array $values
110 : * @param boolean $merge
111 : */
112 : public function setVar(array $values, $merge = TRUE)
113 : {
114 0 : if (!$merge || empty($this->values)) {
115 0 : $this->values = $values;
116 : } else {
117 0 : $this->values = array_merge($this->values, $values);
118 : }
119 0 : }
120 :
121 : /**
122 : * Renders the template and returns the result.
123 : *
124 : * @return string
125 : */
126 : public function render()
127 : {
128 0 : $keys = array();
129 :
130 0 : foreach ($this->values as $key => $value) {
131 0 : $keys[] = '{' . $key . '}';
132 0 : }
133 :
134 0 : return str_replace($keys, $this->values, $this->template);
135 : }
136 :
137 : /**
138 : * Renders the template and writes the result to a file.
139 : *
140 : * @param string $target
141 : */
142 : public function renderTo($target)
143 : {
144 0 : $fp = @fopen($target, 'wt');
145 :
146 0 : if ($fp) {
147 0 : fwrite($fp, $this->render());
148 0 : fclose($fp);
149 : } else {
150 0 : throw new RuntimeException('Could not write to ' . $target . '.');
151 : }
152 0 : }
153 : }
154 : ?>
|