Commit b219eb8b authored by Kasper Skårhøj's avatar Kasper Skårhøj
Browse files

Added syntax highlighting class


git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@113 709f56b5-9817-0410-a4d7-c38de5d9e867
parent 25af6e8d
......@@ -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!?
......
......@@ -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);
}
......
<?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
......@@ -421,3 +421,4 @@ PRE.ts-hl .ts-linenum {background-color: #eeeeee;}
/*
H2,H3,H4,DIV {border: 1px dotted #666666;}
*/
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment