125 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			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);
 | |
| 	}
 | |
| }
 |