Advertisement
sukemaru

gPad用 文字数・行数・ヒット数.js

Aug 26th, 2019
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * -----------------------------------------------------------------------------
  3.  * 【gPad 用】文字数・行数・ヒット数
  4.  * sukemaru ( 2019/08/26 - 2019/09/02 )
  5.  * -----------------------------------------------------------------------------
  6.  * Mery 用マクロ「バイト数と文字数・行数」と「検索ヒット数表示」を gPad 用に改編。
  7.  * ref.『マクロライブラリ - MeryWiki』
  8.  *   https://www.haijin-boys.com/wiki/マクロライブラリ
  9.  *   https://www.haijin-boys.com/wiki/バイト数#バイト数と文字数・行数
  10.  *   https://www.haijin-boys.com/wiki/検索ヒット数表示(選択文字列)
  11.  * -----------------------------------------------------------------------------
  12.  * 編集中の文書または選択範囲の文字数と行数をステータスバーに表示します。
  13.  * 選択範囲があるときは、選択文字列の出現回数を表示します。
  14.  * ※ このマクロは、改行を含む選択範囲でもヒット件数をカウントできます。
  15.  *
  16.  * ※ ソースコード末尾に動作仕様(制限事項)の説明があります。
  17.  */
  18.  
  19.  
  20. // ---------- ▼ 設定項目 ▼ ----------
  21.  
  22. // ■ 行数のカウント方法
  23. // true:論理行(改行) / false:物理行(折り返し)
  24. var logical = true;         // 初期値: true ( ← false でも論理行でカウント)
  25.  
  26. // ■ 選択範囲の末尾が改行記号のときの 行数のカウント方法
  27. // true:次の行頭を含めない / false:含める
  28. var ignoreEnter = true;     // 初期値: true ( ← gPad 方式)
  29.  
  30. // ■ 文字数のカウント方法 での改行記号 CR+LF の数え方
  31. // true:2文字あつかい / false:1文字あつかい
  32. // ヒット数のカウントのさい、true →区別する / false →区別しない  になります
  33. var countCRLF = true;       // 初期値: true ( ← gPad 方式)
  34.  
  35. // ■ ヒット数のカウント方法
  36. // true:大文字と小文字を区別する / false:区別しない
  37. var matchCase = false;      // (← 選択マーカーにあわせるとよい)
  38.  
  39. // ■ 「あああああ」 5文字だけの文書で 「ああ」 を範囲選択したときのカウント方法
  40. // true:ヒット数 2件 / false:ヒット数 4件
  41. var countMinimum = true;    // 初期値: true ( ← gPad 方式)
  42.  
  43. // ■ 選択範囲なし、または「すべて選択」のときにファイルサイズを表示
  44. // true:表示する / false:表示しない
  45. var bytesEnable = true;     // 初期値: true
  46.  
  47. // ■ マクロの処理の所要時間を表示
  48. // true:表示する / false:表示しない
  49. var timerEnable = true; // 初期値: false
  50.  
  51. // ---------- ▲ 設定項目 ▲ ----------
  52.  
  53.  
  54. var timerStart = new Date();
  55. var d = editor.ActiveDocument;
  56. var s = d.selection;
  57. var isEmpty = s.IsEmpty;    // 「範囲選択なし」のフラグ
  58. var selAll = false;         // 「すべて選択」のフラグ
  59. var posMode = logical ? ePosLogical : ePosView;     // ※ ePosView は未対応
  60. var dLines = d.GetLines();
  61. var dt = countCRLF ? d.Text : d.Text.replace( /\r(?:\n)?/g, "\n" );
  62. var lines;
  63. var st = "";
  64. var statusStr = "";
  65.  
  66.  
  67. // 範囲選択なしなら文書全体の文字列と行数
  68. if ( isEmpty ) {
  69.   st = dt;
  70.   lines = d.GetLines();
  71. }
  72. // 範囲選択ありなら選択範囲の文字列と行数
  73. else {
  74.   st = countCRLF ? s.Text : s.Text.replace( /\r(?:\n)?/g, "\n" );
  75.   selAll = ( st == dt );
  76.   lines = s.GetBottomPointY( posMode )
  77.         - s.GetTopPointY( posMode )
  78.         + ( ( ignoreEnter && /[\r\n]$/.test( st ) ) ? 0 : 1 );
  79. }
  80.  
  81.  
  82. /* 範囲選択なしのときは 文書全体の文字数・行数 を、
  83.        ありのときは 選択範囲の文字数・行数 をステータスに表示 */
  84. var charStr = " " + ( selAll || isEmpty ? "全体 " : "選択: " )
  85.             + st.length + " 文字";
  86. var lineStr = " ( " + lines + " 行 )";
  87.  
  88. statusStr = charStr + lineStr;
  89.  
  90.  
  91. /* 範囲選択なし、またはすべて選択のときはファイルサイズをステータスに追加 */
  92. // ※ イベントマクロにするなら、条件は isEmpty なしのほうがよいかも
  93. var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  94. var fileSize = ( bytesEnable && ( isEmpty || selAll ) && d.Saved )
  95.                  ? Fso.GetFile( d.FullName ).Size
  96.                  : 0;
  97. var fileSizeStr = "  /  ファイルサイズ: " + fileSize + " バイト )";
  98.  
  99. statusStr += fileSize ? fileSizeStr : "";
  100.  
  101.  
  102. /* 選択文字列のヒット数をステータスに追加 */
  103. statusStr += ( isEmpty || selAll )
  104.            ? ""
  105.            : HitStatus( st, dt, matchCase, countMinimum );
  106.  
  107. // ステータスバーに送信
  108. Status = SeparateNum( statusStr );
  109.  
  110. /* マクロの処理の所要時間をステータスバーに追加 */
  111. Status += timerEnable ? TimerElapsed( new Date(), timerStart ) : "";
  112.  
  113. // -----------------------------------------------------------------------------
  114.  
  115. /**
  116.  * 関数 SeparateNum( str )
  117.  * 文字列中の数字を3ケタ区切りに
  118.  */
  119. function SeparateNum( str ) {
  120.   return str.replace( /(\d)(?=(?:\d{3})+[^\d])/g, "$1," );
  121. }
  122.  
  123. /**
  124.  * 関数 TimerElapsed( end, start )
  125.  * マクロの処理の所要時間を計測
  126.  */
  127. function TimerElapsed( end, start ) {
  128.   var elapsedSec = ( ( end - start ) / 1000 ).toFixed( 3 );
  129.   return " [ " + elapsedSec.replace( /\./, ". " ) + " 秒 ]";
  130. }
  131.  
  132. /**
  133.  * 関数 HitStatus( strSelection, strDocuText, matchCase, countMinimum )
  134.  * 選択文字列の出現回数を返す
  135.  */
  136. function HitStatus( word, docu, matchCase, countMinimum ) {
  137.   var word = matchCase ? word : word.toLowerCase();
  138.   var docu = matchCase ? docu : docu.toLowerCase();
  139.   var len = word.length;
  140.   var pos = 0,  count = 0,  hit = 0;
  141.   while ( pos >= 0 ) {
  142.     pos = docu.indexOf( word, pos );
  143.     if ( pos >= 0 ) {
  144.       count ++;
  145.       pos += countMinimum ? len : 1;
  146.     }
  147.   }
  148.   return "  /  ヒット数:" + count + " 件";
  149. }
  150.  
  151.  
  152. // -----------------------------------------------------------------------------
  153.  
  154. /**
  155.  * ▼ 動作仕様 / 制限事項 ▼
  156.  *
  157.  * ※ このマクロは、矩形選択範囲では正しく機能しません。
  158.  *
  159.  * ※ 設定項目の logical が無効(false)でも、
  160.  *    行数は論理行数で表示されます(折り返し行数を考慮しない)。
  161.  *    gPad ver 3.0.2 時点では、本体の仕様により物理行カウントには非対応です。
  162.  *
  163.  * ※ 各設定項目で無効(true)を "gPad 方式" としているのは、
  164.  *    通常の範囲選択中にステータスバーに表示されるカウント方式にあわせた表現です。
  165.  *
  166.  * ※ 設定項目 ignoreEnter の有効(true)/無効(false)いずれでも、
  167.  *    文字数のカウントでは選択範囲末尾の改行記号を含めまて数えます。
  168.  *
  169.  * ※ 文字数のカウントでは、設定項目の countCRLF を無効(false)にすることで
  170.  *    改行記号の CR+LF と CR と LF の区別なしに1文字として扱うことができます。
  171.  *    また、ヒット数のカウント方法では、countCRLF が無効(false)のとき
  172.  *    改行コードの CR+LF と CR と LF を同一視します。
  173.  * ※ このマクロは、エディタ上の改行コードの表示形式を自動識別しません。
  174.  *    設定項目の countCRLF で指定された方法で改行文字を扱いますので
  175.  *    CR+LF/CR/LF が混在(複合)する文書ではご注意ください。
  176.  *
  177.  * ※「あああああ」5文字だけの文書で「ああ」を検索した場合、
  178.  *    gPad の通常の検索ダイアログでは "2件" とカウントされます。
  179.  *    また、「あ あ あ」5文字だけの文書で「あ あ」を検索した場合は、
  180.  *    gPad の検索ダイアログでは "1件" とカウントします。
  181.  *    このマクロでは、設定項目の countMinimum を無効(false)にすると
  182.  *    上の例の「ああ」を "4件"、「あ あ」を "2件" とカウントします。
  183.  *
  184.  * ※ 設定項目の bytesEnable が有効(true)で、
  185.  *   「選択範囲なし」または「すべて選択」の状態のときのみ、
  186.  *    実体ファイルのファイルサイズを表示できます。
  187.  *    ただし、「無題」や「未保存状態*」のタブでは表示しません。
  188.  *
  189.  *
  190.  * ▼ Mery 版から移植しなかった機能 ▼
  191.  *
  192.  * ・選択範囲の行数の「物理行」でのカウント
  193.  *  (gPad 本体の仕様で ePosView は未対応、
  194.  *    また、GetLines メソッドに物理行カウント用の定数がない)
  195.  *
  196.  * ・ヒットした文字列が「何件め」かの表示
  197.  *   (GetActivePos メソッドがない)
  198.  *
  199.  * ・未保存の文書のファイルサイズ換算処理
  200.  *   (文字コード形式の定数がわからない)
  201.  *
  202.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement