404 motivation not found | t_ishidaのブログ

12月/07

3

行ぞろえマクロ

前置き

小物過ぎて別ファイルにして、

サーバーにアップするほどじゃないから、

今までずっと出してなかったけど、

今までアップしたものの中では、

一番実用的かも。

※全角が含まれるかどうかのチェックに、

 どこかで拾ったコードが含まれてます。

 なんか不味かったら教えてください。 

仕様

選択領域のcsv,tsvを行ぞろえします。

言い訳

中途半端な仕様だけど、その辺は皆さん好き勝手に書き換えてください。

使い方

選択して、このマクロ呼びます。

var ed = 1;
$print = function(){
if( !ed ) return function(s){ WScript.Echo(s);   };
else      return function(s){ Editor.InsText(s + "\n"); };
}();

$getString = function(){
if(!ed) return function(){ return new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments[0]).ReadALL(); };
else    return function(){ return GetSelectedString(0);                                                                         };
}();

var s  = $getString();
$print("");
$print("");

// マークの判別が投げやりですまん
var lines =  s.split(/\n/);
var mark = '';
if( lines[0].match(/\t/) ) mark = "\t";
else                       mark = ",";
width = [];

// 広さを決める
for(var i = 0;i < lines.length;i++){
var columns = lines[i].split(mark);
for(var j = 0; j < columns.length; j++)
if( !width[j] || width[j] < getByteCount( columns[j] ) )
width[j] = getByteCount( columns[j] );
}

// 広さで埋める
for(var i = 0;i < lines.length;i++){
var columns = lines[i].split(mark);
var buf = '│';
for(var j = 0; j < columns.length; j++) {
columns[j] = columns[j].replace(/(\r|\n|\r\n)/,'');
buf += RPAD(columns[j], width[j]) + '|';
}
$print(buf);
}

function RPAD( src , len , fill_char){
var ret = src;
if( fill_char == null ) fill_char = " ";
while( 1 ) {
ret += fill_char;
var x = getByteCount(ret);
if( x > len &&  x % 2 == 0 ) break;
}
return ret ;
}

//全角ならtrueを返す
function isZenkaku(c) {
var str = escape(c);
if     (str.charAt(0) != "%") return false;
if     (str.charAt(1) == "8") return true;
else if(str.charAt(1) == "9") return true;
else if(str.charAt(1) == "E") return true;
else if(str.charAt(1) == "F") return true;
else                          return false;
}

/**
 * 全角であるかをチェックします。
 *
 * @param チェックする値
 * @return ture : 全角 / flase : 全角以外
 */
function checkIsZenkaku(value) {
for (var i = 0; i < value.length; ++i) {
var c = value.charCodeAt(i);
if (c < 256 || (c >= 0xff61 && c <= 0xff9f)) return false;
}
return true;
}

/**
 * 文字列のバイト数を取得する。
 * 全角を2バイト、半角を1バイトとしてカウントします。
 *
 * @param バイトを取得する値
 * @return 取得したバイト数
 */
function getByteCount(value) {
var count = 0;
for ( var i = 0; i < value.length; ++i ) {
var sub = value.substring(i, i + 1);
if( checkIsZenkaku(sub) ) count += 2;
else                      count += 1;
}
return count;
}
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 前回の要約

後で書いた >>

Find it!

Theme Design by devolux.org

Tag Cloud