テキスト整形

提供: MeryWiki
2014年5月24日 (土) 21:14時点におけるMasme (トーク | 投稿記録)による版 (コマンド変更3個(修正1個含む)。他)
ナビゲーションに移動 検索に移動

ks 氏作のマクロ「テキスト変換」の改造版です。
※用途が変換に限らなくなったため、名称を変更しました。

【主な改造点】

  • コマンド書式を変更した。
    • 簡易書式をベースに単純化。オプション・第2引数は削除。
    • 関数タイプ replace/S/L は、モード R/RS/RM に改称。
  • モード F (関数を実行) を追加。JScript や Mery の関数をそのまま実行することができます。
  • モード CR (連続置換) を追加。配列を利用した文字列置換ができます。
  • モード RS/RM で行選択した場合、次行行頭=範囲終了行末の改行を範囲に含めないようにした。
  • 範囲選択時に対象範囲を選ぶメニューを廃止した。(毎回範囲を選ぶのが面倒なため)。
  • 非選択時に文書全体を対象範囲とする仕様を廃止した。(文字列挿入系コマンドを利用できるようにするため)。
    ※文書全体を対象にしたい場合は「すべて選択」 (Ctrl+A) してから実行してください。

【注意点】

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

スターターパック

ダウンロード→ テキスト整形.zip (2014/03/08 更新)

  • 基本コード と 拡張コード(★印の項目) をまとめて、すぐ使えるようにしてあります。
    ファイル:テキスト整形.zip のページに収録コマンド一覧が掲載されています。
  • 拙作ですがアイコンファイルを同梱してあります。
    Mery の My Macros フォルダにアイコンファイル (テキスト整形.ico) を配置すれば、ツールバーにアイコンが読み込まれます。

更新履歴

ファイル:テキスト整形.zip

  • 2014/05/24
    • コマンド修正 - 各行末尾に文字列付加
      選択範囲の次行先頭にも文字列付加してしまう問題に対処。
    • コマンド変更 - 複製貼り付け
      クリップボードの内容を変数に格納して利用するように変更(高速化)。
    • コマンド変更 - 複製貼り付け/各行先頭に文字列付加/各行末尾に文字列付加
      Prompt() 関連の処理を単純にした(モード RM 以外では冗長なため)。
  • 2014/05/22
    • コマンド追加 - 2進接頭辞換算(Ki,Mi,Gi...)
    • コマンド変更 - Unicode \x{hex} → 文字/Unicode &#dec; → 文字
      サロゲートペアの String.fromCharCode() の引数を複数指定に改修、ビット演算に変更。
  • 2014/05/16
    • コマンド変更 - Unicode 文字 → \x{hex}/Unicode 文字 → &#dec;
      処理方法を replace(for ループ) に統一(手法を改善)。
  • 2014/04/27
    • コマンド追加 - Unicode 文字 → &#dec;/Unicode &#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) → ⑳
    • コマンド変更 - 文字の並び順を逆転/Unicode 文字 → \uHHHH/Unicode 文字 → \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
    • コマンド追加 - ★空白行を削除/Unicode \uHHHH → 文字/Unicode 文字 → \x{hex}/Unicode \x{hex} → 文字
    • スターター除外 - ☆空白行を圧縮
    • コマンド変更 - 挿入 confirm(|)
      接尾辞の長さ(s.length)でカーソル移動量を決めるようにした。
  • 2014/02/01
    • コマンド追加 - Unicode 文字 → \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 を変換対象に含めていたミスを修正。コマンド名を改正(旧名:10進数に変換)。
  • 2013/12/30
    • コマンド追加 - 挿入 confirm(|)/★数値を3桁,区切りに/★10→16進数/★16→10進数
    • コマンド修正 - My Macros フォルダを開く
      マクロの場所からではなく Mery.exe の場所からパスを取得するようにした。
  • 2013/09/15
    • 初版公開。

基本コード

//■テキスト整形
// 2013/09/15-2014/02/16

//■拡張コード:コマンド一覧
var f = [];
// ----------------- ↓ここより下に拡張コードを追加

// ----------------- ↑ここより上に拡張コードを追加
/*■拡張コード:コマンド書式
//▼コマンド
f.push(["コマンド名","モード",function(引数){マクロ}]);
【モード】
  F  (Function)    - 関数を実行
  R  (Replace)     - 選択範囲を置換
  RS (Select-line) - 選択範囲を行頭末まで拡張して置換
  RM (Multi-line)  - 選択範囲を一行ごとに分割して置換
  CR (Chain)       - リスト(配列)の内容に従い連続置換
【引数】
 (モード F)        - Document.Selection
 (モード R/RS/RM)  - Document.Selection.Text
 (モード CR)       - (引数なし)
//▼サブメニュー
f.push(["メニュー名",function(f){コマンドなど}]);
//▼セパレータ
f.push(["----"]);
// ----------------- */

//■実行コード
(function(){
  var sel = Document.Selection;
  var cmd = [], cid = 1; //コマンド格納用,ID
  //メニュー生成用関数
  function ListToMenu(List, Menu) {
    for (var i=0; i<List.length; i++) {
      var $L = List[i], $Ln = List[i].length;
      if (typeof $L[0]!="string") continue;
      switch (true) {
      case ($Ln==3):	//コマンド	$L = ["コマンド名","モード",function]
        if (typeof $L[2]=="function" && /^(F|R|RS|RM|CR)$/.test($L[1])) {
          cmd[cid] = {"mode":$L[1], "func":$L[2]};
          Menu.Add($L[0]+"\t"+$L[1], cid++);
        } break;
      case ($Ln==2):	//サブメニュー	$L = ["メニュー名",function]
        if (typeof $L[1]=="function") {
          var sub_popup = CreatePopupMenu();
          Menu.AddPopup($L[0], sub_popup);
          var sub_f = [];
          $L[1](sub_f);
          ListToMenu(sub_f, sub_popup); //再帰処理:サブメニュー作成
        } break;
      case ($Ln==1):	//セパレータ	$L = ["----"]
        if (/^-+$/.test($L[0])) {
          Menu.Add("", 0, meMenuSeparator);
        } break;
      }
    }
  };
  //コマンド一覧からメニュー生成
  var popup = CreatePopupMenu();
  ListToMenu(f, popup);
  //ポップアップメニューを表示して処理
  var tr = popup.Track(mePosMouse);
  if (tr) { //※キャンセル(Esc)時は0が返る
    var $C = cmd[tr];
    switch ($C["mode"]) {
    case "F":	//関数を実行
      $C["func"](sel);
      break;
    case "R":	//選択範囲を置換
      sel.Text = $C["func"](sel.Text);
      break;
    case "RS":	//行頭行末まで拡張
      sel.Text = $C["func"](SelectLine(sel));
      break;
    case "RM":	//一行ごとに処理
      sel.Text = MultiLine($C["func"], sel);
      break;
    case "CR":	//連続置換
      sel.Text = ChainReplace($C["func"](), sel);
      break;
    }
  }
  //モード RS/RM 用関数:選択範囲を行頭行末まで拡張して返す
  function SelectLine(sel) {
    var meP = mePosLogical;
    var ty = sel.GetTopPointY(meP);	//範囲開始行
    var by = sel.GetBottomPointY(meP);	//範囲終了行
    var bx = sel.GetBottomPointX(meP);
    if (ty!=by && bx==1) by--;		//行選択時、次行を含めないよう対策
    sel.SetActivePoint(meP, 1, by);
    sel.EndOfLine(false, meP);
    sel.SetAnchorPoint(meP, 1, ty);
    return sel.Text;
  };
  //モード RM 用関数:選択範囲を一行ごとに分割して処理
  function MultiLine(func, sel) {
    var result = [];
    var lines = SelectLine(sel).split("\n");
    for (var i=0; i<lines.length; i++) {
      var text = func(lines[i]);
      if (text != null) result.push(text); //戻値がnullの場合、破棄(行削除)
    }
    return result.join("\n");
  };
  //モード CR 用関数:リストに従い選択範囲を連続置換
  function ChainReplace(list, sel) {
    var text = sel.Text;
    for (var i=0; i<list.length; i++) {
      switch (true) {
      case (typeof list[i][0]=="string"):	//list[i] = ["検索","置換"]
        text = text.split(list[i][0]).join(list[i][1]);
        break;
      case (list[i][0] instanceof RegExp):	//list[i] = [/検索/,"置換"]
        text = text.replace(list[i][0],list[i][1]);
        break;
      }
    }
    return text;
  };
})();

拡張コード:コマンド

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

小説/作文 用途

★地の文の行頭を字下げ
左引用符 ‘ “ /開き括弧 ( 〔 [ { 〈 《 「 『 【 および 半角空白/全角空白/水平タブ/改行以外の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。
f.push(["地の文の行頭を字下げ","RS",function(a){
  return a.replace(/^([^‘“(〔[{〈《「『【  \t\n])/mg," $1") }]);
★括弧前の句読点を除去
右引用符 ’ ” /閉じ括弧 ) 〕 ] } 〉 》 」 』 】 の直前に句読点 、。,. がある場合、除去します。
f.push(["括弧前の句読点を除去","R",function(a){
  return a.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]);
★連続する!?を整形
2文字以上連続する感嘆符 ! /疑問符 ? を半角2文字に整形します。
例> !!/!!?/?!!!/?!!!? → !!/!?/?!/??
f.push(["連続する!?を整形","CR",function(a){
  return [ [/[!!][!?!?]*[!!]/g,"!!"],[/[!!][!?!?]*[??]/g,"!?"],[/[??][!?!?]*[!!]/g,"?!"],[/[??][!?!?]*[??]/g,"??"] ]}]);
★三点リーダー(……)に整形
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){
  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){
  return a.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}|─{2,}/g,"――") }]);
青空文庫 ルビを除去
で始まり で終わる箇所を除去します。ルビ開始位置を表す がある場合、| も除去します。
例> 一応《いちおう》何時《いつ》もの/霧の|ロンドン警視庁《スコットランドヤード》 → 一応何時もの/霧のロンドン警視庁
f.push(["青空文庫 ルビを除去","R",function(a){
  return a.replace(/(?:|(.+?))?《.*?》/g,"$1") }]);
青空文庫 注記を除去
[# で始まり で終わる箇所を除去します。
例> [#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり] → 名※
f.push(["青空文庫 注記を除去","R",function(a){
  return a.replace(/[#.*?]/g,"") }]);
外字を表す注記 ※[#~] を除去したくない場合は、下記の内容に差し替えてください。
例> [#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり] → 名※[#二の字点、1-2-22]
f.push(["青空文庫 注記(外字以外)を除去","R",function(a){
  return a.replace(/(※[#.*?])|[#.*?]/g,"$1") }]);

Web/HTML 用途

★HTMLタグを除去
f.push(["HTMLタグを除去","R",function(a){
  return a.replace(/<(".*?"|'.*?'|[^'"])*?>/g,"") }]);
★実体参照 &"<> ⇒ &xxx;/★実体参照 &xxx; ⇒ ␣><"&
HTML で使用される文字実体参照の変換を行います。
文字 実体参照 備考
< &lt; 小なり不等号 (less than)
> &gt; 大なり不等号 (greater than)
" &quot; 引用符 (quotes)
& &amp; アンド (ampersand)
  &nbsp; 改行禁止空白 (no-break space)
&nbsp; は U+00A0 (No-Break Space) ではなく、U+0020 (半角空白) に変換します。
空白文字から &nbsp; への変換は、実用上不都合が多いため行いません。
f.push(['実体参照 &&"<> → &&xxx;',"CR",function(a){
  return [ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"] ]}]);
f.push(['実体参照 &&xxx; → \u2423><"&&',"CR",function(a){
  return [ ["&nbsp;"," "],["&gt;",">"],["&lt;","<"],["&quot;",'"'],["&amp;","&"] ]}]);
数値参照 文字 ⇒ &#dec;/数値参照 &#dec; ⇒ 文字
符号化/復号化 の節の Unicode 文字 ⇒ &#dec;/Unicode &#dec; ⇒ 文字 を参照

マクロ/コード 用途

★行頭 // を付加/削除
行頭に // が無い行なら // を付加し、有る行なら // を削除します。
※このコマンドをよく利用される場合は「コメントマーク付け外し」マクロの導入をオススメします。
f.push(["行頭 \/\/ を付加/削除","RM",function(a){
  return a.match(/^\/\/.*$/)? a.slice(2): "\/\/"+a }]);
★インデント(半角空白2個)
各行の行頭に半角空白2文字を挿入します。
※このコマンドをよく利用される場合は「字下げ・字上げ」マクロの導入をオススメします。
f.push(["インデント(半角空白2個)","RM",function(a){
  return "  "+a }]);
編集中のファイルのパスをコピー/編集中の全ファイルのパスをコピー
現在編集中のファイルの絶対パスをクリップボードにコピーします。
新規作成ファイルなどパスが存在しない場合は、無題 の2文字がコピーされます。
f.push(["編集中のファイルのパスをコピー","F",function(a){
  ClipboardData.SetData(document.FullName||"無題") }]);
f.push(["編集中の全ファイルのパスをコピー","F",function(a){
  var list=[],d=Editor.Documents; for(var i=0;i<d.Count;i++){list.push(d.Item(i).FullName||"無題")} ClipboardData.SetData(list.join("\r\n")) }]);
My Macros フォルダを開く
Mery の My Macros フォルダをエクスプローラで開きます。
f.push(["My Macros フォルダを開く","F",function(a){
  new ActiveXObject("Shell.Application").Explore((new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(Editor.FullName))+"\\My Macros") }]);
挿入 confirm(|)
文字列 if(!confirm())Quit(); を挿入します。
alert() と違い、[キャンセル] ボタンを押すとマクロを強制終了できるため、無限ループにハマっても対処できます。
f.push(["挿入 confirm(|)","F",function(a){
  var p="if(!confirm(",s="))Quit();"; a.Text=p+a.Text+s; a.CharLeft(false,s.length) }]);
選択範囲を eval で評価
ステータスバーに eval(選択範囲) した結果を表示します。
たとえば、選択範囲が 10*(5+20) なら、250 と表示されます。
f.push(["選択範囲を eval で評価","F",function(a){
  if(a.Text){Status=eval(a.Text)} }]);

検索/置換

★全角英数を検索
全角英数字を検索します。
f.push(["全角英数を検索","F",function(a){
  a.Find("[0-9A-Za-z]",meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
★半角カナを検索
半角カナ類を検索します。
f.push(["半角カナを検索","F",function(a){
  a.Find("[。-゚]",meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
★CJK漢字を検索
CJK(中国/日本/韓国)で使用される漢字を検索します。
f.push(["CJK漢字を検索","F",function(a){
  a.Find("\\p{Han}",meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
選択文字列を検索
「検索する文字列」に選択文字列を設定して「次/下を検索」します。
※仕様上、複数行=改行をまたぐ場合は検索文字列が強調されません。
f.push(["選択文字列を検索","F",function(a){
  if(a.Text)a.Find(a.Text.replace(/([!$()*+./:=?[\\\]^{|}])/g,"\\$1"),"",meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
選択文字列をすべて削除
「検索する文字列」に選択文字列を、「置換後の文字列」に空欄を設定して「すべて置換」します。
※検索文字列の強調が変更されます。仕様上、複数行=改行をまたぐ場合は検索文字列が強調されません。
f.push(["選択文字列をすべて削除","F",function(a){
  if(a.Text)a.Replace(a.Text.replace(/([!$()*+./:=?[\\\]^{|}])/g,"\\$1"),"",meFindReplaceRegExp+meFindReplaceCase+meReplaceAll) }]);
★検索文字列の強調をすべて解除
「検索文字列の強調を解除」をすべての文書で実行します。ひとつひとつ解除するのが面倒な場合にご利用ください。
f.push(["検索文字列の強調をすべて解除","F",function(a){
  var d=Editor.Documents; for(var i=0;i<d.Count;i++){d.Item(i).HighlightFind=false} }]);

挿入/貼付

★半角/全角の間を空ける/★半角英数/全角の間を空ける
半角文字/半角英数と全角文字の間に半角空白を挿入します。
※ここでは、半角文字=ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。
f.push(["半角/全角の間を空ける","R",function(a){
  return a.replace(/([!-~。-゚](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[!-~。-゚]))/g,"$1 ") }]);
f.push(["半角英数/全角の間を空ける","R",function(a){
  return a.replace(/([0-9A-Za-z](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[0-9A-Za-z]))/g,"$1 ") }]);
★数値を3桁,区切りに
半角数字列を、3桁毎にカンマで区切ります。小数点以下(ピリオド . 以降の半角数字列)は桁区切りしません。
例> 12345678/1234.1234 → 12,345,678/1,234.1234
f.push(["数値を3桁,区切りに","R",function(a){
  return a.split("").reverse().join("") .replace(/(\d{3})(?=\d)(?!\d*\.)/g,"$1,") .split("").reverse().join("") }]);
複製貼り付け
クリップボードにコピーされた文字列を、入力した回数分複製してから貼り付けます。
f.push(["複製貼り付け","R",function(a){
  var r=[],c=ClipboardData.GetData(),n=Prompt("複製回数: ※半角数字",""); if(!n)Quit(); for(var i=0,n=parseInt(n);i<n;i++){r.push(c)} return r.join("") }]);
★各行行頭/各行行末に貼り付け
クリップボードにコピーされた文字列を、各行の行頭/行末に貼り付けます。
f.push(["各行行頭に貼り付け","RM",function(a){
  return ClipboardData.GetData().replace(/(\r\n|\r|\n)$/,"")+a }]);
f.push(["各行行末に貼り付け","RM",function(a){
  return a+ClipboardData.GetData().replace(/(\r\n|\r|\n)$/,"") }]);
★各行行頭/各行行末に文字列付加 (移植)
入力した文字列を、各行の行頭/行末に挿入します。
f.push(["各行行頭に文字列付加","RM",(function(a){
  var c=null; return function(a){ if(!c){ if(!(c=Prompt("各行行頭に付加する文字列:",""))){Quit()} } return c+a } })()]);
f.push(["各行行末に文字列付加","RM",(function(a){
  var c=null; return function(a){ if(!c){ if(!(c=Prompt("各行行末に付加する文字列:",""))){Quit()} } return a+c } })()]);
各行先頭/各行末尾に文字列付加 (矩形対応/Mery 2.1.0~)
入力した文字列を、Mery の置換機能を利用して各行の先頭/末尾に挿入します。
※矩形対応には Mery 2.1.0 以降が必要です。動作は Mery の矩形置換の仕様に準じます。
※Mery の置換機能を利用するため検索文字列の強調が解除されます(正確には解除でなく変更)。
※Mery の仕様上、零幅での文字挿入や矩形置換はできません。零幅で実行すると、行頭(表示行)に文字列が挿入されます。
f.push(["各行先頭に文字列付加","F",function(a){
  var c=Prompt("各行先頭に付加する文字列:",""); if(!c)Quit(); a.Replace("^",c,meReplaceSelOnly+meReplaceAll+meFindReplaceRegExp) }]);
f.push(["各行末尾に文字列付加","F",function(a){
  var c=Prompt("各行末尾に付加する文字列:",""); if(!c)Quit(); a.Replace("(?<=.|^)$",c,meReplaceSelOnly+meReplaceAll+meFindReplaceRegExp) }]);

除去/削除

★空白文字を除去
空白文字(半角空白/全角空白/水平タブ)を除去します。
f.push(["空白文字を除去","R",function(a){
  return a.replace(/[  \t]+/g,"") }]);
★行頭行末の空白を除去 (移植)
行頭および行末にある空白文字(半角空白/全角空白/水平タブ)を除去します。
f.push(["行頭行末の空白を除去","RS",function(a){
  return a.replace(/^[  \t]+|[  \t]+$/mg,"") }]);
★空白行を削除
改行のみの行、空白文字(半角空白/全角空白/水平タブ)のみの行を削除します。
f.push(["空白行を削除","RM",function(a){
  return a.match(/^[  \t]*$/)? null:a }]);
空白行を圧縮
1行の空白行は削除し、2行以上の空白行は1行に圧縮します。
ネット小説など、行空けを多用しているテキストの行間を詰めることができます。
f.push(["空白行を圧縮","R",function(a){
  return a.replace(/\n([  \t]*\n){2,}/mg,"\n\n\n").replace(/\n([  \t]*\n)/mg,"\n") }]);
★入力文字列を含む行/含まない行を削除 (移植)
f.push(["入力文字列を含む行を削除","RM",(function(a){
  var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の文字列を含む行を削除:",""))){Quit()} } return (a.indexOf(c)>=0)? null:a } })()]);
f.push(["入力文字列を含まない行を削除","RM",(function(a){
  var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の文字列を含まない行を削除:",""))){Quit()} } return (a.indexOf(c)>=0)? a:null } })()]);
★正規表現に一致する行/一致しない行を削除 (移植)
f.push(["正規表現に一致する行を削除","RM",(function(a){
  var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の正規表現に一致する行を削除:",""))){Quit()}else{c=new RegExp(c)} } return c.test(a)? null:a } })()]);
f.push(["正規表現に一致しない行を削除","RM",(function(a){
  var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の正規表現に一致しない行を削除:",""))){Quit()}else{c=new RegExp(c)} } return c.test(a)? a:null } })()]);
★重複行を削除 (移植)
まったく同じ内容の行が2個以上ある場合、2個目以降を削除します。
f.push(["重複行を削除","RS",function(a){
  a=a.split("\n"); var b=[],map={}; for(var i=0;i<a.length;i++){ if(!map[a[i]]){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]);

並べ替え

行の並べ替え(Unicode 昇順/降順) (移植)
行をUnicode順で並べ替えます。
※より柔軟に並べ替えたい場合は「行並べ替え」マクロの導入をオススメします。
f.push(["行の並べ替え(Unicode 昇順)","RS",function(a){
  return a.split("\n").sort().join("\n") }]);
f.push(["行の並べ替え(Unicode 降順)","RS",function(a){
  return a.split("\n").sort().reverse().join("\n") }]);
文字の並び順を逆転
行単位で文字列を左右逆転させます。
例> 文字の並び順を逆転 → 転逆を順び並の字文
※サロゲートペアは対策済ですが、異体字セレクタや結合文字列などは未対策です(位置がズレます)。
f.push(["文字の並び順を逆転","R",function(a){
  return a.replace(/.+/g,function(s){return s.split("").reverse().join("").replace(/([\uDC00-\uDFFF])([\uD800-\uDBFF])/g,"$2$1")}) }]);

字種/数値変換

大文字に変換/小文字に変換
Mery の「選択範囲の変換」機能の一部を再現したものです。
f.push(["大文字に変換","F",function(a){
  a.ChangeCase(meCaseUpperCase) }]);
f.push(["小文字に変換","F",function(a){
  a.ChangeCase(meCaseLowerCase) }]);
半角に変換/全角に変換
Mery の「選択範囲の変換」機能の一部を再現したものです。
f.push(["半角に変換","F",function(a){
  a.ChangeWidth(meWidthHalfWidth) }]);
f.push(["全角に変換","F",function(a){
  a.ChangeWidth(meWidthFullWidth) }]);
★半角英数⇒全角/★全角英数⇒半角 (移植)
f.push(["半角英数→全角","R",function(a){
  return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]);
f.push(["全角英数→半角","R",function(a){
  return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]);
★半角カナ⇒全角/★全角カナ⇒半角
f.push(["半角カナ→全角","CR",function(a){
  return [ ["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]}]);
f.push(["全角カナ→半角","CR",function(a){
  return [ ["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]}]);
★全角かな⇒カナ/★全角カナ⇒かな
全角ひらがなと全角カタカナを変換します。ただし、ヴヵヶ → ゔゕゖ の変換は行いません(ゔゕゖ の3文字が Shift_JIS では保存できないため)。
f.push(["全角かな→カナ","R",function(a){
  return a.replace(/[\u3041-\u3096ゝゞ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x60)}) }]);
f.push(["全角カナ→かな","R",function(a){
  return a.replace(/[\u30A1-\u30F3ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
ヴヵヶ → ゔゕゖ を変換したい場合は、下記の内容に差し替えてください。
f.push(["全角カナ→かな","R",function(a){
  return a.replace(/[\u30A1-\u30F6ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
標準変換
マクロ「標準変換」を移植(一部改変 ※下表参照)したものです。
全角英数・全角記号は半角に、半角カナは全角に変換します。
変換前 標準変換版 テキスト整形版
全角左シングルクォート ` 半角グラーブアクセント ' 半角アポストロフィー/半角シングルクォート
全角グラーブアクセント ※変換しない ` 半角グラーブアクセント
f.push(["標準変換","CR",function(a){
  return [ [" "," "],["!","!"],["“",'"'],["”",'"'],["#","#"],["$","$"],["%","%"],["&","&"],["‘","'"],["’","'"],["(","("],[")",")"],["*","*"],["+","+"],[",",","],["-","-"],[".","."],["/","/"],["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"],["{","{"],["|","|"],["}","}"],["~","~"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]}]);
丸数字 ⑳ ⇒ (20)/丸数字 (20) ⇒ ⑳
丸付き数字 ①~⑳ と (1)~(20) を変換します。(01)~(09) も変換対象に含まれます。
f.push(["丸数字 ⑳ → (20)","R",function(a){
  return a.replace(/[①-⑳]/g,function(s){return "("+(s.charCodeAt(0)-0x245F)+")"}) }]);
f.push(["丸数字 (20) → ⑳","R",function(a){
  return a.replace(/\((\d{1,2})\)/g,function(s,s1){s1=Number(s1); return (0<s1&&s1<21)?String.fromCharCode(s1+0x245F): s}) }]);
★10⇒16進数
半角数字列を10進数値とみなし、16進数値に変換します。
例> 291/15/44015 → 123/F/ABEF
f.push(["10→16進数","R",function(a){
  return a.replace(/\d+/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){
  return a.replace(/(?:0x)?([0-9A-Fa-f]+)/g,function(s,s1){return Number("0x"+s1)}) }]);
2進接頭辞換算(Ki,Mi,Gi...)
210 = 1024 の倍量単位に変換します(小数点第3位を四捨五入)。
例> 1023/1024/54321/1,048,576/1,073,741,824 → 1023/1.00Ki/53.05Ki/1.00Mi/1.00Gi
f.push(["2進接頭辞換算(Ki,Mi,Gi...)","R",function(a){
  return a.replace(/\d+(?:,?\d{3})+(?:\.\d+)?/g,function(s){var n=s.replace(/,/g,""); if(n<1024)return s; var x=0; while(x<8&&n>=1024){x++;n/=1024} return n.toFixed(2)+" KMGTPEZY".charAt(x)+"i"}) }]);

符号化/復号化

URL %エンコード/デコード(UTF-8)
URL アドレスに使用される UTF-8 パーセントエンコーディングの符号化/復号化を行います。
f.push(["URL %エンコード(UTF-8)","R",function(a){
  return encodeURI(a).replace(/%0D%0A|%0D|%0A/g,"\n") }]);
f.push(["URL %デコード(UTF-8)","R",function(a){
  return decodeURIComponent(a) }]);
Unicode 文字 ⇒ \uHHHH
文字列を \uHHHH 形式に変換します。※HHHH=4桁の16進数(大文字)・UTF-16BEバイト列
例> Aわ𠀋 → \u0041\u308F\uD840\uDC0B
f.push(["Unicode 文字 → \\uHHHH","R",function(a){
  return a.replace(/./g,function(s){return "\\u"+("000"+s.charCodeAt(0).toString(16).toUpperCase()).slice(-4)}) }]);
Unicode \uHHHH ⇒ 文字
\uHHHH 形式を文字列に変換します。※HHHH=4桁の16進数(英字の大小問わず)・UTF-16BEバイト列
f.push(["Unicode \\uHHHH → 文字","R",function(a){
  return a.replace(/\\u([0-9A-Fa-f]{4})/g,function(s,s1){return String.fromCharCode(Number("0x"+s1))}) }]);
Unicode 文字 ⇒ \x{hex}
文字列を \x{hex} 形式に変換します。※hex=1~6桁の16進数(小文字)・Unicodeスカラー値
例> Aわ𠀋 → \x{41}\x{308f}\x{2000b}
f.push(["Unicode 文字 → \\x{hex}","R",function(a){
  return a.replace(/.+/g,function(s){var r=[]; for(var i=0;i<s.length;i++){var u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){var v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r.push("\\x{"+u.toString(16)+"}")} return r.join("")}) }]);
Unicode \x{hex} ⇒ 文字
\x{hex} 形式を文字列に変換します。※hex=1~6桁の16進数(英字の大小問わず)・Unicodeスカラー値
f.push(["Unicode \\x{hex} → 文字","R",function(a){
  return a.replace(/\\x{([0-9A-Fa-f]{1,6})}/g,function(s,s1){s1=Number("0x"+s1); return (s1<=0xFFFF)?String.fromCharCode(s1): (s1<=0x10FFFF)?String.fromCharCode((s1-0x10000>>10)+0xD800,(s1-0x10000&0x3FF)+0xDC00): s}) }]);
Unicode 文字 ⇒ &#dec;
文字列を &#dec; 形式に変換します。※dec=1~7桁の10進数・Unicodeスカラー値
例> Aわ𠀋 → &#65;&#12431;&#131083;
f.push(["Unicode 文字 → &&#dec;","R",function(a){
  return a.replace(/.+/g,function(s){var r=[]; for(var i=0;i<s.length;i++){var u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){var v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r.push("&#"+u+";")} return r.join("")}) }]);
Unicode &#dec; ⇒ 文字
&#dec; 形式を文字列に変換します。※dec=1~7桁の10進数・Unicodeスカラー値
f.push(["Unicode &&#dec; → 文字","R",function(a){
  return a.replace(/&#([0-9]{1,7});/g,function(s,s1){s1=Number(s1); return (s1<=0xFFFF)?String.fromCharCode(s1): (s1<=0x10FFFF)?String.fromCharCode((s1-0x10000>>10)+0xD800,(s1-0x10000&0x3FF)+0xDC00): s}) }]);
Base64エンコード(Unicode) (移植)
f.push(["Base64エンコード(Unicode)","R",function(text){
  var map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); var Ch=function(n){return n<text.length? text.charCodeAt(n):0}; var len=text.length, pad=len%3, s=""; for(var i=0;i<len;i+=3){var tmp=(Ch(i)<<16)|(Ch(i+1)<<8)|Ch(i+2); s+=map[(tmp>>>18)&0x3F]+map[(tmp>>>12)&0x3F]+map[(tmp>>>6)&0x3F]+map[tmp&0x3F]} if(pad){s=s.substring(0, s.length-(3-pad))+"===".substring(pad)} return s }]);

コマンド テンプレート

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

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

拡張コード:コマンド書式

拡張コードは以下の書式に従い、記述してください。
※コマンドの自作・改変には、マクロや正規表現についての知識が要求されます。

コマンド

f.push(["コマンド名","モード",function(引数){ マクロ }]);
モード F (Function)
【マクロ】の記述をそのまま実行するコマンドです。
f.push(["コマンド名","F",function( Document.Selection ){ マクロ }]);
モード R (Replace)
選択範囲を【マクロ】の処理結果で置換します。
※「テキスト変換」の replace 関数に相当します。
f.push(["コマンド名","R",function( Document.Selection.Text ){return マクロ }]);
モード RS (Select-line)
選択範囲を行頭末まで拡張して【マクロ】の処理結果で置換します。
※「テキスト変換」の replaceS 関数に相当します。
f.push(["コマンド名","RS",function( Document.Selection.Text ){return マクロ }]);
モード RM (Multi-line)
選択範囲を一行ごとに分割して【マクロ】の処理結果で置換します。
※「テキスト変換」の replaceL 関数に相当します。
f.push(["コマンド名","RM",function( Document.Selection.Text ){return マクロ }]);
モード CR (Chain Replace)
選択範囲をリスト(配列)の内容に従い連続置換します。
正規表現を利用する場合、JScript (JavaScript) の仕様に則り記述します。Mery の正規表現 (鬼車ライブラリ) とは仕様が異なる点があるので注意してください。
f.push(["コマンド名","CR",function(){return [ ["検索文字列","置換文字列"] ]}]);
f.push(["コマンド名","CR",function(){return [ [/パターン/フラグ,"置換文字列"] ]}]);
リストは , カンマ区切りで連結することができます。
f.push(["コマンド名","CR",function(){return [ ["検索1","置換1"],[/パターン2/,"置換2"],["検索3","置換3"] ]}]);
置換は、リストの先頭から順番に実行されます。したがって、リストの記述順で結果が変わります。
たとえば、123 という文字列に対し、例1 と 例2 を実行した結果は 444 と 234 になります。
f.push(["例1","CR",function(){
  return [ ["1","2"],["2","3"],["3","4"] ]}]);
  1. 123 → 1 を 2 へ置換 → 223
  2. 223 → 2 を 3 へ置換 → 333
  3. 333 → 3 を 4 へ置換 → 444 (実行結果)
f.push(["例2","CR",function(){
  return [ ["3","4"],["2","3"],["1","2"] ]}]);
  1. 123 → 3 を 4 へ置換 → 124
  2. 124 → 2 を 3 へ置換 → 134
  3. 134 → 1 を 2 へ置換 → 234 (実行結果)

サブメニュー

サブメニューを設けます。コマンドをグループやカテゴリに仕分けたり、使用頻度の低いコマンドをまとめたり、と用途は様々です。
サブメニュー内にサブメニューを作ること(階層化)も可能です。階層の数に制限はありません。

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

セパレータ

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

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

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

f.push(["-"]);         	//← OK (1個)
f.push(["----------"]);	//← OK (10個)
f.push(["--区切り--"]);	//← NG
スポンサーリンク