「検索ヒット数表示(選択文字列)」の版間の差分

Sukemaru (トーク | 投稿記録)
Sukemaru (トーク | 投稿記録)
「何件目」の表示を追加。関数バージョンを追加
1行目: 1行目:
ks 氏の「[[includeライブラリ]]」の StringEx.js(count 関数)と「[[検索ヒット数表示]]」マクロをもとに作成。
ks 氏の「[[includeライブラリ]]」の StringEx.js(count 関数)と「[[検索ヒット数表示]]」マクロをもとに作成。


* アクティブなタブの文書内から選択範囲の文字列に'''完全一致'''するものをカウントする。
== 単独マクロバージョン ==
 
* アクティブなタブの文書内から選択範囲の文字列に '''完全一致''' するものをカウントする。
* ヒット件数はステータスバーに表示する。
* ヒット件数はステータスバーに表示する。


選択範囲のある状態でマクロを手動で実行するか、「選択範囲が変更されたとき」のイベントマクロに設定して自動で実行させるのがよろしいかと。
選択範囲のある状態でマクロを手動で実行するか、「選択範囲が変更されたとき」のイベントマクロに設定して自動で実行させるのがよろしいかと。


なお、このマクロと Mery 標準の検索メソッドとでは、ヒット数のカウントの仕方が異なります。
:''e.g.''「<u>あああああ</u>」5文字だけの文書で「<u>ああ</u>」を検索した場合、このマクロでは "2件" とカウントしますが、Mery の検索メソッド(次を検索)では "4回" ヒットします。


<span style="color:#c00;">※ このマクロと Mery 標準の検索メソッドとでは、ヒット数のカウントの仕方が異なります。 </span>
:''e.g.''「あ<span style="background:#bfdfff;">ああ</span>ああ」5文字だけの文書で「<span style="background:#bfdfff;">ああ</span>」を検索した場合、このマクロでは "2件" とカウントしますが、Mery の検索メソッド(次/前を検索)では "4回" ヒットします。
:→ 「何件目」かの表示は、うえの例のような範囲選択をしている場合には不正確な値を返します。


※このマクロの実行にあたって include ライブラリは不要です。


※このマクロでは、イベントマクロで利用する場合の処理速度を優先させるために「[[検索ヒット数表示]]」(JScript) マクロのような正規表現検索には対応させていません。また、文字列のヒット判定では「大文字と小文字を区別する」が適用され、「単語のみを検索する」は適用されません。
※ このマクロの実行にあたって include ライブラリは不要です。


※イベントマクロで利用する場合は「遅延時間」を適宜調整しないと、大きな文書の編集のさいに動作がもたつくことがあります。
※ このマクロでは、イベントマクロで利用する場合の処理速度を優先させるために「[[検索ヒット数表示]](JScript)」 マクロのような正規表現検索には対応させていません。また、文字列のヒット判定では「大文字と小文字を区別する」が適用され、「単語のみを検索する」は適用されません。
 
※ イベントマクロで利用する場合は「遅延時間」を適宜調整しないと、大きな文書の編集のさいに動作がもたつくことがあります。


オプション指定をつけてヒット数を調べたい場合は、「[[ポップアップメニューで検索先にジャンプ|ポップアップメニューで検索先にジャンプ]] 」マクロの '''include''' 版をご利用ください(イベントマクロにはできませんが)。
オプション指定をつけてヒット数を調べたい場合は、「[[ポップアップメニューで検索先にジャンプ|ポップアップメニューで検索先にジャンプ]] 」マクロの '''include''' 版をご利用ください(イベントマクロにはできませんが)。


=== ソースコード ===
2019/07/20 更新
*全体のヒット件数のうしろに「何件目」のヒットかを追加


== ソースコード ==
<source lang="javascript">
<source lang="javascript">
#title = "ヒット件数(選択文字列)"
#title = "ヒット件数(選択文字列)"
39行目: 46行目:
var timerStart = new Date();
var timerStart = new Date();
Status = "";
Status = "";
var word = document.selection.Text;
 
var d = editor.ActiveDocument;
var s = d.selection;
var word = s.Text;
 
if ( word ) {
if ( word ) {
   var len = word.length;
   var len = word.length;
   var dText = document.Text;
   var dText = d.Text;


   // 大文字/小文字の区別なしにするなら、以下2行をアンコメント
   // 大文字/小文字の区別なしにするなら、次の2行をアンコメントせよ
   // word = word.toLowerCase();
   // word = word.toLowerCase();
   // dText = dText.toLowerCase();
   // dText = dText.toLowerCase();


   var pos = 0,  hit = 0;
  var tPos = Math.min( s.GetActivePos(), s.GetAnchorPos() )
   var pos = 0,  count = 0,  hit = 0;
   while ( pos >= 0 ) {
   while ( pos >= 0 ) {
     pos = dText.indexOf( word, pos );
     pos = dText.indexOf( word, pos );
     if ( pos >= 0 ) {
     if ( pos >= 0 ) {
      count ++;
      if ( pos <= tPos  ) {
        hit = count;
      }
       pos += len;
       pos += len;
      hit ++;
     }
     }
   }
   }
59行目: 74行目:
     return num.toString().replace( /(\d)(?=(?:\d{3})+$)/g, "$1," );
     return num.toString().replace( /(\d)(?=(?:\d{3})+$)/g, "$1," );
   }
   }
   Status = " ヒット数:" + SeparateNum( hit ) + " 件";
   Status = " ヒット数:" + SeparateNum( count ) + " 件"
        + " ( " + SeparateNum( hit ) + " 件目 ) ";
   var TimerElapsed = function( end, start ) {
   var TimerElapsed = function( end, start ) {
     var elapsedSec = ( ( end - start ) / 1000 ).toFixed( 3 );
     var elapsedSec = ( ( end - start ) / 1000 ).toFixed( 3 );
     return "  [ " + elapsedSec.replace( /\./, ". " ) + " 秒 ]";
     return "  [ " + elapsedSec.replace( /\./, ". " ) + " 秒 ]";
   }
   }
   // 検索所要時間が不要なら以下の1行をコメントアウトせよ
   // 検索所要時間の表示が不要なら、次の1行をコメントアウトせよ
   Status += TimerElapsed( new Date(), timerStart );
   Status += TimerElapsed( new Date(), timerStart );
}
</source>
== 組み込み用関数バージョン ==
2019/07/20 追加
*引数に指定した文字列の出現回数 "'''ヒット数:n 件 ( m 件目 )''' " を返す。
※「[[バイト数]]」マクロなどへの追加コードとして利用できます。
※ 引数が「選択範囲の文字列」でない場合は、キャレット位置までのヒット数を「m 件目」として返します(ただし、キャレットのすぐ右に指定文字列がある場合は、『m 件目』の値 + 1 で返します)。
※ その他、仕様・注意事項については[[#単独マクロバージョン|単独マクロバージョン]]に準じます。
=== 使用例 ===
<source lang="javascript">
// 例1. ステータスバーの表示内容に追加
if ( document.selection.Text ) {
  Status += "  " + HitStatus( document.selection.Text );
}
// 例2. 入力ダイアログで指定した文字列のヒット数
var word = Prompt( "検索文字列:", "" );
if ( word ) {
  Alert( "「 " + word + " 」 \n" + HitStatus( word ) );
}
</source>
=== 組み込み関数コード ===
<source lang="javascript">
/*
* 関数 HitStatus( str )
* 引数に指定した文字列の出現回数 "ヒット数:n 件 ( m 件目 ) " を返す
* 引数 str: 選択範囲の文字列などの「文字列」オブジェクト
* ※「大文字/小文字の区別なし」にしたい場合は、コメントアウトされた toLowerCase の行をアンコメントする
*/
function HitStatus( str ) {
  if ( str ) {
    // str = str.toLowerCase();
    var d = editor.ActiveDocument,  s = d.selection;
    var dText = d.Text;
    // dText = d.Text.toLowerCase();
    var tPos = Math.min( s.GetActivePos(), s.GetAnchorPos() );
    var len = str.length,  pos = 0,  count = 0,  hit = 0;
    while ( pos >= 0 ) {
      pos = dText.indexOf( str, pos );
      if ( pos >= 0 ) {
        count ++;
        if ( pos <= tPos  ) { hit = count; }
        pos += len;
      }
    }
    var SeparateNum = function( num ) {
      return num.toString().replace( /(\d)(?=(?:\d{3})+$)/g, "$1," );
    }
    return "ヒット数:" + SeparateNum( count ) + " 件"
          + " ( " + SeparateNum( hit ) + " 件目 ) ";
  }
}
}
</source>
</source>
スポンサーリンク