1
0
www.mikescher.com/framework/web/widgets/CTextHighlighter.php

125 lines
4.0 KiB
PHP

<?php
/**
* CTextHighlighter class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright 2008-2013 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
require_once(Yii::getPathOfAlias('system.vendors.TextHighlighter.Text.Highlighter').'.php');
require_once(Yii::getPathOfAlias('system.vendors.TextHighlighter.Text.Highlighter.Renderer.Html').'.php');
/**
* CTextHighlighter does syntax highlighting for its body content.
*
* The language of the syntax to be applied is specified via {@link language} property.
* Currently, CTextHighlighter supports the following languages:
* ABAP, CPP, CSS, DIFF, DTD, HTML, JAVA, JAVASCRIPT, MYSQL, PERL,
* PHP, PYTHON, RUBY, SQL, XML. By setting {@link showLineNumbers}
* to true, the highlighted result may be shown with line numbers.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @package system.web.widgets
* @since 1.0
*/
class CTextHighlighter extends COutputProcessor
{
/**
* @var string the language whose syntax is to be used for highlighting.
* Valid values are those file names (without suffix) that are contained
* in 'vendors/TextHighlighter/Text/Highlighter'. Currently, the following
* languages are supported:
* ABAP, CPP, CSS, DIFF, DTD, HTML, JAVA, JAVASCRIPT,
* MYSQL, PERL, PHP, PYTHON, RUBY, SQL, XML
* If a language is not supported, it will be displayed as plain text.
* Language names are case-insensitive.
*/
public $language;
/**
* @var boolean whether to show line numbers in the highlighted result. Defaults to false.
* @see lineNumberStyle
*/
public $showLineNumbers=false;
/**
* @var string the style of line number display. It can be either 'list' or 'table'. Defaults to 'list'.
* @see showLineNumbers
*/
public $lineNumberStyle='list';
/**
* @var integer tab size. Defaults to 4.
*/
public $tabSize=4;
/**
* @var mixed the CSS file used for the widget. Defaults to null, meaning
* using the default CSS file included together with the widget.
* If false, no CSS file will be used. Otherwise, the specified CSS file
* will be included when using this widget.
*/
public $cssFile;
/**
* @var array the HTML attributes to be applied to the container element.
* The highlighted content is contained in a DIV element.
*/
public $containerOptions=array();
/**
* Processes the captured output.
* This method highlights the output according to the syntax of the specified {@link language}.
* @param string $output the captured output to be processed
*/
public function processOutput($output)
{
$output=$this->highlight($output);
parent::processOutput($output);
}
/**
* Highlights the content by the syntax of the specified language.
* @param string $content the content to be highlighted.
* @return string the highlighted content
*/
public function highlight($content)
{
$this->registerClientScript();
$options['use_language']=true;
$options['tabsize']=$this->tabSize;
if($this->showLineNumbers)
$options['numbers']=($this->lineNumberStyle==='list')?HL_NUMBERS_LI:HL_NUMBERS_TABLE;
$highlighter=empty($this->language)?false:Text_Highlighter::factory($this->language);
if($highlighter===false)
$o='<pre>'.CHtml::encode($content).'</pre>';
else
{
$highlighter->setRenderer(new Text_Highlighter_Renderer_Html($options));
$o=preg_replace('/<span\s+[^>]*>(\s*)<\/span>/','\1',$highlighter->highlight($content));
}
return CHtml::tag('div',$this->containerOptions,$o);
}
/**
* Registers the needed CSS and JavaScript.
*/
public function registerClientScript()
{
if($this->cssFile!==false)
self::registerCssFile($this->cssFile);
}
/**
* Registers the needed CSS file.
* @param string $url the CSS URL. If null, a default CSS URL will be used.
*/
public static function registerCssFile($url=null)
{
if($url===null)
$url=CHtml::asset(Yii::getPathOfAlias('system.vendors.TextHighlighter.highlight').'.css');
Yii::app()->getClientScript()->registerCssFile($url);
}
}