その場で編集/実行できるシンタックスハイライター jQuery プラグイン

Ex Code Prettify は、Google Code Prettify をベースとしたシンタックスハイライトを行う jQuery プラグインです。ソースコードの編集/実行をその場で行う機能や、外部 CSS / JS ファイルの動的インポート機能等を使用して、jsdo.itjsFiddle のようなライブデモ機能を自サイトに実装することができます。

変更履歴

  • v0.5.2(2014-11-17)
    • 外部 css, js ファイルの読み込み指定時、それらファイルが読み込まれた後にコードが実行されるように修正しました。
  • v0.5
    • JavaScript のコード内で 自身のデモエリアを格納した$DEMO、API オブジェクトを格納した API という変数を参照できるようにしました。
    • code / demo を横並びレイアウトで表示した際、画面幅に応じたレスポンシブレイアウトになるようにしました。
  • v0.4
    • IE については IE8 以上に限定されますが、編集したソースコードの localStorage への書き込み、読み出し、削除をできるようにしました。
    • デモ非表示モードの際、無駄に行っていたソースコードのパースを省きました。
    • 確定ボタンクリック時のコールバック処理を指定できるようにしました。
  • v0.3
    • ソースコードの編集/実行機能、他を追加。
  • v0.2
    • IE8以下に対応。

使い方

以下のよう jQuery、Google Code Prettify の JS ファイル、Ex Code Prettify の JS/CSS ファイルを読み込みます。

  1. <link href="jquery.ex-code-prettify.css" type="text/css" rel="stylesheet">
  2. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
  3. <script src="google-code-prettify/prettify.js"></script>
  4. <script src="jquery.ex-code-prettify.js"></script>


TEXTAREA または PRE 要素内にハイライト表示したいソースコードを記述します。

  1. <!-- TEXTAREA Markup -->
  2. <textarea class="code" data-ex-code-prettify-param="{codeType:'html'}">
  3. <div class="container">
  4. <div class="page-header">
  5. <h1>Ex Code Prettify</h1>
  6. </div>
  7. </div>
  8. </textarea>
  9.  
  10. <!-- PRE Markup -->
  11. <pre class="code" data-ex-code-prettify-param="{codeType:'html'}">
  12. &lt;div class="container"&gt;
  13. &lt;div class="page-header"&gt;
  14. &lt;h1&gt;Ex Code Prettify&lt;/h1&gt;
  15. &lt;/div&gt;
  16. &lt;/div&gt;
  17. </pre>

data-ex-code-prettify-param 属性にはプラグイン実行時に適用されるパラメータを記述できます。codeType パラメータにはソースコードの種類(css, html, script, cssFile, jsFile)を指定します。


TEXTAREA または PRE 要素に対し exCodePrettify() メソッドを実行します。

  1. $('.code').exCodePrettify();


通常、ソースコードの記述に Tab を使用しているとスペース8個分と深めのインデントとなってしまいますが、tabToSpace パラメータに true を指定する事でスペース4個分に置換することができます。(スペースの個数は tabToSpaceSize パラメータで変更できます。)

  1. $('.code').exCodePrettify({tabToSpace:true});


Google Code Prettify によりソースコードがハイライト表示されます。

image01

ハイライト表示されたソースコードをそのままコピー&ペーストとすると、IE の場合「改行が反映されず行番号もコピーされてしまう」、Firefox の場合「インデントが反映されない」という問題が起きます。(Chrome の場合は問題有りません。詳細は「Google Code Prettify のかゆいとこをなんとかする jQuery プラグインを書いてみた」をご覧ください。)


ソースコードをコピーする場合は、ヘッダ部に表示された「RAW」リンクをクリックしソースコードをプレーンテキスト形式に表示した後コピーします。

image02

ソースコードを編集/実行する

ソースコードをその場で編集/実行することができます。まず、ソースコードを囲うコンテナ要素を記述し、クラス名を ex-code-prettify とします。

  1. <!-- コンテナ要素 -->
  2. <div class="ex-code-prettify">
  3. <textarea class="code" data-ex-code-prettify-param="{codeType:'html'}">.
  4. <!-- ソースコード -->
  5. </textarea>
  6. </div>


この状態で showDemo パラメータに true を指定し実行すると、ソースコードの実行結果が上部に表示されます。

  1. $('.code').exCodePrettify({showDemo:true});

image03

showCode パラメータに false を指定すると実行結果のみが表示されます。


editCode パラメータに true を指定するとソースコードを編集できるようになります。EDIT リンクで編集状態にし、SAVE リンクをクリックすると変更内容が確定されデモが実行されます。変更内容を取り消す場合は CANCEL リンクをクリックします。

image04


TEXTAREA 内でソースコードを編集する際は、Tab キーによるインデントが可能です(IE8以下は未対応)。また、Behave.js を併用することで [範囲選択 + Shift + Tab] でインデント削除、4 Tab インデント置換、簡易的なコード補完機能が有効になります。
Behave.js を使用する場合はまず、behave.js を読み込みます。

  1. <script src="behave/behave.js"></script>


次に behaveJS パラメータに true を指定します。

  1. $('.code').exCodePrettify({
  2. showDemo : true,
  3. editCode : true,
  4. behaveJS : true
  5. });

レイアウトを変更する

コンテナ要素に特定のクラス名を付与することで、レイアウトを変更することができます。demo-bottom クラスを付与するとデモ領域がソースコードの下に表示されます。

  1. <!-- コンテナ要素 -->
  2. <div class="ex-code-prettify demo-bottom">
  3. <textarea class="code" data-ex-code-prettify-param="{codeType:'html'}">.
  4. <!-- ソースコード -->
  5. </textarea>
  6. </div>

image05


demo-right で右側に表示されます。(window幅が 768px 以上の場合のみ)

image06


demo-left で左側に表示されます。(window幅が 768px 以上の場合のみ)

image07

複数のソースコードを1つのデモとして実行する

同一コンテナ内に複数のソースコード記述した場合、それぞれの実行結果は1つのデモ領域に対し適用されます。

  1. <div class="ex-code-prettify demo-right">
  2. <textarea data-ex-code-prettify-param="{codeType:'css'}">...
  3. <textarea data-ex-code-prettify-param="{codeType:'html'}">...
  4. <textarea data-ex-code-prettify-param="{codeType:'script'}">...
  5. </div>

image08

この例の場合、JavaScript によるエフェクト処理がいきなり始まってしまうので、ユーザの任意のタイミングで実行できるようにしてみます。


まず JavaScript の autoRun パラメータに false を指定し、デモの自動実行を抑止します。

  1. <textarea data-ex-code-prettify-param="{codeType:'script', autoRun:false}">...


次にユーザが任意のタイミングでデモの実行/リセットができるように showRunButton/showResetButton パラメータに true を指定します。

  1. $('.code').exCodePrettify({
  2. showRunButton : true,
  3. showResetButton : true,
  4. showDemo : true,
  5. editCode : true
  6. });


RUN / RESET リンクが表示され、任意のタイミングでデモの実行/リセットができるようになります。

image09

外部ファイルを読み込む

codeType パラメータに cssFile , jsFile を指定し、対象ファイルの絶対パス又は相対パスを記述すれば *.css , *.js ファイルを動的に読み込むことができます。

  1. <textarea data-ex-code-prettify-param="{codeType:'cssFile'}">
  2. jquery.ex-inplace-editor/jquery.ex-inplace-editor.css
  3. </textarea>
  4.  
  5. <textarea data-ex-code-prettify-param="{codeType:'jsFile'}">
  6. jquery.ex-inplace-editor/jquery.ex-inplace-editor.js
  7. </textarea>

一つの TEXTAREA に対し改行区切りで複数のファイルを記述することができます。


以下例では in-place-editor(値をその場で編集する機能)の jQuery プラグインを動的に読み込み実行しています。

image10

独自のデザインにする

デモ領域には demo-area クラス、実行ボタンには run-button クラス、リセットボタンには reset-button クラスを付与しておき、コンテナ要素に ex-code-prettify クラス以外のクラス名を付与しておけば、独自のデザインで表示することができます。

例えば、Bootstrap3 を読み込んでおき以下のよう記述すれば、JavaScript の表示領域のみ広くとったレスポンシブなレイアウトとして表示することができます。

  1. <style>
  2. div.demo-contents .row > *{
  3. margin-bottom:8px;
  4. }
  5. div.demo-contents div.demo-area{
  6. padding:8px;
  7. border:solid 1px #eee;
  8. }
  9. </style>
  10. <div class="demo-contents">
  11. <div class="row">
  12. <div class="col-md-12">
  13. <button type="button" class="run-button btn btn-success">RUN</button>
  14. <button type="button" class="reset-button btn btn-default">RESET</button>
  15. </div>
  16. </div>
  17. <div class="row">
  18. <div class="col-md-12">
  19. <div class="demo-area"></div>
  20. </div>
  21. </div>
  22. <div class="row">
  23. <div class="col-md-6">
  24. <textarea class="code" data-ex-code-prettify-param="{codeType:'css'}"></textarea>
  25. </div>
  26. <div class="col-md-6">
  27. <textarea class="code" data-ex-code-prettify-param="{codeType:'html'}"></textarea>
  28. </div>
  29. </div>
  30. <div class="row">
  31. <div class="col-md-12">
  32. <textarea class="code" data-ex-code-prettify-param="{codeType:'script',autoRun:false}"></textarea>
  33. </div>
  34. </div>
  35. </div>


container パラメータにはコンテナ要素を指定します。

  1. $('textarea.code').exCodePrettify({
  2. container : 'div.demo-contents',
  3. showDemo : true,
  4. editCode : true,
  5. behaveJS : true
  6. });

image11

編集したソースコードを localStorage に保存する

IE については IE8 以上に限定されますが、以下パラメータの指定で編集したソースコードの localStorage への書き込み、読み出し、削除ができます。

  • autoSaveToStorage
    • true を指定すると SAVE リンクをクリックしたタイミングで、ソースコードが localStorage に保存されます。
  • autoLoadFromStorage
    • true を指定するとページ読み込み時、localStorage に保存されたソースコードが自動で読み込まれます。
  • clearStorage
    • true を指定するとページ読み込み時、localStorage に保存されたソースコードを削除します。
  • savePrefix
    • local storage 保存キーのプレフィックスを指定します。

また、API オブジェクトを経由し以下メソッドを実行することで、任意のタイミングで上記と同様の処理をすることもできます。

  1. // local storage 保存コードの削除
  2. clearStorage: function(prefix){
  3.  
  4. // コードの local storage への保存
  5. saveCodeToStorage : function(prefix){
  6.  
  7. // local storage 保存コードの取得
  8. getCodeFromStorage : function(prefix){
  9.  
  10. // local storage 保存コードのロード
  11. loadCodeFromStorage : function(prefix){

以下例では、localStorage への保存、読み出しを自動で行い、自前で用意したリセットリンクをクリック時に、clearStorage() メソッドを使用し保存したソースコードを削除しています。

  1. var api = $('.code').exCodePrettify({
  2. api : true,
  3. autoSaveToStorage : true,
  4. autoLoadFromStorage : true,
  5. savePrefix : 'demo',
  6. showDemo : true,
  7. editCode : true
  8. });
  9. $('a.code-reset').on('click', function(){
  10. api.clearStorage();
  11. location.reload();
  12. return false;
  13. });

demo13

$DEMO で自身のデモエリアを参照する

1つのページに複数のデモエリアがある場合、自身のデモエリアの要素を取得するようにする配慮が必要です。

demo1

$DEMO.find( element ) と記述することで自身のデモエリアの要素を参照できるようになります。(グローバル空間は汚染されてません)

demo2

API を参照する

API という変数名で API オブジェクトを参照することができます。(グローバル空間は汚染されてません)

  1. //自身のコードを取得
  2. var code = API.getCode();
  3.  
  4. //デモエリアに pre を生成
  5. var pre = $DEMO.html('<pre/>').find('pre');
  6.  
  7. //pre にコードをセットし fade で表示
  8. pre.text(code).hide().fadeIn(3000, function(){
  9.  
  10. // fade が完了したらデモを再実行
  11. API.runDemo();
  12. });

パラメータ

プラグイン実行時、下記パラメータを指定できます。

  1. defaults : {
  2. api : false, // true の場合 api オブジェクトを返す。
  3. prettyClass : 'linenums', // linenums を指定すると行番号が表示される。
  4. title : '', // コードのヘッダタイトルを指定。
  5. codeTypeTitle : { // title パラメータ未指定時に設定されるコードのヘッsダタイトル。
  6. css : 'CSS',
  7. html : 'HTML',
  8. script : 'JavaScript',
  9. jsFile : 'JS File',
  10. cssFile : 'CSS File'
  11. },
  12. editCode : false, // true でコードの編集が可能になる。
  13. tabIndent : true, // true でコード編集時 Tab キーによるインデントが可能になる。
  14. tabToSpace : false, // true で Google Code Prettify によるコード表示時、Tab をスペースに置換する。
  15. tabToSpaceSize: 4, // tabToSpace が true 時に置換するスペースの数を指定。
  16.  
  17. behaveJS : false, // true で Behave.js を有効にする。
  18. behaveJSParam : { // Behave.js の初期パラメータ。
  19. textarea: null,
  20. replaceTab: true,
  21. softTabs: true,
  22. tabSize: 4,
  23. autoOpen: true,
  24. overwrite: true,
  25. autoStrip: true,
  26. autoIndent: true,
  27. fence: false
  28. },
  29.  
  30. codeType : '', // "css","html","script","jsFile","cssFile" のいずれかを指定。
  31. autoRun : true, // true でデモを自動実行する。
  32. container : '.ex-code-prettify', // デモ、コードのコンテナ要素のセレクタを指定。
  33. codeArea : 'div.code-area', // コードの出力先要素のセレクタを指定。
  34. demoArea : 'div.demo-area', // デモの出力先要素のセレクタを指定。
  35. editLabel : 'EDIT', // 編集ボタンのラベル。
  36. saveLabel : 'SAVE', // 編集内容の確定ボタンのラベル。
  37. cancelLabel : 'CANCEL', // 編集内容の取り消しボタンのラベル。
  38. rawLabel : 'RAW', // プレーン表示モードボタンのラベル。
  39. backLabel : 'BACK', // プレーン表示モードから戻るボタンのラベル。
  40. demoLabel : 'DEMO', // デモコンテンツのタイトルラベル。
  41. showRunButton : false, // true でデモ実行ボタンが表示される。
  42. runButton : '.run-button', // デモ実行ボタンのセレクタを指定。
  43. runLabel : 'RUN', // デモ実行ボタンのラベル。
  44. showResetButton : false, // true でデモリセットボタンが表示される。
  45. resetButton : '.reset-button', // デモリセットボタンのセレクタを指定。
  46. resetLabel : 'RESET', // デモリセットボタンのラベル。
  47. adjustEditorHeight : true, // true で編集モード時のテキストエリアの高さを自動調整する。
  48. showCode : true, // true でコードを表示する。
  49. showDemo : false, // true でデモを表示する。
  50. autoSaveToStorage : false, // true でコードを local storage に自動保存する。
  51. autoLoadFromStorage : false, // true で local storage 保存コードの自動ロードする。
  52. clearStorage : false, // true で local storage 保存コードの自動削除する。
  53. savePrefix : '', // local storage 保存キーのプレフィックスを指定。
  54. onSave : function(api){} // 確定ボタンクリック時のコールバック処理を指定。
  55. },

API

API オブジェクトを使用し、下記メソッドを実行できます。

  1. // config の取得
  2. getConfig : function(){
  3.  
  4. // json 形式の独自データ属性 の取得
  5. getJsonData : function(target,name){
  6.  
  7. // 特定パラメータの取得
  8. getParam : function(name){
  9.  
  10. // プラグイン適用オブジェクトの取得
  11. getTarget : function(){
  12.  
  13. // 編集モードへの切り替え
  14. editMode : function(){
  15.  
  16. // 表示モードへの切り替え
  17. viewMode : function(){
  18.  
  19. // デモの実行
  20. runDemo : function(){
  21.  
  22. // デモのリセット
  23. resetDemo : function(){
  24.  
  25. // コード種別の取得
  26. getCodeType : function(){
  27.  
  28. // コードの取得
  29. getCode : function(){
  30.  
  31. // 全てのコードの取得(json形式)
  32. getAllCode : function(){
  33.  
  34. // local storage 保存コードの削除
  35. clearStorage: function(prefix){
  36.  
  37. // コードの local storage への保存
  38. saveCodeToStorage : function(prefix){
  39.  
  40. // local storage 保存コードの取得
  41. getCodeFromStorage : function(prefix){
  42.  
  43. // local storage 保存コードのロード
  44. loadCodeFromStorage : function(prefix){

API オブジェクトの取得方法

API オブジェクトは以下の方法で取得することができます。


data() メソッドで取得

  1. var api = $(target).exCodePrettify().data($.ex.codePrettify.id);


API パラメータを指定して取得

  1. var api = $(target).exCodePrettify({api:true});

ダウンロード

MIT ライセンスです。こちらからどうぞ。