[ Index ] |
|
Code source de Typo3 4.1.3 |
1 <?php 2 /*************************************************************** 3 * Copyright notice 4 * 5 * (c) 1999-2006 Kasper Skaarhoj (kasperYYYY@typo3.com) 6 * All rights reserved 7 * 8 * This script is part of the TYPO3 project. The TYPO3 project is 9 * free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * The GNU General Public License can be found at 15 * http://www.gnu.org/copyleft/gpl.html. 16 * A copy is found in the textfile GPL.txt and important notices to the license 17 * from the author is found in LICENSE.txt distributed with these scripts. 18 * 19 * 20 * This script is distributed in the hope that it will be useful, 21 * but WITHOUT ANY WARRANTY; without even the implied warranty of 22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 * GNU General Public License for more details. 24 * 25 * This copyright notice MUST APPEAR in all copies of the script! 26 ***************************************************************/ 27 /** 28 * Contains the TypoScript parser class 29 * 30 * $Id: class.t3lib_tsparser.php 2037 2007-02-16 11:02:56Z mundaun $ 31 * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj 32 * 33 * @author Kasper Skaarhoj <kasperYYYY@typo3.com> 34 */ 35 /** 36 * [CLASS/FUNCTION INDEX of SCRIPT] 37 * 38 * 39 * 40 * 80: class t3lib_TSparser 41 * 133: function parse($string,$matchObj='') 42 * 169: function nextDivider() 43 * 185: function parseSub(&$setup) 44 * 389: function rollParseSub($string,&$setup) 45 * 413: function getVal($string,$setup) 46 * 439: function setVal($string,&$setup,$value,$wipeOut=0) 47 * 485: function error($err,$num=2) 48 * 497: function checkIncludeLines($string) 49 * 541: function checkIncludeLines_array($array) 50 * 51 * SECTION: Syntax highlighting 52 * 584: function doSyntaxHighlight($string,$lineNum='',$highlightBlockMode=0) 53 * 605: function regHighLight($code,$pointer,$strlen=-1) 54 * 623: function syntaxHighlight_print($lineNumDat,$highlightBlockMode) 55 * 56 * TOTAL FUNCTIONS: 12 57 * (This index is automatically created/updated by the extension "extdeveval") 58 * 59 */ 60 61 62 63 64 65 66 67 68 69 70 71 72 /** 73 * The TypoScript parser 74 * 75 * @author Kasper Skaarhoj <kasperYYYY@typo3.com> 76 * @package TYPO3 77 * @subpackage t3lib 78 * @see t3lib_tstemplate, t3lib_matchcondition, t3lib_BEfunc::getPagesTSconfig(), t3lib_userAuthGroup::fetchGroupData(), t3lib_TStemplate::generateConfig() 79 */ 80 class t3lib_TSparser { 81 var $strict = 1; // If set, then key names cannot contain characters other than [:alnum:]_\.- 82 83 // Internal 84 var $setup = Array(); // TypoScript hierarchy being build during parsing. 85 var $raw; // raw data, the input string exploded by chr(10) 86 var $rawP; // pointer to entry in raw data array 87 var $lastComment=''; // Holding the value of the last comment 88 var $commentSet=0; // Internally set, used as internal flag to create a multi-line comment (one of those like /*... */) 89 var $multiLineEnabled=0; // Internally set, when multiline value is accumulated 90 var $multiLineObject=''; // Internally set, when multiline value is accumulated 91 var $multiLineValue=array(); // Internally set, when multiline value is accumulated 92 var $inBrace = 0; // Internally set, when in brace. Counter. 93 var $lastConditionTrue = 1; // For each condition this flag is set, if the condition is true, else it's cleared. Then it's used by the [ELSE] condition to determine if the next part should be parsed. 94 var $sections=array(); // Tracking all conditions found 95 var $sectionsMatch=array(); // Tracking all matching conditions found 96 var $syntaxHighLight = 0; // If set, then syntax highlight mode is on; Call the function syntaxHighlight() to use this function 97 var $highLightData=array(); // Syntax highlight data is accumulated in this array. Used by syntaxHighlight_print() to construct the output. 98 var $highLightData_bracelevel = array(); // Syntax highlight data keeping track of the curly brace level for each line 99 100 // Debugging, analysis: 101 var $regComments = 0; // DO NOT register the comments. This is default for the ordinary sitetemplate! 102 var $regLinenumbers = 0; // DO NOT register the linenumbers. This is default for the ordinary sitetemplate! 103 var $errors=array(); // Error accumulation array. 104 var $lineNumberOffset=0; // Used for the error messages line number reporting. Set externally. 105 var $breakPointLN=0; // Line for break point. 106 var $highLightStyles=array( 107 'prespace' => array('<span class="ts-prespace">','</span>'), // Space before any content on a line 108 'objstr_postspace' => array('<span class="ts-objstr_postspace">','</span>'), // Space after the object string on a line 109 'operator_postspace' => array('<span class="ts-operator_postspace">','</span>'), // Space after the operator on a line 110 'operator' => array('<span class="ts-operator">','</span>'), // The operator char 111 'value' => array('<span class="ts-value">','</span>'), // The value of a line 112 'objstr' => array('<span class="ts-objstr">','</span>'), // The object string of a line 113 'value_copy' => array('<span class="ts-value_copy">','</span>'), // The value when the copy syntax (<) is used; that means the object reference 114 'value_unset' => array('<span class="ts-value_unset">','</span>'), // The value when an object is unset. Should not exist. 115 'ignored' => array('<span class="ts-ignored">','</span>'), // The "rest" of a line which will be ignored. 116 'default' => array('<span class="ts-default">','</span>'), // The default style if none other is applied. 117 'comment' => array('<span class="ts-comment">','</span>'), // Comment lines 118 'condition' => array('<span class="ts-condition">','</span>'), // Conditions 119 'error' => array('<span class="ts-error">','</span>'), // Error messages 120 'linenum' => array('<span class="ts-linenum">','</span>'), // Line numbers 121 ); 122 var $highLightBlockStyles = ''; // Additional attributes for the <span> tags for a blockmode line 123 var $highLightBlockStyles_basecolor = '#cccccc'; // The hex-HTML color for the blockmode 124 125 126 /** 127 * Start parsing the input TypoScript text piece. The result is stored in $this->setup 128 * 129 * @param string The TypoScript text 130 * @param object If is object (instance of t3lib_matchcondition), then this is used to match conditions found in the TypoScript code. If matchObj not specified, then no conditions will work! (Except [GLOBAL]) 131 * @return void 132 */ 133 function parse($string,$matchObj='') { 134 $this->raw = explode(chr(10),$string); 135 $this->rawP = 0; 136 $pre = '[GLOBAL]'; 137 while($pre) { 138 if ($this->breakPointLN && $pre=='[_BREAK]') { 139 $this->error('Breakpoint at '.($this->lineNumberOffset+$this->rawP-2).': Line content was "'.$this->raw[$this->rawP-2].'"',1); 140 break; 141 } 142 143 if (strtoupper($pre)=='[GLOBAL]' || strtoupper($pre)=='[END]' || (!$this->lastConditionTrue && strtoupper($pre)=='[ELSE]')) { 144 $pre = trim($this->parseSub($this->setup)); 145 $this->lastConditionTrue=1; 146 } else { 147 if (strtoupper($pre)!='[ELSE]') {$this->sections[md5($pre)]=$pre;} // we're in a specific section. Therefore we log this section 148 if ((is_object($matchObj) && $matchObj->match($pre)) || $this->syntaxHighLight) { 149 if (strtoupper($pre)!='[ELSE]') {$this->sectionsMatch[md5($pre)]=$pre;} 150 $pre = trim($this->parseSub($this->setup)); 151 $this->lastConditionTrue=1; 152 } else { 153 $pre = trim($this->nextDivider()); 154 $this->lastConditionTrue=0; 155 } 156 } 157 } 158 if ($this->inBrace) {$this->error('Line '.($this->lineNumberOffset+$this->rawP-1).': The script is short of '.$this->inBrace.' end brace(s)',1); } 159 if ($this->multiLineEnabled) {$this->error('Line '.($this->lineNumberOffset+$this->rawP-1).': A multiline value section is not ended with a parenthesis!',1); } 160 $this->lineNumberOffset+=count($this->raw)+1; 161 } 162 163 /** 164 * Will search for the next condition. When found it will return the line content (the condition value) and have advanced the internal $this->rawP pointer to point to the next line after the condition. 165 * 166 * @return string The condition value 167 * @see parse() 168 */ 169 function nextDivider() { 170 while (isset($this->raw[$this->rawP])) { 171 $line = ltrim($this->raw[$this->rawP]); 172 $this->rawP++; 173 if ($line && substr($line,0,1)=='[') { 174 return $line; 175 } 176 } 177 } 178 179 /** 180 * Parsing the $this->raw TypoScript lines from pointer, $this->rawP 181 * 182 * @param array Reference to the setup array in which to accumulate the values. 183 * @return string Returns the string of the condition found, the exit signal or possible nothing (if it completed parsing with no interruptions) 184 */ 185 function parseSub(&$setup) { 186 global $TYPO3_CONF_VARS; 187 188 while (isset($this->raw[$this->rawP])) { 189 $line = ltrim($this->raw[$this->rawP]); 190 $lineP = $this->rawP; 191 $this->rawP++; 192 if ($this->syntaxHighLight) $this->regHighLight("prespace",$lineP,strlen($line)); 193 194 // Breakpoint? 195 if ($this->breakPointLN && ($this->lineNumberOffset+$this->rawP-1)==($this->breakPointLN+1)) { // by adding 1 we get that line processed 196 return '[_BREAK]'; 197 } 198 199 // Set comment flag? 200 if (!$this->multiLineEnabled && substr($line,0,2)=='/*') { 201 $this->commentSet=1; 202 } 203 204 if (!$this->commentSet && ($line || $this->multiLineEnabled)) { // If $this->multiLineEnabled we will go and get the line values here because we know, the first if() will be true. 205 if ($this->multiLineEnabled) { // If multiline is enabled. Escape by ')' 206 if (substr($line,0,1)==')') { // Multiline ends... 207 if ($this->syntaxHighLight) $this->regHighLight("operator",$lineP,strlen($line)-1); 208 $this->multiLineEnabled=0; // Disable multiline 209 $theValue = implode($this->multiLineValue,chr(10)); 210 if (strstr($this->multiLineObject,'.')) { 211 $this->setVal($this->multiLineObject,$setup,array($theValue)); // Set the value deeper. 212 } else { 213 $setup[$this->multiLineObject] = $theValue; // Set value regularly 214 if ($this->lastComment && $this->regComments) { 215 $setup[$this->multiLineObject.'..'].=$this->lastComment; 216 } 217 if ($this->regLinenumbers) { 218 $setup[$this->multiLineObject.'.ln..'][]=($this->lineNumberOffset+$this->rawP-1); 219 } 220 } 221 } else { 222 if ($this->syntaxHighLight) $this->regHighLight("value",$lineP); 223 $this->multiLineValue[]=$this->raw[($this->rawP-1)]; 224 } 225 } elseif ($this->inBrace==0 && substr($line,0,1)=='[') { // Beginning of condition (only on level zero compared to brace-levels 226 if ($this->syntaxHighLight) $this->regHighLight("condition",$lineP); 227 return $line; 228 } else { 229 if (substr($line,0,1)=='[' && strtoupper(trim($line))=='[GLOBAL]') { // Return if GLOBAL condition is set - no matter what. 230 if ($this->syntaxHighLight) $this->regHighLight("condition",$lineP); 231 $this->error('Line '.($this->lineNumberOffset+$this->rawP-1).': On return to [GLOBAL] scope, the script was short of '.$this->inBrace.' end brace(s)',1); 232 $this->inBrace=0; 233 return $line; 234 } elseif (strcspn($line,'}#/')!=0) { // If not brace-end or comment 235 $varL = strcspn($line,' {=<>:('); // Find object name string until we meet an operator 236 $objStrName=trim(substr($line,0,$varL)); 237 if ($this->syntaxHighLight) $this->regHighLight("objstr",$lineP,strlen(substr($line,$varL))); 238 if (strlen($objStrName)) { 239 $r = array(); 240 if ($this->strict && preg_match('/[^[:alnum:]_\.-]/i',$objStrName,$r)) { 241 $this->error('Line '.($this->lineNumberOffset+$this->rawP-1).': Object Name String, "'.htmlspecialchars($objStrName).'" contains invalid character "'.$r[0].'". Must be alphanumeric or one of: "_-."'); 242 } else { 243 $line = ltrim(substr($line,$varL)); 244 if ($this->syntaxHighLight) { 245 $this->regHighLight("objstr_postspace", $lineP, strlen($line)); 246 if (strlen($line)>0) { 247 $this->regHighLight("operator", $lineP, strlen($line)-1); 248 $this->regHighLight("operator_postspace", $lineP, strlen(ltrim(substr($line,1)))); 249 } 250 } 251 252 // Checking for special TSparser properties (to change TS values at parsetime) 253 $match = array(); 254 if (preg_match('/^:=([^\(]+)\((.+)\).*/', $line, $match)) { 255 $tsFunc = trim($match[1]); 256 $tsFuncArg = $match[2]; 257 list ($currentValue) = $this->getVal($objStrName,$setup); 258 259 switch ($tsFunc) { 260 case 'prependString': 261 $newValue = $tsFuncArg . $currentValue; 262 break; 263 case 'appendString': 264 $newValue = $currentValue . $tsFuncArg; 265 break; 266 case 'removeString': 267 $newValue = str_replace($tsFuncArg, '', $currentValue); 268 break; 269 case 'replaceString': 270 list($fromStr,$toStr) = explode('|', $tsFuncArg, 2); 271 $newValue = str_replace($fromStr, $toStr, $currentValue); 272 break; 273 case 'addToList': 274 $newValue = (strcmp('',$currentValue) ? $currentValue.',' : '') . trim($tsFuncArg); 275 break; 276 case 'removeFromList': 277 $existingElements = t3lib_div::trimExplode(',',$currentValue); 278 $removeElements = t3lib_div::trimExplode(',',$tsFuncArg); 279 if (count($removeElements)) { 280 $newValue = implode(',', array_diff($existingElements, $removeElements)); 281 } 282 break; 283 default: 284 if (isset($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tsparser.php']['preParseFunc'][$tsFunc])) { 285 $hookMethod = $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tsparser.php']['preParseFunc'][$tsFunc]; 286 $params = array('currentValue'=>$currentValue, 'functionArgument'=>$tsFuncArg); 287 $fakeThis = FALSE; 288 $newValue = t3lib_div::callUserFunction($hookMethod,$params,$fakeThis); 289 } else { 290 t3lib_div::sysLog('Missing function definition for '.$tsFunc.' on TypoScript line '.$lineP,'Core',2); 291 } 292 } 293 294 if (isset($newValue)) { 295 $line = '= '.$newValue; 296 } 297 } 298 299 switch(substr($line,0,1)) { 300 case '=': 301 if ($this->syntaxHighLight) $this->regHighLight('value', $lineP, strlen(ltrim(substr($line,1)))-strlen(trim(substr($line,1)))); 302 303 if (strstr($objStrName,'.')) { 304 $value = Array(); 305 $value[0] = trim(substr($line,1)); 306 $this->setVal($objStrName,$setup,$value); 307 } else { 308 $setup[$objStrName] = trim(substr($line,1)); 309 if ($this->lastComment && $this->regComments) { // Setting comment.. 310 $setup[$objStrName.'..'].=$this->lastComment; 311 } 312 if ($this->regLinenumbers) { 313 $setup[$objStrName.'.ln..'][]=($this->lineNumberOffset+$this->rawP-1); 314 } 315 } 316 break; 317 case '{': 318 $this->inBrace++; 319 if (strstr($objStrName,'.')) { 320 $exitSig=$this->rollParseSub($objStrName,$setup); 321 if ($exitSig) return $exitSig; 322 } else { 323 if (!isset($setup[$objStrName.'.'])) {$setup[$objStrName.'.'] = Array();} 324 $exitSig=$this->parseSub($setup[$objStrName.'.']); 325 if ($exitSig) return $exitSig; 326 } 327 break; 328 case '(': 329 $this->multiLineObject = $objStrName; 330 $this->multiLineEnabled=1; 331 $this->multiLineValue=array(); 332 break; 333 case '<': 334 if ($this->syntaxHighLight) $this->regHighLight("value_copy", $lineP, strlen(ltrim(substr($line,1)))-strlen(trim(substr($line,1)))); 335 $theVal = trim(substr($line,1)); 336 if (substr($theVal,0,1)=='.') { 337 $res = $this->getVal(substr($theVal,1),$setup); 338 } else { 339 $res = $this->getVal($theVal,$this->setup); 340 } 341 $this->setVal($objStrName,$setup,unserialize(serialize($res)),1); // unserialize(serialize(...)) may look stupid but is needed because of some reference issues. See Kaspers reply to "[TYPO3-core] good question" from December 15 2005. 342 break; 343 case '>': 344 if ($this->syntaxHighLight) $this->regHighLight("value_unset", $lineP, strlen(ltrim(substr($line,1)))-strlen(trim(substr($line,1)))); 345 $this->setVal($objStrName,$setup,'UNSET'); 346 break; 347 default: 348 $this->error('Line '.($this->lineNumberOffset+$this->rawP-1).': Object Name String, "'.htmlspecialchars($objStrName).'" was not preceeded by any operator, =<>({'); 349 break; 350 } 351 } 352 $this->lastComment=''; 353 } 354 } elseif (substr($line,0,1)=='}') { 355 $this->inBrace--; 356 $this->lastComment=''; 357 if ($this->syntaxHighLight) $this->regHighLight("operator", $lineP, strlen($line)-1); 358 if ($this->inBrace<0) { 359 $this->error('Line '.($this->lineNumberOffset+$this->rawP-1).': An end brace is in excess.',1); 360 $this->inBrace=0; 361 } else { 362 break; 363 } 364 } else { 365 if ($this->syntaxHighLight) $this->regHighLight("comment", $lineP); 366 367 // Comment. The comments are concatenated in this temporary string: 368 if ($this->regComments) $this->lastComment.= trim($line).chr(10); 369 } 370 } 371 } 372 373 // Unset comment 374 if ($this->commentSet) { 375 if ($this->syntaxHighLight) $this->regHighLight("comment", $lineP); 376 if (substr($line,0,2)=='*/') $this->commentSet=0; 377 } 378 } 379 } 380 381 /** 382 * Parsing of TypoScript keys inside a curly brace where the key is composite of at least two keys, thus having to recursively call itself to get the value 383 * 384 * @param string The object sub-path, eg "thisprop.another_prot" 385 * @param array The local setup array from the function calling this function 386 * @return string Returns the exitSignal 387 * @see parseSub() 388 */ 389 function rollParseSub($string,&$setup) { 390 if ((string)$string!='') { 391 $keyLen = strcspn($string,'.'); 392 if ($keyLen==strlen($string)) { 393 $key = $string.'.'; 394 if (!isset($setup[$key])){$setup[$key]=Array();} 395 $exitSig=$this->parseSub($setup[$key]); 396 if ($exitSig) return $exitSig; 397 } else { 398 $key = substr($string,0,$keyLen).'.'; 399 if (!isset($setup[$key])){$setup[$key]=Array();} 400 $exitSig=$this->rollParseSub(substr($string,$keyLen+1),$setup[$key]); 401 if ($exitSig) return $exitSig; 402 } 403 } 404 } 405 406 /** 407 * Get a value/property pair for an object path in TypoScript, eg. "myobject.myvalue.mysubproperty". Here: Used by the "copy" operator, < 408 * 409 * @param string Object path for which to get the value 410 * @param array Global setup code if $string points to a global object path. But if string is prefixed with "." then its the local setup array. 411 * @return array An array with keys 0/1 being value/property respectively 412 */ 413 function getVal($string,$setup) { 414 if ((string)$string!='') { 415 $keyLen = strcspn($string,'.'); 416 if ($keyLen==strlen($string)) { 417 $retArr=array(); // Added 6/6/03. Shouldn't hurt 418 if (isset($setup[$string])) {$retArr[0]=$setup[$string]; } 419 if (isset($setup[$string.'.'])) {$retArr[1]=$setup[$string.'.']; } 420 return $retArr; 421 } else { 422 $key = substr($string,0,$keyLen).'.'; 423 if ($setup[$key]) { 424 return $this->getVal(substr($string,$keyLen+1),$setup[$key]); 425 } 426 } 427 } 428 } 429 430 /** 431 * Setting a value/property of an object string in the setup array. 432 * 433 * @param string The object sub-path, eg "thisprop.another_prot" 434 * @param array The local setup array from the function calling this function. 435 * @param array The value/property pair array to set. If only one of them is set, then the other is not touched (unless $wipeOut is set, which it is when copies are made which must include both value and property) 436 * @param boolean If set, then both value and property is wiped out when a copy is made of another value. 437 * @return void 438 */ 439 function setVal($string,&$setup,$value,$wipeOut=0) { 440 if ((string)$string!='') { 441 $keyLen = strcspn($string,'.'); 442 if ($keyLen==strlen($string)) { 443 if ($value=='UNSET') { 444 unset($setup[$string]); 445 unset($setup[$string.'.']); 446 if ($this->regLinenumbers) { 447 $setup[$string.'.ln..'][]=($this->lineNumberOffset+$this->rawP-1).'>'; 448 } 449 } else { 450 $lnRegisDone=0; 451 if ($wipeOut && $this->strict) { 452 if ((isset($setup[$string]) && !isset($value[0])) || (isset($setup[$string.'.']) && !isset($value[1]))) {$this->error('Line '.($this->lineNumberOffset+$this->rawP-1).': Object copied in this line "'.trim($this->raw[($this->rawP-1)]).'" would leave either the value or properties untouched in TypoScript Version 1. Please check that this is not a problem for you.',1);} 453 unset($setup[$string]); 454 unset($setup[$string.'.']); 455 if ($this->regLinenumbers) { 456 $setup[$string.'.ln..'][]=($this->lineNumberOffset+$this->rawP-1).'<'; 457 $lnRegisDone=1; 458 } 459 } 460 if (isset($value[0])) {$setup[$string] = $value[0];} 461 if (isset($value[1])) {$setup[$string.'.'] = $value[1];} 462 if ($this->lastComment && $this->regComments) { 463 $setup[$string.'..'].=$this->lastComment; 464 } 465 if ($this->regLinenumbers && !$lnRegisDone) { 466 $setup[$string.'.ln..'][]=($this->lineNumberOffset+$this->rawP-1); 467 } 468 } 469 } else { 470 $key = substr($string,0,$keyLen).'.'; 471 if (!isset($setup[$key])){$setup[$key]=Array();} 472 $this->setVal(substr($string,$keyLen+1),$setup[$key],$value); 473 } 474 } 475 } 476 477 /** 478 * Stacks errors/messages from the TypoScript parser into an internal array, $this->error 479 * If "TT" is a global object (as it is in the frontend when backend users are logged in) the message will be registered here as well. 480 * 481 * @param string The error message string 482 * @param integer The error severity (in the scale of $GLOBALS['TT']->setTSlogMessage: Approx: 2=warning, 1=info, 0=nothing, 3=fatal.) 483 * @return void 484 */ 485 function error($err,$num=2) { 486 if (is_object($GLOBALS['TT'])) $GLOBALS['TT']->setTSlogMessage($err,$num); 487 $this->errors[]=array($err,$num,$this->rawP-1,$this->lineNumberOffset); 488 } 489 490 /** 491 * Checks the input string (un-parsed TypoScript) for include-commands ("<INCLUDE_TYPOSCRIPT: ....") 492 * Use: t3lib_TSparser::checkIncludeLines() 493 * 494 * @param string Unparsed TypoScript 495 * @return string Complete TypoScript with includes added. 496 */ 497 function checkIncludeLines($string) { 498 $splitStr='<INCLUDE_TYPOSCRIPT:'; 499 if (strstr($string,$splitStr)) { 500 $newString=''; 501 $allParts = explode($splitStr,chr(10).$string.chr(10)); // adds line break char before/after 502 reset($allParts); 503 while(list($c,$v)=each($allParts)) { 504 if (!$c) { // first goes through 505 $newString.=$v; 506 } elseif (preg_match('/\r?\n\s*$/',$allParts[$c-1])) { // There must be a line-break char before. 507 $subparts=explode('>',$v,2); 508 if (preg_match('/^\s*\r?\n/',$subparts[1])) { // There must be a line-break char after 509 // SO, the include was positively recognized: 510 $newString.='### '.$splitStr.$subparts[0].'> BEGIN:'.chr(10); 511 $params = t3lib_div::get_tag_attributes($subparts[0]); 512 if ($params['source']) { 513 $sourceParts = explode(':',$params['source'],2); 514 switch(strtolower(trim($sourceParts[0]))) { 515 case 'file': 516 $filename = t3lib_div::getFileAbsFileName(trim($sourceParts[1])); 517 if (strcmp($filename,'')) { // Must exist and must not contain '..' and must be relative 518 if (@is_file($filename) && filesize($filename)<100000) { // Max. 100 KB include files! 519 $newString.=t3lib_div::getUrl($filename).chr(10); 520 } 521 } 522 break; 523 } 524 } 525 $newString.='### '.$splitStr.$subparts[0].'> END:'.chr(10); 526 $newString.=$subparts[1]; 527 } else $newString.=$splitStr.$v; 528 } else $newString.=$splitStr.$v; 529 } 530 $string=substr($newString,1,-1); // not the first/last linebreak char. 531 } 532 return $string; 533 } 534 535 /** 536 * Parses the string in each value of the input array for include-commands 537 * 538 * @param array Array with TypoScript in each value 539 * @return array Same array but where the values has been parsed for include-commands 540 */ 541 function checkIncludeLines_array($array) { 542 reset($array); 543 while(list($k)=each($array)) { 544 $array[$k]=t3lib_TSparser::checkIncludeLines($array[$k]); 545 } 546 return $array; 547 } 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 /********************************** 570 * 571 * Syntax highlighting 572 * 573 *********************************/ 574 575 /** 576 * Syntax highlight a TypoScript text 577 * Will parse the content. Remember, the internal setup array may contain invalid parsed content since conditions are ignored! 578 * 579 * @param string The TypoScript text 580 * @param mixed If blank, linenumbers are NOT printed. If array then the first key is the linenumber offset to add to the internal counter. 581 * @param boolean If set, then the highlighted output will be formatted in blocks based on the brace levels. prespace will be ignored and empty lines represented with a single no-break-space. 582 * @return string HTML code for the syntax highlighted string 583 */ 584 function doSyntaxHighlight($string,$lineNum='',$highlightBlockMode=0) { 585 $this->syntaxHighLight=1; 586 $this->highLightData=array(); 587 $this->error=array(); 588 $string = str_replace(chr(13),'',$string); // This is done in order to prevent empty <span>..</span> sections around chr(13) content. Should not do anything but help lessen the amount of HTML code. 589 590 $this->parse($string); 591 592 return $this->syntaxHighlight_print($lineNum,$highlightBlockMode); 593 } 594 595 /** 596 * Registers a part of a TypoScript line for syntax highlighting. 597 * 598 * @param string Key from the internal array $this->highLightStyles 599 * @param integer Pointer to the line in $this->raw which this is about 600 * @param integer The number of chars LEFT on this line before the end is reached. 601 * @return void 602 * @access private 603 * @see parse() 604 */ 605 function regHighLight($code,$pointer,$strlen=-1) { 606 if ($strlen==-1) { 607 $this->highLightData[$pointer] = array(array($code,0)); 608 } else { 609 $this->highLightData[$pointer][] = array($code,$strlen); 610 } 611 $this->highLightData_bracelevel[$pointer] = $this->inBrace; 612 } 613 614 /** 615 * Formatting the TypoScript code in $this->raw based on the data collected by $this->regHighLight in $this->highLightData 616 * 617 * @param mixed If blank, linenumbers are NOT printed. If array then the first key is the linenumber offset to add to the internal counter. 618 * @param boolean If set, then the highlighted output will be formatted in blocks based on the brace levels. prespace will be ignored and empty lines represented with a single no-break-space. 619 * @return string HTML content 620 * @access private 621 * @see doSyntaxHighlight() 622 */ 623 function syntaxHighlight_print($lineNumDat,$highlightBlockMode) { 624 // Registers all error messages in relation to their linenumber 625 $errA=array(); 626 foreach($this->errors as $err) { 627 $errA[$err[2]][]=$err[0]; 628 } 629 // Generates the syntax highlighted output: 630 $lines=array(); 631 foreach($this->raw as $rawP => $value) { 632 $start=0; 633 $strlen=strlen($value); 634 $lineC=''; 635 636 if (is_array($this->highLightData[$rawP])) { 637 foreach($this->highLightData[$rawP] as $set) { 638 $len = $strlen-$start-$set[1]; 639 if ($len > 0) { 640 $part = substr($value,$start,$len); 641 $start+=$len; 642 $st = $this->highLightStyles[(isset($this->highLightStyles[$set[0]])?$set[0]:'default')]; 643 if (!$highlightBlockMode || $set[0]!='prespace') $lineC.=$st[0].htmlspecialchars($part).$st[1]; 644 }elseif ($len < 0) debug(array($len,$value,$rawP)); 645 } 646 } else debug(array($value)); 647 648 if (strlen(substr($value,$start))) $lineC.=$this->highLightStyles['ignored'][0].htmlspecialchars(substr($value,$start)).$this->highLightStyles['ignored'][1]; 649 650 if ($errA[$rawP]) { 651 $lineC.=$this->highLightStyles['error'][0].'<strong> - ERROR:</strong> '.htmlspecialchars(implode(';',$errA[$rawP])).$this->highLightStyles['error'][1]; 652 } 653 654 if ($highlightBlockMode && $this->highLightData_bracelevel[$rawP]) { 655 $lineC = str_pad('',$this->highLightData_bracelevel[$rawP]*2,' ',STR_PAD_LEFT).'<span style="'.$this->highLightBlockStyles.($this->highLightBlockStyles_basecolor?'background-color: '.t3lib_div::modifyHTMLColorAll($this->highLightBlockStyles_basecolor,-$this->highLightData_bracelevel[$rawP]*16):'').'">'.(strcmp($lineC,'')?$lineC:' ').'</span>'; 656 } 657 658 if (is_array($lineNumDat)) { 659 $lineNum = $rawP+$lineNumDat[0]; 660 $lineC = $this->highLightStyles['linenum'][0].str_pad($lineNum,4,' ',STR_PAD_LEFT).':'.$this->highLightStyles['linenum'][1].' '.$lineC; 661 } 662 663 664 $lines[] = $lineC; 665 } 666 667 return '<pre class="ts-hl">'.implode(chr(10),$lines).'</pre>'; 668 } 669 } 670 671 672 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tsparser.php']) { 673 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tsparser.php']); 674 } 675 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Nov 25 17:13:16 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |