// // OnOutline.msl - アウトラインイベントハンドラのサンプル // $Id: OnOutline.msl,v 1.7 2008/09/11 08:33:06 monnai Exp $ // //【使い方】 // このファイルを Startup.ms からインクルードしてください。C/C++ 言語のアウト // ライン表示をカスタマイズできます。詳しくは、オンラインヘルプのコールバック // 関数 onOutlineProgram( ) を参照してください。 // //【注意】 // カスタマイズできるのは、プログラムのアウトライン表示だけです。文章やHTMLは // 未対応です。 // //【バージョン】 // この拡張スクリプトは、Peggy Series バージョン 4.60β17 以上でお使い下さい。 // Event.onOutlineProgram = function(vw, root) { // アウトライン表示のプログラム解析の表示前に呼び出されるコールバック関数 // どの言語かは、vw から判断する。 var lang = vw.getLanguageID(); if (/\ 0) Outline.traverse(item, func); } func(node); }; global.Outline.sort = function(array) { // アウトライン項目のソート関数。 // 1. まず key、key が無ければ text を使って比較する。 // 2. key や text で勝負が付かないときは行番号で比較する。 array.sort(function (a, b) { return String.stricoll(a.key || a.text, b.key || b.text) || a.line - b.line; }); }; global.Outline.customize_C = function(node) { // C/C++ のアウトライン表示をカスタマイズする。 // #define 専用の入れ物を用意する。 var defines = [ ]; defines.text = "#define"; defines.image = 15; for (var i in node) { var item = node[i]; if (/^#\s*(define|undef)\s+/.test(item.text)) { // #define SYMBOL ... を専用の入れ物に移動させる。 item.text = RegExp.rightContext; defines.push(item); delete node[i]; continue; } // コメントの内容が誤判定の原因になるので予め取り除いておく。 item.text = item.text.replace(/\/\/.*/, ""); // C/C++ の場合は、だいたい (、[、=、;、か行末直前の識別子がアウトラインに // 表示したい名前である可能性が高い。 ただし、関数へのポインタなどは上手く // 処理できない。 //【例】int (*funcptr)(); // ソート用の key が "int" なってしまう。 if (/(~?(\i))\s*([\(\[\=\;]|$)/.test(item.text)) { // 関数 (、配列 [、変数 = ならばソートのためのキーを用意する。 // ソートキーには、ディストラクタの ~ を除外している。 item.key = RegExp.$2; // ★以下の行のコメントを外すと表示も名前だけになる。 //item.text = RegExp.$1; // ★型の部分を覗いた名前と引数を表示するには以下のコメントを外す。 item.text = RegExp.lastMatch # RegExp.rightContext; // ★その他、表示する文字列を任意に加工して item.text へ代入してもよい。 //item.text = ... } } // ソートする。★ソートしたくない場合は、以下の行をコメントアウト。 Outline.sort(node); // #define があった場合は、ソートして配列の先頭に挿入する。 if (defines.length > 0) { Outline.sort(defines); node.splice(0, 0, defines); } };