* @version $NucleusJP: BaseActions.php,v 1.2 2006/07/20 08:01:52 kimitake Exp $
*/
-class BaseActions {\r
-\r
- // depth level for includes (max. level is 3)\r
- var $level;\r
-\r
- // array of evaluated conditions (true/false). The element at the end is the one for the most nested\r
- // if block.\r
- var $if_conditions;\r
-\r
- // in the "elseif" / "elseifnot" sequences, if one of the conditions become "true" remained conditions should not\r
- // be tested. this variable (actually a stack) holds this information.\r
- var $if_execute;\r
-\r
- // at all times, can be evaluated to either true if the current block needs to be displayed. This\r
- // variable is used to decide to skip skinvars in parts that will never be outputted.\r
- var $if_currentlevel;\r
-\r
- // contains a search string with keywords that need to be highlighted. These get parsed into $aHighlight\r
- var $strHighlight;\r
-\r
- // array of keywords that need to be highlighted in search results (see the highlight()\r
- // and parseHighlight() methods)\r
- var $aHighlight;\r
-\r
- // reference to the parser object that is using this object as actions-handler\r
- var $parser;\r
-\r
- function BaseActions() {\r
- $this->level = 0;\r
-\r
- // if nesting level\r
- $this->if_conditions = array(); // array on which condition values are pushed/popped\r
- $this->if_execute = array(); // array on which condition values are pushed/popped\r
- $this->if_currentlevel = 1; // 1 = current level is displayed; 0 = current level not displayed\r
-\r
- // highlights\r
- $this->strHighlight = ''; // full highlight\r
- $this->aHighlight = array(); // parsed highlight\r
-\r
- }\r
-\r
- // include file (no parsing of php)\r
- function parse_include($filename) {\r
- @readfile($this->getIncludeFileName($filename));\r
- }\r
-\r
- // php-include file\r
- function parse_phpinclude($filename) {\r
- includephp($this->getIncludeFileName($filename));\r
- }\r
-\r
- // parsed include\r
- function parse_parsedinclude($filename) {\r
- // check current level\r
- if ($this->level > 3) return; // max. depth reached (avoid endless loop)\r
- global $skinid;\r
- $skin = new SKIN($skinid);\r
- $file = $this->getIncludeFileName($filename);\r
- if (!$skin->isValid && !file_exists($file)) {\r
- return;\r
- }\r
- $parts = explode('|', $filename, 2);\r
- if ($skin->getContent($parts[0])) {\r
- $contents = $skin->getContent($parts[0]);\r
- } else {\r
- $filename = $this->getIncludeFileName($filename);\r
- if (!file_exists($filename)) return '';\r
-\r
- $fsize = filesize($filename);\r
-\r
- // nothing to include\r
- if ($fsize <= 0) return;\r
-\r
- $this->level = $this->level + 1;\r
-\r
- // read file\r
- $fd = fopen ($filename, 'r');\r
- $contents = fread ($fd, $fsize);\r
- fclose ($fd);\r
- }\r
-\r
- // parse file contents\r
- $this->parser->parse($contents);\r
-\r
- $this->level = $this->level - 1;\r
- }\r
-\r
- /**\r
- * Returns the correct location of the file to be included, according to\r
- * parser properties\r
- *\r
- * IF IncludeMode = 'skindir' => use skindir\r
- */\r
- function getIncludeFileName($filename) {\r
- // leave absolute filenames and http urls as they are\r
- if (\r
- (substr($filename,0,1) == '/')\r
- || (substr($filename,0,7) == 'http://')\r
- || (substr($filename,0,6) == 'ftp://')\r
- )\r
- return $filename;\r
-\r
- $filename = PARSER::getProperty('IncludePrefix') . $filename;\r
- if (PARSER::getProperty('IncludeMode') == 'skindir') {\r
- global $DIR_SKINS;\r
- return $DIR_SKINS . $filename;\r
- } else {\r
- return $filename;\r
- }\r
- }\r
-\r
- /**\r
- * Inserts an url relative to the skindir (useful when doing import/export)\r
- *\r
- * e.g. <skinfile(default/myfile.sth)>\r
- */\r
- function parse_skinfile($filename) {\r
- global $CONF;\r
-\r
- echo $CONF['SkinsURL'] . PARSER::getProperty('IncludePrefix') . $filename;\r
- }\r
-\r
- /**\r
- * Sets a property for the parser\r
- */\r
- function parse_set($property, $value) {\r
- PARSER::setProperty($property, $value);\r
- }\r
-\r
- /**\r
- * Helper function: add if condition\r
- */\r
- function _addIfCondition($condition) {\r
-\r
- array_push($this->if_conditions,$condition);\r
-\r
- $this->_updateTopIfCondition();\r
-\r
- ob_start();\r
- }\r
-\r
- function _updateTopIfCondition() {\r
- if (sizeof($this->if_conditions) == 0)\r
- $this->if_currentlevel = 1;\r
- else\r
- $this->if_currentlevel = $this->if_conditions[sizeof($this->if_conditions) - 1];\r
- }\r
-\r
- /**\r
- * Helper function for elseif / elseifnot\r
- */\r
- function _addIfExecute() {\r
- array_push($this->if_execute, 0);\r
- }\r
-\r
- /**\r
- * Helper function for elseif / elseifnot\r
- * @param string condition to be fullfilled\r
- */\r
- function _updateIfExecute($condition) {\r
- $index = sizeof($this->if_execute) - 1;\r
- $this->if_execute[$index] = $this->if_execute[$index] || $condition;\r
- }\r
-\r
- /**\r
- * returns the currently top if condition\r
- */\r
- function _getTopIfCondition() {\r
- return $this->if_currentlevel;\r
- }\r
-\r
- /**\r
- * Sets the search terms to be highlighted\r
- *\r
- * @param $highlight\r
- * A series of search terms\r
- */\r
- function setHighlight($highlight) {\r
- $this->strHighlight = $highlight;\r
- if ($highlight) {\r
- $this->aHighlight = parseHighlight($highlight);\r
- }\r
- }\r
-\r
- /**\r
- * Applies the highlight to the given piece of text\r
- *\r
- * @param &$data\r
- * Data that needs to be highlighted\r
- * @see setHighlight\r
- */\r
- function highlight(&$data) {\r
- if ($this->aHighlight)\r
- return highlight($data,$this->aHighlight,$this->template['SEARCH_HIGHLIGHT']);\r
- else\r
- return $data;\r
- }\r
-\r
- /**\r
- * Parses <%if%> statements\r
- */\r
- function parse_if() {\r
- $this->_addIfExecute();\r
-\r
- $args = func_get_args();\r
- $condition = call_user_func_array(array(&$this,'checkCondition'), $args);\r
- $this->_addIfCondition($condition);\r
- }\r
-\r
- /**\r
- * Parses <%else%> statements\r
- */\r
- function parse_else() {\r
- if (sizeof($this->if_conditions) == 0) return;\r
- array_pop($this->if_conditions);\r
- if ($this->if_currentlevel) {\r
- ob_end_flush();\r
- $this->_updateIfExecute(1);\r
- $this->_addIfCondition(0);\r
- } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {\r
- ob_end_clean();\r
- $this->_addIfCondition(0);\r
- } else {\r
- ob_end_clean();\r
- $this->_addIfCondition(1);\r
- }\r
- }\r
-\r
- /**\r
- * Parses <%elseif%> statements\r
- */\r
- function parse_elseif() {\r
- if (sizeof($this->if_conditions) == 0) return;\r
- array_pop($this->if_conditions);\r
- if ($this->if_currentlevel) {\r
- ob_end_flush();\r
- $this->_updateIfExecute(1);\r
- $this->_addIfCondition(0);\r
- } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {\r
- ob_end_clean();\r
- $this->_addIfCondition(0);\r
- } else {\r
- ob_end_clean();\r
- $args = func_get_args();\r
- $condition = call_user_func_array(array(&$this,'checkCondition'), $args);\r
- $this->_addIfCondition($condition);\r
- }\r
- }\r
-\r
- /**\r
- * Parses <%ifnot%> statements\r
- */\r
- function parse_ifnot() {\r
- $this->_addIfExecute();\r
-\r
- $args = func_get_args();\r
- $condition = call_user_func_array(array(&$this,'checkCondition'), $args);\r
- $this->_addIfCondition(!$condition);\r
- }\r
-\r
- /**\r
- * Parses <%elseifnot%> statements\r
- */\r
- function parse_elseifnot() {\r
- if (sizeof($this->if_conditions) == 0) return;\r
- array_pop($this->if_conditions);\r
- if ($this->if_currentlevel) {\r
- ob_end_flush();\r
- $this->_updateIfExecute(1);\r
- $this->_addIfCondition(0);\r
- } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {\r
- ob_end_clean();\r
- $this->_addIfCondition(0);\r
- } else {\r
- ob_end_clean();\r
- $args = func_get_args();\r
- $condition = call_user_func_array(array(&$this,'checkCondition'), $args);\r
- $this->_addIfCondition(!$condition);\r
- }\r
- }\r
-\r
- /**\r
- * Ends a conditional if-block\r
- * see e.g. ifcat (BLOG), ifblogsetting (PAGEFACTORY)\r
- */\r
- function parse_endif() {\r
- // we can only close what has been opened\r
- if (sizeof($this->if_conditions) == 0) return;\r
-\r
- if ($this->if_currentlevel) {\r
- ob_end_flush();\r
- } else {\r
- ob_end_clean();\r
- }\r
- array_pop($this->if_conditions);\r
- array_pop($this->if_execute);\r
-\r
- $this->_updateTopIfCondition();\r
- }\r
-}\r
+class BaseActions {
+
+ // depth level for includes (max. level is 3)
+ var $level;
+
+ // array of evaluated conditions (true/false). The element at the end is the one for the most nested
+ // if block.
+ var $if_conditions;
+
+ // in the "elseif" / "elseifnot" sequences, if one of the conditions become "true" remained conditions should not
+ // be tested. this variable (actually a stack) holds this information.
+ var $if_execute;
+
+ // at all times, can be evaluated to either true if the current block needs to be displayed. This
+ // variable is used to decide to skip skinvars in parts that will never be outputted.
+ var $if_currentlevel;
+
+ // contains a search string with keywords that need to be highlighted. These get parsed into $aHighlight
+ var $strHighlight;
+
+ // array of keywords that need to be highlighted in search results (see the highlight()
+ // and parseHighlight() methods)
+ var $aHighlight;
+
+ // reference to the parser object that is using this object as actions-handler
+ var $parser;
+
+ function BaseActions() {
+ $this->level = 0;
+
+ // if nesting level
+ $this->if_conditions = array(); // array on which condition values are pushed/popped
+ $this->if_execute = array(); // array on which condition values are pushed/popped
+ $this->if_currentlevel = 1; // 1 = current level is displayed; 0 = current level not displayed
+
+ // highlights
+ $this->strHighlight = ''; // full highlight
+ $this->aHighlight = array(); // parsed highlight
+
+ }
+
+ // include file (no parsing of php)
+ function parse_include($filename) {
+ @readfile($this->getIncludeFileName($filename));
+ }
+
+ // php-include file
+ function parse_phpinclude($filename) {
+ includephp($this->getIncludeFileName($filename));
+ }
+
+ // parsed include
+ function parse_parsedinclude($filename) {
+ // check current level
+ if ($this->level > 3) return; // max. depth reached (avoid endless loop)
+ global $skinid;
+ if (!$skinid) {
+ global $manager, $blogid;
+ if (!$blogid) {
+ global $CONF;
+ $blogid = $CONF['DefaultBlog'];
+ }
+ $blog = &$manager->getBlog($blogid);
+ $skinid = $blog->getDefaultSkin();
+ }
+ $skin = new SKIN($skinid);
+ $file = $this->getIncludeFileName($filename);
+ if (!$skin->isValid && !file_exists($file)) {
+ return;
+ }
+ $parts = explode('|', $filename, 2);
+ if ($skin->getContent($parts[0])) {
+ $contents = $skin->getContent($parts[0]);
+ } else {
+ $filename = $this->getIncludeFileName($filename);
+ if (!file_exists($filename)) return '';
+
+ $fsize = filesize($filename);
+
+ // nothing to include
+ if ($fsize <= 0) return;
+
+ $this->level = $this->level + 1;
+
+ // read file
+ $fd = fopen ($filename, 'r');
+ $contents = fread ($fd, $fsize);
+ fclose ($fd);
+ }
+
+ // parse file contents
+ $this->parser->parse($contents);
+
+ $this->level = $this->level - 1;
+ }
+
+ /**
+ * Returns the correct location of the file to be included, according to
+ * parser properties
+ *
+ * IF IncludeMode = 'skindir' => use skindir
+ */
+ function getIncludeFileName($filename) {
+ // leave absolute filenames and http urls as they are
+ if (
+ (substr($filename,0,1) == '/')
+ || (substr($filename,0,7) == 'http://')
+ || (substr($filename,0,6) == 'ftp://')
+ )
+ return $filename;
+
+ $filename = PARSER::getProperty('IncludePrefix') . $filename;
+ if (PARSER::getProperty('IncludeMode') == 'skindir') {
+ global $DIR_SKINS;
+ return $DIR_SKINS . $filename;
+ } else {
+ return $filename;
+ }
+ }
+
+ /**
+ * Inserts an url relative to the skindir (useful when doing import/export)
+ *
+ * e.g. <skinfile(default/myfile.sth)>
+ */
+ function parse_skinfile($filename) {
+ global $CONF;
+
+ echo $CONF['SkinsURL'] . PARSER::getProperty('IncludePrefix') . $filename;
+ }
+
+ /**
+ * Sets a property for the parser
+ */
+ function parse_set($property, $value) {
+ PARSER::setProperty($property, $value);
+ }
+
+ /**
+ * Helper function: add if condition
+ */
+ function _addIfCondition($condition) {
+
+ array_push($this->if_conditions,$condition);
+
+ $this->_updateTopIfCondition();
+
+ ob_start();
+ }
+
+ function _updateTopIfCondition() {
+ if (sizeof($this->if_conditions) == 0)
+ $this->if_currentlevel = 1;
+ else
+ $this->if_currentlevel = $this->if_conditions[sizeof($this->if_conditions) - 1];
+ }
+
+ /**
+ * Helper function for elseif / elseifnot
+ */
+ function _addIfExecute() {
+ array_push($this->if_execute, 0);
+ }
+
+ /**
+ * Helper function for elseif / elseifnot
+ * @param string condition to be fullfilled
+ */
+ function _updateIfExecute($condition) {
+ $index = sizeof($this->if_execute) - 1;
+ $this->if_execute[$index] = $this->if_execute[$index] || $condition;
+ }
+
+ /**
+ * returns the currently top if condition
+ */
+ function _getTopIfCondition() {
+ return $this->if_currentlevel;
+ }
+
+ /**
+ * Sets the search terms to be highlighted
+ *
+ * @param $highlight
+ * A series of search terms
+ */
+ function setHighlight($highlight) {
+ $this->strHighlight = $highlight;
+ if ($highlight) {
+ $this->aHighlight = parseHighlight($highlight);
+ }
+ }
+
+ /**
+ * Applies the highlight to the given piece of text
+ *
+ * @param &$data
+ * Data that needs to be highlighted
+ * @see setHighlight
+ */
+ function highlight(&$data) {
+ if ($this->aHighlight)
+ return highlight($data,$this->aHighlight,$this->template['SEARCH_HIGHLIGHT']);
+ else
+ return $data;
+ }
+
+ /**
+ * Parses <%if%> statements
+ */
+ function parse_if() {
+ $this->_addIfExecute();
+
+ $args = func_get_args();
+ $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
+ $this->_addIfCondition($condition);
+ }
+
+ /**
+ * Parses <%else%> statements
+ */
+ function parse_else() {
+ if (sizeof($this->if_conditions) == 0) return;
+ array_pop($this->if_conditions);
+ if ($this->if_currentlevel) {
+ ob_end_flush();
+ $this->_updateIfExecute(1);
+ $this->_addIfCondition(0);
+ } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {
+ ob_end_clean();
+ $this->_addIfCondition(0);
+ } else {
+ ob_end_clean();
+ $this->_addIfCondition(1);
+ }
+ }
+
+ /**
+ * Parses <%elseif%> statements
+ */
+ function parse_elseif() {
+ if (sizeof($this->if_conditions) == 0) return;
+ array_pop($this->if_conditions);
+ if ($this->if_currentlevel) {
+ ob_end_flush();
+ $this->_updateIfExecute(1);
+ $this->_addIfCondition(0);
+ } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {
+ ob_end_clean();
+ $this->_addIfCondition(0);
+ } else {
+ ob_end_clean();
+ $args = func_get_args();
+ $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
+ $this->_addIfCondition($condition);
+ }
+ }
+
+ /**
+ * Parses <%ifnot%> statements
+ */
+ function parse_ifnot() {
+ $this->_addIfExecute();
+
+ $args = func_get_args();
+ $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
+ $this->_addIfCondition(!$condition);
+ }
+
+ /**
+ * Parses <%elseifnot%> statements
+ */
+ function parse_elseifnot() {
+ if (sizeof($this->if_conditions) == 0) return;
+ array_pop($this->if_conditions);
+ if ($this->if_currentlevel) {
+ ob_end_flush();
+ $this->_updateIfExecute(1);
+ $this->_addIfCondition(0);
+ } elseif ($this->if_execute[sizeof($this->if_execute) - 1]) {
+ ob_end_clean();
+ $this->_addIfCondition(0);
+ } else {
+ ob_end_clean();
+ $args = func_get_args();
+ $condition = call_user_func_array(array(&$this,'checkCondition'), $args);
+ $this->_addIfCondition(!$condition);
+ }
+ }
+
+ /**
+ * Ends a conditional if-block
+ * see e.g. ifcat (BLOG), ifblogsetting (PAGEFACTORY)
+ */
+ function parse_endif() {
+ // we can only close what has been opened
+ if (sizeof($this->if_conditions) == 0) return;
+
+ if ($this->if_currentlevel) {
+ ob_end_flush();
+ } else {
+ ob_end_clean();
+ }
+ array_pop($this->if_conditions);
+ array_pop($this->if_execute);
+
+ $this->_updateTopIfCondition();
+ }
+}
?>
\ No newline at end of file