3 * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
4 * Copyright (C) 2002-2009 The Nucleus Group
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 * (see nucleus/documentation/index.html#license for more info)
13 * This class contains parse actions that are available in all ACTION classes
14 * e.g. include, phpinclude, parsedinclude, skinfile, ...
16 * It should never be used on it's own
18 * @license http://nucleuscms.org/license.txt GNU General Public License
19 * @copyright Copyright (C) 2002-2009 The Nucleus Group
21 * @version $NucleusJP: BaseActions.php,v 1.2 2006/07/20 08:01:52 kimitake Exp $
26 // depth level for includes (max. level is 3)
29 // array of evaluated conditions (true/false). The element at the end is the one for the most nested
33 // in the "elseif" / "elseifnot" sequences, if one of the conditions become "true" remained conditions should not
34 // be tested. this variable (actually a stack) holds this information.
37 // at all times, can be evaluated to either true if the current block needs to be displayed. This
38 // variable is used to decide to skip skinvars in parts that will never be outputted.
41 // contains a search string with keywords that need to be highlighted. These get parsed into $aHighlight
44 // array of keywords that need to be highlighted in search results (see the highlight()
45 // and parseHighlight() methods)
48 // reference to the parser object that is using this object as actions-handler
51 function BaseActions() {
55 $this->if_conditions = array(); // array on which condition values are pushed/popped
56 $this->if_execute = array(); // array on which condition values are pushed/popped
57 $this->if_currentlevel = 1; // 1 = current level is displayed; 0 = current level not displayed
60 $this->strHighlight = ''; // full highlight
61 $this->aHighlight = array(); // parsed highlight
65 // include file (no parsing of php)
66 function parse_include($filename) {
67 @readfile($this->getIncludeFileName($filename));
71 function parse_phpinclude($filename) {
72 includephp($this->getIncludeFileName($filename));
76 function parse_parsedinclude($filename) {
77 // check current level
78 if ($this->level > 3) return; // max. depth reached (avoid endless loop)
80 $skin = new SKIN($skinid);
81 $file = $this->getIncludeFileName($filename);
82 if (!$skin->isValid && !file_exists($file)) {
85 $contents = $skin->getContent($filename);
87 if (!file_exists($file)) return;
89 if ($fsize <= 0) return;
90 $fd = fopen ($file, 'r');
91 $contents = fread ($fd, $fsize);
94 $this->level = $this->level + 1;
95 /* $parts = explode('|', $filename, 2);
96 if ($skin->getContent($parts[0])) {
97 $contents = $skin->getContent($parts[0]);
99 $filename = $this->getIncludeFileName($filename);
100 if (!file_exists($filename)) return '';
102 $fsize = filesize($filename);
104 // nothing to include
105 if ($fsize <= 0) return;
107 $this->level = $this->level + 1;
110 $fd = fopen ($filename, 'r');
111 $contents = fread ($fd, $fsize);
115 // parse file contents
116 $this->parser->parse($contents);
118 $this->level = $this->level - 1;
122 * Returns the correct location of the file to be included, according to
125 * IF IncludeMode = 'skindir' => use skindir
127 function getIncludeFileName($filename) {
128 // leave absolute filenames and http urls as they are
130 (substr($filename,0,1) == '/')
131 || (substr($filename,0,7) == 'http://')
132 || (substr($filename,0,6) == 'ftp://')
136 $filename = PARSER::getProperty('IncludePrefix') . $filename;
137 if (PARSER::getProperty('IncludeMode') == 'skindir') {
139 return $DIR_SKINS . $filename;
146 * Inserts an url relative to the skindir (useful when doing import/export)
148 * e.g. <skinfile(default/myfile.sth)>
150 function parse_skinfile($filename) {
153 echo $CONF['SkinsURL'] . PARSER::getProperty('IncludePrefix') . $filename;
157 * Sets a property for the parser
159 function parse_set($property, $value) {
160 PARSER::setProperty($property, $value);
164 * Helper function: add if condition
166 function _addIfCondition($condition) {
168 array_push($this->if_conditions,$condition);
170 $this->_updateTopIfCondition();
175 function _updateTopIfCondition() {
176 if (sizeof($this->if_conditions) == 0)
177 $this->if_currentlevel = 1;
179 $this->if_currentlevel = $this->if_conditions[sizeof($this->if_conditions) - 1];
183 * Helper function for elseif / elseifnot
185 function _addIfExecute() {
186 array_push($this->if_execute, 0);
190 * Helper function for elseif / elseifnot
191 * @param string condition to be fullfilled
193 function _updateIfExecute($condition) {
194 $index = sizeof($this->if_execute) - 1;
195 $this->if_execute[$index] = $this->if_execute[$index] || $condition;
199 * returns the currently top if condition
201 function _getTopIfCondition() {
202 return $this->if_currentlevel;
206 * Sets the search terms to be highlighted
209 * A series of search terms
211 function setHighlight($highlight) {
212 $this->strHighlight = $highlight;
214 $this->aHighlight = parseHighlight($highlight);
219 * Applies the highlight to the given piece of text
222 * Data that needs to be highlighted
225 function highlight(&$data) {
226 if ($this->aHighlight)
227 return highlight($data,$this->aHighlight,$this->template['SEARCH_HIGHLIGHT']);
233 * Parses <%if%> statements
235 function parse_if() {
236 $this->_addIfExecute();
238 $args = func_get_args();
239 $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
240 $this->_addIfCondition($condition);
244 * Parses <%else%> statements
246 function parse_else() {
247 if (sizeof($this->if_conditions) == 0) return;
248 array_pop($this->if_conditions);
249 if ($this->if_currentlevel) {
251 $this->_updateIfExecute(1);
252 $this->_addIfCondition(0);
253 } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {
255 $this->_addIfCondition(0);
258 $this->_addIfCondition(1);
263 * Parses <%elseif%> statements
265 function parse_elseif() {
266 if (sizeof($this->if_conditions) == 0) return;
267 array_pop($this->if_conditions);
268 if ($this->if_currentlevel) {
270 $this->_updateIfExecute(1);
271 $this->_addIfCondition(0);
272 } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {
274 $this->_addIfCondition(0);
277 $args = func_get_args();
278 $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
279 $this->_addIfCondition($condition);
284 * Parses <%ifnot%> statements
286 function parse_ifnot() {
287 $this->_addIfExecute();
289 $args = func_get_args();
290 $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
291 $this->_addIfCondition(!$condition);
295 * Parses <%elseifnot%> statements
297 function parse_elseifnot() {
298 if (sizeof($this->if_conditions) == 0) return;
299 array_pop($this->if_conditions);
300 if ($this->if_currentlevel) {
302 $this->_updateIfExecute(1);
303 $this->_addIfCondition(0);
304 } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {
306 $this->_addIfCondition(0);
309 $args = func_get_args();
310 $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
311 $this->_addIfCondition(!$condition);
316 * Ends a conditional if-block
317 * see e.g. ifcat (BLOG), ifblogsetting (PAGEFACTORY)
319 function parse_endif() {
320 // we can only close what has been opened
321 if (sizeof($this->if_conditions) == 0) return;
323 if ($this->if_currentlevel) {
328 array_pop($this->if_conditions);
329 array_pop($this->if_execute);
331 $this->_updateTopIfCondition();