[▲前のスレッド]

2008/10/16 (木) 13:21:12  
[446] タブ区切りテキストの桁そろえ

タブ区切り(TSV)テキストを桁そろえするマクロです。
JavaScriptで書いていますので拡張子 .js で保存してください。

ごく単純な方法でやっていますので速度は期待できませんし、
コメントにも記載しているようにエスケープされたフィールドは正しく処理できません。

右詰めにしたい場合は桁そろえ部分の出力順を入れ替えればOKです

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// TSVで記載されたテキストの桁そろえを行います。
// 対象となる文字列を選択してマクロを実行してください
//
// 注意
// ・ダブルクォートなどで囲んでタブをエスケープしたフィールドには対応していません。
// ・同様に改行を含むフィールドにも対応していません。


// 設定ぽいもの
var        FIELD_SPLITTER        = "\t";                        // 行内のフィールドを区切る文字列
//var        FIELD_SPLITTER        = new RegExp( "\s+", "g" );                        // もしくは正規表現オブジェクト(こちらの形式を使うと、空のフィールドは詰められます)
var        FIELD_SEPARATOR        = " ";                        // 整形する際に、フィールド間に入れる文字列
var        EOL                                = "\r\n";                // 改行コード

// C言語風に。。。
Main();

function Main()
{
        // 選択状態をチェック
        if( !Editor.IsTextSelected() ){
                // 未選択なら何もしない
                return;
        }
 
        // 選択文字列の取得
        var        selectedStr                = Editor.GetSelectedString( 0 );
 
        // 選択文字列を改行で分割
        var        splitedLines        = selectedStr.split( /[\r\n]+/g );
 
        // 各行のフィールド分割とフィールド毎の最大文字数算出
        var        lineFields = new Array();
        var        fieldSize  = new Array();
        var lineCnt;
        var fldCnt;
        for( lineCnt = 0; lineCnt < splitedLines.length; lineCnt++ ){
                // 行をフィールドに分割
                // ※ Microsoft JScriptの仕様により、正規表現オブジェクトを利用して分割した場合は空のフィールドが削除された分割結果となるようです
                lineFields[lineCnt] = splitedLines[lineCnt].split( FIELD_SPLITTER );

                // 各フィールドの最大文字数算出
                for( fldCnt = 0; fldCnt < lineFields[lineCnt].length; fldCnt++ ){
                        var        fieldWidth = GetStrWidth( lineFields[lineCnt][fldCnt] );
                        if( !fieldSize[fldCnt]                                        // このフィールドの最大幅がまだ保持されてない
                         || (fieldSize[fldCnt] < fieldWidth) ){        // 保持している最大幅より大きい今回のフィールド幅が大きい
                                fieldSize[fldCnt]  = fieldWidth;
                        }
                }
        }
        // 桁をそろえた文字列として結合する
        var        formattedStr = "";
        for( lineCnt = 0; lineCnt < splitedLines.length; lineCnt++ ){
                for( fldCnt = 0; fldCnt < lineFields[lineCnt].length; fldCnt++ ){
 
                        // 右詰めとするには、フィールド追加とスペース埋めの順を逆にすればOK
 
                        // フィールド文字列結合
                        formattedStr += lineFields[lineCnt][fldCnt];
 
                        // 最大フィールドサイズとの差数分の半角空白を追加
                        var spaceNum = fieldSize[fldCnt] - GetStrWidth( lineFields[lineCnt][fldCnt] );
                        for( var cnt = 0; cnt < spaceNum; cnt++ ){
                                formattedStr += " ";
                        }
 
                        // フィールドを区切り文字列の追加
                        formattedStr += FIELD_SEPARATOR;
                }
                formattedStr += EOL;
        }
 
        // エディタに書き戻す
        Editor.InsText( formattedStr );
}

// 半角を 1 ,全角を 2 とカウントした文字列の幅を取得する
function GetStrWidth( str )
{
        // 半角文字を削除
        var        delHalfWidth = str.replace( /[\u0001-\u00FF]/g, "" );
 
        // 文字列の幅(?) = (残った全角文字の数 * 2) + (消えた半角文字の数)
        var        strWidth = (delHalfWidth.length * 2) + (str.length - delHalfWidth.length);
 
        return strWidth;
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

ぜっと
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81