-
Notifications
You must be signed in to change notification settings - Fork 49
/
rawphpengine.php
227 lines (206 loc) · 5.89 KB
/
rawphpengine.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<?php
/**
* @package Habari
*
*/
namespace Habari;
/**
* Habari RawPHPEngine class
*
*
* The RawPHPEngine is a subclass of the abstract TemplateEngine class
* which is intended for those theme designers who choose to use raw PHP
* to design theme templates.
*/
class RawPHPEngine extends TemplateEngine
{
// Internal data to be extracted into template symbol table
protected $engine_vars = array();
protected $available_templates = array();
protected $template_map =array();
protected $var_stack = array();
protected $loaded_templates = false;
/**
* Constructor for RawPHPEngine
*
* Sets up default values for required settings.
*/
public function __construct()
{
// Nothing to do here...
}
/**
* Tries to retrieve a variable from the internal array engine_vars.
* Method returns the value if succesful, returns false otherwise.
*
* @param key name of variable
*/
public function __get( $key )
{
return isset( $this->engine_vars[$key] ) ? $this->engine_vars[$key] : null;
}
/**
* Assigns a variable to the template engine for use in
* constructing the template's output.
*
* @param key name of variable
* @param value value of variable
*/
public function __set( $key, $value )
{
$this->engine_vars[$key] = $value;
}
/**
* Unassigns a variable to the template engine.
*
* @param key name of variable
*/
public function __unset( $key )
{
unset( $this->engine_vars[$key] );
}
/**
* Detects if a variable is assigned to the template engine for use in
* constructing the template's output.
*
* @param key name of variable
* @returns boolean true if name is set, false if not set
*/
public function __isset( $key )
{
return isset( $this->engine_vars[$key] );
}
/**
* A function which outputs the result of a transposed
* template to the output stream
*
* @param template Name of template to display
*/
public function display( $template )
{
extract( $this->engine_vars );
if ( $this->template_exists( $template ) ) {
$template_file = isset( $this->template_map[$template] ) ? $this->template_map[$template] : null;
$template_file = Plugins::filter( 'include_template_file', $template_file, $template, __CLASS__ );
if(is_string($template_file)) {
include ( $template_file );
}
elseif(is_callable($template_file)) {
$template_file($this->engine_vars);
}
}
}
/**
* Search directories for templates to use
* Templates are always taken from the first directory they're found in.
* To override this behavior, the template must be specifically added via ->add_template()
* @see add_template
* @param string|array $dirs A directory to look for templates in
*/
public function queue_dirs($dirs)
{
$dirs = Utils::single_array($dirs);
$alltemplates = array();
// If multiple directories are passed, the earlier ones should override the later ones
$dirs = array_reverse( $dirs );
foreach ( $dirs as $dir ) {
$templates = Utils::glob( Utils::end_in_slash($dir) . '*.*' );
$alltemplates = array_merge( $alltemplates, $templates );
}
// Convert the template files into template names and produce a map from name => file
$available_templates = array_map( 'basename', $alltemplates, array_fill( 1, count( $alltemplates ), '.php' ) );
$template_map = array_combine( $available_templates, $alltemplates );
$this->template_map = array_merge($this->template_map, $template_map);
// Workaround for the 404 template key being merged into the 0 integer index
unset($this->template_map[0]);
if(isset($template_map[404])) {
$this->template_map['404'] = $template_map[404];
}
// The templates in the list should be uniquely identified
array_unique( $available_templates );
// Filter the templates that are available
$available_templates = Plugins::filter( 'available_templates', $available_templates, __CLASS__ );
$this->available_templates = array_merge($available_templates, $this->available_templates);
}
/**
* Returns the existance of the specified template name
*
* @param string $template Name of template to detect
* @returns boolean True if the template exists, false if not
*/
public function template_exists( $template )
{
return in_array( $template, $this->available_templates );
}
/**
* A function which returns the content of the transposed
* template as a string
*
* @param string $template Name of template to fetch
*/
public function fetch( $template )
{
ob_start();
$this->display( $template );
$contents = ob_get_clean();
return $contents;
}
/**
* Assigns a variable to the template engine for use in
* constructing the template's output.
*
* @param key name( s ) of variable
* @param value value of variable
*/
public function assign( $key, $value = '' )
{
$this->$key = $value;
}
/**
* Detects if a variable is assigned to the template engine for use in
* constructing the template's output.
*
* @param string $key name of variable
* @returns boolean true if key is set, false if not set
*/
public function assigned( $key )
{
return isset( $this->$key );
}
/**
* Clear all of the assigned template variables
*/
public function clear()
{
$this->engine_vars = array();
}
/**
* Appends to an existing variable more values
*
* @param key name of variable
* @param value value of variable
*/
public function append( $key, $value = '' )
{
if ( ! isset( $this->engine_vars[$key] ) ) {
$this->engine_vars[$key][] = $value;
}
else {
$this->engine_vars[$key] = $value;
}
}
/**
* Adds and/or replaces a previously queued template in the available template listing
* @param string $name The name of the template
* @param string $file The file of the template
* @param bool $replace
*/
public function add_template($name, $file, $replace = false)
{
if($replace || !in_array($name, $this->available_templates)) {
$this->available_templates[] = $name;
$this->template_map[$name] = $file;
}
}
}
?>