テキスト整形

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

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

【主な改造点】

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

【注意点】

  • 表示行での処理には対応していません。※このページで使用される 各行・行頭・行末 とは、論理行を意味しています。
  • マクロの仕様上、矩形選択での処理には対応していません。※Mery 2.1.0 以降の Replace メソッドを利用すれば一応は可能です。

お知らせ (2015/03/14)[編集]

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

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

スターターパック[編集]

ダウンロード→ テキスト整形.zip (2015/12/26 更新)

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

更新履歴[編集]

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

  • 2015/12/26
    • 仕様変更 - アイコンの指定先を "My Macros\テキスト整形.ico" ⇒ "テキスト整形.ico" に変更。
    • 変更 - マクロフォルダを開く
      コマンド名「My Macros フォルダを開く」→「マクロフォルダを開く」に変更。
      My 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+1F3FB~F)、国旗 (U+1F1E6~FF) を追加。
    • 改名 - \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
    • 追加 - ★連続する!?を整形 ¦ ★全角ダッシュ(――)に整形
    • 変更 - ★括弧前の句読点を除去
      全角カンマ , /全角ピリオド . を除去対象に追加。
    • 変更 - ★三点リーダー(……)に整形
      全角カンマ , /全角ピリオド . /半角中黒 ・ /三点リーダー … /二点リーダー ‥ を変換対象に追加。
    • 変更 - My Macros フォルダを開く
      処理方法を 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 で、正規表現の特殊文字があると誤動作する不具合を修正し、正規表現 (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-2015/09/30
 
//■拡張コード:コマンド一覧
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;
  for (var i=0,n=a.length; i<n; i++) {
    if (typeof a[i][0]==="string") //◆特殊文字をエスケープし、"g"フラグを付加
      a[i][0] = new RegExp(a[i][0].replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"),"g");
    _this = _this.replace(a[i][0],a[i][1]);
  }
  return _this;
};
 
//■実行コード
(function(){
  var sel = Document.Selection;
  var cmd = [], cid = 1; //コマンド格納用,ID
  //メニュー生成用関数
  function ListToMenu(List, Menu) {
    for (var i=0, n=List.length; i<n; i++) {
      var $L = List[i], $Ln = List[i].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_popup = CreatePopupMenu();
        $L[1](sub_f);
        Menu.AddPopup($L[0], sub_popup);
        ListToMenu(sub_f, sub_popup); //再帰処理:サブメニュー作成
        break;
      //◆セパレータ	$L = ["----"]
      case ($Ln===1 && /^-+$/.test($L[0])):
        Menu.Add("", 0, meMenuSeparator);
        break;
      }
    }
  };
  //コマンド一覧からメニュー生成
  var popup = CreatePopupMenu();
  ListToMenu(f, popup);
  //ポップアップメニューを表示して処理
  if (cid = popup.Track(mePosMouse)) { //※キャンセル(Esc)時は0が返る
    var $C = cmd[cid];
    switch ($C["mode"]) {
    case "F":	//関数を実行
      $C["func"](sel);
      break;
    case "RS":	//選択範囲を行頭行末まで拡張
      selectLine();
      //↓FALL THROUGH
    case "R":	//選択範囲を置換
      var pos = new Pos();	//選択範囲の記憶
      sel.Text = $C["func"](sel.Text);
      pos.set();		//選択範囲の設定
      break;
    }
  }
 
//■選択範囲を行頭行末まで拡張
function selectLine() {
  var sel = Document.Selection;
  var ty = sel.GetTopPointY(mePosLogical);
  var by = sel.GetBottomPointY(mePosLogical);
  var bx = sel.GetBottomPointX(mePosLogical);
  var br =(sel.Text.match(/\n/g)||[]).length;
  if (bx==1 && by-ty==br && br) by--;	//次行行頭を含めないよう対策
  sel.SetActivePoint(mePosLogical, 1, by);
  sel.EndOfLine(false, mePosLogical);
  sel.SetAnchorPoint(mePosLogical, 1, ty);
};
//■位置情報オブジェクト
function Pos() {
  var sel = Document.Selection;
  this.get = function() {
    this.acp = sel.GetActivePos();
    this.anp = sel.GetAnchorPos();
    this.len = Document.Text.length;
  };
  this.set = function() { //字数変化を加味して範囲選択
    var acp = this.acp, anp = this.anp, gap = Document.Text.length - this.len;
    sel.SetActivePos((acp<anp)? acp: acp+gap);
    sel.SetAnchorPos((acp<anp)? anp+gap: anp);
  };
  return this.get();
};
 
})();

拡張コード:コマンド[編集]

  • (移植) の項目は、マクロ「テキスト変換」から移植したコマンドです。
  • ★印の項目は、スターターパックに収録されているコマンドです。

小説/作文 用途[編集]

★地の文の行頭を字下げ
左引用符 ‘ “ /開き括弧 ( 〔 [ { 〈 《 「 『 【 および 半角空白/全角空白/水平タブ/改行以外の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。
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,"") }]);
★連続する!?を整形
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文字 ―― に整形します。
例> そんなーーー。 → そんな――。
※変換対象となるのは以下の5パターンです。
名称 連続字数 Shift_JIS Unicode
全角長音符 2字以上 ーー 0x815B U+30FC
em ダッシュ
(全角ダッシュ)
—— - U+2014
全角ダッシュ
(水平線)
―― 0x815C U+2015
全角マイナス -- 0x817C U+FF0D
罫線(横) ── 0x849F U+2500
f.push(["全角ダッシュ(――)に整形","R",function(a){ //2014/03/01
  return a.replace(/ー{2,}|\u2014{2,}|―{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?/ig,"\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){ //2015/03/14
  return a.replace(/&#([0-9]{1,7});|&#x([0-9A-Fa-f]{1,6});/g,function(s,nd,nx){var n=Number(nd||"0x"+nx); 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文字を単語検索
空白文字などを除く ASCII 印字可能文字 (U+0021~007E) が1文字以上連続する箇所を検索します。
f.push(["ASCII文字を単語検索","F",function(a){ //2015/03/14
  var RE="!-~"; a.Find("(?<!["+RE+"])["+RE+"]+", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
半角カナを単語検索
半角カナ類 (。 「 」 、 ・ ヲ~ッ ー ア~ン ゙ ゚) が1文字以上連続する箇所を検索します。
f.push(["半角カナを単語検索","F",function(a){ //2015/03/14
  var RE="。-゚"; a.Find("(?<!["+RE+"])["+RE+"]+", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
全角英数を単語検索
全角英数字 (0~9 A~Z a~z) が1文字以上連続する箇所を検索します。
f.push(["全角英数を単語検索","F",function(a){ //2015/03/14
  var RE="0-9A-Za-z"; a.Find("(?<!["+RE+"])["+RE+"]+", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
CJK漢字を単語検索
CJK (China/Japan/Korea) の漢字が1文字以上連続する箇所を検索します。
f.push(["CJK漢字を単語検索","F",function(a){ //2015/03/26
  var Han="\\p{Han}",VS="\\x{FE00}-\\x{FE02}\\x{E0100}-\\x{E01EF}"; a.Find("(?<!["+Han+"]["+VS+"]|["+Han+"])(["+Han+"]["+VS+"]?)+", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
ひらがなを単語検索
カタカナを単語検索
平仮名/片仮名が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){ //2015/09/30
  var Mark="(?<m>[\\x{3099}\\x{309A}゛゙゜゚ーー])",Kana="(?<k>[ぁ-\\x{3096}ゝゞ\\x{309F}])"; a.Find("(?<!\\g<k>\\g<m>\\g<m>|\\g<k>\\g<m>|\\g<k>)("+Kana+Mark+"*)+", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
f.push(["カタカナを単語検索","F",function(a){ //2015/09/30
  var Mark="(?<m>[\\x{3099}\\x{309A}゛゙゜゚ーー])",Kana="(?<k>[ァ-\\x{30FA}ヽヾ\\x{30FF}ヲ-ッア-ン\\x{31F0}-\\x{31FF}])"; a.Find("(?<!\\g<k>\\g<m>\\g<m>|\\g<k>\\g<m>|\\g<k>)("+Kana+Mark+"*)+", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
CP932依存文字を検索
Shift_JIS (CP932) における機種依存文字 (NEC特殊文字 / IBM拡張文字 / ユーザー定義外字 / 未定義文字) を検索します。
f.push(["CP932依存文字を検索","F",function(a){ //2015/09/30
  a.Find("[纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑①-⑳Ⅰ-Ⅹⅰ-ⅹ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼㍻∮∑∟⊿¦'"\\x{E000}-\\x{E757}\\x{80}\\x{F8F0}-\\x{F8F3}]", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
サロゲートペアを検索
UTF-16において2バイト2個組で1文字を形成する文字 (U+10000~10FFFF) を検索します。
f.push(["サロゲートペアを検索","F",function(a){ //2015/09/30
  a.Find("[\\x{10000}-\\x{10FFFF}]", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
選択文字列を検索
「検索する文字列」に選択文字列を設定して「次/下を検索」します。
「次/前の文字列を検索」と異なり、改行を含む文字列(複数行)も検索できるのが特徴です。
※Mery の仕様上、改行を含む場合は検索強調が効きません。
f.push(["選択文字列を検索","F",function(a){ //2015/02/14
  if(a.Text)a.Find(a.Text.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"), meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
選択文字列をすべて削除
「検索する文字列」に選択文字列を、「置換後の文字列」に空欄を設定して「すべて置換」します。
上記のコマンド「選択文字列を検索」と同様、改行を含む文字列(複数行)も削除できます。
※検索強調が解除されます(正確には変更)。
f.push(["選択文字列をすべて削除","F",function(a){ //2015/02/14
  if(a.Text)a.Replace(a.Text.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"),"", meFindReplaceRegExp+meFindReplaceCase+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")) }]);

挿入/貼付[編集]

★半角/全角の間を空ける
★半角英数/全角の間を空ける
半角文字/半角英数と全角文字の間に半角空白を挿入します。
※半角文字=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,s1,s2){return s1+s2.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 の置換機能を利用して各行の先頭/末尾に挿入します。
※矩形対応には 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){ //2014/02/16
  return a.replace(/[  \t]+/g,"") }]);
★行頭行末の空白を除去 (移植)
★行頭の/行末の空白を除去 (移植)
行頭および行末にある空白文字を除去します。
f.push(["行頭行末の空白を除去","RS",function(a){ //2015/02/14
  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){ //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){ //2015/02/14
  var a=a.split("\n"),b=[],map={}; for(var i=0,n=a.length;i<n;i++){ if(!map[a[i]]){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]);
重複行を削除(空白行は除く)
空白行(改行/半角空白/全角空白/水平タブのみの行)は例外とし、削除しません。
f.push(["重複行を削除(空白行は除く)","RS",function(a){ //2015/02/14
  var a=a.split("\n"),b=[],map={}; for(var i=0,n=a.length;i<n;i++){ if(/^[  \t]*$/.test(a[i])||!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") }]);
※空白行/重複行削除系コマンドの違い (☐ は空白/↵ は改行)
空白行 重複行
実行前 ~を削除 ~を圧縮 ~を減量 実行前 ~を削除 空白行は除く 連続する~
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:""}) }]);

並べ替え[編集]

行の並べ替え(Unicode 昇順/降順) (移植)
行をUnicode(UTF-16)順で並べ替えます。
※より柔軟に並べ替えたい場合は「行並べ替え」マクロの導入をオススメします。
f.push(["行の並べ替え(Unicode 昇順)","RS",function(a){ //2014/02/16
  return a.split("\n").sort().join("\n") }]);
f.push(["行の並べ替え(Unicode 降順)","RS",function(a){ //2014/02/16
  return a.split("\n").sort().reverse().join("\n") }]);
行の並べ替え(逆順)
行を逆順に並べ替えます。
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+1F3FB~F)
  • 絵文字の国旗 (U+1F1E6~FF)
例> 𠮟る/りんご/tréma → amért/ごんり/る𠮟
実行前 𠮟 t r é m a
Unicode 20B9F 308B 308A 3093 3053 3099 0074 0072 0065 0301 006D 0061
UTF-16BE 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){ //2015/09/30
  var re=new RegExp(/(?:(?:\uD83C[\uDDE6-\uDDFF]){2}|[\uD800-\uDBFF][\uDC00-\uDFFF]|.)(?:[\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\u3099\u309A\uFE20-\uFE2F\u200C\u200D\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF]|\uD83C[\uDFFB-\uDFFF])*|\n/g); return a.replace(/.+/g,function(s){return s.match(re).reverse().join("")}) }]);
文字のシャッフル
各行の文字をランダムに並べ替えます。
例> 文字のシャッフル → フ字のャシッル文
f.push(["文字のシャッフル","R",function(a){ //2015/09/30
  var re=new RegExp(/(?:(?:\uD83C[\uDDE6-\uDDFF]){2}|[\uD800-\uDBFF][\uDC00-\uDFFF]|.)(?:[\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\u3099\u309A\uFE20-\uFE2F\u200C\u200D\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF]|\uD83C[\uDFFB-\uDFFF])*|\n/g); return a.replace(/.+/g,function(s){var a=s.match(re),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) }]);
半角/全角に変換
Mery の「選択範囲の変換」機能の一部を再現したものです。
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"],["{","{"],["|","|"],["}","}"],["~","~"],["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
★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){ //2014/10/12
  return a.replace(/(?:0x)?([0-9A-Fa-f]+)/g,function(s,n){return Number("0x"+n)}) }]);
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){ //2014/02/22
  return a.replace(/./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){ //2015/09/30
  return a.replace(/.+/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){ //2014/10/12
  return a.replace(/.+/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){ //2014/10/12
  return a.replace(/.+/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){ //2014/10/12
  return a.replace(/.+/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){ //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}) }]);

コマンド テンプレート[編集]

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

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){ //2015/03/14
  return a.replace(/\[("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|\/.*?\/[igm]*),("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\],?/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?(((".*"|'.*'|\/.*\/[igm]*)\t(".*"|'.*')\n*)+)/g,function(s,s1){return s1.replace(/(".*"|'.*'|\/.*\/[igm]*)\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/ig,"JKL"] ]) }]);
replaceBatch は、replace を連鎖させる記法(メソッドチェーン)をより簡素に記述するためのメソッドです。
上記のコマンドは、下記のコマンドと同一の処理になります。
f.push(["replace","R",function(a){
  return a.replace(/ABC/g,"DEF").replace(/\(1\)/g,"①").replace(/GHI/ig,"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(省略) }]);