[ Index ]
 

Code source de Typo3 4.1.3

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/t3lib/ -> class.t3lib_tsparser.php (source)

   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:'&nbsp;').'</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  ?>


Généré le : Sun Nov 25 17:13:16 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics