シンタックスハイライト(prettifier)を実装

このブログソースコードが以下の点で凄く見難かった。

1.phpのnl2br関数を使っているので、preタグの中でも改行されてしまう。
2.全て同じ色

で、素直にはてな日記とかで書こうかなと思ったんだけど、そういうのを解決していくのが勉強かなと思い留まり、頑張って実装してみた。

まずは、1つめの改行問題について。
smartyで独自の修飾子で解決できないかなと考え、いろんなところからソース探してきてこんなものが出来た。
参考サイト:No Such Blog or Diary - Nucleus の改行をちょっと頭よくする
function smarty_modifier_mynl2br($value)
{
    $i=0;
    $v2="";
    $n=mb_strlen($value);
    while($i<$n){
        $p=mb_strpos($value,"&lt;pre",$i);
        if($p==FALSE){
            $v2.=nl2br(mb_substr($value, $i));
            break;
        }
        $v2.=nl2br(mb_substr($value, $i,$p-$i));
        $i=$p;
        $p=mb_strpos($value,"&lt;/pre&gt;",$i);

        // 1つも無い場合
        if($p==FALSE){
            $v2.=mb_substr($value, $i);
            break;
        }

        $v2.=mb_substr($value, $i,$p-$i);
        $i=$p;
    }
    return $v2;
}
これで一応preタグ間はbrタグ入らないようになった。

続いて2の問題については、いろいろ探したらjavascriptで色つけれる奴があるみたいだった。
一番簡単そうなのが、Javascript code prettifierって奴だったので、以下のサイトを参考に実装。
参考サイト:コードをプリティに整形するjavascript「code prettifier」 : skuare.net

で、DBに格納しているデータそのものにprettifierってclass名をつけるのがなんだか嫌だったので、これまたsmartyの修飾子を作成。
function smarty_modifier_prettyprint($value)
{
    $result = str_replace('&lt;pre', '&lt;pre class="prettyprint"', $value);
    return $result;
}
んで、smartyのテンプレートで2つとも呼んでやればOKってことにした。
キレイキレイ。

コメント

アーカイブ

2012

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2011

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com