Text_Highlighter 0.7.1 (beta)
当サイトではPHPソースをテーブル内に入れて表示していますが、ぶっちゃけ見難いです。
他所のブログではソースに命令毎に色を付けたりハイライトしたりしているところがありますが、そういうことを自動で行ってくれるライブラリが存在します。
Text_Highlighterは、PHPだけでなくC++やPerlやRuby等の他言語、そしてHTMLやCSS、Javascript等にも対応しています。
例によってダウンロード後pear/Textフォルダに移動。
このText_Highlighter、pear/Text直下にHighlighter.phpとその他のxmlファイル等を置いて、Highlighterフォルダ内に各phpファイルを設置するという前提で書かれているようです。
個人的に美しくないので却下したいところですが、Highlighterフォルダ内の全ファイルを書き直さなければいけないようで面倒なのでやめました。
いつものようにとりあえずラッパクラス。
highlighter.class.php
<?php //初期設定 define('PEAR_DIR',$_SERVER['DOCUMENT_ROOT'].'/src/php/pear/'); ini_set('include_path',PEAR_DIR.PATH_SEPARATOR.ini_get('include_path')); require_once(PEAR_DIR.'Text/Highlighter.php'); class pearHighLightModel { //メンバ変数 private $highlight = ''; private $language = 'PHP'; private $renderer = 'Html'; private $numbers = FALSE ; //コンストラクタ public function __construct(){ $this->_makeHighlighter(); } //ハイライトして返す public function highlight($str){ return $this->highlight->highlight($str); } //言語を変更 public function setLang($language){ $this->language=$language; $this->_makeHighlighter(); } //レンダリング変更 public function setRenderer($renderer){ $this->renderer=$renderer; $this->_makeHighlighter(); } //表示形式を変更 public function setNumbers($numbers){ $this->numbers=$numbers; $this->_makeHighlighter(); } //オブジェクト作る private function _makeHighlighter(){ require_once('Text/Highlighter/Renderer/'.$this->renderer.'.php'); $renderclass='Text_Highlighter_Renderer_'.$this->renderer; $this->highlight = Text_Highlighter::factory($this->language); $this->highlight->setRenderer(new $renderclass(array('numbers'=>$this->numbers))); } #↓クラスのおわり } |
factoryに引き渡すのが表示させたい内容の形式、setRendererで渡すのが表示する形式です。
混乱しがちですので注意しましょう。
レンダリング方法はHTML形式が基本ですが、XMLやJSON等の形式にで出力することもできます。
ただ、その場合は何故か対応するレンダリングの設定ファイルをText_Highlighter側でincludeしてくれないので、手動でincludeしてやる必要があります。
デフォルトのHtml形式だけは自力でincludeしてるのに。
setNumbersの引数には、Highlighter.phpで定義されている定数を入れます。
現在、HL_NUMBERS_LI、HL_NUMBERS_TABLE、HL_INFINITY、FALSEが指定でき、それぞれ行番号を表示したりしなかったりというHTMLの出力形式に対応します。
レンダリング方法はsetRendererで変更できるのですが、最初はPHPのソースを表示させて次にJavaScriptのソースを表示したい、等という場合に変更する方法が何気にありません。
使用する側で別々にnewすればいいだけではありますが、とりあえずsetLangを作って毎回クラスを新規作成することにしました。
例によってエラー処理等を全然行っていないので、存在しない引数を渡したりするとエラーになります。
さて、実際に表示してみます。
highlighter.php
<?php #初期設定 header("Content-type: text/html; charset=utf-8"); require_once('./highlight.class.php'); $highlight = new pearHighLightModel(); #適当に取得 $str='array_pop($array);SELECT * FROM some_table WHERE id = 12'; $ret[]=$highlight->highlight($str); $highlight->setLang('SQL'); $highlight->setRenderer('XML'); $ret[]=$highlight->highlight($str); $highlight->setLang('Html'); $highlight->setRenderer('Html'); $highlight->setNumbers(HL_NUMBERS_TABLE); $ret[]=$highlight->highlight($str); #表示 foreach($ret as $val){ print(htmlspecialchars($val).'<hr>'); } |
<div class="hl-main"><pre><span class="hl-code">array_pop($array);SELECT * FROM some_table WHERE id = 12</span></pre></div> -------------------------------------------------------------------------------- <array> <XML_Serializer_Tag> <identifier>array_pop</identifier> </XML_Serializer_Tag> <XML_Serializer_Tag> <brackets>(</brackets> </XML_Serializer_Tag> <XML_Serializer_Tag> <code>$</code> </XML_Serializer_Tag> <XML_Serializer_Tag> <reserved>array</reserved> </XML_Serializer_Tag> <XML_Serializer_Tag> <brackets>)</brackets> </XML_Serializer_Tag> <XML_Serializer_Tag> <code>;</code> </XML_Serializer_Tag> <XML_Serializer_Tag> <reserved>SELECT</reserved> </XML_Serializer_Tag> <XML_Serializer_Tag> <code> * </code> </XML_Serializer_Tag> <XML_Serializer_Tag> <reserved>FROM</reserved> </XML_Serializer_Tag> <XML_Serializer_Tag> <code> </code> </XML_Serializer_Tag> <XML_Serializer_Tag> <identifier>some_table</identifier> </XML_Serializer_Tag> <XML_Serializer_Tag> <code> </code> </XML_Serializer_Tag> <XML_Serializer_Tag> <reserved>WHERE</reserved> </XML_Serializer_Tag> <XML_Serializer_Tag> <code> </code> </XML_Serializer_Tag> <XML_Serializer_Tag> <identifier>id</identifier> </XML_Serializer_Tag> <XML_Serializer_Tag> <code> = </code> </XML_Serializer_Tag> <XML_Serializer_Tag> <number>12</number> </XML_Serializer_Tag> </array> -------------------------------------------------------------------------------- <div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1 </pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">array_pop($array);SELECT * FROM some_table WHERE id = 12</span></pre></td></tr></table></div> |
このようにタグがついた上で出力されます。
あとは適当にcssで飾り付けましょう。
何気にPHPにはhighlight_stringという命令があるのですが、気にしたら負けです。
http://php.benscom.com/manual/ja/function.highlight-string.php