2015年10月04日

Emeditorマクロ・文書の本文のみ字数カウント

 この記事も含めて、Emeditorに関するまとめはこちらLink


 PCで文書を書いていると、例えば「2000字の文書を書きたい」という時に、今の字数をカウントしてくれる機能が欲しいことがある。
 テキストエディタであるEmeditorでは、標準でそれを取得する機能がプラグインとして実装されている。

単語数プラグイン(Emeditor公式ページより)

 でも、このままでは改行も全て含んでしまうので、ちょっと工夫。
20151004-01.png
 このようなクエリを作成すれば、ほぼ望み通りのものができる。
 ただし、私が使う時、もう一つ機能が欲しいと思っていた。それは、

本文の字数のみ、改行や見出し・URLなど指定の部分を省いてカウントしたい

 欲しいのは「本文が何文字あるか」で、確認の時はタイトルを削除してカウントし直すなどしないといけなかった。
 ということで、マクロで作ってみた。

プログラムと解説


// 文書全文字数取得

if (document.selection.IsEmpty){ // 範囲指定が無ければ
CX = document.selection.
GetActivePointX(eePosLogical);
CY = document.selection.
GetActivePointY(eePosLogical); // カーソル位置取得
document.selection.SelectAll(); // 全選択
Msg = "全文"; // 全文メッセージ
} else { // 範囲指定があれば
CX = -1 // 変数にフラグ
Msg = "範囲"; // 範囲メッセージ
}
Alen = document.selection.Text // 範囲文字から
.replace(/\r\n/g, "") // 改行削除
.length; // 文字数取得

Word = document.selection.Text
.replace(//*[\s\S]**//,"") // 削除エリアの消去
.split("\r\n"); // 改行区切りで配列に

for (i=0 ; i < Word.length ; i++){ // 配列数ループ
Word[i] = Word[i]
.replace(/^[■|【].*/,""); // 見出し行を削除
}

Len = Word.join("\r\n") // 配列を連結
.replace(/\r\n/g, "") // 改行削除
.length; // 文字数取得

if (CX > 0) // カーソル位置あれば
document.selection.SetActivePoint
(eePosLogical , CX , CY); // カーソル戻す

status = Msg + ":" + Alen
+ "字 / 本文:" + Len + " 字"; // 字数表示

 使い方として、文書で

20151004-02.png
 このように、見出しなどカウントしたくない部分の行頭に「■」もしくは「【」を、省略するエリアは全角「/*」「*/」で囲む。

 ここでマクロを実行すると、
20151004-03.png
 範囲指定していればその部分のみ、していなければ文書全体の字数と共に、印を付けた部分を無視してカウント、下にあるステータスバーに表示する。

プログラム解説
 ここでは、範囲指定もしくは文書全体のことを「範囲」と呼ぶが、変数として、

Alen :範囲の字数
Len :本文のみの字数
Word[i]:範囲を1行ごとに分割
CX,CY :カーソル位置
Msg :全文か範囲かのメッセージ

 で、範囲を改行コードで区切って変数Wordに配列として入れてしまう。その配列を1つずつ、replaceで行頭に指定文字が入ってるものを消す。その後で改行を省いた字数をカウント。
 文書全体を取得するのに全選択を使っているので、終わってから元の位置にカーソルを戻してから表示、という流れ。

 カウントしない部分を消去すのが、replace命令。

 見出し行を削除するのは
.replace(/^[■|【].*/,"");
 で、行頭文字を正規表現「■」と「【」を「|」で区切っているだけ。これを変えたり増やせば自由に設定可能。

 その前に、削除エリアを消す方法として、
.replace(//*[\s\S]**//,"")
 と書いているが、少し説明が必要。

 正規表現で範囲を判別するなら、「.*」を使って
.replace(//*.**//,"")
 と書くのが通常だが、これでは改行をまたいだ文字を検索してくれない。
 そこで使ったのが、

EmEditorヘルプ: 正規表現構文

 に書かれているエスケープシーケンス。「\s」が空白文字、「\S」が空白以外の文字で、この両方「[\s\S]*」と書いたら空白と空白以外、つまり「改行も含んだ文字全て」として判別してくれる。
 だから、Sではなく「\w\W」などでも同じ結果になるという、ちょっとした正規表現のテクニック。

タグ:EmEditor

posted by 司隆 at 10:09 | Comment(0) | Computer
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]