行末を半角スペースで揃えるマクロ〜その2

SQLファイルの整形とかで行末を揃える事が多く、スペースキーを叩くのも疲れてきたので、マクロ(JScript)を組んでみた。

※サクラエディッタ専用(かな?)

http://d.hatena.ne.jp/crays/20081031/1225438472

上記エントリーでマルチバイト文字とか、タブ文字の対応ができてなかったので対応してみました。

使い方や注意事項は以前と一緒です。

function end_of_indent(str){
  var out = '';
  
  //タブ文字のバイト数
  var tab_cnt = 4;
  
  //改行文字で分割
  var str_array = str.split('\r\n');
  
  //最大文字バイト数の取得
  var max_length = 0;
  for(var i = 0; i < str_array.length; i++){
    //マルチバイト文字に対応する為、一文字づつ判定しバイト加算
    var _tmp_mlen = 0;
    for(var ch_cnt = 0; ch_cnt < str_array[i].length; ch_cnt++) {
      if('\t' == str_array[i].charAt(ch_cnt)){
        //タブ文字の場合(設定バイト数加算)
        _tmp_mlen = _tmp_mlen + tab_cnt;
      }else{
        if(128 <= str_array[i].charCodeAt(ch_cnt)){
          //マルチバイト文字の場合(1バイト加算)
          _tmp_mlen++;
        }
        _tmp_mlen++;
      }
    }
    
    //当該行が最大バイト数であれば、退避変数に代入
    if(max_length < _tmp_mlen){
      max_length = _tmp_mlen;
    }
  }
  
  //スペーサーを定義
  var spacer = '';
  for(var i = 0; i < max_length; i++){
    spacer = spacer + ' ';
  }
  
  //各行にスペーサーを連結し、最大バイト数まで返却変数に結合
  for(var i = 0; i < str_array.length; i++){
    
    str_array[i] = str_array[i] + spacer;
    
    //マルチバイト文字に対応する為、一文字づつ判定しバイト加算
    var _line_mlen = 0;
    for(var ch_cnt = 0; _line_mlen <= max_length; ch_cnt++) {
      if('\t' == str_array[i].charAt(ch_cnt)){
        //タブ文字の場合(設定バイト数加算)
        _line_mlen = _line_mlen + tab_cnt;
      }else{
        if(128 <= str_array[i].charCodeAt(ch_cnt)){
          //マルチバイト文字の場合(1バイト加算)
          _line_mlen++;
        }
        _line_mlen++;
      }
      //返却変数に一文字づつ結合
      out = out + str_array[i].charAt(ch_cnt);
    }
    
    //次行が存在すれば改行コードを結合
    if(i + 1 < str_array.length){
      out = out + '\r\n';
    }
  }
  return out;
}
Editor.InsText( end_of_indent(Editor.GetSelectedString()) );
プライバシーポリシー お問い合わせ