◀マクロトップへ
  • 446 タブ区切りテキストの桁そろえ
  • [446] タブ区切りテキストの桁そろえ ぜっと 2008年10月16日 13:21

    タブ区切り(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;
    }
    ------------------------------