| [ PHPXref.com ] | [ Generated: Sun Jul 20 20:11:31 2008 ] | [ SAPID CMS 1.2.3 ] |
| [ Index ] [ Variables ] [ Functions ] [ Classes ] [ Constants ] [ Statistics ] | ||
[Summary view] [Print] [Text view]
1 <?PHP 2 3 4 /** 5 * SAPID Kernel Module. 6 * Defines basic parser class. 7 * 8 * $Log: kernel.lib.php,v $ 9 * Revision 1.14 2005/09/01 15:58:15 sheiko 10 * *** empty log message *** 11 * 12 * Revision 1.13 2005/09/01 11:00:41 mephius 13 * fixed bug with duplicate qc values 14 * 15 * Revision 1.12 2005/08/29 05:39:10 sheiko 16 * FireFox Support for Insert Image/File 17 * 18 * Revision 1.11 2005/08/22 05:34:08 sheiko 19 * load_qc_data() was changed for new interface of images/files adding. It needs to program Firefox support 20 * 21 * Revision 1.10 2005/08/03 09:20:27 toxin76 22 * embendded <sapi:for-each... > now works correct in ddc (it makes a temporary save from the vars of the outer for-each and load them back before finishing its work) 23 * 24 * 25 * Revision 1.9 2005/07/18 05:53:31 mephius 26 * fixed bug with quotes in queries with type "string" 27 * 28 * Revision 1.8 2005/07/04 11:10:28 sheiko 29 * New QC-image attributes - resize and addiconsize. Sample of using resize="width*height" 30 * 31 * Revision 1.7 2005/06/30 09:13:08 sheiko 32 * *** empty log message *** 33 * 34 * Revision 1.6 2005/06/30 08:20:14 mephius 35 * added ability of quering data as lists (HTML SELECT in edit mode) {temporary} 36 * 37 * Revision 1.5 2005/06/16 06:54:36 mephius 38 * Fixed small bug with incorrect trace mode info while in admin mode 39 * 40 * Revision 1.4 2005/06/14 13:21:52 mephius 41 * Formatted header of this file 42 * 43 * 44 * @package kernel 45 * @author $Author: sheiko $ 46 * @version $Id: kernel.lib.php,v 1.14 2005/09/01 15:58:15 sheiko Exp $ 47 * @since SAPID v.0.9 48 * @copyright (c) by Mephius 49 */ 50 51 52 /** 53 * SAPI Core class. Needs to be extended with DAL (Data Abstraction Layer). 54 * Parses XML Sapiens objects in the given template. 55 * @package kernel 56 * @author $Author: sheiko $ 57 * @version $Id: kernel.lib.php,v 1.14 2005/09/01 15:58:15 sheiko Exp $ 58 * @since SAPID v.0.9 59 * @copyright (c) by Mephius 60 */ 61 62 if (!defined("SAPID_STARTED")) die("Hacking attempt!"); 63 64 class sapi_core { 65 /** 66 * Current value of the template 67 * @var string (may be string or filepath) 68 */ 69 var $template=""; 70 71 /** 72 * This instance name 73 * @var string (may be string or filepath) 74 */ 75 var $name=""; 76 77 /** 78 * Query containers parsing passed flag 79 * @var boolean 80 */ 81 var $qc_passed=false; 82 83 /** 84 * Processing instructions parsing passed flag 85 * @var boolean 86 */ 87 var $pi_passed=false; 88 89 /** 90 * Static Data Containers parsing passed flag 91 * @var boolean 92 */ 93 var $sdc_passed=false; 94 95 /** 96 * Dynamic Data Containers parsing passed flag 97 * @var boolean 98 */ 99 var $ddc_passed=false; 100 101 /** 102 * Value parsing passed flag 103 * @var boolean 104 */ 105 var $val_passed=false; 106 107 /** 108 * Parser Environment 109 * @var array 110 */ 111 var $env=array(); 112 113 /** 114 * Found SAPI objects 115 * @var array 116 */ 117 var $sapi=array(); 118 119 /** 120 * Temp. array of parsed <sapi:code> instructions 121 * @var array 122 */ 123 var $code=array(); 124 125 /** 126 * Current element (used by XML Parser) 127 * @var string 128 */ 129 var $element=""; 130 131 /** 132 * Counter 133 * @var integer 134 */ 135 var $count=0; 136 137 /** 138 * Code Array 139 * @var array 140 */ 141 var $codearr=array(); 142 143 /** 144 * Parser Stack value 145 * @var array 146 */ 147 var $stack=array(); 148 149 /** 150 * Current handler 151 * @var string 152 */ 153 var $handler=""; 154 155 /** 156 * Temporary Parser Environment 157 * @var string 158 */ 159 var $thandler=""; 160 161 /** 162 * Parser Mode 163 * @var integer 164 */ 165 var $mode=0; 166 167 /** 168 * Parsing error 169 * @var string 170 */ 171 var $error=""; 172 173 174 /** 175 * Class constructor 176 * @param mixed $template initial value of template to parse 177 * @param array $env initial environmant array 178 * @param string $handler this instance handler 179 * @param string $name this instance name 180 * @return object 181 */ 182 function sapi_core ($template, $env=false, $handler="", $name="sapi_env"){ 183 184 if(!$env){ 185 $env=$this->env=&$GLOBALS["env"]; 186 }else{ 187 $this->env=$env; 188 } 189 $this->mode = (isset($env["mode"])?$env["mode"]:0); 190 $this->template=$template; 191 if($name=="sapi_env") { 192 $this->load_template($template); 193 $this->load_pagedata(); 194 if(is_array($this->env)) $this->env=($this->init_stack($this->env) + $this->env); 195 $this->check_predefinition(); 196 } 197 198 $this->handler=$handler; 199 $this->name=$name; 200 201 return $this; 202 } //\\sapi_core 203 204 205 /** 206 * Appends to an array it's "serialized" copy 207 * $arr["one"]["two"] will be accessable as $arr["one.two"] 208 * 209 * @param array $arr array to serialize 210 * @return array 211 */ 212 function init_stack($arr){ 213 $arr2=array(); 214 if(empty($arr)) return $arr; 215 $flag_end=0; 216 while (!empty($arr)){ 217 foreach ($arr as $key=>$value) { 218 if (is_array($value)) { 219 unset($arr[$key]); 220 foreach ($value as $k=>$v) { 221 if(is_array($v)) $arr[$key . "." . $k]=$v; else $arr2[$key . "." . $k]=$v; 222 } 223 }else{ 224 unset($arr[$key]); 225 } 226 } 227 } 228 return $arr2; 229 } //\\init_stack 230 231 232 /** 233 * XML Parser start element handler 234 * 235 * @param object $parser XML Parser Resourse ID 236 * @param string $name element name 237 * @param array $attribs element attributes 238 */ 239 function sapi_start($parser, $name, $attribs) 240 { 241 $this->element=$name; 242 if ($name=="SAPI:WHEN" and $attribs["EXP"]){ 243 244 //$data=preg_replace("/([a-zA-Z_\d\.]+)\.value/is", "\$this->env[\"\\1\"]", $attribs["EXP"]); 245 246 247 $this->code.="if (".preg_replace("/([a-zA-Z_\d\.]+)\.value/is", "\$this->env[\"\\1\"]", $attribs["EXP"]).") {\n"; 248 }elseif ($name=="SAPI:FOR-EACH"){ 249 if(!isset($attribs["NAME"])) $attribs["NAME"]="enum"; 250 $this->code.=" 251 \$filename=ROOT_PATH . \"usr/extensions/".preg_replace("/(.*)\(.*\)$/isU", "\\1", $attribs["SELECT"]).".inc.php\"; 252 if(is_file(\$filename)) include_once(\$filename); 253 \$temp_create=true;\$temp_save_array=array();\$temp_tenv=array(); 254 255 \$" . $attribs["NAME"] . "=" . $attribs["SELECT"] . "; 256 ".(TRACE?" 257 \$result['count'][]=count(\$" . $attribs["NAME"] . "); 258 \$result['slice'][]=array_slice(\$" . $attribs["NAME"] . ", 0, 1); 259 \$result['handler'][]=\$this->handler.'.'.".$attribs["NAME"]."; 260 \$result['array'][]='\$" . $attribs["NAME"] . "=" . addslashes($attribs["SELECT"]) . "'; 261 ":"")." 262 if(is_array(\$".$attribs["NAME"].")) 263 foreach (\$".$attribs["NAME"]." as \$key=>\$value){ 264 unset(\$arr); 265 266 267 if(!strpos(\"".$attribs["NAME"]."\", \$this->handler)) { 268 \$th=\$this->handler; 269 \$this->handler.=\".".$attribs["NAME"]."\"; 270 \$this->thandler.=\".this\"; 271 } 272 if(is_array(\$tenv)){ 273 foreach (\$tenv as \$k=>\$entry) if (is_array(\$entry)) { 274 foreach (\$entry as \$k2=>\$tv) { 275 if(\$temp_create){ 276 277 if (isset(\$this->env[\$k.\".\".\$k2])) \$temp_save_array[\$k.\".\".\$k2]=\$this->env[\$k.\".\".\$k2]; 278 \$temp_tenv[\$k][\$k2]=\$tv; 279 } 280 unset(\$this->env[\$k.\".\".\$k2]); 281 282 } 283 unset(\$this->env[\$this->handler]); 284 } 285 \$temp_create=false; 286 } 287 288 \$tenv=array(); 289 \$tenv[\$this->handler]=\$value; 290 \$tenv[\$this->thandler]=\$value; 291 \$arr[\$th][\"".$attribs["NAME"]."\"]=\$value; 292 293 294 \$this->env=\$this->env + \$this->init_stack(\$tenv);// + \$arr;\n"; 295 296 }elseif ($name=="SAPI:CODE"){ 297 $this->code.=" 298 \$iter_stack= '" . addcslashes(stripcslashes(trim($this->codearr[$this->count])), "'") . "'; 299 if(strstr(\$iter_stack, '.value')){ 300 \$tmp_sapi_obj =& new sapi_parser(stripslashes(\$iter_stack), \$this->env, \$this->handler, \"tmp_sapi_env\"); 301 \$this->stack.=\$tmp_sapi_obj->build_page(); 302 }else \$this->stack.=\$iter_stack;"; 303 304 $this->count++; 305 } 306 307 } //\\sapi_start 308 309 /** 310 * XML Parser end element handler 311 * 312 * @param object $parser XML Parser Resourse ID 313 * @param string $name element name 314 */ 315 function sapi_end($parser, $name) 316 { 317 if ($name=="SAPI:FOR-EACH") $this->code .= "\$this->handler=preg_replace(\"/(.*)(\.[a-zA-z\d]+)$/\", \"\\\\1\", \$this->handler); 318 \$this->thandler=preg_replace(\"/\.this$/\", \"\", \$this->thandler); 319 \n}\n 320 if (is_array(\$temp_save_array)){ 321 foreach (\$temp_save_array as \$key=>\$value)\$this->env[\$key]=\$value; 322 foreach (\$temp_tenv as \$key1=>\$value1)foreach (\$value1 as \$key2=>\$value2) \$tenv[\$key1][\$key2]=\$value2; 323 } 324 325 "; 326 if ($name=="SAPI:WHEN") { 327 $this->code.="\n}\n"; 328 } 329 } //\\sapi_end 330 331 /** 332 * XML Parser character data handler 333 * 334 * @param object $parser XML Parser Resourse ID 335 * @param string $name element name 336 */ 337 function sapi_data($parser, $data) 338 { 339 if ($this->element=="SAPI:EXP" and trim($data)!="") { 340 $this->code.= "if (".preg_replace("/([a-zA-Z_\d\.]+)\.value/is", "\$this->env[\"\\1\"]", $data).") {"; 341 } 342 } //\\sapi_data 343 344 345 /** 346 * Initializes sapi containers from file 347 * 348 * @param string $filename 349 */ 350 function sapi_init($name, $type){ 351 352 $sapi=$this->load_sapi($name, $type); 353 354 // preg_match_all("/<sapi:qc (.*)>(.*)<\/sapi:qc>/isU", $sapi, $tqc, PREG_PATTERN_ORDER); 355 preg_match_all("/<sapi:sdc (.*)>(.*)<\/sapi:sdc>/isU", $sapi, $tsdc, PREG_PATTERN_ORDER); 356 preg_match_all("/<sapi:ddc (.*)>(.*)<\/sapi:ddc>/isU", $sapi, $tddc, PREG_PATTERN_ORDER); 357 unset($sapi); 358 $sapi_containers=array_merge(/*$tqc,*/ $tsdc, $tddc); 359 //unset($tqc); 360 unset($sdc); 361 unset($ddc); 362 363 if (is_array($sapi_containers)) 364 foreach ($sapi_containers as $k=>$value){ 365 foreach ($value as $key=>$container) { 366 $p = xml_parser_create(); 367 xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0); 368 xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1); 369 xml_parse_into_struct($p, $container, $values, $tags); 370 xml_parser_free($p); 371 foreach ($tags as $tag=>$index) { 372 // if ($tag=="sapi:qc") { 373 // $data=$values[$index[0]]["attributes"]; 374 // $data["value"]=$sapi_containers[$k+2][$key]; 375 // $this->sapi["qc"][$data["name"]]=$data; 376 // } 377 if ($tag=="sapi:sdc") { 378 $data=$values[$index[0]]["attributes"]; 379 $data["value"]=$sapi_containers[$k+2][$key]; 380 $this->sapi["sdc"][$data["name"]]=$data; 381 } 382 if ($tag=="sapi:ddc") { 383 $data=$values[$index[0]]["attributes"]; 384 $cache_fname=ROOT_PATH . "usr/system/cache/ddc." . $data["name"] . ".cache"; 385 if(is_file($cache_fname) and OBJ_CACHE and !TRACE and @filemtime($cache_fname)>@filemtime($filename)){ 386 $fp=@fopen($cache_fname, "r"); 387 if (!$fp) message_die("Filed opening <b>" . $cache_fname . "</b> for reading!"); 388 else{ 389 $size=filesize($cache_fname); 390 $data["exec"]=fread($fp, $size); 391 $this->sapi["ddc"][$data["name"]]=$data; 392 fclose($fp); 393 } 394 }else{ 395 preg_match("/<sapi:name>(.*)<\/sapi:name>/isU", $sapi_containers[$k+2][$key], $name); 396 preg_match("/<sapi:email>(.*)<\/sapi:email>/isU", $sapi_containers[$k+2][$key], $email); 397 preg_match("/<sapi:url>(.*)<\/sapi:url>/isU", $sapi_containers[$k+2][$key], $url); 398 preg_match("/<sapi:comments>(.*)<\/sapi:comments>/isU", $sapi_containers[$k+2][$key], $comment); 399 $sapi_containers[$k+2][$key]=preg_replace("/<sapi:author>(.*)<\/sapi:author>/isU", "", $sapi_containers[$k+2][$key]); 400 $sapi_containers[$k+2][$key]=preg_replace("/<sapi:comments>(.*)<\/sapi:comments>/isU", "", $sapi_containers[$k+2][$key]); 401 $data["author"]["name"]=$name[1]; 402 $data["author"]["email"]=$email[1]; 403 $data["author"]["url"]=$url[1]; 404 $data["comments"]=$comment[1]; 405 406 407 $ddc_body=$sapi_containers[$k+2][$key]; 408 preg_match_all("/<sapi:code.*>(.*)<\/sapi:code>/isU", $ddc_body, $tcode, PREG_PATTERN_ORDER); 409 $this->codearr=$tcode[1]; 410 $ddc_body=preg_replace("/<sapi:code(.*)>/isU", "<sapi:code\\1><![CDATA[", $ddc_body); 411 $ddc_body=str_replace("</sapi:code>", "]]></sapi:code>", $ddc_body); 412 $sp=xml_parser_create(); 413 xml_set_element_handler($sp, array(&$this, 'sapi_start'), array(&$this, 'sapi_end')); 414 xml_set_character_data_handler($sp, array(&$this, 'sapi_data')); 415 xml_parser_set_option($sp, XML_OPTION_SKIP_WHITE, 1); 416 $this->count=0; 417 $this->code=""; 418 if(!xml_parse($sp, trim($ddc_body))) { 419 if(DEBUG){ 420 $ddc_body=str_replace("<![CDATA[", "", $ddc_body); 421 $ddc_body=str_replace("]]>", "", $ddc_body); 422 $arr=explode("\n", trim($ddc_body)); 423 $code='<span style="color: red;"><b>Error:</b> ' . xml_error_string(xml_get_error_code($sp)) . " at line ".xml_get_current_line_number($sp)."</span><br /><br />"; 424 foreach ($arr as $key=>$line) { 425 if($key==xml_get_current_line_number($sp)-1) $code.='<div style="background-color: #FF9797"><div style="float: left; clear: left; width: 20px; background-color: #dfdfdf;">'.($key+1).".</div>".str_replace("\t", " ", htmlentities($line))."</div>"; else $code.='<div style="float: left; clear: left; width: 20px; background-color: #dfdfdf;">'.($key+1).".</div>".str_replace("\t", " ", htmlentities($line))."<br />"; 426 } 427 $this->env["sapi_error_cnt"]++; 428 $data["exec"]="\$error=<<<EOC\n<div style=\"border: 1px solid red; color: white; background-color: red; font-weight: bold; cursor: pointer;\" align=\"center\" onclick=\"if(document.getElementById('sapi_error_".$this->env["sapi_error_cnt"]."').style.display!='block') document.getElementById('sapi_error_".$this->env["sapi_error_cnt"]."').style.display='block'; else document.getElementById('sapi_error_".$this->env["sapi_error_cnt"]."').style.display='none';\">SAPI Error #".$this->env["sapi_error_cnt"]."</div><div id=\"sapi_error_".$this->env["sapi_error_cnt"]."\" style=\"display: none;margin-top: 2px; position: absolute; background-color: #efefef; width: 700px; border: 1px solid Gray; padding: 5px;\">" . $code."</div>\nEOC;\n \$this->stack=\$error;"; 429 }else $data["exec"]=""; 430 }else{ 431 $data["exec"]=trim($this->code); 432 } 433 xml_parser_free($sp); 434 435 if(OBJ_CACHE and !TRACE){ 436 $fp=@fopen(ROOT_PATH . "usr/system/cache/ddc." . $data["name"] . ".cache", "w+"); 437 if (!$fp) message_die("Failed opening <b>" . ROOT_PATH . "usr/system/cache/" . $tag . "." . $data["name"] . "cache" . "</b> for writing!"); 438 else{ 439 fwrite($fp, $data["exec"]); 440 fclose($fp); 441 } 442 } 443 444 $this->sapi["ddc"][$data["name"]]=$data; 445 } 446 } 447 } 448 } 449 } 450 unset($sapi_containers); 451 } //\\sapi_init 452 453 454 /** 455 * Loads query container data 456 * 457 * @param string $name 458 * @param string $query_type 459 * @return string 460 */ 461 function load_qc_data($name