コードをいい具合に表示する『SyntaxHighlighter』を導入しました
[2014.1.2追記]
後半で紹介しているCKEditor用プラグインは、baserCMS3同梱のCKEditorでは使えないようです。代わりのプラグインをインストールしてみた記事をまとめました。よろしければご参照ください。
Syntaxhighlighterを活用できるCKEditorプラグイン入れたよ(baserCMS3編)
載せているコンテンツの性格上、ページのところどころにPHPやCSSのコードが出てくる本サイト。少しでも読みやすいものにできればと、別ブログではずいぶん前から導入している『SyntaxHighlighter』を本サイトにも入れてみました。別ブログはWordPressで構築しているのでプラグイン一発でいけるのですが、ここではがんばってイチから入れることになりました。
CDNでの配布もされていて設定がかなりラクチン
『SyntaxHighlighter』は、公式サイトで配布されているZIPファイルをダウンロード→展開して、使用中のテーマディレクトリにインストールするのが本来の使い方です。ところがうまい具合にというかありがたいことに、CDNでの配布もされているので、その方法でさくっとセットアップすることにしました。
(CDNの案内ページにもあるように、フリーとはいいながらも、中の人は月間40ドルをホスティングサーバ〔Amazon S3〕に支払ってるそうです。ぜひ、寄付しましょう)
テンプレートファイルに追記して下準備
まずは、使用中のテーマの layouts/default.php の head セクションに下記のコードを追記します。他のCSSファイルやJavaScriptファイルを読み込んでいる場合は、合わせて記述してください。
<?php $bcBaser->css( 'http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css' ) ?>
<?php $bcBaser->js( array( 'http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js', 'http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' ) ) ?>
マニュアルにもあるように『SyntaxHighlighter』はページ内の pre タグをJavaScriptで検知し、動的にタグを書き換えてスタイルをあてる、という処理を行っています。上記のコードだけではその処理が行われないので、「どの言語が書かれているときに処理するか?」という指示をしてあげる必要があります。
そこで body セクションの終了直前に下記のコードを記述します。baserCMSの場合、テンプレートファイルの body 終了直前には <?php $bcBaser->func() ?> が入るのが定番でしょうから、さらにその直前に挿入するとよいでしょう。
<script type="text/javascript"> function path() { var args = arguments, result = [] ; for(var i = 0; i < args.length; i++) result.push(args[i].replace('@', 'http://alexgorbatchev.com/pub/sh/current/scripts/')); return result }; SyntaxHighlighter.autoloader.apply(null, path( 'applescript @shBrushAppleScript.js', 'actionscript3 as3 @shBrushAS3.js', 'bash shell @shBrushBash.js', 'coldfusion cf @shBrushColdFusion.js', 'cpp c @shBrushCpp.js', 'c# c-sharp csharp @shBrushCSharp.js', 'css @shBrushCss.js', 'delphi pascal @shBrushDelphi.js', 'diff patch pas @shBrushDiff.js', 'erl erlang @shBrushErlang.js', 'groovy @shBrushGroovy.js', 'java @shBrushJava.js', 'jfx javafx @shBrushJavaFX.js', 'js jscript javascript @shBrushJScript.js', 'perl pl @shBrushPerl.js', 'php @shBrushPhp.js', 'text plain @shBrushPlain.js', 'py python @shBrushPython.js', 'ruby rails ror rb @shBrushRuby.js', 'sass scss @shBrushSass.js', 'scala @shBrushScala.js', 'sql @shBrushSql.js', 'vb vbnet @shBrushVb.js', 'xml xhtml xslt html @shBrushXml.js' )); SyntaxHighlighter.all(); </script>
上記のコードは『SyntaxHighlighter』がサポートしているほぼすべての言語に対して処理をする設定ですが、通常はここまで必要ではないでしょうから適宜カットすればオッケイかと思います。
(参考ページ:サポートしている言語と書式の一覧)
以上の設定で、記事本文に書かれたコードをいい感じで表示してくれる下準備が整いました。
pre タグに class 属性を加えてコードを記述
記事本文執筆時には、ソースモードに切り替えて下記のような書式でコードを書きます。
<pre class="brush: php"> <?php echo 'はじめてのSyntaxHighlighter'; ?> </pre>
すると、ページ上にはこのように表示されます(適用する『SyntaxHighlighter』のテーマ〔スキン〕によって表示は異なります)。
<?php echo 'はじめてのSyntaxHighlighter'; ?>
ということで、いい感じでソースを表示してくれるようになりました。
CKEditorのプラグインでさらに入力がラクに
とはいえ、コードの挿入が多い記事になってくると、いちいちソースモードに切り替えて pre タグに class つけて……なんてことはとうていやってられませんよね。どうせならもうちょっとラクしちゃいましょう。
そこで導入するのは、baserCMSの記事編集画面で使われているリッチテキストエディタ『CKEditor』のプラグイン『CKEditor SyntaxHighlighter Plugin』です。これを使うとツールバーに
こんなボタンが現れ、それをクリックすることによって
と、コードをペーストできるフローティングウィンドウを出せるようになります。いやあ、世の中には便利なことを考えてくださる方がいらっしゃるものです。ありがたい。
『CKEditor SyntaxHighlighter Plugin』は、CKEditorのバージョンによって対応するスクリプトが異なるようなので、baserCMSに同梱されている3.x系に対応したものを、Project Hosting on Google Codeの配布ページからダウンロードして展開します。
(参考までに、4.1に対応している『CKEditor SyntaxHighlighter Plugin』はGitHubにあります)
展開がすむとファイル一式の入った ckeditor-syntaxhighlight フォルダができるはずなので、その中の plugins フォルダをまるっと、サーバ上の /app/vendors/js/ckeditor ディレクトリ内にアップロードします。
(js/ckeditor ディレクトリはあらかじめ作っておいてください)
仕上げにbaserCMS同梱の bc_ckeditor.php をカスタマイズ
ここまで来たらあと一息。まずは /baser/views/helpers/bc_ckeditor.php を /app/views/helpers 内にコピーしましょう。
そのうえで、コピーした方(/app/views/helpers/bc_ckeditor.php)を開いて、2ヵ所追記します。まずは97行目あたり。
- 'Smiley', 'Table', 'HorizontalRule', '-'), + 'Smiley', 'Table', 'HorizontalRule', '-', 'Code'),
もう1ヵ所は279行目あたり。
- $jscode .= "CKEDITOR.config.extraPlugins = 'draft';"; + $jscode .= "CKEDITOR.config.extraPlugins = 'draft,syntaxhighlight';";
追記が終わったら、サーバにアップして動作確認してみましょう。うまくいきましたか?
私の場合、ローカル環境ではツールバーに現れてるのにリモートでは出てないという状況になりまして、管理画面の[システム管理]-[サーバーキャッシュ削除]を実行したらなぜか正常に動きました。
以上、『SyntaxHighlighter』導入の手順でした。みなさんハッピーなbaserCMSライフを!