先日のエントリ、WordPressでシンタックスハイライトを適用するで、
プログラムコードに色付けを行うシンタックスハイライトのプラグインを加えました。
それでまぁ、なかなか重宝してまして調子に乗ってプログラムを掲載していたわけですが・・・ふと思いました。
行番号の開始番号って指定できないの?
行番号は 1 からになるのですが、何か既存のコードを修正するようなケースでは、途中の行番号から開始したいなと思いまして。
そんな機能くらいデフォルトで搭載されてるっしょ!
と、あまり深く考えずにgoogleしたのが泥沼への一歩だったみたいです。。。
色んなキーワードで検索しても、探せど探せど見つからない。
なんとかかんとか辿りついたのが、 firstline[10] とかって記述すればいいらしいって・・・それどこに書くの?
code=’php firstline[10]’
とか
code=’php firstline:10′
とか
code=’php firstline=10′
とか
code=’php’ firstline[10]
とかとか、まぁ思いつく限り試してみましたよ。
けど、なにも変わらない。ってか、変な記述にするから、SyntaxHighlighterそのものが効かなくなるし。そもそも、気になってたのは、firstline[10] って見つけた記事は、実は私が使っているSyntaxHighlighterとは別種のものだってことなんだけど。
で、初心に戻ってまたgoogleさんで検索検索。
だから初心にってそれが泥沼への一歩なのに。。。
相変わらず、探せど探せど解決策は見つからず。。。
ふと思った。ソース見ればいいじゃん!!
そう、最初からソース見てれば良かったんだ。
で、見る。(/wp-content/plugins/syntaxhighlighter/syntaxhighlighter.php)
とりあえず、firstline で検索かけてみる。見つからず。
firstでやっても、lineでやっても見つからず。。
あれ?違うの?
うーむ。行き詰った。
あっ、実際に整形しているのは、javascript側なんだから、そっち見ればいいか。
で、見る。(/wp-content/plugins/syntaxhighlighter/files/shCore.js)
javascriptのファイルはたくさんあるけど、この名前(shCore.js)が一番怪しい。
とりあえず、olタグらしき変数を探して、start=10 とかって付けてみる。
(<ol start=10> の start を ol変数に付ける)
ファイルを更新して、ブラウザで確認。
そして、何も変わらず。
あれ?
start で検索をかけてみる。
this.ol.start=this.firstLine;
こんな記述を発見!!
おーー!これぞ探し求めていた【firstLine】
ちなみに、上で start=10 が効かなかったのは、後の処理のこっち側で再度初期化されてたから。
とりあえず、
this.ol.start=10;
こんなふうに書き換えてブラウザで確認。
やっぱり!! 行番号が10から始まってる!!
今書き換えたところは元に戻しておく。
で、ここまで分かればこっちのものさ!
this.firstLine がどの場所で指定されているか特定。
どうやら、<pre>のclassらしいってことまでは分かった。
そして再び、syntaxhighlighter.php
class で検索。
class 発見!
<pre>
こんなふうに、 firstline[10] を書き加えてみる。
そしてブラウザで確認。
おーー!!おーー!!変わった。行番号が10から始まってる!!!
これで、shCore.js は何も悪くないってことが確定した。
すべての原因は、syntaxhighlighter.php おまえかー!
で、どうして、firstlineを認識してくれないのか考える。
function GetBBCode()
これの中で正規表現を使ってるのが怪しい。
GetBBCode()でやっていることは、SyntaxHighlighterで変換するべき文字が投稿内容に含まれているか調べて、必要なキーワードを変数に入れること。
ようは、投稿内容に[code=’XXX’]…[/code] が含まれているかチェックしてるわけ。
XXXには、phpとかhtmlとかjsとかcssなどなど色付けしたいコードの言語名が入る。
で、問題なのが、XXXに入れることができるのは、きっちり言語名だけってこと。
firstlineが入る余地なんてない。
これ以外の書き方や余計な文字が入ってたら、認識されない。
だから、firstlineをいれると、[code=’XXX’]という正規の形じゃなくなって、シンタックスハイライトが効かなくなる。
ダメじゃん。。
ってことで、firstline が認識するように書き換える。
その他いろいろ、書き換える。
で、更新して、投稿してみる。
でけた!!
ふぅ長かった。
ということで、以下、修正コードを掲載いたします。
次のファイルを編集します。
/wp-content/plugins/syntaxhighlighter/syntaxhighlighter.php
※下記コードの行番号は、追加するコードを追加したあとの行番号になります。
var $kses_filters = array();
var $widget_format_to_edit = false;
var $match_code = 8;
var $match_lang = 4;
var $match_opt = 5;
31, 32行目は元々記述されているので、その下に、34, 35, 36行目を加える。
varってのが気になる。privateじゃないの?
下位互換? PHP4ってprivateじゃダメだったっけ? PHP4は長いこと触ってないので曖昧。
なので、既存コードに合わせて var で宣言。
本当は、const で定数にしたいところだけど、constはPHP5からなのでやっぱりvarで宣言。
if ( $addslashes ) $regex .= '\\';
$regex .= '((:(first[[0-9]+]))*)';
$regex .= '3](.*?)[/1e]/si';
141, 145行目は元々記述されているので、間に 143行目を加える。
firstlineじゃなくfirstにした。長いと書くの面倒なので。
[code=’php:first[10]’]
投稿するときには、こんなふうに書く。
極端な話、’php:f[10]’ でも、 ‘php f=10’ でも、自分の好きなように正規表現(143行目)を書き換えてしまえばいい。
$language = strtolower( $match[4] );
$opt = $match[$this->match_opt];
$opt = str_replace("first[", "firstline[", $opt);
$content = str_replace( $match[0], '<pre>n" . htmlspecialchars( $match[$this->match_code], ENT_QUOTES ) . "n</pre>", $content );
$this->jsfiles2load[$this->languages[$language]] = TRUE;
301, 307行目は元々あるコード。
303, 304行目を加える。
305行目は、元々あるコードを少し変更する。
上で、firstと省略してしまったので、304行目で firstline に戻す必要がある。
別に、shCore.js側で、firstlieをfirstにしてしまえばいいんだけど、shCore.jsは触りたくない。
他人のコードだから修正箇所は最小限にしておかないと、バージョンアップがあると大変だし。
ファイルの修正はここまで。後は、ファイルをアップロードして確認。
※ 参考にしたページはあるけど既に(TOPページごと)削除されていて、実際に参考にしたのはそのページのGoogleのキャッシュです。なぜ削除されたのか分かりませんが、理由があってのことだと思いますので、参考サイトへのリンクは控えさせて頂きます。