Added syntax highlighting class
authorKasper Skårhøj <kasper@typo3.org>
Fri, 2 Jan 2004 08:56:02 +0000 (08:56 +0000)
committerKasper Skårhøj <kasper@typo3.org>
Fri, 2 Jan 2004 08:56:02 +0000 (08:56 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@113 709f56b5-9817-0410-a4d7-c38de5d9e867

TODO.txt
t3lib/class.t3lib_parsehtml.php
t3lib/class.t3lib_syntaxhl.php [new file with mode: 0644]
typo3/stylesheet.css

index fc4a01d..745f2f0 100755 (executable)
--- a/TODO.txt
+++ b/TODO.txt
@@ -73,6 +73,8 @@ TCEmain/TCEforms for FlexForms:
 - Affects: "lowlevel" ext/DBint , "impexp" extension. Must/Should be extended.
 - Permissions handled per-field in FlexForms?
 - What to do if data structure was not found? (Both TCEmain, TCEforms, templavoila_pi1, t3lib_transferdata) 
+- block the creation of FlexForm in FlexForm inside TCEforms.
+- ['pi_flexform']['config']['ds'] must be set to some default message making sense!
 - TCEmain features:
        - caching of references/files in meta data (for analysis tools)?
        - mapping values to a plain-text search field(s)  
@@ -86,7 +88,7 @@ TCEmain/TCEforms for FlexForms:
        - NiceToHave: Attaching an image to the Data Structure. This image is a preview of what the data structure can create. When rolling over the image you can have the form fields highlighted which affects the area. (by a red border or so...)
                - visual: Table with condition in top header, condition value column + block column. Not user supplied. -> OR just a selector box deciding what is shown below!? (possibly "ALL")
        - Displaying partial branch of the data structure (and to a certain level)
-       
+       - FlexForms cannot be possible if the record is not saved? No, should be ok, BUT a data source can of course not be referenced from another field since that fields value is NOT actually there! So only for fixed references to flex form definitions can this be done.
                
 TCEforms:
 - Support for other backend charsets / right-aligned charsets!?
index 2398a2f..e43bec8 100644 (file)
@@ -349,11 +349,14 @@ class t3lib_parsehtml {
         * Returns the NAME of the first tag in $str
         * 
         * @param       string          HTML tag (The element name MUST be separated from the attributes by a space character! Just *whitespace* will not do)
+        * @param       boolean         If set, then the tag is NOT converted to uppercase by case is preserved.
         * @return      string          Tag name in upper case
         * @see getFirstTag()
         */
-       function getFirstTagName($str)  {
-               list($tag) = split('[[:space:]]',substr(strtoupper(trim($this->getFirstTag($str))),1,-1), 2);
+       function getFirstTagName($str,$preserveCase=FALSE)      {
+               list($tag) = split('[[:space:]]',substr(trim($this->getFirstTag($str)),1,-1), 2);
+               if (!$preserveCase)     $tag = strtoupper($tag);
+                       
                return trim($tag);
        }
        
diff --git a/t3lib/class.t3lib_syntaxhl.php b/t3lib/class.t3lib_syntaxhl.php
new file mode 100644 (file)
index 0000000..300eb69
--- /dev/null
@@ -0,0 +1,249 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*  
+*  (c) 1999-2003 Kasper Skaarhoj (kasper@typo3.com)
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is 
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+* 
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*  A copy is found in the textfile GPL.txt and important notices to the license 
+*  from the author is found in LICENSE.txt distributed with these scripts.
+*
+* 
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+/** 
+ * Contains a class for various syntax highlighting.
+ *
+ * $Id$
+ *
+ * @author     Kasper Skaarhoj <kasper@typo3.com>
+ */
+/**
+ * [CLASS/FUNCTION INDEX of SCRIPT]
+ *
+ *
+ *
+ *   76: class t3lib_syntaxhl 
+ *  109:     function highLight_DS($str)       
+ *  133:     function getAllTags($str) 
+ *  164:     function splitXMLbyTags($tagList,$str)    
+ *  192:     function markUpRecursively($struct,$parent='',$app='')    
+ *
+ * TOTAL FUNCTIONS: 4
+ * (This index is automatically created/updated by the extension "extdeveval")
+ *
+ */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+require_once(PATH_t3lib.'class.t3lib_parsehtml.php');
+
+
+/**
+ * Syntax Highlighting class.
+ * 
+ * @author     Kasper Skaarhoj <kasper@typo3.com>
+ * @package TYPO3
+ * @subpackage t3lib
+ */
+class t3lib_syntaxhl {
+
+               // Internal, dynamic:
+       var $htmlParse;                 // Parse object.
+       
+               // External, static:
+       var $wrapTags = array(
+               'T3DataStructure' => array('<span style="font-weight: bold;">','</span>'),
+               'type' => array('<span style="font-weight: bold; color: #000080;">','</span>'),
+               'section' => array('<span style="font-weight: bold; color: #000080;">','</span>'),
+               'el' => array('<span style="font-weight: bold; color: #800000;">','</span>'),
+               'meta' => array('<span style="font-weight: bold; color: #800080;">','</span>'),
+               '_unknown' => array('<span style="font-style: italic; color: #666666;">','</span>'),
+
+               '_applicationTag' => array('<span style="font-weight: bold; color: #FF6600;">','</span>'),
+               '_applicationContents' => array('<span style="font-style: italic; color: #C29336;">','</span>'),
+
+               'sheets'  => array('<span style="font-weight: bold; color: #008000;">','</span>'),
+               'parent:sheets' => array('<span style="color: #008000;">','</span>'),
+
+               'ROOT' => array('<span style="font-weight: bold; color: #008080;">','</span>'),
+               'parent:el' => array('<span style="font-weight: bold; color: #008080;">','</span>'),
+
+               'langDisable' => array('<span style="color: #000080;">','</span>'),
+               'langChildren' => array('<span style="color: #000080;">','</span>'),
+       );
+
+       /**
+        * Makes syntax highlighting of a Data Structure, <T3DataStructure>
+        * 
+        * @param       string          Data Structure XML, must be valid since it's parsed.
+        * @return      string          HTML code with highlighted content. Must be wrapped in <PRE> tags
+        */
+       function highLight_DS($str)     {
+               
+                       // Parse DS to verify that it is valid:
+               $DS = t3lib_div::xml2array($str);
+               if (is_array($DS))      {
+                       $completeTagList = array_unique($this->getAllTags($str));       // Complete list of tags in DS
+                       
+                               // Highlighting source:
+                       $this->htmlParse = t3lib_div::makeInstance('t3lib_parsehtml');  // Init parser object
+                       $struct = $this->splitXMLbyTags(implode(',',$completeTagList),$str);    // Split the XML by the found tags, recursively into LARGE array.
+                       $markUp = $this->markUpRecursively($struct);    // Perform color-markup on the parsed content. Markup preserves the LINE formatting of the XML. 
+
+                               // Return content:
+                       return $markUp;
+               } else $error = 'ERROR: The input content failed XML parsing: '.$DS;
+               return $error;
+       }
+       
+       /**
+        * Returning all tag names found in XML/HTML input string
+        * 
+        * @param       string          HTML/XML input
+        * @return      array           Array with all found tags (starttags only)
+        */
+       function getAllTags($str)       {
+       
+                       // Init:
+               $tags = array();
+               $token = md5(microtime());
+               
+                       // Markup all tag names with token.
+               $markUpStr = ereg_replace('<([[:alnum:]_]+)[^>]*>',$token.'\1'.$token,$str);
+               
+                       // Splitting by token:
+               $parts = explode($token,$markUpStr);
+               
+                       // Traversing parts:
+               foreach($parts as $k => $v)     {
+                       if ($k%2)       {
+                               $tags[]=$v;
+                       }
+               }
+               
+                       // Returning tags:
+               return $tags;
+       }
+
+       /**
+        * Splitting the input source by the tags listing in $tagList.
+        * Called recursively.
+        * 
+        * @param       string          Commalist of tags to split source by (into blocks, ALL being block-tags!)
+        * @param       string          Input string.
+        * @return      array           Array with the content arranged hierarchically.
+        */
+       function splitXMLbyTags($tagList,$str)  {
+               $struct = $this->htmlParse->splitIntoBlock($tagList,$str);
+               
+                       // Traverse level:
+               foreach($struct as $k => $v)    {
+                       if ($k%2)       {
+                               $tag = $this->htmlParse->getFirstTag($v);
+                               $tagName = $this->htmlParse->getFirstTagName($tag,TRUE);
+                               $struct[$k] = array(
+                                       'tag' => $tag,
+                                       'tagName' => $tagName,
+                                       'sub' => $this->splitXMLbyTags($tagList,$this->htmlParse->removeFirstAndLastTag($struct[$k]))
+                               );
+                       }
+               }
+               
+               return $struct;
+       }
+
+       /**
+        * Making syntax highlighting of the parsed Data Structure XML.
+        * Called recursively.
+        * 
+        * @param       array           The structure, see splitXMLbyTags()
+        * @param       string          Parent tag.
+        * @param       string          "Application" - used to denote if we are 'inside' a sectionl
+        * @return      string          HTML
+        */
+       function markUpRecursively($struct,$parent='',$app='')  {
+               $output='';
+               foreach($struct as $k => $v)    {
+                       if ($k%2)       {
+                               $nextApp = $app;
+                               $innerWrap = $wrap = array('','');
+                               
+                               switch($app)    {
+                                       case 'TCEforms':
+                                       case 'tx_templavoila':
+                                               $wrap = $this->wrapTags['_applicationContents'];
+                                       break;
+                                       case 'el':
+                                       default:
+                                               if ($parent=='el')      {
+                                                       $wrap = $this->wrapTags['parent:el'];
+                                                       $nextApp = 'el';
+                                               } elseif ($parent=='sheets')    {
+                                                       $wrap = $this->wrapTags['parent:sheets'];
+                                               } else {
+                                                       $wrap = $this->wrapTags[$v['tagName']];
+                                                       $nextApp = '';
+                                               }
+                               
+                                               if (!is_array($wrap))   {
+                                                       $wrap = $this->wrapTags['_unknown'];
+                                               }
+                                               
+                                               if ($app=='el' || $parent=='ROOT')      {
+                                                       switch($v['tagName'])   {
+                                                               case 'TCEforms':
+                                                               case 'tx_templavoila':
+                                                                       $nextApp = $v['tagName'];
+                                                                       $wrap = $this->wrapTags['_applicationTag'];
+                                                                       #$innerWrap = $this->wrapTags['_applicationContents'];
+                                                               break;
+                                                       }
+                                               }
+                                       break;
+                               }
+
+                               $output.=$wrap[0].htmlspecialchars($v['tag']).$wrap[1];
+                               $output.=$innerWrap[0].$this->markUpRecursively($v['sub'],$v['tagName'],$nextApp).$innerWrap[1];
+                               $output.=$wrap[0].htmlspecialchars('</'.$v['tagName'].'>').$wrap[1];
+                       } else {
+                               $output.=htmlspecialchars($v);
+                       }
+               }
+               
+               return $output;
+       }
+}
+
+
+if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_syntaxhl.php']) {
+       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_syntaxhl.php']);
+}
+?>
\ No newline at end of file
index c24a564..85ccebc 100755 (executable)
@@ -421,3 +421,4 @@ PRE.ts-hl .ts-linenum {background-color: #eeeeee;}
 /*
 H2,H3,H4,DIV {border: 1px dotted #666666;}
 */
+