[ 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_syntaxhl.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 a class for various syntax highlighting.
  29   *
  30   * $Id: class.t3lib_syntaxhl.php 1421 2006-04-10 09:27:15Z mundaun $
  31   *
  32   * @author    Kasper Skaarhoj <kasperYYYY@typo3.com>
  33   */
  34  /**
  35   * [CLASS/FUNCTION INDEX of SCRIPT]
  36   *
  37   *
  38   *
  39   *   84: class t3lib_syntaxhl
  40   *
  41   *              SECTION: Markup of Data Structure, <T3DataStructure>
  42   *  156:     function highLight_DS($str)
  43   *  183:     function highLight_DS_markUpRecursively($struct,$parent='',$app='')
  44   *
  45   *              SECTION: Markup of Data Structure, <T3FlexForms>
  46   *  268:     function highLight_FF($str)
  47   *  295:     function highLight_FF_markUpRecursively($struct,$parent='',$app='')
  48   *
  49   *              SECTION: Various
  50   *  376:     function getAllTags($str)
  51   *  407:     function splitXMLbyTags($tagList,$str)
  52   *
  53   * TOTAL FUNCTIONS: 6
  54   * (This index is automatically created/updated by the extension "extdeveval")
  55   *
  56   */
  57  
  58  
  59  
  60  
  61  
  62  
  63  
  64  
  65  
  66  
  67  
  68  
  69  
  70  
  71  
  72  
  73  
  74  require_once(PATH_t3lib.'class.t3lib_parsehtml.php');
  75  
  76  
  77  /**
  78   * Syntax Highlighting class.
  79   *
  80   * @author    Kasper Skaarhoj <kasperYYYY@typo3.com>
  81   * @package TYPO3
  82   * @subpackage t3lib
  83   */
  84  class t3lib_syntaxhl {
  85  
  86          // Internal, dynamic:
  87      var $htmlParse;            // Parse object.
  88  
  89          // External, static:
  90      var $DS_wrapTags = array(
  91          'T3DataStructure' => array('<span style="font-weight: bold;">','</span>'),
  92          'type' => array('<span style="font-weight: bold; color: #000080;">','</span>'),
  93          'section' => array('<span style="font-weight: bold; color: #000080;">','</span>'),
  94          'el' => array('<span style="font-weight: bold; color: #800000;">','</span>'),
  95          'meta' => array('<span style="font-weight: bold; color: #800080;">','</span>'),
  96          '_unknown' => array('<span style="font-style: italic; color: #666666;">','</span>'),
  97  
  98          '_applicationTag' => array('<span style="font-weight: bold; color: #FF6600;">','</span>'),
  99          '_applicationContents' => array('<span style="font-style: italic; color: #C29336;">','</span>'),
 100  
 101          'sheets'  => array('<span style="font-weight: bold; color: #008000;">','</span>'),
 102          'parent:sheets' => array('<span style="color: #008000;">','</span>'),
 103  
 104          'ROOT' => array('<span style="font-weight: bold; color: #008080;">','</span>'),
 105          'parent:el' => array('<span style="font-weight: bold; color: #008080;">','</span>'),
 106  
 107          'langDisable' => array('<span style="color: #000080;">','</span>'),
 108          'langChildren' => array('<span style="color: #000080;">','</span>'),
 109      );
 110  
 111      var $FF_wrapTags = array(
 112          'T3FlexForms' => array('<span style="font-weight: bold;">','</span>'),
 113          'meta' => array('<span style="font-weight: bold; color: #800080;">','</span>'),
 114          'data' => array('<span style="font-weight: bold; color: #800080;">','</span>'),
 115          'el' => array('<span style="font-weight: bold; color: #80a000;">','</span>'),
 116          'itemType' => array('<span style="font-weight: bold; color: #804000;">','</span>'),
 117          'section' => array('<span style="font-weight: bold; color: #604080;">','</span>'),
 118          'numIndex' => array('<span style="color: #333333;">','</span>'),
 119          '_unknown' => array('<span style="font-style: italic; color: #666666;">','</span>'),
 120  
 121  
 122          'sDEF'  => array('<span style="font-weight: bold; color: #008000;">','</span>'),
 123          'level:sheet' => array('<span style="font-weight: bold; color: #008000;">','</span>'),
 124  
 125          'lDEF'  => array('<span style="font-weight: bold; color: #000080;">','</span>'),
 126          'level:language' => array('<span style="font-weight: bold; color: #000080;">','</span>'),
 127  
 128          'level:fieldname' => array('<span style="font-weight: bold; color: #666666;">','</span>'),
 129  
 130          'vDEF'  => array('<span style="font-weight: bold; color: #008080;">','</span>'),
 131          'level:value' => array('<span style="font-weight: bold; color: #008080;">','</span>'),
 132  
 133          'currentSheetId' => array('<span style="color: #000080;">','</span>'),
 134          'currentLangId' => array('<span style="color: #000080;">','</span>'),
 135      );
 136  
 137  
 138  
 139  
 140  
 141  
 142  
 143  
 144      /*************************************
 145       *
 146       * Markup of Data Structure, <T3DataStructure>
 147       *
 148       *************************************/
 149  
 150      /**
 151       * Makes syntax highlighting of a Data Structure, <T3DataStructure>
 152       *
 153       * @param    string        Data Structure XML, must be valid since it's parsed.
 154       * @return    string        HTML code with highlighted content. Must be wrapped in <PRE> tags
 155       */
 156  	function highLight_DS($str)    {
 157  
 158              // Parse DS to verify that it is valid:
 159          $DS = t3lib_div::xml2array($str);
 160          if (is_array($DS))    {
 161              $completeTagList = array_unique($this->getAllTags($str));    // Complete list of tags in DS
 162  
 163                  // Highlighting source:
 164              $this->htmlParse = t3lib_div::makeInstance('t3lib_parsehtml');    // Init parser object
 165              $struct = $this->splitXMLbyTags(implode(',',$completeTagList),$str);    // Split the XML by the found tags, recursively into LARGE array.
 166              $markUp = $this->highLight_DS_markUpRecursively($struct);    // Perform color-markup on the parsed content. Markup preserves the LINE formatting of the XML.
 167  
 168                  // Return content:
 169              return $markUp;
 170          } else $error = 'ERROR: The input content failed XML parsing: '.$DS;
 171          return $error;
 172      }
 173  
 174      /**
 175       * Making syntax highlighting of the parsed Data Structure XML.
 176       * Called recursively.
 177       *
 178       * @param    array        The structure, see splitXMLbyTags()
 179       * @param    string        Parent tag.
 180       * @param    string        "Application" - used to denote if we are 'inside' a section
 181       * @return    string        HTML
 182       */
 183  	function highLight_DS_markUpRecursively($struct,$parent='',$app='')    {
 184          $output='';
 185          foreach($struct as $k => $v)    {
 186              if ($k%2)    {
 187                  $nextApp = $app;
 188                  $wrap = array('','');
 189  
 190                  switch($app)    {
 191                      case 'TCEforms':
 192                      case 'tx_templavoila':
 193                          $wrap = $this->DS_wrapTags['_applicationContents'];
 194                      break;
 195                      case 'el':
 196                      default:
 197                          if ($parent=='el')    {
 198                              $wrap = $this->DS_wrapTags['parent:el'];
 199                              $nextApp = 'el';
 200                          } elseif ($parent=='sheets')    {
 201                              $wrap = $this->DS_wrapTags['parent:sheets'];
 202                          } else {
 203                              $wrap = $this->DS_wrapTags[$v['tagName']];
 204                              $nextApp = '';
 205                          }
 206  
 207                              // If no wrap defined, us "unknown" definition
 208                          if (!is_array($wrap))    {
 209                              $wrap = $this->DS_wrapTags['_unknown'];
 210                          }
 211  
 212                              // Check for application sections in the XML:
 213                          if ($app=='el' || $parent=='ROOT')    {
 214                              switch($v['tagName'])    {
 215                                  case 'TCEforms':
 216                                  case 'tx_templavoila':
 217                                      $nextApp = $v['tagName'];
 218                                      $wrap = $this->DS_wrapTags['_applicationTag'];
 219                                  break;
 220                              }
 221                          }
 222                      break;
 223                  }
 224  
 225                  $output.=$wrap[0].htmlspecialchars($v['tag']).$wrap[1];
 226                  $output.=$this->highLight_DS_markUpRecursively($v['sub'],$v['tagName'],$nextApp);
 227                  $output.=$wrap[0].htmlspecialchars('</'.$v['tagName'].'>').$wrap[1];
 228              } else {
 229                  $output.=htmlspecialchars($v);
 230              }
 231          }
 232  
 233          return $output;
 234      }
 235  
 236  
 237  
 238  
 239  
 240  
 241  
 242  
 243  
 244  
 245  
 246  
 247  
 248  
 249  
 250  
 251  
 252  
 253  
 254  
 255  
 256      /*************************************
 257       *
 258       * Markup of Data Structure, <T3FlexForms>
 259       *
 260       *************************************/
 261  
 262      /**
 263       * Makes syntax highlighting of a FlexForm Data, <T3FlexForms>
 264       *
 265       * @param    string        Data Structure XML, must be valid since it's parsed.
 266       * @return    string        HTML code with highlighted content. Must be wrapped in <PRE> tags
 267       */
 268  	function highLight_FF($str)    {
 269  
 270              // Parse DS to verify that it is valid:
 271          $DS = t3lib_div::xml2array($str);
 272          if (is_array($DS))    {
 273              $completeTagList = array_unique($this->getAllTags($str));    // Complete list of tags in DS
 274  
 275                  // Highlighting source:
 276              $this->htmlParse = t3lib_div::makeInstance('t3lib_parsehtml');    // Init parser object
 277              $struct = $this->splitXMLbyTags(implode(',',$completeTagList),$str);    // Split the XML by the found tags, recursively into LARGE array.
 278              $markUp = $this->highLight_FF_markUpRecursively($struct);    // Perform color-markup on the parsed content. Markup preserves the LINE formatting of the XML.
 279  
 280                  // Return content:
 281              return $markUp;
 282          } else $error = 'ERROR: The input content failed XML parsing: '.$DS;
 283          return $error;
 284      }
 285  
 286      /**
 287       * Making syntax highlighting of the parsed FlexForm XML.
 288       * Called recursively.
 289       *
 290       * @param    array        The structure, see splitXMLbyTags()
 291       * @param    string        Parent tag.
 292       * @param    string        "Application" - used to denote if we are 'inside' a section
 293       * @return    string        HTML
 294       */
 295  	function highLight_FF_markUpRecursively($struct,$parent='',$app='')    {
 296          $output='';
 297  
 298              // Setting levels:
 299          if ($parent=='data')    {
 300              $app='sheet';
 301          } elseif($app=='sheet')    {
 302              $app='language';
 303          } elseif($app=='language')    {
 304              $app='fieldname';
 305          } elseif($app=='fieldname')    {
 306              $app='value';
 307          } elseif($app=='el' || $app=='numIndex')    {
 308              $app='fieldname';
 309          }
 310  
 311              // Traverse structure:
 312          foreach($struct as $k => $v)    {
 313              if ($k%2)    {
 314                  $wrap = array('','');
 315  
 316                  if ($v['tagName'] == 'numIndex')    {
 317                      $app = 'numIndex';
 318                  }
 319  
 320                      // Default wrap:
 321                  $wrap = $this->FF_wrapTags[$v['tagName']];
 322  
 323                      // If no wrap defined, us "unknown" definition
 324                  if (!is_array($wrap))    {
 325                      switch($app)    {
 326                          case 'sheet':
 327                          case 'language':
 328                          case 'fieldname':
 329                          case 'value':
 330                              $wrap = $this->FF_wrapTags['level:'.$app];
 331                          break;
 332                          default:
 333                              $wrap = $this->FF_wrapTags['_unknown'];
 334                          break;
 335                      }
 336                  }
 337  
 338                  if ($v['tagName']=='el')    {
 339                      $app='el';
 340                  }
 341  
 342                  $output.=$wrap[0].htmlspecialchars($v['tag']).$wrap[1];
 343                  $output.=$this->highLight_FF_markUpRecursively($v['sub'],$v['tagName'],$app);
 344                  $output.=$wrap[0].htmlspecialchars('</'.$v['tagName'].'>').$wrap[1];
 345              } else {
 346                  $output.=htmlspecialchars($v);
 347              }
 348          }
 349  
 350          return $output;
 351      }
 352  
 353  
 354  
 355  
 356  
 357  
 358  
 359  
 360  
 361  
 362  
 363  
 364      /*************************************
 365       *
 366       * Various
 367       *
 368       *************************************/
 369  
 370      /**
 371       * Returning all tag names found in XML/HTML input string
 372       *
 373       * @param    string        HTML/XML input
 374       * @return    array        Array with all found tags (starttags only)
 375       */
 376  	function getAllTags($str)    {
 377  
 378              // Init:
 379          $tags = array();
 380          $token = md5(microtime());
 381  
 382              // Markup all tag names with token.
 383          $markUpStr = ereg_replace('<([[:alnum:]_]+)[^>]*>',$token.'\1'.$token,$str);
 384  
 385              // Splitting by token:
 386          $parts = explode($token,$markUpStr);
 387  
 388              // Traversing parts:
 389          foreach($parts as $k => $v)    {
 390              if ($k%2)    {
 391                  $tags[]=$v;
 392              }
 393          }
 394  
 395              // Returning tags:
 396          return $tags;
 397      }
 398  
 399      /**
 400       * Splitting the input source by the tags listing in $tagList.
 401       * Called recursively.
 402       *
 403       * @param    string        Commalist of tags to split source by (into blocks, ALL being block-tags!)
 404       * @param    string        Input string.
 405       * @return    array        Array with the content arranged hierarchically.
 406       */
 407  	function splitXMLbyTags($tagList,$str)    {
 408          $struct = $this->htmlParse->splitIntoBlock($tagList,$str);
 409  
 410              // Traverse level:
 411          foreach($struct as $k => $v)    {
 412              if ($k%2)    {
 413                  $tag = $this->htmlParse->getFirstTag($v);
 414                  $tagName = $this->htmlParse->getFirstTagName($tag,TRUE);
 415                  $struct[$k] = array(
 416                      'tag' => $tag,
 417                      'tagName' => $tagName,
 418                      'sub' => $this->splitXMLbyTags($tagList,$this->htmlParse->removeFirstAndLastTag($struct[$k]))
 419                  );
 420              }
 421          }
 422  
 423          return $struct;
 424      }
 425  }
 426  
 427  
 428  if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_syntaxhl.php'])    {
 429      include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_syntaxhl.php']);
 430  }
 431  ?>


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