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