Brushと呼ばれる言語ごとのハイライトのルールを記述したスクリプトと対応CSSを読み込むことで複数言語に対応しているのだが、ブログの記事ごとにSyntaxHighlighterの設定コードを書き分けると面倒だし、かといって共通部分にSyntaxHighlighterの設定コードを埋め込むなら、ブログで使いそうな全ての言語についてBrushを読み込まなくてはならず、表示速度が遅くなってしまう。
そこでAutoloader機能を使えば、必要なBrushと対応CSSだけを自動的に読み込むことで表示速度を遅くせずに済む。これで記事ごとにSyntaxHighlighterの設定コードを書き分けなくても、共通部分に1つコードを埋め込んでおけばいいってことになる。
ただ、公式ページに掲載されているAutoloader対応スクリプトは、カスタムBrushに対応したコードではない。そこで今回公式にはBrushのないObjective-Cのコードを掲載するにあたり、設定コードを書いてみた。
下記のコードをHTML/Javascriptガジェットとしてタイトル無しでサイドバーの一番下に配置し読み込んで使っている。コード中のObjective-CのカスタムBrushはここからダウンロードして少しだけ色をいじったもの。
<!-- Common Scripts --> <link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css" /> <!--<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />--> <link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeMidnight.css" rel="stylesheet" type="text/css" /> <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script> <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js" type="text/javascript"></script> <script type="text/javascript"> //////////////////////////////////// // Autoloader //////////////////////////////////// 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', 'objc obj-c @shBrushPlain.js', // dummy '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' )); //////////////////////////////////// // Custom Brush Objective-C //////////////////////////////////// /** * SyntaxHighlighter - Objective-C Brush * http://codepirate.seaandco.com/ * * @version * 1.0.0 (February 22 2009) * * @author * Geoffrey Byers * * @copyright * Copyright (C) 2009 Geoffrey Byers. * * Licensed under a GNU Lesser General Public License. * http://creativecommons.org/licenses/LGPL/2.1/ * * Updated From: * Code Syntax Highlighter for Objective-C. * Version 0.0.2 * Copyright (C) 2006 Shin, YoungJin. * http://scottdensmore.typepad.com/blog/2008/12/objective-c-cocoa-syntax-highlighter.html */ SyntaxHighlighter.brushes.ObjC = function() { var datatypes = 'char bool BOOL double float int long short id void'; var keywords = 'IBAction IBOutlet SEL YES NO readwrite readonly nonatomic nil NULL '; keywords += 'super self copy '; keywords += 'break case catch class const copy __finally __exception __try '; keywords += 'const_cast continue private public protected __declspec '; keywords += 'default delete deprecated dllexport dllimport do dynamic_cast '; keywords += 'else enum explicit extern if for friend goto inline '; keywords += 'mutable naked namespace new noinline noreturn nothrow '; keywords += 'register reinterpret_cast return selectany '; keywords += 'sizeof static static_cast struct switch template this '; keywords += 'thread throw true false try typedef typeid typename union '; keywords += 'using uuid virtual volatile whcar_t while'; // keywords += '@property @selector @interface @end @implementation @synthesize '; this.regexList = [ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings { regex: new RegExp('^ *#.*', 'gm'), css: 'variable' }, // preprocessor { regex: new RegExp(this.getKeywords(datatypes), 'gm'), css: 'functions' }, // datatypes { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'functions' }, // keyword { regex: new RegExp('\\bNS\\w+\\b', 'g'), css: 'constants' }, // keyword { regex: new RegExp('\\bUI\\w+\\b', 'g'), css: 'constants' }, // keyword { regex: new RegExp('\\bCG\\w+\\b', 'g'), css: 'constants' }, // keyword { regex: new RegExp('@\\w+\\b', 'g'), css: 'functions' }, // keyword ]; } SyntaxHighlighter.brushes.ObjC.prototype = new SyntaxHighlighter.Highlighter(); SyntaxHighlighter.brushes.ObjC.aliases = ['objc', 'obj-c']; //////////////////////////////////// // Settings and initialize //////////////////////////////////// SyntaxHighlighter.config.bloggerMode = true; SyntaxHighlighter.defaults['toolbar'] = false; //SyntaxHighlighter.defaults['gutter'] = false; SyntaxHighlighter.all(); </script>
ポイントはAutoloaderの設定部分で、ファイルタイプに対応するBrushスクリプトのURLにダミーのURLを設定すること(SyntaxHighlighter.autoloader.applyの部分)。その設定後に、カスタムBrushのコードを追加して上書きしている。
実際の動作サンプルは、昨日の記事の下の方をご覧頂ければ。
参考サイト:
SyntaxHighlighter 3.0 にアップデート - 電脳スピーチ blog
アプリ開発の記録 SyntaxHighlighterでObjective-Cをきれいに表示
※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうそ。
0 件のコメント:
コメントを投稿