テキスト整形

提供: MeryWiki
移動先: 案内検索

ks 氏作のマクロ「テキスト変換」の改造版です。

【主な改造点】

  • 拡張コードの書式を変更した。
    • 簡易書式をベースに単純化。オプション・第2引数は削除。
    • 関数タイプ replace/replaceS はモード R/RS に改称。replaceL は廃止。
  • モード F (関数を実行) を追加。JScript や Mery の関数をそのまま実行することができます。
  • モード RS で、範囲終端の改行=次行行頭は範囲に含めないようにした。(正規表現 ^ $ の使い勝手を考え)
  • モード R/RS 実行後、処理した範囲を選択し直すようにした。(選択範囲の維持)
  • メソッド String.replaceBatch (連続置換) を追加。
  • 範囲選択時に対象範囲を選ぶメニューを廃止した。(毎回選ぶのが面倒なため)
  • 非選択時に文書全体を対象範囲とする仕様を廃止した。(挿入/貼付コマンドと相性が悪いため)
    • 文書全体を対象にしたい場合は「すべて選択」 (Ctrl+A) してから実行してください。

【注意点】

  • 表示行での処理には対応していません。※特記なき場合、各行・行頭・行末論理行 を意味しています。
  • マクロの仕様上、矩形選択での処理には対応していません。

お知らせ (2015/03/14)

仕様変更によりモード RM / CR は廃止されました。
詳しくは #更新履歴 または 利用者:Masme のページをご覧ください。

旧仕様の利用者はお手数ですが基本コードおよび拡張コードの更新をお願いいたします。

スターターパック

ダウンロード→ テキスト整形.zip (2017/06/25 更新)

  • 基本コードと拡張コード(★印の項目)をまとめて、すぐ使えるようにした入門用セットです。→ 収録コマンド一覧
  • 拙作ですがアイコンファイル (テキスト整形.ico) を同梱してあります。
    Mery 2.4.7 以降の場合、マクロ (テキスト整形.js) と同じフォルダに、
    Mery 2.4.6 以前の場合、Mery.exe と同じフォルダに、
    アイコンファイルを配置しておくとツールバーにアイコンが読み込まれます。

更新履歴

//2017/06/25 でページ内検索すると、その日付で更新されたコマンドを検索できます。

  • 2017/06/25
    • 仕様変更 - アイコンファイルに24x24・32x32・48x48の画像を追加。
    • 仕様変更 - replaceBatch メソッドで配列先頭/末尾のコンマを許容するようにした。
      例> a.replaceBatch([ ,[省略],[省略],[省略], ])
    • コード整理 - 基本コードを改訂。
    • 追加 - 行を昇順/降順並べ(Unicode) ¦ ★!?を半角/全角に整形 ¦ 空白行の空白を除去 ¦ 各行行頭/各行行末から数文字削除 ¦ 重複する/しない行を抽出 ¦ 表外漢字→代替
    • 改名 - 行を昇順/降順並べ(UTF-16) ¦ 行を逆順並べ ¦ 文字を逆順並べ
      コマンド名「~の並べ替え(○順)」→「~を○順並べ」に変更。
      旧来のコマンドは、実態に即し (Unicode) → (UTF-16) に訂正。
    • 改名 - ★重複行を単一化 ¦ ★連続する重複行を単一化
      コマンド名「~を削除」→「~を単一化」に変更。
    • 修正 - ★重複行を単一化
      下記の7行を削除してしまう不具合を修正。重複の判定に Object.prototype.hasOwnProperty.call() を使用するようにした。
      「constructor」「hasOwnProperty」「isPrototypeOf」「propertyIsEnumerable」「toLocaleString」「toString」「valueOf」
    • 変更 - ★全角ダッシュ(――)に整形
      罫線(横) ── を変換対象から除外。
    • 変更 - ★数値参照を文字に変換 ¦ ★16→10進数 ¦ &#xHEX; デコード
      0Xff, ÿ など X が大文字の場合に対応。
    • 変更 - 文字を逆順並べ ¦ 文字をシャッフル ¦ \uHHHH, \u4H \U8H, \x{hex}, &#dec;, &#xHEX; エンコード
      正規表現を . → [^\n] に統一。
    • 変更 - 文字を逆順並べ ¦ 文字をシャッフル
      UAX #29 に一部対応し、\p{Zl}, {Zp}, {Cc}, U+00AD, FEFF は結合しないようにした。
    • 変更 - 選択文字列を検索
      カーソル位置・スクロール位置を移動しないようにした。
    • 変更 - 選択文字列を検索 ¦ 選択文字列をすべて削除 ¦ replaceBatch メソッド
      特殊文字のエスケープ処理を /([$()*+.?[\\\]^{|}])/g,"\\$1" → /[$()*+.?\[\\\]^{|}]/g,"\\$&" に統一。
    • 変更 - コマンド テンプレート(分割)
      配列先頭のコンマの仕様に対応(末尾は実質対応済)。
  • 2017/05/28
    • 追加 - 結合文字列を検索
    • 修正 - CP932依存文字を検索
      Wiki が 神 → 神 などの正規化(NFC)を行う影響で、漢字22字が意図どおりに検索されないミスを修正。
    • 変更 - ASCII文字, 半角カナ, 全角英数, CJK漢字, ひらがな, カタカナを単語検索
      変数を使用せず、正規表現 \g<名前> を使用する形式に統一。
  • 2015/12/26
    • 仕様変更 - アイコンの指定先を "My Macros\テキスト整形.ico" → "テキスト整形.ico" に変更。
    • 変更 - マクロフォルダを開く
      コマンド名「My Macros フォルダを開く」→「マクロフォルダを開く」に変更。
      My Macros フォルダではなく「テキスト整形」マクロがあるフォルダを開くようにした(Mery 2.4.7 での Macros フォルダ改名に対処)。
  • 2015/09/30
    • 追加 - CP932依存文字を検索 ¦ サロゲートペアを検索 ¦ 行頭に連番付加 (#) ¦ 行頭に連番付加 (#/Σ) ¦ 行頭に連番付加 (0#) ¦ \u4H \U8H エンコード/デコード
    • 修正 - ひらがなを単語検索 ¦ カタカナを単語検索
      選択範囲が記号の前後で途切れる問題に対処(記号2連続まで対応)。
    • 変更 - 青空文庫 ルビを除去
      正規表現を [^《]+ → [^《\n]+ に変更し、改行を跨がないようにした。
    • 変更 - ★HTMLタグを除去
      正規表現を .*? → [^文字]* に変更し、改行を跨ぐようにした。
    • 変更 - 文字を逆順並べ ¦ 文字をシャッフル
      処理方法を split() → match() に変更。対応文字に結合文字 (U+1AB0~FF, 1DC0~FF, 20D0~FF, FE20~F)、制御文字 (U+200C~D)、絵文字の国旗 (U+1F1E6~FF)、肌色指定 (U+1F3FB~F) を追加。
    • 改名 - \uHHHH, \x{hex}, &#dec;, &#xHEX; エンコード/デコード
      コマンド名「Unicode 文字 → ○○」→「○○ エンコード」に変更。
      コマンド名「Unicode ○○ → 文字」→「○○ デコード」に変更。
  • 2015/03/26
    • 変更 - CJK漢字を単語検索
      異体字セレクタを考慮するようにした(ただし組合せが適正かは考慮しえない)。
    • 変更 - 複製貼り付け
      処理中止の条件を 非数字(NaN) or 1 未満 → クリップボードが空文字 or 1 未満 に変更。
  • 2015/03/14
    • 仕様変更 - モード R/RS 実行後、処理した範囲を選択し直すようにした。
    • 仕様変更 - モード RM を廃止した。既存コマンドはモード RS で作り直した。
      ★行頭 // を付加/削除 ¦ ★インデント(半角空白2個) ¦ ★空白行を削除 ¦ ★各行行頭/各行行末に貼り付け ¦ ★各行行頭/各行行末に文字列付加 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
    • 仕様変更 - モード CR を廃止し、String.replaceBatch メソッドを追加した。既存コマンドは replaceBatch メソッドで作り直した。
      ★連続する!?を整形 ¦ ★実体参照 &"<> → &xxx; ¦ ★実体参照 &xxx; → ␣><"& ¦ ★半角カナ→全角 ¦ ★全角カナ→半角 ¦ 標準変換
    • コード整理 - コマンド各々に更新年月日を付けるようにした。
    • スターター除外 - ☆検索強調をすべて解除
    • 削除 - ☆全角英数を検索 ¦ ☆半角カナを検索 ¦ ☆CJK漢字を検索
    • 追加 - ASCII文字を単語検索 ¦ 半角カナを単語検索 ¦ 全角英数を単語検索 ¦ CJK漢字を単語検索 ¦ ひらがなを単語検索 ¦ カタカナを単語検索 ¦ 検索結果カウント ¦ 総字行数カウント
    • 変更 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー
      パスが存在しない場合の名前を、無題 → <無題> に変更。
    • 変更 - ★数値参照を文字に変換 ¦ \x{hex}, &#dec;, &#xHEX; デコード
      サロゲートペアの計算を + → | に変更し、不必要な括弧を除去した(演算子の優先順が + - → >> → & → | である事による)。
    • 変更 - Base64エンコード/デコード
      不必要な括弧を除去した(同上、演算子の優先順による)。
    • 変更 - コマンド テンプレート
      モード RM/CR 廃止に伴う改訂。コマンドおよびセパレータは、表示行頭に挿入するようにした。
  • 2015/02/14
    • 仕様修正 - モード RS/RM で、矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。
    • コード整理 - 文字入力など追加操作を求めるコマンドは、名称末尾に目印 ... を付けた。
      複製貼り付け ¦ ★各行行頭/各行行末に文字列付加 ¦ 各行先頭/各行末尾に文字列付加 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
    • 削除 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳
    • 追加 - 行末に<br>を付加 ¦ <br>を改行に変換 ¦ ★行頭の/行末の空白を除去 ¦ 空白行を減量 ¦ 重複行を単一化(空白行は除く) ¦ ★連続する重複行を単一化 ¦ 文字のシャッフル
    • 修正 - 各行先頭/各行末尾に文字列付加
      正規表現が意味的に不適切だったのを修正。
    • 変更 - 空白行を圧縮
      モード R → RS に。空白行内の空白を除去してから改行を処理するように変更。
    • 変更 - 文字を逆順並べ
      サロゲートペアの対処方法を変更。結合文字の一部 (U+0300~6F, 3099~A) および異体字セレクタに対応した。
    • 変更 - 2進接頭辞換算
      正規表現を [0-9]+(,?[0-9]{3})+(\.[0-9]+)? → [0-9]+(,?[0-9]{3})+ に変更(小数は非対応とした)。
    • 変更 - Base64デコード
      JScript 5.x の decodeURIComponent() は字数が多すぎると能率が下がるようなので、最大50字ずつ処理するようにした(高速化)。
  • 2014/10/12
    • スターター除外 - ☆正規表現に一致する/しない行を削除
      Mery (鬼車) と JScript (ECMAScript) では正規表現の仕様が異なり、意図しない結果を招く怖れがあるため。
    • スターター追加 - ★数値参照 &#dec; に変換 ¦ ★数値参照 &#xHEX; に変換
    • 追加 - ★数値参照を文字に変換 ¦ 行を逆順並べ ¦ 行をシャッフル ¦ &#xHEX; エンコード/デコード
    • 修正 - 選択文字列を検索
      引数不一致により動作しないミスを修正。
    • 修正 - 編集中の全ファイルのパスをコピー ¦ ★検索強調をすべて解除
      対象範囲を 同ウィンドウ内の全文書 → 全ウィンドウの全文書 に改修。
    • 変更 - 複製貼り付け
      処理方法を for → while に変更。処理中止の条件を 未入力 → 非数字(NaN) or 1 未満に変更。
    • 変更 - \x{hex}, &#dec; エンコード
      処理方法を 配列連結 join("") → 文字列連結 += に変更。
    • 変更 - \x{hex}, &#dec; デコード
      下位サロゲートの計算を (n-0x10000&0x3FF) → (n&0x3FF) に変更。
  • 2014/07/27
    • 修正 - Base64デコード
      終端の余分な [NUL] を除去する処理が手抜きだったのを修正。
  • 2014/05/31
    • 削除 - Base64エンコード(Unicode)
      Mery の「Base64デコード」機能と同じ方式の Base64エンコード(UTF-8) に差し替え。
    • 追加 - Base64エンコード/デコード(UTF-8)
    • 変更 - ★数値を3桁,区切りに
      数字列を抽出して処理するように変更(高速化)。
    • 変更 - ★数値を3桁,区切りに ¦ 丸数字 (20) → ⑳ ¦ ★10→16進数 ¦ 2進接頭辞換算
      正規表現を \d → [0-9] に統一。
    • 修正 - コマンド テンプレート(モード CR 交換/分割)
      文字列リテラルでのエスケープ \ をより正確に判定できる正規表現に改修。
  • 2014/05/24
    • 修正 - 各行末尾に文字列付加
      選択範囲の次行先頭にも文字列付加してしまう問題に対処。
    • 変更 - 複製貼り付け
      クリップボードの内容を変数に格納しておくように変更(高速化)。
    • 変更 - 複製貼り付け ¦ 各行先頭/各行末尾に文字列付加
      Prompt() 関連の処理を単純にした(モード RM 以外では冗長だった)。
  • 2014/05/22
    • 追加 - 2進接頭辞換算
    • 変更 - \x{hex}, &#dec; デコード
      サロゲートペアの String.fromCharCode() の引数を複数指定に改修、ビット演算に一部変更。
  • 2014/05/16
    • 変更 - \x{hex}, &#dec; エンコード
      処理方法を replace(for ループ) に統一。
  • 2014/04/27
    • 追加 - &#dec; エンコード/デコード
  • 2014/03/14
    • 追加 - 青空文庫 ルビを除去 ¦ 青空文庫 注記を除去
  • 2014/03/08
    • 追加 - 選択文字列を検索 ¦ 選択文字列をすべて削除
    • 変更 - ★全角英数を検索 ¦ ★半角カナを検索 ¦ ★CJK漢字を検索
      検索方向を 前 → 次 に変更。念の為「大文字と小文字を区別」するようにした。
  • 2014/03/01
    • 追加 - ★連続する!?を整形 ¦ ★全角ダッシュ(――)に整形
    • 変更 - ★括弧前の句読点を除去
      全角コンマ , /全角ピリオド . を除去対象に追加。
    • 変更 - ★三点リーダー(……)に整形
      全角コンマ , /全角ピリオド . /半角中黒 ・ /三点リーダー … /二点リーダー ‥ を変換対象に追加。
    • 変更 - マクロフォルダを開く
      処理方法を WScript.Shell.Run("explorer") → Shell.Application.Explore() に変更。
  • 2014/02/22
    • 追加 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳
    • 変更 - 文字を逆順並べ ¦ \uHHHH, \x{hex} エンコード
      処理方法を for ループ → replace() に変更(字数削減)。
    • 変更 - コマンド テンプレート
      モード CR 作成補助コマンドを追加。モード CR テンプレートを変更。
  • 2014/02/17
    • 修正 - ★各行行頭/各行行末に貼り付け
      クリップボード終端の改行文字を除去する正規表現を修正。\r\n|\r|\n$ → (\r\n|\r|\n)$
  • 2014/02/16
    • 仕様修正 - モード CR で、正規表現の特殊文字があると誤動作する不具合を修正。
    • 仕様変更 - モード CR で、正規表現 (JScript) による検索置換に対応した。
    • コード整理 - コメントアウトしていた基本コードを削除した。→ 2014/01/08 スクロール位置
    • コード整理 - 下記の6カテゴリを3カテゴリに統合。コマンドの名称や配置を見直した。
      (空白の追加 + 各行に追加) (空白の削除 + 行の削除) (数値の変換 + 文字種変換)
    • スターター除外 - ☆標準変換
    • 追加 - 複製貼り付け ¦ 文字を逆順並べ ¦ ★半角カナ→全角 ¦ ★全角カナ→半角
    • 変更 - ★各行行頭/各行行末に貼り付け
      クリップボード終端の改行文字は除去するようにした(行切り取り・行コピーとの相性を考え)。
    • 変更 - コマンド テンプレート
      モード CR テンプレートを刷新。
  • 2014/02/10
    • スターター除外 - ☆空白行を圧縮
    • 追加 - ★空白行を削除 ¦ \uHHHH デコード ¦ \x{hex} エンコード/デコード
    • 変更 - 挿入 Confirm(|)
      接尾辞の長さ(s.length)でカーソル移動量を決めるようにした。
  • 2014/02/01
    • 追加 - \uHHHH エンコード
    • 変更 - ★全角かな→カナ ¦ ★全角カナ→かな
      踊り字(繰り返し記号) ゝゞヽヾ を変換対象に追加。
  • 2014/01/24
    • 追加 - ★半角/全角の間を空ける ¦ ★半角英数/全角の間を空ける
    • 変更 - ★全角カナ→かな
      ヴヵヶ → ゔゕゖ の変換を行わないようにした(Shift_JIS では保存できない文字のため)。
  • 2014/01/12
    • 仕様変更 - スターターパックにアイコンファイルを同梱し、読み込むようにした。
    • 修正 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー
      join("\n") → join("\r\n") に変更し、メモ帳でも正しく改行されるようにした。
    • 修正 - ★数値を3桁,区切りに
      小数点以下(ピリオド以降)は桁区切りしないようにした。
  • 2014/01/08
    • 仕様変更 - コマンド実行時、スクロール位置を記憶・復元しないように(コメントアウト)した。
      検索系コマンドと相性が悪く、Mery の検索機能と挙動が合っていないため。
    • スターター追加 - ★CJK漢字を検索 ¦ ★検索強調をすべて解除
    • 追加 - ★全角英数を検索 ¦ ★半角カナを検索
    • 修正 - ★16→10進数
      16進数に使用しない英字 G~Z を変換対象に含めていたミスを修正。
  • 2013/12/30
    • 追加 - 挿入 Confirm(|) ¦ ★数値を3桁,区切りに ¦ ★10→16進数 ¦ ★16→10進数
    • 修正 - My Macros フォルダを開く
      マクロの場所からではなく Mery.exe の場所からパスを取得するようにした。
  • 2013/09/15
    • 初版公開。

基本コード

//■テキスト整形
// 2013/09/15-2017/06/25
 
//■拡張コード:コマンド一覧
var f = [];
// ----------------- ↓ここより下に拡張コードを追加
 
// ----------------- ↑ここより上に拡張コードを追加
/*■拡張コード:書式
//▼コマンド
f.push(["コマンド名","モード",function(引数){マクロ}]);
//▽モード F (Function)     - 関数を実行
  function( Document.Selection ) : 戻値なし
//▽モード R (Replace)      - 選択範囲を置換
//▽モード RS (Select-line) - 選択範囲を行頭行末まで拡張して置換
  function( Document.Selection.Text ) : String
//▼サブメニュー
f.push(["メニュー名",function(f){コマンドなど}]);
//▼セパレータ
f.push(["----"]);
// ----------------- */
 
//■メソッド:連続置換
//"string".replaceBatch([ [検索1,置換1],[検索2,置換2],[検索3,置換3],… ]);
String.prototype.replaceBatch = function(a) { //▲引数の型はチェックしてない
  var $this = this, i = 0, n = a.length;
  if (!a[0]) i++;
  if (!a[n-1]) n--;
  for (; i<n; i++) {
    if (typeof a[i][0]==="string") //◆特殊文字をエスケープし、"g"フラグを付加
      a[i][0] = new RegExp(a[i][0].replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"),"g");
    $this = $this.replace(a[i][0],a[i][1]);
  }
  return $this;
};
 
(function(){
//■実行コード
var Sel = Document.Selection;
var cmd = [], cid = 1; //コマンド, ID
//コマンド一覧からメニュー作成
var Menu = CreatePopupMenu();
(function ListToMenu(List, Menu) {
  for (var i=0,n=List.length; i<n; i++) {
    var $L = List[i], $Ln = $L.length;
    if (typeof $L[0]!=="string") continue;
    switch (true) {
    //◆コマンド	$L = ["コマンド名","モード",function]
    case ($Ln===3 && /^(F|RS?)$/.test($L[1]) && typeof $L[2]==="function"):
      cmd[cid] = {mode:$L[1], func:$L[2]};
      Menu.Add($L[0]+"\t"+$L[1], cid++);
      break;
    //◆サブメニュー	$L = ["メニュー名",function]
    case ($Ln===2 && typeof $L[1]==="function"):
      var sub_f = [], sub_Menu = CreatePopupMenu();
      $L[1](sub_f);
      Menu.AddPopup($L[0], sub_Menu);
      ListToMenu(sub_f, sub_Menu); //再帰処理:サブメニュー作成
      break;
    //◆セパレータ	$L = ["----"]
    case ($Ln===1 && /^-+$/.test($L[0])):
      Menu.Add("", 0, meMenuSeparator);
      break;
    }
  }
}(f, Menu));
//ポップアップメニューを表示して処理
if (cid = Menu.Track(mePosMouse)) { //※キャンセル(Esc)時は0が返る
  switch (cmd[cid].mode) {
  case "F":	//関数を実行
    cmd[cid].func(Sel);
    break;
  case "RS":	//選択範囲を行頭行末まで拡張
    selectLine(Sel);
    //↓FALL THROUGH
  case "R":	//選択範囲を置換
    var pos = new Pos(Sel);
    Sel.Text = cmd[cid].func(Sel.Text);
    pos.restore();
    break;
  }
}
 
//■選択範囲を行頭行末まで拡張
function selectLine(Sel, includeBreak) {
  var ty = Sel.GetTopPointY(mePosLogical);
  var by = Sel.GetBottomPointY(mePosLogical);
  var bx = Sel.GetBottomPointX(mePosLogical);
  var nn =(Sel.Text.match(/\n/g)||[]).length;
  if (bx===1 && nn<=by-ty && nn) by--; //下端行頭を含めない
  Sel.SetActivePoint(mePosLogical, 1, by);
  Sel.EndOfLine(false, mePosLogical);
  Sel.SetAnchorPoint(mePosLogical, 1, ty);
  if (includeBreak) Sel.CharRight(true); //末尾改行を含める
};
//■位置情報オブジェクト
function Pos(Sel) {
  this.acp = Sel.GetActivePos();
  this.anp = Sel.GetAnchorPos();
  this.len = Document.Text.length;
  this.restore = function(isCollapse) {
    var isRev = this.acp<this.anp, gap = Document.Text.length - this.len;
    Sel.SetAnchorPos(this.anp+(isRev? gap : 0));
    Sel.SetActivePos(this.acp+(isRev? 0 : gap), !isCollapse);
  };
};
 
}());

拡張コード:コマンド

  • ★印の項目は、スターターパックに収録されているコマンドです。

小説/作文 用途

★地の文の行頭を字下げ
開き括弧類 ‘ “ ( 〔 [ { 〈 《 「 『 【 および 半角空白/全角空白/水平タブ/改行 以外の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。
f.push(["地の文の行頭を字下げ","RS",function(a){ //2015/02/14
  return a.replace(/^([^‘“(〔[{〈《「『【  \t\n])/gm," $1") }]);
★括弧前の句読点を除去
閉じ括弧類 ’ ” ) 〕 ] } 〉 》 」 』 】 の直前に句読点 、 。 , . がある場合、除去します。
f.push(["括弧前の句読点を除去","R",function(a){ //2014/03/01
  return a.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]);
★!?を半角/全角に整形
感嘆符・疑問符 ! ? を、直前の文字が半角なら半角に、全角なら全角に整形します。
直前の文字がない場合(範囲先頭や行頭)は整形しません。
半角文字=半角空白+ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。
例> What!?/あ!? → What!?/あれ!?(※赤字が直前の文字)
f.push(["!?を半角/全角に整形","R",function(a){ //2017/06/25
  return a.replace(/[!?!?]+/g,function(s,i,c){c=c.charAt(i-1); return (!c||c==="\n")? s: /[ -~。-゚]/.test(c)? s.replace(/!/g,"!").replace(/?/g,"?"): s.replace(/\!/g,"!").replace(/\?/g,"?")}) }]);
★連続する!?を整形
2文字以上連続する感嘆符・疑問符 ! ? を半角2文字に整形します。
例> !!/!!?/?!!!/?!!!? → !!/!?/?!/??
f.push(["連続する!?を整形","R",function(a){ //2015/03/14
  return a.replaceBatch([ [/[!][!?!?]*[!]/g,"!!"],[/[!][!?!?]*[?]/g,"!?"],[/[?][!?!?]*[!]/g,"?!"],[/[?][!?!?]*[?]/g,"??"] ]) }]);
★三点リーダー(……)に整形
1~3文字以上連続する中黒・句点・読点などを、三点リーダー2文字 …… に整形します。
例> そんな・・・・。 → そんな……。
※変換対象となるのは以下の8パターンです。
名称 連続字数 Shift_JIS Unicode
全角読点 3字以上 、、、 0x8141 U+3001
全角句点 。。。 0x8142 U+3002
全角コンマ ,,, 0x8143 U+FF0C
全角ピリオド ... 0x8144 U+FF0E
全角中黒 ・・・ 0x8145 U+30FB
半角中黒 ・・・ 0xA5 U+FF65
三点リーダー 1字以上 0x8163 U+2026
二点リーダー 0x8164 U+2025
f.push(["三点リーダー(……)に整形","R",function(a){ //2014/03/01
  return a.replace(/、{3,}|。{3,}|,{3,}|.{3,}|・{3,}|・{3,}|…{1,}|‥{1,}/g,"……") }]);
★全角ダッシュ(――)に整形
2文字以上連続する長音などを、全角ダッシュ2文字 ―― に整形します。
例> そんなーーー。 → そんな――。
※変換対象となるのは以下の4パターンです。
名称 連続字数 Shift_JIS Unicode
全角長音符 2字以上 ーー 0x815B U+30FC
em ダッシュ
(全角ダッシュ)
—— - U+2014
全角ダッシュ
(水平線)
―― 0x815C U+2015
全角マイナス -- 0x817C U+FF0D
f.push(["全角ダッシュ(――)に整形","R",function(a){ //2017/06/25
  return a.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}/g,"――") }]);
青空文庫 ルビを除去
で始まり で終わる箇所を除去します。ルビ開始位置を表す がある場合、 も除去します。
例> 一応《いちおう》何時《いつ》もの/霧の|ロンドン警視庁《スコットランドヤード》 → 一応何時もの/霧のロンドン警視庁
f.push(["青空文庫 ルビを除去","R",function(a){ //2015/09/30
  return a.replace(/(?:|([^《\n]+))?《.*?》/g,"$1") }]);
青空文庫 注記を除去
[# で始まり で終わる箇所を除去します。
例> [#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり] → 名※
f.push(["青空文庫 注記を除去","R",function(a){ //2014/03/14
  return a.replace(/[#.*?]/g,"") }]);
青空文庫 注記(外字以外)を除去
外字を表す注記 ※[#~] は例外とし、除去しません。
例> [#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり] → 名※[#二の字点、1-2-22]
f.push(["青空文庫 注記(外字以外)を除去","R",function(a){ //2014/03/14
  return a.replace(/(※[#.*?])|[#.*?]/g,"$1") }]);

Web/HTML 用途

★HTMLタグを除去
f.push(["HTMLタグを除去","R",function(a){ //2015/09/30
  return a.replace(/<("[^"]*"|'[^']*'|[^"'>])*>/g,"") }]);
行末に<br>を付加
f.push(["行末に<br>を付加","RS",function(a){ //2015/02/14
  return a.replace(/$/gm,"<br>") }]);
<br>を改行に変換
改行タグを改行に変換します。ただし、改行タグ直後に改行が含まれている場合は、二重改行にならないようタグのみ削除します。
※対応タグは <br> <br/> <br /> の3種類です。英字の大小は問いません。
※属性付きには対応していません。例> <br clear="all"> など
f.push(["<br>を改行に変換","R",function(a){ //2015/02/14
  return a.replace(/<br( ?\/)?>\n?/gi,"\n") }]);
★実体参照 &"<> → &xxx;
★実体参照 &xxx; → ␣><"&
HTML で使用される文字実体参照の変換を行います。
文字 実体参照 備考
< &lt; 小なり不等号 (less-than sign)
> &gt; 大なり不等号 (greater-than sign)
" &quot; 引用符 (quotation mark)
& &amp; アンド (ampersand)
  &nbsp; 折り返し禁止空白 (no-break space)
&nbsp; は U+00A0 (No-Break Space) ではなく、U+0020 (半角空白) に変換します。
空白文字 → &nbsp; の変換は、実用上不都合が多いため行いません。
f.push(['実体参照 &&"<> → &&xxx;',"R",function(a){ //2015/03/14
  return a.replaceBatch([ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"] ]) }]);
f.push(['実体参照 &&xxx; → \u2423><"&&',"R",function(a){ //2015/03/14
  return a.replaceBatch([ ["&nbsp;"," "],["&gt;",">"],["&lt;","<"],["&quot;",'"'],["&amp;","&"] ]) }]);
半角空白 → &nbsp; の変換も行う場合は、下記の内容に差し替えてください。
f.push(['実体参照 &&"<>\u2423 → &&xxx;',"R",function(a){ //2015/03/14
  return a.replaceBatch([ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"],[" ","&nbsp;"] ]) }]);
★数値参照 &#dec; に変換
文字列を数値文字参照(10進)形式に変換します。(dec=decimal/十進法)
例> Aわ𠀋 → &#65;&#12431;&#131083;
#符号化/復号化 の節の &#dec; エンコード を参照
★数値参照 &#xHEX; に変換
文字列を数値文字参照(16進)形式に変換します。(HEX=hexadecimal/十六進法)
例> Aわ𠀋 → &#x41;&#x308F;&#x2000B;
#符号化/復号化 の節の &#xHEX; エンコード を参照
★数値参照を文字に変換
数値文字参照(10進/16進)を文字列に変換します。
例> &#65;&#x308F;&#x2000b; → Aわ𠀋
f.push(["数値参照を文字に変換","R",function(a){ //2017/06/25
  return a.replace(/&#([0-9]{1,7});|&#[Xx]([0-9A-Fa-f]{1,6});/g,function(s,d,x){var n=Number(d||"0x"+x); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);

マクロ/コード 用途

★行頭 // を付加/削除
行頭に // が無い行なら // を付加し、有る行なら // を削除します。
※このコマンドをよく利用される場合は「コメントマーク付け外し」マクロの導入をオススメします。
f.push(["行頭 \/\/ を付加/削除","RS",function(a){ //2015/03/14
  return a.replace(/^(\/\/)?/gm,function(s){return s? "": "\/\/"}) }]);
★インデント(半角空白2個)
各行の行頭に半角空白2文字を挿入します。
※このコマンドをよく利用される場合は「字下げ・字上げ」マクロの導入をオススメします。
f.push(["インデント(半角空白2個)","RS",function(a){ //2015/03/14
  return a.replace(/^/gm,"  ") }]);
挿入 Confirm(|)
文字列 if(!Confirm())Quit(); を挿入します。
Alert() と違い、[キャンセル] ボタンを押すとマクロを強制終了できるため、無限ループにハマっても対処できます。
f.push(["挿入 Confirm(|)","F",function(a){ //2014/05/31
  var p="if(!Confirm(",s="))Quit();"; a.Text=p+a.Text+s; a.CharLeft(false,s.length) }]);
マクロフォルダを開く
エクスプローラを起動し、「テキスト整形」マクロがあるフォルダを開きます。
f.push(["マクロフォルダを開く","F",function(a){ //2015/12/26
  new ActiveXObject("Shell.Application").Explore(new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(ScriptFullName)) }]);
選択範囲を eval で評価
ステータスバーに eval(選択範囲) した結果を表示します。
たとえば、選択範囲が 10*(5+20) なら、250 と表示されます。
f.push(["選択範囲を eval で評価","F",function(a){ //2014/02/01
  if(a.Text){Status=eval(a.Text)} }]);

挿入/貼付

★半角/全角の間を空ける
★半角英数/全角の間を空ける
半角文字/半角英数と全角文字の間に半角空白を挿入します。
半角文字=ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。
f.push(["半角/全角の間を空ける","R",function(a){ //2014/02/16
  return a.replace(/([!-~。-゚](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[!-~。-゚]))/g,"$1 ") }]);
f.push(["半角英数/全角の間を空ける","R",function(a){ //2014/02/16
  return a.replace(/([0-9A-Za-z](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[0-9A-Za-z]))/g,"$1 ") }]);
★数値を3桁,区切りに
半角数字列を3桁毎にコンマで区切ります。小数点以下(ピリオド以降)は桁区切りしません。
例> 87654321/0.12345/54321.12345 → 87,654,321/0.12345/54,321.12345
f.push(["数値を3桁,区切りに","R",function(a){ //2014/10/12
  return a.replace(/([^.0-9]|^)([0-9]+)/g,function(s,t,n){return t+n.replace(/([0-9])(?=(?:[0-9]{3})+$)/g,"$1,")}) }]);
複製貼り付け...
クリップボードの文字列を、入力した回数分複製してから貼り付けます。
f.push(["複製貼り付け...","R",function(a){ //2015/03/26
  var r=[],c=ClipboardData.GetData(),n=parseInt(Prompt("複製回数: ※半角数字","")); if(!c||n<1)Quit(); while(n--){r.push(c)} return r.join("") }]);
★各行行頭/各行行末に貼り付け
クリップボードの文字列を、各行の行頭/行末に貼り付けます。
f.push(["各行行頭に貼り付け","RS",function(a){ //2015/09/30
  var c=ClipboardData.GetData().replace(/(\r\n|[\r\n])$/,""); return a.replace(/^/gm,c) }]);
f.push(["各行行末に貼り付け","RS",function(a){ //2015/09/30
  var c=ClipboardData.GetData().replace(/(\r\n|[\r\n])$/,""); return a.replace(/$/gm,c) }]);
★各行行頭/各行行末に文字列付加...
入力した文字列を、各行の行頭/行末に挿入します。
f.push(["各行行頭に文字列付加...","RS",function(a){ //2015/03/14
  var p=Prompt("各行行頭に付加する文字列:",""); if(!p)Quit(); return a.replace(/^/gm,p) }]);
f.push(["各行行末に文字列付加...","RS",function(a){ //2015/03/14
  var p=Prompt("各行行末に付加する文字列:",""); if(!p)Quit(); return a.replace(/$/gm,p) }]);
各行先頭/各行末尾に文字列付加...
下記の条件で置換を行い、入力した文字列を各行の先頭/末尾に挿入します。
※矩形対応には Mery 2.1.0 以降が必要です。
※Mery の仕様上、零幅には対応していません。零幅で実行すると、表示行頭に文字列が挿入されます。
検索文字列 (先頭) ^(?=.|\n)
検索文字列 (末尾) (?<=.)$|^(?=\n)
置換文字列 ※入力した文字列
フラグ 正規表現を使用する (meFindReplaceRegExp)
選択した範囲のみ (meReplaceSelOnly)
すべて置換 (meReplaceAll)
f.push(["各行先頭に文字列付加...","F",function(a){ //2015/02/14
  var p=Prompt("各行先頭に付加する文字列:",""); if(!p)Quit(); a.Replace("^(?=.|\\n)",p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]);
f.push(["各行末尾に文字列付加...","F",function(a){ //2015/02/14
  var p=Prompt("各行末尾に付加する文字列:",""); if(!p)Quit(); a.Replace("(?<=.)$|^(?=\\n)",p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]);
行頭に連番付加 (#)
行頭に連番 (1), (2), (3) … を挿入します。
f.push(["行頭に連番付加 (#)","RS",function(a){ //2015/09/30
  var re=/^/gm, n=1, pf="(", sf=")"; return a.replace(re,function(s){return pf+(n++)+sf}) }]);
行頭に連番付加 (#/Σ)
選択行数を Σ として、連番 (1/Σ), (2/Σ), (3/Σ) … を挿入します。
f.push(["行頭に連番付加 (#/Σ)","RS",function(a){ //2015/09/30
  var re=/^/gm, n=1, m=(a.match(re)||[]).length, pf="(", sf="/"+m+")"; return a.replace(re,function(s){return pf+(n++)+sf}) }]);
行頭に連番付加 (0#)
連番が2桁以上になる場合、桁揃えした連番 (01), (02), (03) … を挿入します。
f.push(["行頭に連番付加 (0#)","RS",function(a){ //2015/09/30
  var re=/^/gm, n=1, m=(a.match(re)||[]).length, pf="(", sf=")", sp="0", k=String(m).length, sp=new Array(k).join(sp); return a.replace(re,function(s){return pf+(sp+(n++)).slice(-k)+sf}) }]);
※行頭に連番付加系コマンドの比較
実行前 (#) (#/Σ) (0#)
1行目
2行目

9行目
10行目
11行目

99行目
100行目
(1)1行目
(2)2行目

(9)9行目
(10)10行目
(11)11行目

(99)99行目
(100)100行目
(1/100)1行目
(2/100)2行目

(9/100)9行目
(10/100)10行目
(11/100)11行目

(99/100)99行目
(100/100)100行目
(001)1行目
(002)2行目

(009)9行目
(010)10行目
(011)11行目

(099)99行目
(100)100行目

除去/削除

★空白文字を除去
空白文字(半角空白/全角空白/水平タブ)を除去します。
f.push(["空白文字を除去","R",function(a){ //2013/09/15
  return a.replace(/[  \t]+/g,"") }]);
★行頭行末の/行頭の/行末の空白を除去
f.push(["行頭行末の空白を除去","RS",function(a){ //2013/09/15
  return a.replace(/^[  \t]+|[  \t]+$/gm,"") }]);
f.push(["行頭の空白を除去","RS",function(a){ //2015/02/14
  return a.replace(/^[  \t]+/gm,"") }]);
f.push(["行末の空白を除去","RS",function(a){ //2015/02/14
  return a.replace(/[  \t]+$/gm,"") }]);
空白行の空白を除去
空白行を、改行のみの空行にします。
f.push(["空白行の空白を除去","RS",function(a){ //2017/06/25
  return a.replace(/^[  \t]+$/gm,"") }]);
★空白行を削除
空白行(半角空白/全角空白/水平タブ/改行のみの行)を削除します。
f.push(["空白行を削除","RS",function(a){ //2015/03/14
  return a.replace(/^[  \t]*$\n?/gm,"") }]);
空白行を圧縮
連続する空白行を1行の空行に変換します。連続しない(=1行の)空白行は削除します。
f.push(["空白行を圧縮","RS",function(a){ //2015/02/14
  return a.replace(/^[  \t]+$/gm,"").replace(/^(\n)\n+|^\n/gm,"$1") }]);
空白行を減量
連続する空白行を1行分削減します。
空白行の連続が3行なら2行に、2行なら1行に、1行なら0行(=削除)になります。
f.push(["空白行を減量","RS",function(a){ //2015/02/14
  return a.replace(/((?:^[  \t]*$\n?)*)(?:^[  \t]*$\n?)/gm,"$1") }]);
★重複行を単一化
同じ内容の行が2個以上ある場合、2個目以降を削除します。
f.push(["重複行を単一化","RS",function(a){ //2017/06/25
  var a=a.split("\n"),b=[],map={}; for(var i=0,n=a.length;i<n;i++){ if(!Object.prototype.hasOwnProperty.call(map,a[i])){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]);
重複行を単一化(空白行は除く)
空白行(半角空白/全角空白/水平タブ/改行のみの行)は例外とし、削除しません。
f.push(["重複行を単一化(空白行は除く)","RS",function(a){ //2017/06/25
  var a=a.split("\n"),b=[],map={}; for(var i=0,n=a.length;i<n;i++){ if(/^[  \t]*$/.test(a[i])||!Object.prototype.hasOwnProperty.call(map,a[i])){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]);
★連続する重複行を単一化
f.push(["連続する重複行を単一化","RS",function(a){ //2015/02/14
  return a.replace(/(^.*$)\n(^\1$\n?)+/gm,"$2") }]);
重複する/しない行を抽出
f.push(["重複する行を抽出","RS",function(a){ //2017/06/25
  var a=a.split("\n"),b=[],k=0,map={}; for(var i=0,n=a.length;i<n;i++){ if(!Object.prototype.hasOwnProperty.call(map,a[i])){b[k]={dup:false,txt:a[i]};map[a[i]]=k++;}else{b[map[a[i]]].dup=true} } i=b.length;while(--i>=0){ if(b[i].dup){b[i]=b[i].txt}else{b.splice(i,1)} } return b.join("\n") }]);
f.push(["重複しない行を抽出","RS",function(a){ //2017/06/25
  var a=a.split("\n"),b=[],k=0,map={}; for(var i=0,n=a.length;i<n;i++){ if(!Object.prototype.hasOwnProperty.call(map,a[i])){b[k]={dup:false,txt:a[i]};map[a[i]]=k++;}else{b[map[a[i]]].dup=true} } i=b.length;while(--i>=0){ if(!b[i].dup){b[i]=b[i].txt}else{b.splice(i,1)} } return b.join("\n") }]);
※空白行系/重複行系コマンドの比較 (☐ は空白/↵ は改行)
実行前 空白行
を削除
空白行
を圧縮
空白行
を減量
実行前 重複行を
単一化
空白行は
除く
連続する
重複行
重複する
行を抽出
しない
行を抽出
1行目↵
☐↵
2行目↵
☐↵
☐☐↵
3行目↵
☐↵
☐☐↵
☐☐☐↵
4行目
1行目↵
2行目↵
3行目↵
4行目
1行目↵
2行目↵

3行目↵

4行目
1行目↵
2行目↵
☐↵
3行目↵
☐↵
☐☐↵
4行目
あいう↵
あいう↵
☐↵
☐↵
☐☐↵
あいう↵
あいう↵
カキク↵
さしす↵
カキク
あいう↵
☐↵
☐☐↵
カキク↵
さしす
あいう↵
☐↵
☐↵
☐☐↵
カキク↵
さしす
あいう↵
☐↵
☐☐↵
あいう↵
カキク↵
さしす↵
カキク
あいう↵
☐↵
カキク
☐☐↵
さしす
★入力文字列を含む/含まない行を削除...
f.push(["入力文字列を含む行を削除...","RS",function(a){ //2015/03/14
  var p=Prompt("以下の文字列を含む行を削除:",""); if(!p)Quit(); return a.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? "":s}) }]);
f.push(["入力文字列を含まない行を削除...","RS",function(a){ //2015/03/14
  var p=Prompt("以下の文字列を含まない行を削除:",""); if(!p)Quit(); return a.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? s:""}) }]);
正規表現に一致する/しない行を削除...
※正規表現は JScript / JavaScript の仕様で記述します。Mery の正規表現 (鬼車/鬼雲) と仕様が異なる点があるので注意してください。
f.push(["正規表現に一致する行を削除...","RS",function(a){ //2015/03/14
  var p=Prompt("以下の正規表現に一致する行を削除:",""); if(!p)Quit(); p=new RegExp(p); return a.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? "":s}) }]);
f.push(["正規表現に一致しない行を削除...","RS",function(a){ //2015/03/14
  var p=Prompt("以下の正規表現に一致しない行を削除:",""); if(!p)Quit(); p=new RegExp(p); return a.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? s:""}) }]);
各行行頭/行末から数文字削除...
各行の行頭/行末から指定した文字数分を削除します。
※サロゲートペアには対応していますが、結合文字列などには対応していません。
f.push(["各行行頭から数文字削除...","RS",function(a){ //2017/06/25
  var n=parseInt(Prompt("各行行頭から削除する字数: ※半角数字","")); if(!n||n<1)Quit(); return a.replace(new RegExp("^(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}","gm"),"") }]);
f.push(["各行行末から数文字削除...","RS",function(a){ //2017/06/25
  var n=parseInt(Prompt("各行行末から削除する字数: ※半角数字","")); if(!n||n<1)Quit(); return a.replace(new RegExp("(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}$","gm"),"") }]);

検索/置換

ASCII文字を単語検索
空白文字などを除く ASCII 印字可能文字 (U+0021~007E) が1文字以上連続する箇所を検索します。
f.push(["ASCII文字を単語検索","F",function(a){ //2017/05/28
  a.Find("(?<!\\g<Graph>)(?<Graph>[!-~])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
半角カナを単語検索
半角カナ類 (ヲ~ッ ア~ン 。 「 」 、 ・ ー ゙ ゚) が1文字以上連続する箇所を検索します。
f.push(["半角カナを単語検索","F",function(a){ //2017/05/28
  a.Find("(?<!\\g<HKana>)(?<HKana>[。-゚])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
全角英数を単語検索
全角英数字 (0~9 A~Z a~z) が1文字以上連続する箇所を検索します。
f.push(["全角英数を単語検索","F",function(a){ //2017/05/28
  a.Find("(?<!\\g<FAlnm>)(?<FAlnm>[0-9A-Za-z])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
CJK漢字を単語検索
CJK (China/Japan/Korea) の漢字が1文字以上連続する箇所を検索します。
f.push(["CJK漢字を単語検索","F",function(a){ //2017/05/28
  a.Find("(?<!\\g<Han>\\g<VS>|\\g<Han>)(?:(?<Han>[\\p{Han}])(?<VS>[\\x{FE00}-\\x{FE02}\\x{E0100}-\\x{E01EF}])?)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
ひらがなを単語検索
カタカナを単語検索
平仮名/片仮名が1文字以上連続する箇所を検索します。
※検索対象となる文字は、下表のとおりです。囲み文字 ㋐ や組み文字 ㍍ は除外しています。
種別 文字 Shift_JIS Unicode 備考
平仮名
(かな)
全角ひらがな (89字) ぁ ~ ん
ゔゕゖ
0x829F~82F1
-
U+3041~3093
U+3094~3096
※SJIS では ゔゕゖ の3字は保存不可
ゝゞ 0x8154, 8155 U+309D, 309E 踊り字(繰り返し)
- U+309F 「より」の合字
片仮名
(カナ)
全角カタカナ (93字) ァ ~ ヶ
ヷヸヹヺ
0x8340~8396
-
U+30A1~30F6
U+30F7~30FA
※SJIS では ヷヸヹヺ の4字は保存不可
ヽヾ 0x8152, 8153 U+30FD, 30FE 踊り字(繰り返し)
- U+30FF 「コト」の合字
半角カタカナ (55字) ヲ ~ ッ
ア ~ ン
0xA6~AF
0xB1~DD
U+FF66~FF6F
U+FF71~FF9D
カタカナ拡張 (16字) ㇰ ~ ㇿ - U+31F0~31FF アイヌ語表記などに用いる
記号 ※以下は、仮名の後に続いて出現する場合のみ検索される。例> 複製゜ーコヒ゜ー
半角/全角濁点 (2字) ゙ ゛ 0xDE, 814A U+FF9E, 309B
半角/全角半濁点 (2字) ゚ ゜ 0xDF, 814B U+FF9F, 309C
結合用濁点/半濁点 (2字) ゙ ゚ - U+3099, 309A 結合文字
半角/全角長音符 (2字) ー ー 0xB0, 815B U+FF70, 30FC
f.push(["ひらがなを単語検索","F",function(a){ //2017/05/28
  a.Find("(?<!\\g<Kana>\\g<Mark>\\g<Mark>|\\g<Kana>\\g<Mark>|\\g<Kana>)(?:(?<Kana>[ぁ-\\x{3096}ゝゞ\\x{309F}])(?<Mark>[\\x{3099}\\x{309A}゛゙゜゚ーー])*)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
f.push(["カタカナを単語検索","F",function(a){ //2017/05/28
  a.Find("(?<!\\g<Kana>\\g<Mark>\\g<Mark>|\\g<Kana>\\g<Mark>|\\g<Kana>)(?:(?<Kana>[ァ-\\x{30FA}ヽヾ\\x{30FF}ヲ-ッア-ン\\x{31F0}-\\x{31FF}])(?<Mark>[\\x{3099}\\x{309A}゛゙゜゚ーー])*)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
CP932依存文字を検索
Shift_JIS (CP932) の環境依存文字 (NEC特殊文字・IBM拡張文字・ユーザー定義外字・未定義文字) を検索します。
f.push(["CP932依存文字を検索","F",function(a){ //2017/05/28
  a.Find("[纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏\\x{FA10}增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙\\x{FA12}晳暙暠暲暿曺朎\\x{F929}杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇\\x{FA15}燁燾犱犾猤\\x{FA16}獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦\\x{FA17}睆劯砡硎硤硺礰\\x{FA18}\\x{FA19}\\x{FA1A}禔\\x{FA1B}禛竑竧\\x{FA1C}竫箞\\x{FA1D}絈絜綷綠緖繒罇羡\\x{FA1E}茁荢荿菇菶葈蒴蕓蕙蕫﨟薰\\x{FA20}﨡蠇裵訒訷詹誧誾諟\\x{FA22}諶譓譿賰賴贒赶﨣軏﨤\\x{FA25}遧郞\\x{FA26}鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒\\x{F9DC}﨩隝隯霳霻靃靍靏靑靕顗顥\\x{FA2A}\\x{FA2B}餧\\x{FA2C}馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫\\x{FA2D}鸙黑①-⑳Ⅰ-Ⅹⅰ-ⅹ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼㍻∮∑∟⊿¦'"\\x{E000}-\\x{E757}\\x{80}\\x{F8F0}-\\x{F8F3}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
サロゲートペアを検索
UTF-16において2バイト2個組で1文字を形成する文字 (U+10000~10FFFF) を検索します。
f.push(["サロゲートペアを検索","F",function(a){ //2015/09/30
  a.Find("[\\x{10000}-\\x{10FFFF}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
結合文字列を検索
2文字以上を組み合わせて1文字を形成する文字を検索します。
※基底文字+結合文字の組合せを検索するため、それ以外の組合せで形成される文字は正しく検索・選択できません。
※結合文字列や異体字を表示するには、対応するソフトウェアやフォントが必要です。
ラテン文字 ひらがな 漢字(異体字) 囲み文字
実際の表示 ǖ ǖ じ 辻󠄀 あ⃞
文字の構成 ǖ u ̈ ̄ 󠄀
Unicode 01D6 0075 0308 0304 3058 3057 3099 8FBB 8FBB E0100 3042 20DE
f.push(["結合文字列を検索","F",function(a){ //2017/05/28
  a.Find("(?:[^\\p{M}\\n]|^)[\\p{M}]+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
選択文字列を検索
下記の条件で検索を行います。
※Mery の仕様上、改行や折り返しを含むと検索強調が不完全になります。
検索文字列 ※選択文字列
フラグ 大文字と小文字を区別する (meFindReplaceCase)
正規表現を使用する (meFindReplaceRegExp)
文末まで検索したら文頭に移動する (meFindAround)
下/次を検索 (meFindNext)
f.push(["選択文字列を検索","F",function(a){ //2017/06/25
  if(a.Text){var acp=a.GetActivePos(),anp=a.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; a.Find(a.Text.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext); a.SetActivePos(acp);a.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true;} }]);
選択文字列をすべて削除
下記の条件で置換を行い、選択文字列を削除します。
検索文字列 ※選択文字列
置換文字列 ※空欄
フラグ 大文字と小文字を区別する (meFindReplaceCase)
正規表現を使用する (meFindReplaceRegExp)
すべて置換 (meReplaceAll)
f.push(["選択文字列をすべて削除","F",function(a){ //2017/06/25
  if(a.Text)a.Replace(a.Text.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), "", meFindReplaceCase+meFindReplaceRegExp+meReplaceAll) }]);
検索強調をすべて解除
「検索文字列の強調を解除」をすべての文書で実行します。
f.push(["検索強調をすべて解除","F",function(a){ //2015/03/14
  for(var ei=0;ei<Editors.Count;ei++){var d=Editors.Item(ei).Documents; for(var i=0;i<d.Count;i++){d.Item(i).HighlightFind=false}} }]);
検索結果カウント
前回(直前)の検索条件で文書全体を検索し直し、一致した件数をステータスバーに表示します。
※検索条件が複雑なほど、件数が多いほど処理に時間がかかります(作者の環境では、1000件で約2秒かかりました)。
※処理に時間をかけたくない場合は「検索ヒット数表示」プラグインの導入をオススメします。
f.push(["検索結果カウント","F",function(a){ //2015/09/30
  var t=new Date(),n=-1,acp=a.GetActivePos(),anp=a.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; Status=""; a.StartOfDocument(); do{a.FindRepeat(meFindNext);n++}while(!Status); a.SetActivePos(acp);a.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true; Status=n+"件の検索結果 (処理時間: "+(new Date()-t)/1000+"秒)" }]);

文書情報

総字行数カウント
総文字数と総表示行数をステータスバーに表示します。
表示される数値は、「すべて選択」時に表示される字数・行数と同値になります。
※サロゲートペアは2文字扱い。結合文字や異体字セレクタも字数にカウントされます。
f.push(["総字行数カウント","F",function(a){ //2015/03/14
  Status=Document.Text.length+"文字 ("+Document.GetLines()+"表示行)" }]);
※サロゲートペアを1文字と扱い、論理行数をカウントする場合は、下記のようにします。
f.push(["総字行数カウント","F",function(a){ //2015/09/30
  Status=(Document.Text.length-(Document.Text.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[]).length)+"文字 ("+Document.GetLines(0)+"論理行)" }]);
編集中のファイルのパスをコピー
編集中の全ファイルのパスをコピー
現在編集中のファイルのパスをクリップボードにコピーします。
新規作成ファイルなどパスが存在しない場合は、<無題> の文字がコピーされます。
f.push(["編集中のファイルのパスをコピー","F",function(a){ //2015/03/14
  ClipboardData.SetData(Document.FullName||"<無題>") }]);
f.push(["編集中の全ファイルのパスをコピー","F",function(a){ //2015/03/14
  var list=[]; for(var ei=0;ei<Editors.Count;ei++){var d=Editors.Item(ei).Documents; for(var i=0;i<d.Count;i++){list.push(d.Item(i).FullName||"<無題>")}} ClipboardData.SetData(list.join("\r\n")) }]);

並べ替え

行を昇順/降順並べ(UTF-16)
行を UTF-16 順に並べ替えます(サロゲートペアが U+D7FF~E000 の間に並ぶ)。
f.push(["行を昇順並べ(UTF-16)","RS",function(a){ //2013/09/15
  return a.split("\n").sort().join("\n") }]);
f.push(["行を降順並べ(UTF-16)","RS",function(a){ //2013/09/15
  return a.split("\n").sort().reverse().join("\n") }]);
行を昇順/降順並べ(Unicode)
行を Unicode 順に並べ替えます(サロゲートペアが U+FFFF の次に並ぶ)。
f.push(["行を昇順並べ(Unicode)","RS",function(a){ //2017/06/25
  return a.replace(/\uFFFF/g,"\uFFFF_").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"\uFFFF$&").split("\n").sort().join("\n").replace(/\uFFFF([\uD800-\uDBFF][\uDC00-\uDFFF])/g,"$1").replace(/\uFFFF_/g,"\uFFFF") }]);
f.push(["行を降順並べ(Unicode)","RS",function(a){ //2017/06/25
  return a.replace(/\uFFFF/g,"\uFFFF_").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"\uFFFF$&").split("\n").sort().reverse().join("\n").replace(/\uFFFF([\uD800-\uDBFF][\uDC00-\uDFFF])/g,"$1").replace(/\uFFFF_/g,"\uFFFF") }]);
行を逆順並べ
f.push(["行を逆順並べ","RS",function(a){ //2014/10/12
  return a.split("\n").reverse().join("\n") }]);
行をシャッフル
行をランダムに並べ替えます。
f.push(["行をシャッフル","RS",function(a){ //2014/10/12
  var a=a.split("\n"),i=a.length,j,t; while(i){j=Math.floor(Math.random()*i--); t=a[i];a[i]=a[j];a[j]=t;} return a.join("\n") }]);
文字を逆順並べ
各行の文字を逆順に並べ替えます。
例> 文字を逆順並べ → べ並順逆を字文
※以下の文字に対応しています。対応していない文字は位置がズレます。
  • サロゲートペア (U+10000~10FFFF)
  • 結合文字の一部 (U+0300~6F, 1AB0~FF, 1DC0~FF, 20D0~FF, 3099~A, FE20~F)
  • 制御文字の一部 (U+200C~D)
  • 異体字セレクタ (U+180B~D, FE00~F, E0100~EF)
  • 絵文字の国旗 (U+1F1E6~FF)
  • 絵文字の肌色指定 (U+1F3FB~F)
例> 𠮟る/りんご/tréma → amért/ごんり/る𠮟
実行前 𠮟 ご t r m a
Unicode 20B9F 308B 308A 3093 3053 3099 0074 0072 0065 0301 006D 0061
UTF-16 D842 DF9F 308B ※同上 ※同上
実行後 𠮟 ご a m r t
308B 20B9F 3053 3099 3093 308A 0061 006D 0065 0301 0072 0074
308B D842 DF9F ※同上 ※同上
f.push(["文字を逆順並べ","R",function(a){ //2017/06/25
  var X=new RegExp(/[\x00-\x1F\x7F-\x9F\xAD\u2028\u2029\uFEFF]|(?:(?:\uD83C[\uDDE6-\uDDFF]){2}|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\s\S])(?:[\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\u3099\u309A\uFE20-\uFE2F\u200C\u200D\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF]|\uD83C[\uDFFB-\uDFFF])*/g); return a.replace(/[^\n]+/g,function(s){return s.match(X).reverse().join("")}) }]);
文字をシャッフル
各行の文字をランダムに並べ替えます。
例> 文字をシャッフル → フ字をャシッル文
f.push(["文字をシャッフル","R",function(a){ //2017/06/25
  var X=new RegExp(/[\x00-\x1F\x7F-\x9F\xAD\u2028\u2029\uFEFF]|(?:(?:\uD83C[\uDDE6-\uDDFF]){2}|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\s\S])(?:[\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\u3099\u309A\uFE20-\uFE2F\u200C\u200D\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF]|\uD83C[\uDFFB-\uDFFF])*/g); return a.replace(/[^\n]+/g,function(s){var a=s.match(X),i=a.length,j,t; while(i){j=Math.floor(Math.random()*i--); t=a[i];a[i]=a[j];a[j]=t;} return a.join("")}) }]);

字種/数値変換

大文字/小文字に変換
半角/全角に変換
Mery の「選択範囲の変換」にある該当機能を呼び出します。
f.push(["大文字に変換","F",function(a){ //2013/09/15
  a.ChangeCase(meCaseUpperCase) }]);
f.push(["小文字に変換","F",function(a){ //2013/09/15
  a.ChangeCase(meCaseLowerCase) }]);
f.push(["半角に変換","F",function(a){ //2013/09/15
  a.ChangeWidth(meWidthHalfWidth) }]);
f.push(["全角に変換","F",function(a){ //2013/09/15
  a.ChangeWidth(meWidthFullWidth) }]);
★半角英数→全角
★全角英数→半角
f.push(["半角英数→全角","R",function(a){ //2014/02/10
  return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]);
f.push(["全角英数→半角","R",function(a){ //2014/02/10
  return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]);
★半角カナ→全角
★全角カナ→半角
f.push(["半角カナ→全角","R",function(a){ //2015/03/14
  return a.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
f.push(["全角カナ→半角","R",function(a){ //2015/03/14
  return a.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]) }]);
★全角かな→カナ
★全角カナ→かな
全角ひらがなと全角カタカナを変換します。
ただし、ヴヵヶ → ゔゕゖ の変換は行いません(Shift_JIS では保存できない文字のため)。
f.push(["全角かな→カナ","R",function(a){ //2014/02/10
  return a.replace(/[\u3041-\u3096ゝゞ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x60)}) }]);
f.push(["全角カナ→かな(ヴヵヶ除く)","R",function(a){ //2015/02/14
  return a.replace(/[\u30A1-\u30F3ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
ヴヵヶ → ゔゕゖ の変換も行う場合は、下記の内容に差し替えてください。
f.push(["全角カナ→かな","R",function(a){ //2014/02/10
  return a.replace(/[\u30A1-\u30F6ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
標準変換
マクロ「標準変換」を移植(一部改変)したものです。
全角英数・全角記号は半角に、半角カナは全角に変換します。
文字 変換前 文字 標準変換版 文字 テキスト整形版
全角左シングルクォート ` 半角グレーブアクセント ' 半角アポストロフィー/シングルクォート
全角グレーブアクセント ※変換しない ` 半角グレーブアクセント/バッククォート
f.push(["標準変換","R",function(a){ //2015/03/14
  return a.replaceBatch([ [" "," "],["!","!"],["“",'"'],["”",'"'],["#","#"],["$","$"],["%","%"],["&","&"],["‘","'"],["’","'"],["(","("],[")",")"],["*","*"],["+","+"],[",",","],["-","-"],[".","."],["/","/"],["0","0"],["1","1"],["2","2"],["3","3"],["4","4"],["5","5"],["6","6"],["7","7"],["8","8"],["9","9"],[":",":"],[";",";"],["<","<"],["=","="],[">",">"],["?","?"],["@","@"],["A","A"],["B","B"],["C","C"],["D","D"],["E","E"],["F","F"],["G","G"],["H","H"],["I","I"],["J","J"],["K","K"],["L","L"],["M","M"],["N","N"],["O","O"],["P","P"],["Q","Q"],["R","R"],["S","S"],["T","T"],["U","U"],["V","V"],["W","W"],["X","X"],["Y","Y"],["Z","Z"],["[","["],["¥","\\"],["]","]"],["^","^"],["_","_"],["`","`"],["a","a"],["b","b"],["c","c"],["d","d"],["e","e"],["f","f"],["g","g"],["h","h"],["i","i"],["j","j"],["k","k"],["l","l"],["m","m"],["n","n"],["o","o"],["p","p"],["q","q"],["r","r"],["s","s"],["t","t"],["u","u"],["v","v"],["w","w"],["x","x"],["y","y"],["z","z"],["{","{"],["|","|"],["}","}"],["~","~"],["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
表外漢字→代替
表外漢字字体表 1022字のうち Shift_JIS (CP932) では保存できない文字40字を、保存できる文字で代用します。
𠮟
f.push(["表外漢字→代替","R",function(a){ //2017/06/25
  return a.replaceBatch([ ["\u555E","唖"],["\u7130","焔"],["\u9DD7","鴎"],["\u6451","掴"],["\u9EB4","麹"],["\u5653","嘘"],["\u4FE0","侠"],["\u9830","頬"],["\u8EC0","躯"],["\u4FF1","倶"],["\u7E6B","繋"],["\u59F8","妍"],["\u9E7C","鹸"],["\u5699","噛"],["\u6522","攅"],["\uD842\uDF9F","叱"],["\u7E61","繍"],["\u8523","蒋"],["\u91AC","醤"],["\u87EC","蝉"],["\u6414","掻"],["\u7626","痩"],["\u9A52","騨"],["\u7C1E","箪"],["\u5861","填"],["\u985A","顛"],["\u79B1","祷"],["\u7006","涜"],["\u541E","呑"],["\u56CA","嚢"],["\u525D","剥"],["\u6F51","溌"],["\u91B1","醗"],["\u5C5B","屏"],["\u5E77","并"],["\u9EB5","麺"],["\u840A","莱"],["\u5C62","屡"],["\u6CAA","濾"],["\u881F","蝋"] ]) }]);
★10→16進数
半角数字列を10進数値とみなし、16進数値に変換します。
例> 291/15/44015 → 123/F/ABEF
f.push(["10→16進数","R",function(a){ //2014/05/31
  return a.replace(/[0-9]+/g,function(s){return Number(s).toString(16).toUpperCase()}) }]);
★16→10進数
半角英数字列を16進数値とみなし、10進数値に変換します。英字の大小、0x の有無は問いません。
例> 123/0x0F/abef → 291/15/44015
f.push(["16→10進数","R",function(a){ //2017/06/25
  return a.replace(/(?:0x)?([0-9a-f]+)/gi,function(s,x){return Number("0x"+x)}) }]);
2進接頭辞換算
半角数字列を 210 = 1024 の倍量単位 (Ki,Mi,Gi...Yi) に変換します(小数点第3位を四捨五入)。
例> 1023/1024/54321/1,048,576/1,073,741,824 → 1023/1.00Ki/53.05Ki/1.00Mi/1.00Gi
f.push(["2進接頭辞換算","R",function(a){ //2015/03/14
  var k=1024,p="?KMGTPEZY"; return a.replace(/[0-9]+(,?[0-9]{3})+/g,function(s){var x=0,n=s.replace(/,/g,""); if(n<k)return s; while(n>=k&&x<8){n/=k;x++} return n.toFixed(2)+p.charAt(x)+"i"}) }]);

符号化/復号化

URL %エンコード/デコード(UTF-8)
URL アドレスに使用される UTF-8 パーセントエンコーディングの符号化/復号化を行います。
f.push(["URL %エンコード(UTF-8)","R",function(a){ //2014/02/01
  return encodeURI(a).replace(/%0D%0A|%0D|%0A/g,"\n") }]);
f.push(["URL %デコード(UTF-8)","R",function(a){ //2014/02/01
  return decodeURIComponent(a) }]);
Base64エンコード/デコード(UTF-8)
Base64 形式の符号化/復号化を行います。
※バイナリデータ(画像や音声など)の復号化は、[編集]→[選択範囲の変換]→[Base64デコード] をご利用ください。
エンコード時の注意点
  • 改行は LF (0x0A) とみなされます(Mery の内部改行文字が LF のため)。
デコード時の注意点
  • デコード前に A~Z a~z 0~9 + / 以外の文字(改行含む)は削除されます。
f.push(["Base64エンコード(UTF-8)","R",function(txt){ //2015/03/14
  txt=unescape(encodeURIComponent(txt)); var len=txt.length, out="", map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); for(var i=0;i<len;i+=3){var tmp=(txt.charCodeAt(i)<<16)|(txt.charCodeAt(i+1)<<8)|(txt.charCodeAt(i+2)); out+=map[tmp>>>18&0x3F]+map[tmp>>>12&0x3F]+map[tmp>>>6&0x3F]+map[tmp&0x3F]} if(len%3)out=out.slice(0,len%3-3)+"===".slice(len%3); return out }]);
f.push(["Base64デコード(UTF-8)","R",function(txt){ //2015/03/14
  txt=txt.replace(/[^A-Za-z0-9+/]/g,""); var len=txt.length, out="", map=[], chr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for(var i=0;i<chr.length;i++){map[chr.charAt(i)]=i} for(var i=0;i<len;i+=4){var tmp=(map[txt.charAt(i)]<<18)|(map[txt.charAt(i+1)]<<12)|(map[txt.charAt(i+2)]<<6)|(map[txt.charAt(i+3)]); out+=String.fromCharCode(tmp>>>16&0xFF,tmp>>>8&0xFF,tmp&0xFF)} out=out.replace(/([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}){1,50}/g,function(str){return decodeURIComponent(escape(str))}); if(len%4)out=out.slice(0,len%4-4); return out }]);
\uHHHH エンコード/デコード
JavaScript などで使用される \uHHHH 形式の変換を行います。※HHHH=4桁の16進数・UTF-16BEバイナリ値
例> Aわ𠀋 ←→ \u0041\u308F\uD840\uDC0B
f.push(["\\uHHHH エンコード","R",function(a){ //2017/06/25
  return a.replace(/[^\n]/g,function(s){return "\\u"+("000"+s.charCodeAt(0).toString(16).toUpperCase()).slice(-4)}) }]);
f.push(["\\uHHHH デコード","R",function(a){ //2014/10/12
  return a.replace(/\\u([0-9A-Fa-f]{4})/g,function(s,n){return String.fromCharCode(Number("0x"+n))}) }]);
\u4H \U8H エンコード/デコード
Unicode で使用される \u4H および \U8H 形式の変換を行います。※4H, 8H=4桁, 8桁の16進数・Unicodeスカラー値
例> Aわ𠀋 ←→ \u0041\u308F\U0002000B
f.push(["\\u4H \\U8H エンコード","R",function(a){ //2017/06/25
  return a.replace(/[^\n]+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00);r+="\\U"+toHex(u,8);continue}} r+="\\u"+toHex(u,4)} return r}); function toHex(n,d){return ("000"+n.toString(16).toUpperCase()).slice(-d)} }]);
f.push(["\\u4H \\U8H デコード","R",function(a){ //2015/09/30
  return a.replace(/\\u([0-9A-Fa-f]{4})|\\U([0-9A-Fa-f]{8})/g,function(s,u4,U8){var n=Number("0x"+(u4||U8)); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);
\x{hex} エンコード/デコード
Mery の正規表現 (鬼車/鬼雲) などで使用される \x{hex} 形式の変換を行います。※hex=1~6桁の16進数・Unicodeスカラー値
例> Aわ𠀋 ←→ \x{41}\x{308f}\x{2000b}
f.push(["\x{hex} エンコード","R",function(a){ //2017/06/25
  return a.replace(/[^\n]+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("\\x{"+u.toString(16)+"}")} return r}) }]);
f.push(["\x{hex} デコード","R",function(a){ //2015/03/14
  return a.replace(/\\x\{([0-9A-Fa-f]{1,6})\}/g,function(s,n){n=Number("0x"+n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);
&#dec; エンコード/デコード
HTML などで使用される &#dec; 形式の変換を行います。※dec=1~7桁の10進数・Unicodeスカラー値
例> Aわ𠀋 ←→ &#65;&#12431;&#131083;
f.push(["&&#dec; エンコード","R",function(a){ //2017/06/25
  return a.replace(/[^\n]+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("&#"+u+";")} return r}) }]);
f.push(["&&#dec; デコード","R",function(a){ //2015/03/14
  return a.replace(/&#([0-9]{1,7});/g,function(s,n){n=Number(n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);
&#xHEX; エンコード/デコード
HTML などで使用される &#xHEX; 形式の変換を行います。※HEX=1~6桁の16進数・Unicodeスカラー値
例> Aわ𠀋 ←→ &#x41;&#x308F;&#x2000B;
f.push(["&&#xHEX; エンコード","R",function(a){ //2017/06/25
  return a.replace(/[^\n]+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("&#x"+u.toString(16).toUpperCase()+";")} return r}) }]);
f.push(["&&#xHEX; デコード","R",function(a){ //2017/06/25
  return a.replace(/&#[Xx]([0-9A-Fa-f]{1,6});/g,function(s,n){n=Number("0x"+n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);

コマンド テンプレート

拡張コードの雛形を挿入します。コマンドを自作したい場合にご利用ください。

f.push(["コマンド テンプレート",function(f){ //2015/03/14
f.push(["コマンド F (Function)","F",function(a){
  var p='f.push(["","F",function(a){\n  ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]);
f.push(["コマンド R (Replace)","F",function(a){
  var p='f.push(["","R",function(a){\n  return ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]);
f.push(["コマンド RS (Select-line)","F",function(a){
  var p='f.push(["","RS",function(a){\n  return ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]);
f.push(["サブメニュー","F",function(a){
  var p='f.push(["",function(f){\n',s='}]);\n'; Document.Write(p+a.Text+s) }]);
f.push(["セパレータ","F",function(a){
  a.StartOfLine(); Document.Write('f.push(["----"]);\n') }]);
}]);
連続置換・配列作成補助
replaceBatch (連続置換メソッド) の配列作成を補助するコマンド群です。
※書式の解析精度は不完全です。検索/置換文字に " ' , / \ ] を含む配列は誤変換する恐れがあります。
※書式ミスがある場合については考慮していません。誤変換した場合は書式ミスの可能性も疑ってみてください。
交換 ["a","b"] → ["b","a"]
配列の検索文字列と置換文字列を入れ替えます。※正規表現は検索/置換の役割を交換できないため何もしません(例では ■,□ のペアが該当)。
例> ["●","○"],['▲','△'],[/■/g,"□"],["◆",'◇']["○","●"],['△','▲'],[/■/g,"□"],['◇',"◆"]
f.push(['交換 ["a","b"] → ["b","a"]',"R",function(a){ //2014/05/31
  return a.replace(/\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'),("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*')\]/g,"[$2,$1]") }]);
分割 ["a","b"] → "a" › "b"↵
結合 "a" › "b"↵ → ["a","b"]
配列と TSV 形式を変換します。
f.push(['分割 ["a","b"] → "a" \u203A "b"\u21B5',"R",function(a){ //2017/06/25
  return a.replace(/,?\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'|\/.*?\/[gim]*),("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*')\],?/g,"\n$1\t$2\n").replace(/\n\n/g,"\n") }]);
f.push(['結合 "a" \u203A "b"\u21B5 → ["a","b"]',"R",function(a){ //2015/03/14
  return a.replace(/\n?(((".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*)+)/g,function(s,r){return r.replace(/(".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*/g,"[$1,$2],").replace(/,$/,"")}) }]);

拡張コード:書式

コマンド

モード F (Function)
f.push(["コマンド名","F",function( 引数 ){ マクロ }]);
【マクロ】の記述をそのまま実行します。
コマンド実行時、以下の処理が行われます。
(function( 引数 ){ マクロ })( Document.Selection );
モード R (Replace)
モード RS (Select-line)
f.push(["コマンド名","R",function( 引数 ){ マクロ }]);
f.push(["コマンド名","RS",function( 引数 ){ マクロ }]);
モード R は、選択範囲を【マクロ】の処理結果で置換します。
モード RS は、選択範囲を行頭行末まで拡張してから置換します。
コマンド実行時、以下の処理が行われます。
Document.Selection.Text = (function( 引数 ){ マクロ })( Document.Selection.Text );
また、コマンド実行前に選択範囲を記憶し、実行後に処理結果を加味しつつ復元します。

サブメニュー

サブメニューを設けます。
サブメニュー内にサブメニューを作ること(階層化)も可能です。

f.push(["メニュー名",function(f){
【コマンド or サブメニュー or セパレータ】
}]);

セパレータ

セパレータ(区切り)を設けます。

f.push(["----"]);

半角ハイフン - の数は何個でもかまいません。
ただし、半角ハイフン以外の文字を含めることはできません。

f.push(["-"]);         	//← OK (1個)
f.push(["----------"]);	//← OK (10個)
f.push(["--区切り--"]);	//← NG

メソッド

string.replaceBatch(array)
stringarray (配列) の内容に従い連続置換した結果(文字列)を返します。
f.push(["replaceBatch","R",function(a){
  return a.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]);
replaceBatch は、replace を連鎖させる記法(メソッドチェーン)をより簡素に記述するためのメソッドです。
上記のコマンドは、下記のコマンドと同一の処理になります。
f.push(["replace","R",function(a){
  return a.replace(/ABC/g,"DEF").replace(/\(1\)/g,"①").replace(/GHI/gi,"JKL") }]);
replaceBatch は、String のメソッドであるため、どのモードでも利用できます。
また、戻値も String であるため、replace のようにメソッドチェーンが行えます。
//※モード R で利用する
f.push(["コマンド名","R",function(a){
  return a.replaceBatch([ 省略 ]) }]);
//※モード RS で利用する
f.push(["コマンド名","RS",function(a){
  return a.replaceBatch([ 省略 ]) }]);
//※モード F で利用する
f.push(["コマンド名","F",function(a){
  a.Text = a.Text.replaceBatch([ 省略 ]) }]);
//※replace のようにメソッドチェーンが可能
f.push(["コマンド名","R",function(a){
  return a.replace(省略).replaceBatch([ 省略 ]).replace(省略) }]);