「テキスト整形」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Masme (トーク | 投稿記録)
収録コマンド一覧のパイプが機能してないため文言修正。
MSY-07 (トーク | 投稿記録)
SyntaxHighlightにcopyの追加
 
(3人の利用者による、間の35版が非表示)
1行目: 1行目:
<div style="float:right">__TOC__</div>
ks 氏作のマクロ「<b>[[テキスト変換]]</b>」の改造版です。


ks 氏作のマクロ「[[テキスト変換]]」の改造版です。
== 主な改造点 ==
* <b>[[#拡張コード:書式|拡張コードの書式]]</b>を変更。
** 簡易書式をベースに単純化。view フラグは削除。
** 「関数タイプ」は「オプション」に変更。
* 処理の戻り値により選択範囲を置換するか、再選択するかを制御できるようにした。
* 行選択してから処理する際、範囲終端の改行は範囲に含めないようにした(正規表現 <code>^ $</code> の使い勝手を考え)。
* メソッド <code><i>String</i>.replaceBatch</code> を追加。
* 範囲選択時に対象範囲を選ぶメニューを廃止(毎回選ぶのが面倒なため)。


【主な改造点】
== 注意事項 ==
* [[#拡張コード:コマンド書式|コマンド書式]]を変更した。
* <b style="color:#c00;">表示行での処理には対応していません。</b>
** 簡易書式をベースに単純化。オプション・第2引数は削除。
* マクロの仕様上、<b style="color:#c00;">矩形選択での処理には原則対応していません。</b>
** 関数タイプ replace/S/L は、モード R/RS/RM に改称。
* モード F (関数を実行) を追加。JScript や Mery の関数をそのまま実行することができます。
* モード CR (連続置換) を追加。配列を利用した文字列置換ができます。
* モード RS/RM で、範囲末尾の改行=次行行頭は範囲に含めないようにした。
* 範囲選択時に対象範囲を選ぶメニューを廃止した。(毎回範囲を選ぶのが面倒なため)。
* 非選択時に文書全体を対象範囲とする仕様を廃止した。(文字列挿入系コマンドを利用できるようにするため)。<br>※文書全体を対象にしたい場合は「すべて選択」 (Ctrl+A) してから実行してください。
【注意点】
* <span style="color:#c00;">マクロの仕様上、矩形選択での処理には対応していません。</span>※Mery 2.1.0 以降の Replace メソッドを利用すれば一応は可能です。
* <span style="color:#c00;">表示行での処理には対応していません。</span>※このページで使用される <b>各行・行頭・行末</b> とは、<b>論理行</b>を意味しています。


=お知らせ=
== お知らせ ==
;2015/02/14
<b style="color:#c00;">仕様変更によりモードは廃止されました。</b>
<span style="color:#c00;">次回の更新で、下記3点の仕様変更を行う予定です。</span>
* モード R/RS 実行後、処理した範囲を選択し直すように。
** コマンドの効果範囲が分かりやすくなり、また、連続してコマンドを実行しやすくなります。
* モード RM を廃止。
** モード R/RS に比べ処理が異質である事、RS で代替可能な事などの理由により。
** 既存コマンド全11個は、モード RS に作り直し、掲載する予定です。
* モード CR を廃止し、<code><i>String</i>.replaceBatch</code> メソッドを追加。
** モードではなくメソッドにすることで <code>replace</code> のように取り扱うことができ、応用が効くため。
** 既存コマンド全6個は、replaceBatch メソッドで作り直し、掲載する予定です。
<span style="color:#c00;">詳しくは、[[利用者:Masme]] のページをご覧ください。</span>


=スターターパック=
詳しくは [[#変更履歴]] または [[利用者:Masme]] のページをご覧ください。
ダウンロード→ [[メディア:テキスト整形.zip|テキスト整形.zip]] (2015/02/14 更新)


* 基本コード と 拡張コード(★印の項目) をまとめて、すぐ使えるようにしたものです。収録コマンド一覧→ [[ファイル:テキスト整形.zip]]
旧仕様の利用者はお手数ですが基本コードおよび拡張コードの更新をお願いいたします。
* 拙作ですがアイコンファイルを同梱してあります。<br>Mery の My Macros フォルダにアイコンファイル (テキスト整形.ico) を配置すれば、ツールバーにアイコンが読み込まれます。


=更新履歴=
== スターターパック ==
[[ファイル:テキスト整形.zip]]
[[ファイル:テキスト整形.zip]]
<div style="height:35em; overflow:auto; border:1px dashed #999;">
 
* 2015/02/14
* 基本コードと拡張コード(★印の項目)をまとめて、すぐ使えるようにした入門用セットです。
** <span style="color:#c00;">仕様修正 - モード RS/RM で、矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。</span>
* 拙作ですがアイコンファイル (テキスト整形.ico) を同梱してあります。Mery 2.4.7 以降の場合、マクロ (テキスト整形.js) と同じフォルダに、Mery 2.4.6 以前の場合、Mery.exe と同じフォルダに、アイコンファイルを配置しておくとツールバーにアイコンが読み込まれます。
** コード整理 - 文字入力など追加操作を要求するコマンドは、名称末尾に目印 ... を付けた。
 
** コマンド追加 - 行末に&lt;br&gt;を付加/&lt;br&gt;を改行に変換/★行頭の空白を除去/★行末の空白を除去/空白行を減量/重複行を削除(空白行は除く)/★連続する重複行を削除/文字のシャッフル
== 変更履歴 ==
** コマンド削除 - 丸数字 ⑳ → (20)/丸数字 (20) → ⑳
<code style="background:#fe0;">//2019-12-21</code> でページ内検索すると、その日付で更新されたコマンドを検索できます。
** コマンド修正 - 各行先頭に文字列付加/各行末尾に文字列付加
<div style="height:40em; overflow:auto; border:1px dashed #999;">
**: 正規表現が意味的に不適切だったのを修正。
* 1.3.0 (2019-12-21)
** コマンド変更 - 空白行を圧縮
** 追加 - 全角仮名+濁点を合成
**: モード R → RS に。空白行内の空白を除去してから改行を処理するように変更。
** 改名 - 行頭に連番挿入 (#/Z)
** コマンド変更 - 文字の並ベ替え(逆順)
*** 「#/Σ」→「#/Z」に変更
**: サロゲートペアの対処方法を変更。結合文字の一部 (U+0300~036F, 3099, 309A) および異体字セレクタに対応した。
** 変更 - Base64エンコード/デコード
** コマンド変更 - 2進接頭辞換算
*** 変数名を asc, b64, A, B → bin, asc, B, A に変更
**: 処理対象の正規表現を [0-9]+(,?[0-9]{3})+(\.[0-9]+)? → [0-9]+(,?[0-9]{3})+ に変更(小数は非対応とした)。
**** 関数 btoa() の由来 binary to ascii(=Base64) に倣った
** コマンド変更 - Base64デコード(UTF-8)
* 1.2.9 (2019-06-01)
**: JScript 5.x の decodeURIComponent() は字数が多いほど能率が悪くなるようなので、最大50字毎に分割処理するようにした(高速化)。
** <b style="color:#c00;">仕様変更 - 戻り値により選択範囲の置換・再選択を制御するようにした</b>
* 2014/10/12
** <b style="color:#c00;">仕様変更 - [[#コマンド|コマンドの書式]]を変更</b>
** コマンド追加 - ★数値参照を文字に変換/行の並べ替え(逆順)/行のシャッフル/Unicode 文字 &#xHEX;/Unicode &#xHEX; 文字
*** マクロ「[[テキスト変換]]」の第2引数を復活。モード F は第2引数利用に変更
** スターター追加 - ★数値参照 &#dec; に変換/★数値参照 &#xHEX; に変換
*** モードを廃止し、オプションに変更。モード RS はオプション L に変更
** スターター除外 - ☆正規表現に一致する行を削除/☆正規表現に一致しない行を削除
*** 実行に範囲選択/クリップボードを要求するコマンドにオプション s/c を設定
**: Mery (鬼車) と JScript (ECMAScript) では正規表現の仕様に差異があり、意図しない結果を招く怖れがあるため。
** <b>仕様変更 - メニュー作成処理を変更。</b>falsy な要素があるとループ終了
** コマンド修正 - 選択文字列を検索
** <b>コード整理 - 第2引数追加に伴い、引数名を a → _ と $ に変更</b>
**: 引数不一致により動作しないミスを修正。
** <b>コード整理 - 不使用の引数は極力省略するようにした</b>
** コマンド修正 - 編集中の全ファイルのパスをコピー/★検索強調をすべて解除
** 改名 - ★行頭/行末に貼り付け ¦ 行頭/行末から数文字削除
**: 対象範囲を 同ウィンドウ内の全文書 → 全ウィンドウの全文書 に改修。
*** 「各行~」を除去
** コマンド変更 - 複製貼り付け
** 改名 - ★行頭/行末に挿入
**: 処理方法を for → while に変更。非数字(NaN) または 1 未満を入力した場合、処理を中止するようにした。
*** 「各行~」を除去。「文字列付加」→「挿入」に変更
** コマンド変更 - Unicode 文字 → \x{hex}/Unicode 文字 → &#dec;
** 改名 - 各行先頭/末尾に挿入 ¦ 行頭に連番挿入 ¦ 行末に&lt;br&gt;を挿入 ¦ ★行頭 // を挿入/削除
**: 処理方法を 配列連結 join("") → 文字列連結 += に変更。
*** 「(文字列)付加」→「挿入」に変更
** コマンド変更 - Unicode \x{hex} → 文字/Unicode &#dec; → 文字
** 変更 - 複製貼り付け ¦ ★行頭/行末に挿入 ¦ 各行先頭/末尾に挿入 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除 ¦ 行頭/行末から数文字削除
**: 下位サロゲートの計算を (n-0x10000&0x3FF) → (n&0x3FF) に変更(減算は不要だった)。
*** 入力判定を中止条件 実行条件に変更
* 2014/07/27
*** 戻り値の仕様を利用し、中止時は Quit() 戻り値なし (undefined) に変更
** コマンド修正 - Base64デコード(UTF-8)
** 修正 - 複製貼り付け ¦ 行頭/行末から数文字削除
**: 終端の余分な [NUL] を除去する処理が手抜きだったのを修正。
*** キャンセルまたは数字以外を入力した場合、正常に中止できていないのを修正(NaN<1 は false)
* 2014/05/31
** 変更 - ★数値参照を文字に変換
** コマンド追加 - Base64エンコード(UTF-8)/Base64デコード(UTF-8)
*** 正規表現を <code>/&#([0-9]{1,7});|&#[Xx]([0-9A-Fa-f]{1,6});/g</code> <code>/&#(?:([0-9]{1,7})|x([0-9a-f]{1,6}));/gi</code> に短縮
** コマンド削除 - Base64エンコード(Unicode) (移植)
** 変更 - 挿入 Confirm(|)
**: Mery の「Base64デコード」機能と同じ方式の Base64エンコード(UTF-8) に差し替え。
*** 戻り値の仕様を利用したものに変更
** コマンド変更 - ★数値を3桁,区切りに
** 変更 - Base64エンコード/デコード
**: 数字列を抽出して処理するように変更(高速化)。
*** 引数名を txt → _ に統一。変数名を変更
** コマンド変更 - ★数値を3桁,区切りに/丸数字 (20) → ⑳/★10→16進数/2進接頭辞換算
** 追加 - ★このマクロを編集 ¦ 連番を出力 ¦ 文字数カウント(空白は除く) ¦ ステータスバーの表示をコピー ¦ 行を文字数順並べ ¦ 数行毎に/数行一組で逆順並べ ¦ 空行毎に/空行一組で逆順並べ ¦ 指定見出しで逆順並べ
**: 正規表現 \d を [0-9] に統一。
** 変更 - 総字行数カウント
** コマンド修正 - コマンド テンプレート(モード CR 交換/分割)
*** GetLines() → GetLines(meGetLineView) に変更(引数を明示)
**: 文字列リテラルでのエスケープ \ をより正確に判定できる正規表現に改修。
*** 符号点数&論理行数版を削除
* 2014/05/24
** 変更 - 選択範囲を eval で評価 ¦ 選択文字列を検索 ¦ 選択文字列をすべて削除
** コマンド修正 - 各行末尾に文字列付加
*** オプション s の設定に伴い、選択判定を削除
**: 選択範囲の次行先頭にも文字列付加してしまう問題に対処。
** 変更 - 拡張コード テンプレート
** コマンド変更 - 複製貼り付け
*** 仕様変更に伴う改訂
**: クリップボードの内容を変数に格納しておくように変更(高速化)。
*** サブメニューは、挿入後にメニュー名を選択するようにした
** コマンド変更 - 複製貼り付け/各行先頭に文字列付加/各行末尾に文字列付加
* 1.2.8 (2019-05-01)
**: Prompt() 関連の処理を単純にした(モード RM 以外では冗長だった)。
** 削除 - 大文字/小文字に変換 ¦ 半角/全角に変換
* 2014/05/22
*** Mery 側のメソッドを使う一例として掲載していたが、結構かと判断
** コマンド追加 - 2進接頭辞換算
** 削除 - 行を昇順/降順並べ(UTF-16)
** コマンド変更 - Unicode \x{hex} → 文字/Unicode &#dec; → 文字
** 改名 - \x{hex} エンコード/デコード
**: サロゲートペアの String.fromCharCode() の引数を複数指定に改修、ビット演算に変更。
*** コマンド名のエスケープミスを修正
* 2014/05/16
** 改名 - 拡張コード テンプレート
** コマンド変更 - Unicode 文字 \x{hex}/Unicode 文字 → &#dec;
*** 「コマンド~」→「拡張コード~」に変更
**: 処理方法を replace(for ループ) に統一(手法を改善)。
* 1.2.7 (2018-01-15)
* 2014/04/27
** 削除 - ☆インデント(半角空白2個)
** コマンド追加 - Unicode 文字 → &#dec;/Unicode &#dec; → 文字
** スターター追加 - ★行を昇順/降順並べ(Unicode) ¦ ★行を逆順並べ
* 2014/03/14
** 追加 - CJK互換漢字を検索
** コマンド追加 - 青空文庫 ルビを除去/青空文庫 注記を除去
** 修正 - Base64デコード
* 2014/03/08
*** 最大50字ずつ処理する箇所で、異常なデータ 0xF8~FF をスルーしていたのを改修
** コマンド追加 - 選択文字列を検索/選択文字列をすべて削除
** 修正 - 挿入 Confirm(|)
** コマンド変更 - ★全角英数を検索/★半角カナを検索/★CJK漢字を検索
*** 折り返しが発生した場合、カーソル位置がズレる不具合を修正(カーソル移動を CharLeft(false,移動量) SetActivePos(GetActivePos()-移動量) に変更)
**: 前ではなく次を検索するように変更。念の為「大文字と小文字を区別」フラグをオンにした。
** 変更 - ★重複行を単一化 ¦ 重複する/しない行を抽出
* 2014/03/01
*** <code>for(var i=0,n=a.length;i<n;i++)</code> → <code>for(var i=0;i<a.length;i++)</code> に単純化
** コマンド追加 - ★連続する!?を整形/★全角ダッシュ(――)に整形
* 1.2.6 (2017-06-25)
** コマンド変更 - ★括弧前の句読点を除去
** <b>仕様変更 - アイコンファイルに24x24・32x32・48x48の画像を追加</b>
**: 全角カンマ , /全角ピリオド . を除去対象に追加。
** <b style="color:#c00;">仕様変更 - <samp>replaceBatch</samp> メソッドで配列先頭/末尾のコンマを許容するようにした</b>
** コマンド変更 - ★三点リーダー(……)に整形
*** 例> <code><i>String</i>.replaceBatch([ <b style="background:#fcc;">,</b>[省略],[省略],[省略]<b style="background:#fcc;">,</b> ])</code>
**: 全角カンマ , /全角ピリオド . /半角中黒 ・ /三点リーダー … /二点リーダー ‥ を変換対象に追加。
** コード整理 - 基本コードを改訂
** コマンド変更 - My Macros フォルダを開く
** 追加 - 行を昇順/降順並べ(Unicode) ¦ ★!?を半角/全角に整形 ¦ 空白行の空白を除去 ¦ 行頭/行末から数文字削除 ¦ 重複する/しない行を抽出 ¦ 表外漢字→代替
**: 処理方法を WScript.Shell.Run("explorer") → Shell.Application.Explore() に変更。
** 改名 - 行を昇順/降順並べ(UTF-16) ¦ 行を逆順並べ ¦ 文字を逆順並べ
* 2014/02/22
*** 「~の並べ替え(○順)」→「~を○順並べ」に変更
** コマンド追加 - 丸数字 ⑳ → (20)/丸数字 (20) → ⑳
*** 従来の「行を昇順/降順並べ(Unicode)」は (UTF-16) に訂正
** コマンド変更 - 文字の並ベ替え(逆順)/Unicode 文字 → \uHHHH/Unicode 文字 → \x{hex}
** 改名 - ★重複行を単一化 ¦ ★連続する重複行を単一化
**: 処理方法を for ループ → replace() に変更(字数削減)。
*** 「~を削除」→「~を単一化」に変更
** コマンド変更 - コマンド テンプレート
** 修正 - ★重複行を単一化
**: モード CR 作成補助コマンドを追加。モード CR テンプレートを変更。
*** 下記の7行を削除してしまう不具合を修正(重複の判定は Object.prototype.hasOwnProperty.call() で行うようにした)
* 2014/02/17
*** 「constructor」「hasOwnProperty」「isPrototypeOf」「propertyIsEnumerable」「toLocaleString」「toString」「valueOf」
** コマンド修正 - ★各行行頭に貼り付け/★各行行末に貼り付け
** 変更 - ★全角ダッシュ(――)に整形
**: クリップボード終端の改行文字を除去する正規表現を修正。\r\n|\r|\n$ → (\r\n|\r|\n)$
*** 罫線(横) ── を変換対象から除外
* 2014/02/16
** 変更 - ★数値参照を文字に変換 ¦ ★16→10進数 ¦ &#xHEX; デコード
** <span style="color:#c00;">仕様修正 - モード CR の仕様ミスを修正し、正規表現 (JScript) に正式対応した。</span>
*** 0Xff, &amp;#Xff; など X が大文字の場合に対応
**: 正規表現の特殊文字があると誤動作していたのでエスケープするようにした。
** 変更 - 文字を逆順並べ ¦ 文字をシャッフル ¦ \uHHHH, \u4H \U8H, \x{hex}, &#dec;, &#xHEX; エンコード
** コード整理 - コメントアウトしていた基本コードを削除した(→2014/01/08 スクロール位置)。
*** 正規表現を . → [^\n] に統一
** コード整理 - 下記の6カテゴリを3カテゴリに統合。コマンドの名称や配置を見直した。
** 変更 - 文字を逆順並べ ¦ 文字をシャッフル
**: 空白の追加 + 各行に追加/空白の削除 + 行の削除/数値の変換 + 文字種変換
*** UAX #29 に一部対応し、\p{Zl}, {Zp}, {Cc}, U+00AD, FEFF は結合不可にした
** コマンド追加 - 複製貼り付け/文字の並ベ替え(逆順)/★半角カナ→全角/★全角カナ→半角
** 変更 - 選択文字列を検索
*** カーソル位置・スクロール位置を移動しないようにした
** 変更 - 選択文字列を検索 ¦ 選択文字列をすべて削除 ¦ <samp>replaceBatch</samp> メソッド
*** 特殊文字のエスケープ処理を <code>/([$()*+.?[\\\]^{|}])/g,"\\$1"</code> → <code>/[$()*+.?\[\\\]^{|}]/g,"\\$&"</code> に統一
** 変更 - 拡張コード テンプレート(分割)
*** 配列先頭のコンマの仕様に対応(末尾は実質対応済)
* 1.2.5 (2017-05-28)
** 追加 - 結合文字列を検索
** 修正 - CP932依存文字を検索
*** Wiki が &#xFA19; → 神 などの正規化(NFC)を行う影響で、漢字22字が意図どおりに検索されないミスを修正
** 変更 - ASCII文字, 半角カナ, 全角英数, CJK漢字, ひらがな, カタカナを単語検索
*** 変数を使用せず、正規表現 \g<名前> を使用する形式に統一
* 1.2.4 (2015-12-26)
** <b style="color:#c00;">仕様変更 - アイコンの指定先を "My Macros\テキスト整形.ico" → "テキスト整形.ico" に変更</b>
** 変更 - マクロフォルダを開く
*** 「My Macros フォルダを開く」→「マクロフォルダを開く」に変更
*** 「テキスト整形」マクロがあるフォルダを開くようにした(Mery 2.4.7 での Macros フォルダ改名に対処)
* 1.2.3 (2015-09-30)
** 追加 - CP932依存文字を検索 ¦ サロゲートペアを検索 ¦ 行頭に連番挿入 (#) ¦ 行頭に連番挿入 (#/Z) ¦ 行頭に連番挿入 (0#) ¦ \u4H \U8H エンコード/デコード
** 修正 - ひらがなを単語検索 ¦ カタカナを単語検索
*** 選択範囲が記号の前後で途切れる問題に対処(記号2連続まで対応)
** 変更 - 青空文庫 ルビを除去
*** 正規表現を [^《]+ → [^《\n]+ に変更し、改行を跨がないようにした
** 変更 - ★HTMLタグを除去
*** 正規表現を .*? → [^<i>文字</i>]* に変更し、改行を跨ぐようにした
** 変更 - 文字を逆順並べ ¦ 文字をシャッフル
*** 処理方法を 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 ○○ → 文字」→「○○ デコード」に変更
* 1.2.2 (2015-03-26)
** 変更 - CJK漢字を単語検索
*** 異体字セレクタを考慮するようにした(ただし組合せが適正かは考慮しえない)
** 変更 - 複製貼り付け
*** 処理中止の条件を 非数字(NaN) or 1 未満 → クリップボードがカラ or 1 未満 に変更
* 1.2.1 (2015-03-14)
** <b style="color:#c00;">仕様変更 - モード R/RS 実行後、処理した範囲を選択し直すようにした</b>
** <b style="color:#c00;">仕様変更 - モード RM を廃止。</b>既存コマンドはモード RS に移行
*** ★行頭 // を挿入/削除 ¦ ★インデント(半角空白2個) ¦ ★空白行を削除 ¦ ★行頭/行末に貼り付け ¦ ★行頭/行末に挿入 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
** <b style="color:#c00;">仕様変更 - モード CR を廃止し、<code><i>String</i>.replaceBatch</code> メソッドを追加。</b>既存コマンドは <samp>replaceBatch</samp> メソッド利用に移行
*** ★連続する!?を整形 ¦ ★実体参照 &"<> → &xxx; ¦ ★実体参照 &xxx; → ␣><"& ¦ ★半角カナ→全角 ¦ ★全角カナ→半角 ¦ 標準変換
** <b>コード整理 - コマンド各々に更新年月日を付けるようにした</b>
** スターター除外 - ☆検索強調をすべて解除
** 削除 - ☆全角英数を検索 ¦ ☆半角カナを検索 ¦ ☆CJK漢字を検索
** 追加 - ASCII文字を単語検索 ¦ 半角カナを単語検索 ¦ 全角英数を単語検索 ¦ CJK漢字を単語検索 ¦ ひらがなを単語検索 ¦ カタカナを単語検索 ¦ 検索結果カウント ¦ 総字行数カウント
** 変更 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー
*** パスが存在しない場合の名前を、無題 → <無題> に変更
** 変更 - ★数値参照を文字に変換 ¦ \x{hex}, &#dec;, &#xHEX; デコード
*** サロゲートペアの計算を + → | に変更し、不要な括弧を除去(演算子の優先順が + - → >> → & → | である事による)
** 変更 - Base64エンコード/デコード
*** 不要な括弧を除去(同上、演算子の優先順による)
** 変更 - 拡張コード テンプレート
*** 仕様変更に伴う改訂
*** コマンドおよびセパレーターは、表示行頭に挿入するようにした
* 1.2.0 (2015-02-14)
** <b style="color:#c00;">仕様修正 - モード RS/RM で、矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正</b>
** <b>コード整理 - 文字入力など追加操作を求めるコマンドは、名称末尾に目印 ... を付けた</b>
*** 複製貼り付け ¦ ★行頭/行末に挿入 ¦ 各行先頭/末尾に挿入 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
** 削除 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳
** 追加 - 行末に&lt;br&gt;を挿入 ¦ &lt;br&gt;を改行に変換 ¦ ★行頭/行末の空白を除去 ¦ 空白行を減量 ¦ 重複行を単一化(空白行は除く) ¦ ★連続する重複行を単一化 ¦ 文字のシャッフル
** 修正 - 各行先頭/末尾に挿入
*** 正規表現が意味的に不適切だったのを修正
** 変更 - 空白行を圧縮
*** モード R → RS に。空白行内の空白を除去してから改行を処理するように変更
** 変更 - 文字を逆順並べ
*** サロゲートペアの対処方法を変更。結合文字の一部 (U+0300~6F, 3099~A) および異体字セレクタに対応した
** 変更 - 2進接頭辞換算
*** 正規表現を <code>[0-9]+(,?[0-9]{3})+(\.[0-9]+)?</code> → <code>[0-9]+(,?[0-9]{3})+</code> に変更(小数は非対応とした)
** 変更 - Base64デコード
*** JScript 5.x の decodeURIComponent() は字数が多すぎると能率が悪くなるようなので、最大50字ずつ処理するようにした(高速化)
* 1.1.9 (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) に短縮
* 1.1.8 (2014-07-27)
** 修正 - Base64デコード
*** 終端の余分な [NUL] を除去する処理が手抜きだったのを修正
* 1.1.7 (2014-05-31)
** 削除 - Base64エンコード(Unicode)
*** Mery の「Base64デコード」機能と同じ方式の Base64エンコード(UTF-8) に差し替え
** 追加 - Base64エンコード/デコード(UTF-8)
** 変更 - ★数値を3桁,区切りに
*** 数字列を抽出して処理するように変更(高速化)
** 変更 - ★数値を3桁,区切りに ¦ 丸数字 (20) → ⑳ ¦ ★10→16進数 ¦ 2進接頭辞換算
*** 正規表現を \d → [0-9] に統一
** 修正 - 拡張コード テンプレート(モード CR 交換/分割)
*** エスケープ文字 \ をより正確に判定できる正規表現に改修
* 1.1.6 (2014-05-24)
** 修正 - 各行末尾に挿入
*** 選択範囲の次行先頭にも挿入してしまう問題に対処
** 変更 - 複製貼り付け
*** クリップボードの内容を変数に格納しておくように変更(高速化)
** 変更 - 複製貼り付け ¦ 各行先頭/末尾に挿入
*** Prompt() 関連の処理を単純化(モード RM 以外では冗長だった)
* 1.1.5 (2014-05-22)
** 追加 - 2進接頭辞換算
** 変更 - \x{hex}, &#dec; デコード
*** サロゲートペアの String.fromCharCode() の引数を複数指定に改修、ビット演算に一部変更
* 1.1.4 (2014-05-16)
** 変更 - \x{hex}, &#dec; エンコード
*** 処理方法を replace(for ループ) に統一
* 1.1.3 (2014-04-27)
** 追加 - &#dec; エンコード/デコード
* 1.1.2 (2014-03-14)
** 追加 - 青空文庫 ルビを除去 ¦ 青空文庫 注記を除去
* 1.1.1 (2014-03-08)
** 追加 - 選択文字列を検索 ¦ 選択文字列をすべて削除
** 変更 - ★全角英数を検索 ¦ ★半角カナを検索 ¦ ★CJK漢字を検索
*** 検索方向を 前 → 次 に変更。念の為「大文字と小文字を区別」フラグを追加
* 1.1.0 (2014-03-01)
** 追加 - ★連続する!?を整形 ¦ ★全角ダッシュ(――)に整形
** 変更 - ★括弧前の句読点を除去
*** 全角コンマ , /全角ピリオド . を除去対象に追加
** 変更 - ★三点リーダー(……)に整形
*** 全角コンマ , /全角ピリオド . /半角中黒 ・ /三点リーダー … /二点リーダー ‥ を変換対象に追加
** 変更 - マクロフォルダを開く
*** 処理方法を WScript.Shell.Run("explorer") → Shell.Application.Explore() に変更
* 1.0.9 (2014-02-22)
** 追加 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳
** 変更 - 文字を逆順並べ ¦ \uHHHH, \x{hex} エンコード
*** 処理方法を for ループ → replace() に変更(字数削減)
** 変更 - 拡張コード テンプレート
*** モード CR 作成補助コマンドを追加。モード CR テンプレートを変更
* 1.0.8 (2014-02-17)
** 修正 - ★行頭/行末に貼り付け
*** クリップボード終端の改行文字を除去する正規表現を修正 \r\n|\r|\n$ → (\r\n|\r|\n)$
* 1.0.7 (2014-02-16)
** <b style="color:#c00;">仕様修正 - モード CR で、正規表現の特殊文字があると誤動作する不具合を修正</b>
** <b style="color:#c00;">仕様変更 - モード CR で、正規表現 (JScript) による検索置換に対応</b>
** コード整理 - コメントアウトしていた基本コードを削除
** コード整理 - 下記の6カテゴリを3カテゴリに統合。コマンドの名称や配置を見直した
*** (空白の追加 + 各行に追加) (空白の削除 + 行の削除) (数値の変換 + 文字種変換)
** スターター除外 - ☆標準変換
** スターター除外 - ☆標準変換
** コマンド変更 - ★各行行頭に貼り付け/★各行行末に貼り付け
** 追加 - 複製貼り付け ¦ 文字を逆順並べ ¦ ★半角カナ→全角 ¦ ★全角カナ→半角
**: 行コピーと連携しやすくするため、クリップボード終端の改行文字は除去するようにした。
** 変更 - ★行頭/行末に貼り付け
** コマンド変更 - コマンド テンプレート
*** クリップボード終端の改行文字は除去するようにした(行切り取り・行コピーとの相性を考え)
**: モード CR テンプレートを刷新。
** 変更 - 拡張コード テンプレート
* 2014/02/10
*** モード CR テンプレートを刷新
** コマンド追加 - ★空白行を削除/Unicode \uHHHH → 文字/Unicode 文字 → \x{hex}/Unicode \x{hex} → 文字
* 1.0.6 (2014-02-10)
** スターター除外 - ☆空白行を圧縮
** スターター除外 - ☆空白行を圧縮
** コマンド変更 - 挿入 Confirm(|)
** 追加 - ★空白行を削除 ¦ \uHHHH デコード ¦ \x{hex} エンコード/デコード
**: 接尾辞の長さ(s.length)でカーソル移動量を決めるようにした。
** 変更 - 挿入 Confirm(|)
* 2014/02/01
*** 接尾辞の長さ(s.length)でカーソル移動量を決めるようにした
** コマンド追加 - Unicode 文字 → \uHHHH
* 1.0.5 (2014-02-01)
** コマンド変更 - ★全角かな→カナ/★全角カナ→かな
** 追加 - \uHHHH エンコード
**: 踊り字(繰り返し記号) ゝゞヽヾ を変換対象に追加。
** 変更 - ★全角かな→カナ ¦ ★全角カナ→かな
* 2014/01/24
*** 踊り字(繰り返し記号) ゝゞヽヾ を変換対象に追加
** コマンド追加 - ★半角/全角の間を空ける/★半角英数/全角の間を空ける
* 1.0.4 (2014-01-24)
** コマンド変更 - ★全角カナ→かな
** 追加 - ★半角/全角の間を空ける ¦ ★半角英数/全角の間を空ける
**: ヴヵヶ → ゔゕゖ の変換を行わないようにした(Shift_JIS では保存できない文字のため)。
** 変更 - ★全角カナ→かな
* 2014/01/12
*** ヴヵヶ は対象外とした(Shift_JIS では保存できない文字のため)
** <span style="color:#c00;">仕様変更 - スターターパックにアイコンファイルを同梱し、読み込むようにした。</span>
* 1.0.3 (2014-01-12)
** コマンド修正 - 編集中のファイルのパスをコピー/編集中の全ファイルのパスをコピー
** <b>仕様変更 - スターターパックにアイコンファイルを同梱</b>
**: join("\n") join("\r\n") に変更し、メモ帳でも正しく改行されるようにした。
** 修正 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー
** コマンド変更 - ★数値を3桁,区切りに
*** 改行を LF CR+LF に変更し、メモ帳でも正しく改行されるようにした
**: 小数点以下(ピリオド . 以降の半角数字列)を桁区切りしないようにした。
** 修正 - ★数値を3桁,区切りに
* 2014/01/08
*** 小数点以下(ピリオド以降)は桁区切りしないようにした
** <span style="color:#c00;">仕様変更 - コマンド実行時、スクロール位置を記憶・復元しないように(コメントアウト)した。</span>
* 1.0.2 (2014-01-08)
**: 検索系コマンドと相性が悪く、Mery の検索機能と挙動が合っていないため。
** <b style="color:#c00;">仕様変更 - コマンド実行時、スクロール位置を記憶・復元しないように(コメントアウト)した</b>
** コマンド追加 - ★全角英数を検索/★半角カナを検索
*** 検索系コマンドと相性が悪く、Mery の検索機能と挙動が合っていないため
** スターター追加 - ★CJK漢字を検索/★検索強調をすべて解除
** スターター追加 - ★CJK漢字を検索 ¦ ★検索強調をすべて解除
** コマンド修正 - ★16→10進数
** 追加 - ★全角英数を検索 ¦ ★半角カナを検索
**: 16進数に使用しない英字 G~Z を変換対象に含めていたミスを修正。
** 修正 - ★16→10進数
* 2013/12/30
*** 16進数に使用しない英字 G~Z を変換対象に含めていたミスを修正
** コマンド追加 - 挿入 Confirm(|)/★数値を3桁,区切りに/★10→16進数/★16→10進数
* 1.0.1 (2013-12-30)
** コマンド修正 - My Macros フォルダを開く
** 追加 - 挿入 Confirm(|) ¦ ★数値を3桁,区切りに ¦ ★10→16進数 ¦ ★16→10進数
**: マクロの場所からではなく Mery.exe の場所からパスを取得するようにした。
** 修正 - My Macros フォルダを開く (現「マクロフォルダを開く」)
* 2013/09/15
*** 「テキスト整形」マクロのあるフォルダではなく Mery.exe 直下の My Macros フォルダを開くようにした
** 初版公開。
* 1.0.0 (2013-09-15)
** 初版公開
</div>
</div>


=基本コード=
== 基本コード ==
<source lang="javascript" style="height:35em; overflow:auto;">
<syntaxhighlight lang="javascript" copy>
//■テキスト整形
//■テキスト整形
// 2013/09/15-2015/02/14
// 2013-09-15 - 2019-06-01


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


// ----------------- ↑ここより上に拡張コードを追加
// ----------------- ↑ここより上に拡張コードを追加
/*■拡張コード:コマンド書式
/*■拡張コード:書式
//▼コマンド
//▼コマンド
f.push(["コマンド名","モード",function(引数){マクロ}]);
f.push(["コマンド名","オプション",function(引数){ 処理 }]);
【モード】
//▽オプション
   (Function)   - 関数を実行
   s : 実行に範囲選択を要求 (require selection)
   (Replace)     - 選択範囲を置換
   c : 実行にクリップボードを要求 (require clipboard)
   RS (Select-line) - 選択範囲を行頭末まで拡張して置換
   L : 行選択してから処理 (select Line)
   RM (Multi-line) - 選択範囲を一行ごとに分割して置換
   O : 非選択時はすべて選択してから処理 (select OR all) ※実験的
  CR (Chain)       - リスト(配列)の内容に従い連続置換
//▽引数(arguments)
【引数】
  第1引数 = Document.Selection.Text
(モード F)        - Document.Selection
  第2引数 = Document.Selection
(モード R/RS/RM)  - Document.Selection.Text
//▽処理の戻り値(return value)
(モード CR)      - (引数なし)
  String/Array以外 : 選択範囲に対し何もしない
  "abcd"          : abcd に置換後、abcd を選択
  ["ab","cd"]      : abcd に置換後、ab と cd の間に移動
  ["ab","cd",""]  : abcd に置換後、cd を選択
//▼サブメニュー
//▼サブメニュー
f.push(["メニュー名",function(f){コマンドなど}]);
f.push(["メニュー名",function(f){ コマンドなど }]);
//▼セパレータ
//▼セパレーター
f.push(["----"]);
f.push(["--------"]);
// ----------------- */
// ----------------- */


//■メソッド:連続置換
//"string".replaceBatch([ [検索1,置換1],[検索2,置換2],… ]);
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(){
//■実行コード
//■実行コード
(function(){
var Sel = Document.Selection;
  var sel = Document.Selection;
var isSelEmpty = Sel.IsEmpty;
  var cmd = [], cid = 1; //コマンド格納用,ID
var isClipEmpty = !ClipboardData.GetData();
  //メニュー生成用関数
var cmd = [], cid = 0; //コマンド, ID
  function ListToMenu(List, Menu) {
//リストからメニュー作成
    for (var i=0; i<List.length; i++) {
var Menu = CreatePopupMenu();
      var $L = List[i], $Ln = List[i].length;
(function ListToMenu(List, Menu) {
      if (typeof $L[0]!="string") continue;
  for (var i=0,_L; _L=List[i]; i++) {
      switch (true) {
    if (typeOf(_L[0]) !== "String") continue;
      case ($Ln==3): //コマンド $L = ["コマンド名","モード",function]
    switch (_L.length) {
        if (typeof $L[2]=="function" && /^(F|R|RS|RM|CR)$/.test($L[1])) {
    case 3: //◆コマンド      _L = ["コマンド名","オプション",function]
          cmd[cid] = {"mode":$L[1], "func":$L[2]};
      if (typeOf(_L[1]) !== "String") break;
          Menu.Add($L[0]+"\t"+$L[1], cid++);
      if (typeOf(_L[2]) !== "Function") break;
        } break;
      ++cid;
       case ($Ln==2): //サブメニュー $L = ["メニュー名",function]
      var isGray = (/\bs\b/.test(_L[1]) && isSelEmpty)
        if (typeof $L[1]=="function") {
                || (/\bc\b/.test(_L[1]) && isClipEmpty) ;
          var sub_popup = CreatePopupMenu();
      Menu.Add(_L[0]+"\t"+_L[1], cid, isGray? meMenuGrayed: 0);
          Menu.AddPopup($L[0], sub_popup);
      if (isGray) break;
          var sub_f = [];
       cmd[cid] = { func: _L[2]
          $L[1](sub_f);
      , selLine: /\bL\b/.test(_L[1])
          ListToMenu(sub_f, sub_popup); //再帰処理:サブメニュー作成
      , selOrAll: /\bO\b/.test(_L[1])
        } break;
      };
      case ($Ln==1): //セパレータ $L = ["----"]
    break;
        if (/^-+$/.test($L[0])) {
    case 2: //◆サブメニュー  _L = ["メニュー名",function]
          Menu.Add("", 0, meMenuSeparator);
      if (typeOf(_L[1]) !== "Function") break;
        } break;
       var sub_f = [], sub_Menu = CreatePopupMenu();
       }
      _L[1](sub_f);
    }
      Menu.AddPopup(_L[0], sub_Menu);
  };
       ListToMenu(sub_f, sub_Menu); //再帰:サブメニュー作成
  //コマンド一覧からメニュー生成
    break;
  var popup = CreatePopupMenu();
     case 1: //◆セパレーター  _L = ["--------"]
  ListToMenu(f, popup);
       if (!/^-+$/.test(_L[0])) break;
  //ポップアップメニューを表示して処理
       Menu.Add("", 0, meMenuSeparator);
  var tr = popup.Track(mePosMouse);
    break;
  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 用関数:選択範囲を行頭行末まで拡張して返す
}(f, Menu));
  function SelectLine(sel) {
//ポップアップメニューを表示して処理
    var meP = mePosLogical;
main: if (cid = Menu.Track(mePosMouse)) { //※キャンセル(Esc)時は 0 で終了
    var ty = sel.GetTopPointY(meP); //範囲開始行
  var invertPos = Sel.GetActivePos() < Sel.GetAnchorPos();
    var by = sel.GetBottomPointY(meP); //範囲終了行
  if (cmd[cid].selLine) selectLine(Sel);
    var bx = sel.GetBottomPointX(meP);
  if (cmd[cid].selOrAll && isSelEmpty) Sel.SelectAll();
    var br =(sel.Text.match(/\n/g)||[]).length;
  var res = cmd[cid].func(Sel.Text, Sel);
    if (bx==1 && by-ty==br && br) by--; //次行行頭を含めないよう対策
  if (typeOf(res) === "String") res = ["",res,""];
    sel.SetActivePoint(meP, 1, by);
   if (typeOf(res) !== "Array") break main;
    sel.EndOfLine(false, meP);
    
    sel.SetAnchorPoint(meP, 1, ty);
   var head = res.shift(), tail = res.pop() || "", body = res.join("");
    return sel.Text;
  Sel.Text = head + body + tail;
   };
  var acp = Sel.GetActivePos() - tail.replace(/\r\n/g,"\n").length;
   //モード RM 用関数:選択範囲を一行ごとに分割して処理
  var anp = acp                - body.replace(/\r\n/g,"\n").length;
   function MultiLine(func, sel) {
    //※クリップボードなどCR+LFが含まれる場合、1字と数えなければズレる
    var result = [];
  Sel.SetActivePos(invertPos? anp: acp);
    var lines = SelectLine(sel).split("\n");
  Sel.SetAnchorPos(invertPos? acp: anp);
    for (var i=0; i<lines.length; i++) {
}
      var text = func(lines[i]);
 
      if (text != null) result.push(text); //戻値がnullの場合、破棄(行削除)
//■型判別
    }
function typeOf(obj) {
     return result.join("\n");
  return (obj===null)? "Null": (obj==null)? "Undefined":
  };
     Object.prototype.toString.call(obj).slice(8,-1); //"[object Type]".slice
  //モード CR 用関数:リストに従い選択範囲を連続置換
};
  function ChainReplace(list, sel) {
//■論理行選択
    var text = sel.Text;
function selectLine(Sel) {
    for (var i=0; i<list.length; i++) {
  var ty = Sel.GetTopPointY(mePosLogical);
      switch (true) {
  var by = Sel.GetBottomPointY(mePosLogical);
      case (typeof list[i][0]=="string"): //list[i] = ["検索","置換"]
  var bx = Sel.GetBottomPointX(mePosLogical);
        text = text.split(list[i][0]).join(list[i][1]);
  var nn =(Sel.Text.match(/\n/g)||[]).length;
        break;
  if (bx===1 && nn<=by-ty && nn) by--; //末尾改行対策
      case (list[i][0] instanceof RegExp): //list[i] = [/検索/,"置換"]
    //下端が論理行頭 && 矩形選択でない && 複数行
        text = text.replace(list[i][0],list[i][1]);
  Sel.SetActivePoint(mePosLogical, 1, by);
        break;
  Sel.EndOfLine(false, mePosLogical);
      }
   Sel.SetAnchorPoint(mePosLogical, 1, ty);
    }
};
    return text;
   };
})();
</source>


=拡張コード:コマンド=
}());
* (移植) の項目は、マクロ「[[テキスト変換]]」から移植したコマンドです。
</syntaxhighlight>
* ★印の項目は、スターターパックに含まれているコマンドです。


==小説/作文 用途==
== 拡張コード ==
★印の項目は、スターターパックに収録されているコマンドです。


=== 小説/作文 ===
;★地の文の行頭を字下げ
;★地の文の行頭を字下げ
:左引用符 <span style="color:#c00;">‘ “</span> /開き括弧 <span style="color:#c00;">( 〔 [ { 〈 《 「 『 【</span> および 半角空白/全角空白/水平タブ/改行<b style="color:#c00;">以外</b>の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。
:開き括弧類 <code>‘ “ ( 〔 [ { 〈 《 「 『 【</code> または 半角空白/全角空白/水平タブ/改行 <b style="color:#c00;">以外</b>の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["地の文の行頭を字下げ","RS",function(a){
f.push(["地の文の行頭を字下げ","L",function(_){ //2015-02-14
   return a.replace(/^(?![‘“(〔[{〈《「『【  \t\n])/gm," ") }]);
   return _.replace(/^([^‘“(〔[{〈《「『【  \t\n])/gm," $1") }]);
</source>
</syntaxhighlight>


;★括弧前の句読点を除去
;★括弧前の句読点を除去
:右引用符 <span style="color:#c00;">’ ”</span> /閉じ括弧 <span style="color:#c00;">) 〕 ] } 〉 》 」 』 】</span> の直前に句読点 、。,. がある場合、除去します。
:閉じ括弧類 <code>’ ” ) 〕 ] } 〉 》 」 』 】</code> の直前に句読点 <code>、 。 , .</code> がある場合、除去します。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["括弧前の句読点を除去","R",function(a){
f.push(["括弧前の句読点を除去","s",function(_){ //2014-03-01
   return a.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]);
  return _.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]);
</source>
</syntaxhighlight>
 
;★!?を半角/全角に整形
:感嘆符・疑問符を、直前の文字が半角なら半角に、全角なら全角に整形します。
:直前の文字がない場合(範囲先頭か行頭)は何もしません。
:※<b style="color:#c00;">半角文字</b>=ASCII文字+半角カナ、<b style="color:#c00;">全角文字</b>=それ以外の文字、を意味しています。
:例> <span style="background:#bfdfff;">Wha<b style="color:#c00;">t</b>!?/あ<b style="color:#c00;">れ</b>!?</span> → What!?/あれ!?(※<b style="color:#c00;">赤字</b>が直前の文字)
<syntaxhighlight lang="javascript" copy>
f.push(["!?を半角/全角に整形","s",function(_){ //2017-06-25
   return _.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,"?")}) }]);
</syntaxhighlight>


;★連続する!?を整形
;★連続する!?を整形
:2文字以上連続する感嘆符 ! /疑問符 ? を半角2文字に整形します。
:2文字以上連続する感嘆符・疑問符を半角2文字に整形します。
:例> <span style="background:#bfdfff;">!!/!!?/?!!!/?!!!?</span> → !!/!?/?!/??
:例> <span style="background:#bfdfff;">!!/!!?/?!!!/?!!!?</span> → !!/!?/?!/??
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["連続する!?を整形","CR",function(a){
f.push(["連続する!?を整形","s",function(_){ //2015-03-14
   return [ [/[!!][!?!?]*[!!]/g,"!!"],[/[!!][!?!?]*[??]/g,"!?"],[/[??][!?!?]*[!!]/g,"?!"],[/[??][!?!?]*[??]/g,"??"] ]}]);
   return _.replaceBatch([ [/[!!][!?!?]*[!!]/g,"!!"],[/[!!][!?!?]*[??]/g,"!?"],[/[??][!?!?]*[!!]/g,"?!"],[/[??][!?!?]*[??]/g,"??"] ]) }]);
</source>
</syntaxhighlight>


;★三点リーダー(……)に整形
;★三点リーダー(……)に整形
:3文字以上連続する中黒・句点・読点などを、三点リーダー2文字 …… に整形します。
:1~3文字以上連続する中黒・句点・読点などを、三点リーダー2文字 …… に整形します。
:例> <span style="background:#bfdfff;">そんな・・・・。</span> → そんな……。
:例> <span style="background:#bfdfff;">そんな・・・・。</span> → そんな……。
:※変換対象となるのは以下の8パターンです。
:※変換対象となるのは以下の8パターンです。
:{| class="wikitable" style="text-align:center;"
:{|class="wikitable" style="text-align:center;"
! 名称 !! 連続字数 !! 例 !! Shift_JIS !! Unicode
! 名称 !! 連続字数 !! 例 !! Shift_JIS !! Unicode
|-
|-
330行目: 466行目:
| 全角句点 || 。。。 || 0x8142 || U+3002
| 全角句点 || 。。。 || 0x8142 || U+3002
|-
|-
| 全角カンマ || ,,, || 0x8143 || U+FF0C
| 全角コンマ || ,,, || 0x8143 || U+FF0C
|-
|-
| 全角ピリオド || ... || 0x8144 || U+FF0E
| 全角ピリオド || ... || 0x8144 || U+FF0E
342行目: 478行目:
| 二点リーダー || ‥ || 0x8164 || U+2025
| 二点リーダー || ‥ || 0x8164 || U+2025
|}
|}
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["三点リーダー(……)に整形","R",function(a){
f.push(["三点リーダー(……)に整形","s",function(_){ //2014-03-01
   return a.replace(/、{3,}|。{3,}|,{3,}|.{3,}|・{3,}|・{3,}|…{1,}|‥{1,}/g,"……") }]);
   return _.replace(/、{3,}|。{3,}|,{3,}|.{3,}|・{3,}|・{3,}|…{1,}|‥{1,}/g,"……") }]);
</source>
</syntaxhighlight>


;★全角ダッシュ(――)に整形
;★全角ダッシュ(――)に整形
:2文字以上連続する長音・罫線などを、全角ダッシュ2文字 ―― に整形します。
:2文字以上連続する長音などを、全角ダッシュ2文字 ―― に整形します。
:例> <span style="background:#bfdfff;">そんなーーー。</span> → そんな――。
:例> <span style="background:#bfdfff;">そんなーーー。</span> → そんな――。
:※変換対象となるのは以下の5パターンです。
:※変換対象となるのは以下の4パターンです。
:{| class="wikitable" style="text-align:center;"
:{|class="wikitable" style="text-align:center;"
! 名称 !! 連続字数 !! 例 !! Shift_JIS !! Unicode
! 名称 !! 連続字数 !! 例 !! Shift_JIS !! Unicode
|-
|-
| 全角長音符号 ||rowspan="5"| 2字以上 || ーー || 0x815B || U+30FC
| 全角長音符 ||rowspan="5"| 2字以上 || ーー || 0x815B || U+30FC
|-
|-
| em ダッシュ<br>(全角ダッシュ) || —— || - || U+2014
| em ダッシュ<br>(全角ダッシュ) || —— || - || U+2014
361行目: 497行目:
|-
|-
| 全角マイナス || -- || 0x817C || U+FF0D
| 全角マイナス || -- || 0x817C || U+FF0D
|-
| 罫線(横) || ── || 0x849F || U+2500
|}
|}
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["全角ダッシュ(――)に整形","R",function(a){
f.push(["全角ダッシュ(――)に整形","s",function(_){ //2017-06-25
   return a.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}|─{2,}/g,"――") }]);
   return _.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}/g,"――") }]);
</source>
</syntaxhighlight>


;青空文庫 ルビを除去
;青空文庫 ルビを除去
:<span style="color:#c00;">《</span> で始まり <span style="color:#c00;">》</span> で終わる箇所を除去します。ルビ開始位置を表す <span style="color:#c00;">|</span> がある場合、| も除去します。
:<code>《</code> で始まり <code>》</code> で終わる箇所を除去します。ルビ開始位置を表す <code>|</code> がある場合、<code>|</code> も除去します。
:例> <span style="background:#bfdfff;">一応《いちおう》何時《いつ》もの/霧の|ロンドン警視庁《スコットランドヤード》</span> → 一応何時もの/霧のロンドン警視庁
:例> <span style="background:#bfdfff;">一応《いちおう》何時《いつ》もの/霧の|ロンドン警視庁《スコットランドヤード》</span> → 一応何時もの/霧のロンドン警視庁
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["青空文庫 ルビを除去","R",function(a){
f.push(["青空文庫 ルビを除去","s",function(_){ //2015-09-30
   return a.replace(/(?:|([^《]+))?《.*?》/g,"$1") }]);
   return _.replace(/(?:|([^《\n]+))?《.*?》/g,"$1") }]);
</source>
</syntaxhighlight>


;青空文庫 注記を除去
;青空文庫 注記を除去
:<span style="color:#c00;">[#</span> で始まり <span style="color:#c00;">]</span> で終わる箇所を除去します。
:<code>[#</code> で始まり <code>]</code> で終わる箇所を除去します。
:例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※
:例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["青空文庫 注記を除去","R",function(a){
f.push(["青空文庫 注記を除去","s",function(_){ //2014-03-14
   return a.replace(/[#.*?]/g,"") }]);
   return _.replace(/[#.*?]/g,"") }]);
</source>
</syntaxhighlight>
:外字を表す注記 <span style="color:#c00;">※[#~]</span> は除去したくない場合は、下記の内容に差し替えてください。
;青空文庫 注記(外字以外)を除去
:外字を表す注記 <code>※[# ~ ]</code> は例外とし、除去しません。
:例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※[#二の字点、1-2-22]
:例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※[#二の字点、1-2-22]
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["青空文庫 注記(外字以外)を除去","R",function(a){
f.push(["青空文庫 注記(外字以外)を除去","s",function(_){ //2014-03-14
   return a.replace(/(※[#.*?])|[#.*?]/g,"$1") }]);
   return _.replace(/(※[#.*?])|[#.*?]/g,"$1") }]);
</source>
</syntaxhighlight>
 
==Web/HTML 用途==


=== Web/HTML ===
;★HTMLタグを除去
;★HTMLタグを除去
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["HTMLタグを除去","R",function(a){
f.push(["HTMLタグを除去","s",function(_){ //2015-09-30
   return a.replace(/<(".*?"|'.*?'|[^'"])*?>/g,"") }]);
   return _.replace(/<("[^"]*"|'[^']*'|[^"'>])*>/g,"") }]);
</source>
</syntaxhighlight>


;行末に&lt;br&gt;を付加
;行末に&lt;br&gt;を挿入
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["行末に<br>を付加","RS",function(a){
f.push(["行末に<br>を挿入","L",function(_){ //2015-02-14
   return a.replace(/$/gm,"<br>") }]);
   return _.replace(/$/gm,"<br>") }]);
</source>
</syntaxhighlight>
;&lt;br&gt;を改行に変換
;&lt;br&gt;を改行に変換
:改行タグを改行に変換します。ただしタグ直後に改行を含む場合は、タグのみ削除します。
:改行タグを改行に変換します。ただし、改行タグ直後に改行が含まれている場合は、二重改行にならないようタグのみ削除します。
:※対応タグは <code>&lt;br&gt; &lt;br/&gt; &lt;br /&gt;</code> の3種類です。英字の大小は問いません。
:※対応タグは <code>&lt;br&gt; &lt;br/&gt; &lt;br /&gt;</code> の3種類です。英字の大小は問いません。
:<span style="color:#c00;">※属性付きには対応していません。</span>例> <code>&lt;br clear="all"&gt;</code> など
:<b style="color:#c00;">※属性付きには対応していません。</b>例> <code>&lt;br clear="all"&gt;</code> など
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["<br>を改行に変換","R",function(a){
f.push(["<br>を改行に変換","s",function(_){ //2015-02-14
   return a.replace(/<br( ?\/)?>\n?/gi,"\n") }]);
   return _.replace(/<br( ?\/)?>\n?/gi,"\n") }]);
</source>
</syntaxhighlight>


;★実体参照 &"<> &xxx;
;★実体参照 &"<> &xxx;
;★実体参照 &xxx; ␣><"&
;★実体参照 &xxx; ␣><"&
:HTML で使用される文字実体参照の変換を行います。
:HTML で使用される文字実体参照の変換を行います。
:{| class="wikitable"
:{|class="wikitable"
! 文字 !! 実体参照 !! 備考
! 文字 !! 実体参照 !! 備考
|-
|-
430行目: 564行目:
|}
|}
:&amp;nbsp; は U+00A0 (No-Break Space) ではなく、U+0020 (半角空白) に変換します。
:&amp;nbsp; は U+00A0 (No-Break Space) ではなく、U+0020 (半角空白) に変換します。
:空白文字から &amp;nbsp; への変換は、実用上不都合が多いため行いません。
:空白文字 → &amp;nbsp; の変換は、実用上不都合が多いため行いません。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(['実体参照 &&"<> → &&xxx;',"CR",function(a){
f.push(['実体参照 &&"<> → &&xxx;',"s",function(_){ //2015-03-14
   return [ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"] ]}]);
   return _.replaceBatch([ ["&","&amp;amp;"],['"',"&amp;quot;"],["<","&amp;lt;"],[">","&amp;gt;"] ]) }]);
f.push(['実体参照 &&xxx; → \u2423><"&&',"CR",function(a){
f.push(['実体参照 &&xxx; → \u2423><"&&',"s",function(_){ //2015-03-14
   return [ ["&nbsp;"," "],["&gt;",">"],["&lt;","<"],["&quot;",'"'],["&amp;","&"] ]}]);
   return _.replaceBatch([ ["&amp;nbsp;"," "],["&amp;gt;",">"],["&amp;lt;","<"],["&amp;quot;",'"'],["&amp;amp;","&"] ]) }]);
</source>
</syntaxhighlight>
:半角空白 → &amp;nbsp; の変換も行う場合は、下記の内容に差し替えてください。
:半角空白 → &amp;nbsp; の変換も行う場合は、下記の内容に差し替えてください。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(['実体参照 &&"<>\u2423 → &&xxx;',"CR",function(a){
f.push(['実体参照 &&"<>\u2423 → &&xxx;',"s",function(_){ //2015-03-14
   return [ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"],[" ","&nbsp;"] ]}]);
   return _.replaceBatch([ ["&","&amp;amp;"],['"',"&amp;quot;"],["<","&amp;lt;"],[">","&amp;gt;"],[" ","&amp;nbsp;"] ]) }]);
</source>
</syntaxhighlight>


;★数値参照 &#dec; に変換
;★数値参照 &#dec; に変換
:文字列を数値文字参照(10進)形式に変換します。(dec=decimal/十進法)
:文字列を数値文字参照(10進)形式に変換します。(dec=decimal/十進法)
:例> <span style="background:#bfdfff;">Aわ𠀋</span> → &amp;#65;&amp;#12431;&amp;#131083;
:例> <span style="background:#bfdfff;">Aわ𩸽</span> → &amp;#65;&amp;#12431;&amp;#171581;
:→ コードは [[#符号化/復号化|符号化/復号化]] の節の <b>Unicode 文字 ⇒ &#dec;</b> を参照
:→ <b>[[#符号化/復号化]]</b> の節の <b>&#dec; エンコード</b> を参照


;★数値参照 &#xHEX; に変換
;★数値参照 &#xHEX; に変換
:文字列を数値文字参照(16進)形式に変換します。(HEX=hexadecimal/十六進法)
:文字列を数値文字参照(16進)形式に変換します。(HEX=hexadecimal/十六進法)
:例> <span style="background:#bfdfff;">Aわ𠀋</span> → &amp;#x41;&amp;#x308F;&amp;#x2000B;
:例> <span style="background:#bfdfff;">Aわ𩸽</span> → &amp;#x41;&amp;#x308F;&amp;#x29E3D;
:→ コードは [[#符号化/復号化|符号化/復号化]] の節の <b>Unicode 文字 ⇒ &#xHEX;</b> を参照
:→ <b>[[#符号化/復号化]]</b> の節の <b>&#xHEX; エンコード</b> を参照


;★数値参照を文字に変換
;★数値参照を文字に変換
:数値文字参照(10進/16進)を文字列に変換します。
:数値文字参照(10進/16進)を文字列に変換します。
:例> <span style="background:#bfdfff;">&amp;#65;&amp;#x308F;&amp;#x2000b;</span> → Aわ𠀋
:例> <span style="background:#bfdfff;">&amp;#65;&amp;#x308F;&amp;#x29e3d;</span> → Aわ𩸽
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["数値参照を文字に変換","R",function(a){
f.push(["数値参照を文字に変換","s",function(_){ //2019-06-01
   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}) }]);
   return _.replace(/&#(?:([0-9]{1,7})|x([0-9a-f]{1,6}));/gi,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}) }]);
</source>
</syntaxhighlight>
 
==マクロ/コード 用途==
 
;★行頭 // を付加/削除
:行頭に // が無い行なら // を付加し、有る行なら // を削除します。
:※このコマンドをよく利用される場合は「[[コメントマーク付け外し]]」マクロの導入をオススメします。
<source lang="javascript">
f.push(["行頭 \/\/ を付加/削除","RM",function(a){
  return a.match(/^\/\/.*$/)? a.slice(2): "\/\/"+a }]);
</source>


;★インデント(半角空白2個)
=== マクロ/コード ===
:各行の行頭に半角空白2文字を挿入します。
;★行頭 // を挿入/削除
:※このコマンドをよく利用される場合は「[[字下げ・字上げ]]」マクロの導入をオススメします。
:行頭に // が無い行なら // を挿入し、有る行なら // を削除します。
<source lang="javascript">
:※このコマンドをよく利用される場合は「<b>[[コメントマーク付け外し]]</b>」マクロの導入をオススメします。
f.push(["インデント(半角空白2個)","RM",function(a){
<syntaxhighlight lang="javascript" copy>
   return " "+a }]);
f.push(["行頭 \/\/ を挿入/削除","L",function(_){ //2015-03-14
</source>
   return _.replace(/^(\/\/)?/gm,function(s){return s? "": "\/\/"}) }]);
</syntaxhighlight>


;編集中のファイルのパスをコピー
;★このマクロを編集
;編集中の全ファイルのパスをコピー
:実行中のマクロ(テキスト整形)を Mery で開きます。
:現在編集中のファイルの絶対パスをクリップボードにコピーします。
:※マクロを実行後、[マクロ]→[編集] でファイルを開くのと同様です。
:新規作成ファイルなどパスが存在しない場合は、無題 の2文字がコピーされます。
<syntaxhighlight lang="javascript" copy>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["このマクロを編集","",function(){ //2019-06-01
f.push(["編集中のファイルのパスをコピー","F",function(a){
   Editor.OpenFile(ScriptFullName, meEncodingNone, meOpenAllowNewWindow) }]);
   ClipboardData.SetData(Document.FullName||"無題") }]);
</syntaxhighlight>
f.push(["編集中の全ファイルのパスをコピー","F",function(a){
  var list=[]; for(var j=0;j<Editors.Count;j++){var d=Editors.Item(j).Documents; for(var i=0;i<d.Count;i++){list.push(d.Item(i).FullName||"無題")}} ClipboardData.SetData(list.join("\r\n")) }]);
</source>


;My Macros フォルダを開く
;マクロフォルダを開く
:Mery の My Macros フォルダをエクスプローラで開きます。
:エクスプローラを起動し、実行中のマクロ(テキスト整形)があるフォルダを開きます。
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["My Macros フォルダを開く","F",function(a){
f.push(["マクロフォルダを開く","",function(){ //2015-12-26
   new ActiveXObject("Shell.Application").Explore((new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(Editor.FullName))+"\\My Macros") }]);
   new ActiveXObject("Shell.Application").Explore(new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(ScriptFullName)) }]);
</source>
</syntaxhighlight>


;挿入 Confirm(|)
;挿入 Confirm(|)
:文字列 <code>if(!Confirm())Quit();</code> を挿入します。
:文字列 <code>if(!Confirm(</code> <code>))Quit();</code> を挿入します。
:<code>Alert()</code> と違い、[キャンセル] ボタンを押すとマクロを強制終了できるため、無限ループにハマっても対処できます。
<syntaxhighlight lang="javascript" copy>
<source lang="javascript">
f.push(["挿入 Confirm(|)","",function(_){ //2019-06-01
f.push(["挿入 Confirm(|)","F",function(a){
   return ["if(!Confirm(" , _ , "))Quit();"] }]);
   var p="if(!Confirm(",s="))Quit();"; a.Text=p+a.Text+s; a.CharLeft(false,s.length) }]);
</syntaxhighlight>
</source>


;選択範囲を eval で評価
;選択範囲を eval で評価
:ステータスバーに eval(選択範囲) した結果を表示します。
:ステータスバーに eval(<i>選択範囲</i>) の結果を表示します。
:たとえば、選択範囲が <span style="background:#bfdfff;">10*(5+20)</span> なら、250 と表示されます。
:たとえば、選択範囲が <code style="background:#bfdfff;">10*(5+20)</code> なら、250 と表示されます。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["選択範囲を eval で評価","F",function(a){
f.push(["選択範囲を eval で評価","s",function(_){ //2019-06-01
  if(a.Text){Status=eval(a.Text)} }]);
   Status=eval(_) }]);
</source>
</syntaxhighlight>
 
==検索/置換==
 
;★全角英数を検索
:全角英数字を検索します。
<source lang="javascript">
f.push(["全角英数を検索","F",function(a){
  a.Find("[0-9A-Za-z]", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
</source>
;★半角カナを検索
:半角カナ類を検索します。
<source lang="javascript">
f.push(["半角カナを検索","F",function(a){
   a.Find("[。-゚]", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
</source>
;★CJK漢字を検索
:CJK (China/Japan/Korea 漢字文化圏) の漢字を検索します。
<source lang="javascript">
f.push(["CJK漢字を検索","F",function(a){
  a.Find("[\\p{Han}]", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
</source>
 
;選択文字列を検索
:「検索する文字列」に選択文字列を設定して「次/下を検索」します。
:「次/前の文字列を検索」と異なり、改行を含む文字列(複数行)も検索できるのが特徴です。
:<span style="color:#c00;">※Mery の仕様上、改行を含む場合は検索強調が効きません。</span>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["選択文字列を検索","F",function(a){
  if(a.Text)a.Find(a.Text.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"), meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
</source>
 
;選択文字列をすべて削除
:「検索する文字列」に選択文字列を、「置換後の文字列」に空欄を設定して「すべて置換」します。
:上記のコマンド「選択文字列を検索」と同様、改行を含む文字列(複数行)も削除できます。
:<span style="color:#c00;">※検索強調が変更されます。</span>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["選択文字列をすべて削除","F",function(a){
  if(a.Text)a.Replace(a.Text.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"),"", meFindReplaceRegExp+meFindReplaceCase+meReplaceAll) }]);
</source>
 
;★検索強調をすべて解除
:「検索文字列の強調を解除」をすべての文書で実行します。
:ひとつひとつ解除するのが面倒な場合などにご利用ください。
<source lang="javascript" style="word-wrap:break-word;">
f.push(["検索強調をすべて解除","F",function(a){
  for(var j=0;j<Editors.Count;j++){var d=Editors.Item(j).Documents; for(var i=0;i<d.Count;i++){d.Item(i).HighlightFind=false}} }]);
</source>
 
==挿入/貼付==


=== 挿入/貼付 ===
;★半角/全角の間を空ける
;★半角/全角の間を空ける
;★半角英数/全角の間を空ける
;★半角英数/全角の間を空ける
:半角文字/半角英数と全角文字の間に半角空白を挿入します。
:半角文字/半角英数と全角文字の間に半角空白を挿入します。
:※半角文字=ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。
:※<b style="color:#c00;">半角文字</b>=ASCII文字+半角カナ、<b style="color:#c00;">全角文字</b>=それ以外の文字、を意味しています。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["半角/全角の間を空ける","R",function(a){
f.push(["半角/全角の間を空ける","s",function(_){ //2014-02-16
   return a.replace(/([!-~。-゚](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[!-~。-゚]))/g,"$1 ") }]);
   return _.replace(/([!-~。-゚](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[!-~。-゚]))/g,"$1 ") }]);
f.push(["半角英数/全角の間を空ける","R",function(a){
f.push(["半角英数/全角の間を空ける","s",function(_){ //2014-02-16
   return a.replace(/([0-9A-Za-z](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[0-9A-Za-z]))/g,"$1 ") }]);
   return _.replace(/([0-9A-Za-z](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[0-9A-Za-z]))/g,"$1 ") }]);
</source>
</syntaxhighlight>


;★数値を3桁,区切りに
;★数値を3桁,区切りに
:半角数字列を、3桁毎にカンマで区切ります。小数点以下(ピリオド以降)は桁区切りしません。
:半角数字列を3桁毎にコンマで区切ります。小数点以下(ピリオド以降)は区切りません。
:例> <span style="background:#bfdfff;">87654321/54321.12345/.12345</span> → 87,654,321/54,321.12345/.12345
:例> <span style="background:#bfdfff;">87654321/0.12345/54321.12345</span> → 87,654,321/0.12345/54,321.12345
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["数値を3桁,区切りに","R",function(a){
f.push(["数値を3桁,区切りに","s",function(_){ //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,")}) }]);
   return _.replace(/([^.0-9]|^)([0-9]+)/g,function(_,p,n){return p+n.replace(/([0-9])(?=(?:[0-9]{3})+$)/g,"$1,")}) }]);
</source>
</syntaxhighlight>


;複製貼り付け...
;複製貼り付け...
:クリップボードの文字列を、入力した回数分複製してから貼り付けます。
:クリップボードの文字列を、入力した回数分複製してから貼り付けます。
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["複製貼り付け...","R",function(a){
f.push(["複製貼り付け...","c",function(){ //2019-06-01
   var r=[],c=ClipboardData.GetData(),n=parseInt(Prompt("複製回数: ※半角数字","")); if(!n||n<1)Quit(); while(n--){r.push(c)} return r.join("") }]);
   var r=[],c=ClipboardData.GetData(),n=parseInt(Prompt("複製回数: ※半角数字","")); if(n>0){ while(n--){r.push(c)} return r.join("") } }]);
</source>
</syntaxhighlight>


;★各行行頭/各行行末に貼り付け
;★行頭/行末に貼り付け
:クリップボードの文字列を、各行の行頭/行末に貼り付けます。
:クリップボードの文字列を、各行の行頭/行末に貼り付けます。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["各行行頭に貼り付け","RM",function(a){
f.push(["行頭に貼り付け","L c",function(_){ //2015-09-30
   return ClipboardData.GetData().replace(/(\r\n|\r|\n)$/,"")+a }]);
   var c=ClipboardData.GetData().replace(/(\r\n|[\r\n])$/,""); return _.replace(/^/gm,c) }]);
f.push(["各行行末に貼り付け","RM",function(a){
f.push(["行末に貼り付け","L c",function(_){ //2015-09-30
   return a+ClipboardData.GetData().replace(/(\r\n|\r|\n)$/,"") }]);
   var c=ClipboardData.GetData().replace(/(\r\n|[\r\n])$/,""); return _.replace(/$/gm,c) }]);
</source>
</syntaxhighlight>


;★各行行頭/各行行末に文字列付加... (移植)
;★行頭/行末に挿入...
:入力した文字列を、各行の行頭/行末に挿入します。
:入力した文字列を、各行の行頭/行末に挿入します。
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["各行行頭に文字列付加...","RM",(function(a){
f.push(["行頭に挿入...","L",function(_){ //2019-06-01
   var c=null; return function(a){ if(!c){ if(!(c=Prompt("各行行頭に付加する文字列:",""))){Quit()} } return c+a } })()]);
   var p=Prompt("行頭に挿入する文字列:",""); if(p)return _.replace(/^/gm,p) }]);
f.push(["各行行末に文字列付加...","RM",(function(a){
f.push(["行末に挿入...","L",function(_){ //2019-06-01
   var c=null; return function(a){ if(!c){ if(!(c=Prompt("各行行末に付加する文字列:",""))){Quit()} } return a+c } })()]);
   var p=Prompt("行末に挿入する文字列:",""); if(p)return _.replace(/$/gm,p) }]);
</source>
</syntaxhighlight>


;各行先頭/各行末尾に文字列付加... (矩形対応/Mery 2.1.0~)
;各行先頭/末尾に挿入...
:入力した文字列を、Mery の置換機能を利用して各行の先頭/末尾に挿入します。
:下記の条件で置換を行い、入力した文字列を各行の先頭/末尾に挿入します。
:<span style="color:#c00;">※矩形対応には Mery 2.1.0 以降が必要です。</span>動作は Mery の矩形置換の仕様に準じます。
:<b style="color:#c00;">※矩形対応には Mery 2.1.0 以降が必要です。</b>
:<span style="color:#c00;">※Mery の置換機能を利用するため検索強調が解除されます</span>(正確には解除ではなく変更)。
:<b style="color:#c00;">※Mery の仕様上、ゼロ幅には対応していません。</b>ゼロ幅で実行すると、<b>表示行頭</b>に文字列が挿入されます。
:<span style="color:#c00;">※Mery の仕様上、零幅には対応していません。</span>零幅で実行すると、行頭(表示行)に文字列が挿入されます。
:{|class="wikitable"
:※コマンド実行時、下記の条件で置換が行われます。
:{| class="wikitable"
! 検索文字列 (先頭)
! 検索文字列 (先頭)
| <code>^(?=.&#124;\n)</code>
| <code>^(?=.&#x7C;\n)</code>
|-
|-
! 検索文字列 (末尾)
! 検索文字列 (末尾)
| <code>(?<=.)$&#124;^(?=\n)</code>
| <code>(?<=.)$&#x7C;^(?=\n)</code>
|-
|-
! 置換文字列
! 置換文字列
625行目: 696行目:
| 正規表現を使用する (meFindReplaceRegExp)<br>選択した範囲のみ (meReplaceSelOnly)<br>すべて置換 (meReplaceAll)
| 正規表現を使用する (meFindReplaceRegExp)<br>選択した範囲のみ (meReplaceSelOnly)<br>すべて置換 (meReplaceAll)
|}
|}
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["各行先頭に文字列付加...","F",function(a){
f.push(["各行先頭に挿入...","",function(_,$){ //2019-06-01
   var p=Prompt("各行先頭に付加する文字列:",""); if(!p)Quit(); a.Replace("^(?=.|\\n)",p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]);
   var p=Prompt("各行先頭に挿入する文字列:",""); if(p)$.Replace("^(?=.|\\n)", p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]);
f.push(["各行末尾に文字列付加...","F",function(a){
f.push(["各行末尾に挿入...","",function(_,$){ //2019-06-01
   var p=Prompt("各行末尾に付加する文字列:",""); if(!p)Quit(); a.Replace("(?<=.)$|^(?=\\n)",p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]);
   var p=Prompt("各行末尾に挿入する文字列:",""); if(p)$.Replace("(?<=.)$|^(?=\\n)", p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]);
</source>
</syntaxhighlight>


==除去/削除==
;行頭に連番挿入 (#)
:行頭に連番 (1), (2), (3) … を挿入します。
<syntaxhighlight lang="javascript" copy>
f.push(["行頭に連番挿入 (#)","L",function(_){ //2015-09-30
  var re=/^/gm, n=1, pf="(", sf=")"; return _.replace(re,function(){return pf+(n++)+sf}) }]);
</syntaxhighlight>
;行頭に連番挿入 (#/Z)
:選択行数を Z として、連番 (1/Z), (2/Z), (3/Z) … を挿入します。
<syntaxhighlight lang="javascript" copy>
f.push(["行頭に連番挿入 (#/Z)","L",function(_){ //2015-09-30
  var re=/^/gm, n=1, m=(_.match(re)||[]).length, pf="(", sf="/"+m+")"; return _.replace(re,function(){return pf+(n++)+sf}) }]);
</syntaxhighlight>
;行頭に連番挿入 (0#)
:連番が2桁以上になる場合、桁揃えした連番 (01), (02), (03) … を挿入します。
<syntaxhighlight lang="javascript" copy>
f.push(["行頭に連番挿入 (0#)","L",function(_){ //2015-09-30
  var re=/^/gm, n=1, m=(_.match(re)||[]).length, pf="(", sf=")", sp="0", k=String(m).length, sp=new Array(k).join(sp); return _.replace(re,function(){return pf+(sp+(n++)).slice(-k)+sf}) }]);
</syntaxhighlight>


;※行頭に連番挿入系コマンドの比較
:{|class="wikitable"
! 例文 !! (#) !! (#/Z) !! (0#)
|-
| 1行目<br>2行目<br>…<br>9行目<br>10行目<br>11行目<br>…<br>99行目<br>100行目
| (1)1行目<br>(2)2行目<br>…<br>(9)9行目<br>(10)10行目<br>(11)11行目<br>…<br>(99)99行目<br>(100)100行目
| (1/100)1行目<br>(2/100)2行目<br>…<br>(9/100)9行目<br>(10/100)10行目<br>(11/100)11行目<br>…<br>(99/100)99行目<br>(100/100)100行目
| (001)1行目<br>(002)2行目<br>…<br>(009)9行目<br>(010)10行目<br>(011)11行目<br>…<br>(099)99行目<br>(100)100行目
|}
;連番を出力...
:<code><i>数値</i>..<i>数値</i></code>を含む文字列(数値は 0 以上の整数)を入力すると、連番に展開して書き出します。
:{|class="wikitable"
! 例
| <code>8..10</code>
| <code>10..8</code>
| <code>第01..3章</code>
| <code>第1..003章</code>
| <code>1..3..9</code>
|-
! 結果
| 8<br>9<br>10
| 10<br>9<br>8
| 第01章<br>第02章<br>第03章
| 第001章<br>第002章<br>第003章
| 1..9<br>2..9<br>3..9
|-
! 補足
|
| 降順可
|colspan="2"| ゼロ始まりならゼロ埋め
| 最初のみ展開
|}
<syntaxhighlight lang="javascript" copy>
f.push(["連番を出力...","",function(_){ //2019-06-01
  var p=Prompt("連番を出力: ※例> 第1..10章",_.match(/^.*/)[0]), q=p.replace(/^([\s\S]*?)((0*)[0-9]+)\.\.((0*)[0-9]+)([\s\S]*)$/,function(_,p,n,nz,m,mz,q){var r=[],d=Math.max(n.length,m.length),z=(nz||mz)?new Array(d+1).join("0"):"",n=Number(n),m=Number(m); if(n<=m){for(;n<=m;n++)r.push(p+(z+n).slice(-d)+q);}else{for(;n>=m;n--)r.push(p+(z+n).slice(-d)+q);} return r.join("\n")}); if(q!==p)return q }]);
</syntaxhighlight>
=== 除去/削除 ===
;★空白文字を除去
;★空白文字を除去
:空白文字(半角空白/全角空白/水平タブ)を除去します。
:空白文字(半角空白/全角空白/水平タブ)を除去します。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["空白文字を除去","R",function(a){
f.push(["空白文字を除去","s",function(_){ //2013-09-15
   return a.replace(/[  \t]+/g,"") }]);
   return _.replace(/[  \t]+/g,"") }]);
</source>
</syntaxhighlight>
;★行頭行末の空白を除去 (移植)
;★行頭行末/行頭/行末の空白を除去
;★行頭の/行末の空白を除去 (移植)
<syntaxhighlight lang="javascript" copy>
:行頭および行末にある空白文字を除去します。
f.push(["行頭行末の空白を除去","L",function(_){ //2013-09-15
<source lang="javascript">
   return _.replace(/^[  \t]+|[  \t]+$/gm,"") }]);
f.push(["行頭行末の空白を除去","RS",function(a){
f.push(["行頭の空白を除去","L",function(_){ //2015-02-14
   return a.replace(/^[  \t]+|[  \t]+$/gm,"") }]);
   return _.replace(/^[  \t]+/gm,"") }]);
f.push(["行頭の空白を除去","RS",function(a){
f.push(["行末の空白を除去","L",function(_){ //2015-02-14
   return a.replace(/^[  \t]+/gm,"") }]);
  return _.replace(/[  \t]+$/gm,"") }]);
f.push(["行末の空白を除去","RS",function(a){
</syntaxhighlight>
   return a.replace(/[  \t]+$/gm,"") }]);
 
</source>
;空白行の空白を除去
:空白行を、改行のみの空行にします。
<syntaxhighlight lang="javascript" copy>
f.push(["空白行の空白を除去","L",function(_){ //2017-06-25
   return _.replace(/^[  \t]+$/gm,"") }]);
</syntaxhighlight>


;★空白行を削除
;★空白行を削除
:空白行(改行/半角空白/全角空白/水平タブのみの行)を削除します。
:空白行(半角空白/全角空白/水平タブ/改行のみの行)を削除します。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["空白行を削除","RM",function(a){
f.push(["空白行を削除","L",function(_){ //2015-03-14
   return a.match(/^[  \t]*$/)? null:a }]);
   return _.replace(/^[  \t]*$\n?/gm,"") }]);
</source>
</syntaxhighlight>
;空白行を圧縮
;空白行を圧縮
:連続する空白行を1行の空行に変換します。連続しない(=1行の)空白行は削除します。
:連続する空白行を1行の空行に変換します。連続しない(=1行の)空白行は削除します。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["空白行を圧縮","RS",function(a){
f.push(["空白行を圧縮","L",function(_){ //2015-02-14
   return a.replace(/^[  \t]+$/gm,"").replace(/^(\n)\n+|^\n/gm,"$1") }]);
   return _.replace(/^[  \t]+$/gm,"").replace(/^(\n)\n+|^\n/gm,"$1") }]);
</source>
</syntaxhighlight>
;空白行を減量
;空白行を減量
:連続する空白行を1行分削減します。
:連続する空白行を1行分削減します。
:空白行の連続が3行なら2行に、2行なら1行に、1行なら0行(=削除)になります。
:空白行の連続が3行なら2行に、2行なら1行に、1行なら0行(=削除)になります。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["空白行を減量","RS",function(a){
f.push(["空白行を減量","L",function(_){ //2015-02-14
   return a.replace(/((?:^[  \t]*$\n?)*)(?:^[  \t]*$\n?)/gm,"$1") }]);
   return _.replace(/((?:^[  \t]*$\n?)*)(?:^[  \t]*$\n?)/gm,"$1") }]);
</source>
</syntaxhighlight>


;★重複行を削除 (移植)
;★重複行を単一化
:同じ内容の行が2個以上ある場合、2個目以降を削除します。
:同じ内容の行が2個以上ある場合、2個目以降を削除します。
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["重複行を削除","RS",function(a){
f.push(["重複行を単一化","L",function(_){ //2018-01-15
   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") }]);
   var a=_.split("\n"),b=[],map={}; for(var i=0;i<a.length;i++){ if(!Object.prototype.hasOwnProperty.call(map,a[i])){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]);
</source>
</syntaxhighlight>
:空白行(改行/半角空白/全角空白/水平タブのみの行)は例外とする場合は、下記の内容に差し替えてください。
;重複行を単一化(空白行は除く)
<source lang="javascript" style="word-wrap:break-word;">
:空白行(半角空白/全角空白/水平タブ/改行のみの行)は例外とし、削除しません。
f.push(["重複行を削除(空白行は除く)","RS",function(a){
<syntaxhighlight lang="javascript" copy>
   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(["重複行を単一化(空白行は除く)","L",function(_){ //2018-01-15
</source>
   var a=_.split("\n"),b=[],map={}; for(var i=0;i<a.length;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") }]);
;★連続する重複行を削除
</syntaxhighlight>
<source lang="javascript">
;★連続する重複行を単一化
f.push(["連続する重複行を削除","RS",function(a){
<syntaxhighlight lang="javascript" copy>
   return a.replace(/(^.*$)\n(^\1$\n?)+/gm,"$2") }]);
f.push(["連続する重複行を単一化","L",function(_){ //2015-02-14
</source>
   return _.replace(/(^.*$)\n(^\1$\n?)+/gm,"$2") }]);
</syntaxhighlight>
 
;重複する/しない行を抽出
<syntaxhighlight lang="javascript" copy>
f.push(["重複する行を抽出","L",function(_){ //2018-01-15
  var a=_.split("\n"),b=[],k=0,map={}; for(var i=0;i<a.length;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(["重複しない行を抽出","L",function(_){ //2018-01-15
  var a=_.split("\n"),b=[],k=0,map={}; for(var i=0;i<a.length;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") }]);
</syntaxhighlight>


;※空白行/重複行削除系コマンドの違い (☐ は空白/↵ は改行)
;※空白行系/重複行系コマンドの比較 (☐ は空白/↵ は改行)
:{| class="wikitable"
:{|class="wikitable"
!colspan="4"| 空白行 !! !!colspan="4"| 重複行
! 例文 !! 空白行<br>を削除 !! 空白行<br>を圧縮 !! 空白行<br>を減量
|-
!rowspan="2" width="6px"|
! 元の文章 !! ~を削除 !! ~を圧縮 !! ~を減量
! 例文 !! 重複行を<br>単一化 !! 空白行は<br>除く !! 連続する<br>重複行 !! 重複する<br>行を抽出 !! しない<br>行を抽出
!
|-style="vertical-align:top;"
! 元の文章 !! ~を削除 !! 空白行は除く !! 連続する~
|- style="vertical-align:top;"
| 1行目↵<br>☐↵<br>2行目↵<br>☐↵<br>☐☐↵<br>3行目↵<br>☐↵<br>☐☐↵<br>☐☐☐↵<br>4行目
| 1行目↵<br>☐↵<br>2行目↵<br>☐↵<br>☐☐↵<br>3行目↵<br>☐↵<br>☐☐↵<br>☐☐☐↵<br>4行目
| 1行目↵<br>2行目↵<br>3行目↵<br>4行目
| 1行目↵<br>2行目↵<br>3行目↵<br>4行目
| 1行目↵<br>2行目↵<br>↵<br>3行目↵<br>↵<br>4行目
| 1行目↵<br>2行目↵<br>↵<br>3行目↵<br>↵<br>4行目
| 1行目↵<br>2行目↵<br>☐↵<br>3行目↵<br>☐↵<br>☐☐↵<br>4行目
| 1行目↵<br>2行目↵<br>☐↵<br>3行目↵<br>☐↵<br>☐☐↵<br>4行目
|
| あいう↵<br>あいう↵<br>☐↵<br>☐↵<br>☐☐↵<br>あいう↵<br>あいう↵<br>カキク↵<br>さしす↵<br>カキク<br>
| あいうえお↵<br>☐↵<br>☐↵<br>カキクケコ↵<br>カキクケコ↵<br>☐↵<br>☐☐↵<br>☐↵<br>あいうえお↵<br>あいうえお
| あいう↵<br>☐↵<br>☐☐↵<br>カキク↵<br>さしす
| あいうえお↵<br>☐↵<br>カキクケコ↵<br>☐☐
| あいう↵<br>☐↵<br>☐↵<br>☐☐↵<br>カキク↵<br>さしす
| あいうえお↵<br>☐↵<br>☐↵<br>カキクケコ↵<br>☐↵<br>☐☐↵<br>
| あいう↵<br>☐↵<br>☐☐↵<br>あいう↵<br>カキク↵<br>さしす↵<br>カキク
| あいうえお↵<br>☐↵<br>カキクケコ↵<br>☐↵<br>☐☐↵<br>☐↵<br>あいうえお
| あいう↵<br>☐↵<br>カキク
| ☐☐↵<br>さしす
|}
 
;★入力文字列を含む/含まない行を削除...
<syntaxhighlight lang="javascript" copy>
f.push(["入力文字列を含む行を削除...","L",function(_){ //2019-06-01
  var p=Prompt("以下の文字列を含む行を削除:",""); if(p)return _.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? "":s}) }]);
f.push(["入力文字列を含まない行を削除...","L",function(_){ //2019-06-01
  var p=Prompt("以下の文字列を含まない行を削除:",""); if(p)return _.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? s:""}) }]);
</syntaxhighlight>
 
;正規表現に一致する/しない行を削除...
:<b style="color:#c00;">※正規表現は JavaScript (JScript) の仕様で記述します。</b>
<syntaxhighlight lang="javascript" copy>
f.push(["正規表現に一致する行を削除...","L",function(_){ //2019-06-01
  var p=Prompt("以下の正規表現に一致する行を削除:",""); if(p){ p=new RegExp(p); return _.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? "":s}) } }]);
f.push(["正規表現に一致しない行を削除...","L",function(_){ //2019-06-01
  var p=Prompt("以下の正規表現に一致しない行を削除:",""); if(p){ p=new RegExp(p); return _.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? s:""}) } }]);
</syntaxhighlight>
 
;行頭/行末から数文字削除...
:各行の行頭/行末から指定した文字数分を削除します。
:※結合文字列には対応していません。
<syntaxhighlight lang="javascript" copy>
f.push(["行頭から数文字削除...","L",function(_){ //2019-06-01
  var n=parseInt(Prompt("行頭から削除する字数: ※半角数字","")); if(n>0)return _.replace(new RegExp("^(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}","gm"),"") }]);
f.push(["行末から数文字削除...","L",function(_){ //2019-06-01
  var n=parseInt(Prompt("行末から削除する字数: ※半角数字","")); if(n>0)return _.replace(new RegExp("(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}$","gm"),"") }]);
</syntaxhighlight>
 
=== 検索/置換 ===
;ASCII文字を単語検索
:空白文字などを除く ASCII 印字可能文字 (U+0021~007E) が1文字以上連続する箇所を検索します。
<syntaxhighlight lang="javascript" copy>
f.push(["ASCII文字を単語検索","",function(_,$){ //2017-05-28
  $.Find("(?<!\\g<Graph>)(?<Graph>[!-~])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</syntaxhighlight>
;半角カナを単語検索
:半角カナ類 (ヲ~ッ ア~ン 。 「 」 、 ・ ー ゙ ゚) が1文字以上連続する箇所を検索します。
<syntaxhighlight lang="javascript" copy>
f.push(["半角カナを単語検索","",function(_,$){ //2017-05-28
  $.Find("(?<!\\g<HKana>)(?<HKana>[。-゚])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</syntaxhighlight>
;全角英数を単語検索
:全角英数字 (0~9 A~Z a~z) が1文字以上連続する箇所を検索します。
<syntaxhighlight lang="javascript" copy>
f.push(["全角英数を単語検索","",function(_,$){ //2017-05-28
  $.Find("(?<!\\g<FAlnm>)(?<FAlnm>[0-9A-Za-z])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</syntaxhighlight>
;CJK漢字を単語検索
:CJK (China/Japan/Korea) の漢字が1文字以上連続する箇所を検索します。
<syntaxhighlight lang="javascript" copy>
f.push(["CJK漢字を単語検索","",function(_,$){ //2017-05-28
  $.Find("(?<!\\g<Han>\\g<VS>|\\g<Han>)(?:(?<Han>[\\p{Han}])(?<VS>[\\x{FE00}-\\x{FE02}\\x{E0100}-\\x{E01EF}])?)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</syntaxhighlight>
 
;ひらがなを単語検索
;カタカナを単語検索
:平仮名/片仮名が1文字以上連続する箇所を検索します。
:※検索対象となる文字は、下表のとおりです。囲み文字 ㋐ や組み文字 ㍍ は含まれません。
:{|class="wikitable" style="text-align:center;"
! !! 種別 !! 文字 !! Shift_JIS !! Unicode !! 備考
|-
!rowspan="3"| 平仮名<br>(かな)<br>89字
|rowspan="3"| 全角ひらがな (89字)
| ぁ ~ ん<br>ゔゕゖ || 0x829F~82F1<br>- || U+3041~3093<br>U+3094~3096 || ※SJIS では ゔゕゖ の3字は保存不可
|-
| ゝゞ || 0x8154, 8155 || U+309D, 309E || 踊り字(繰り返し)
|-
| ゟ || - || U+309F || 「より」の合字
|-
!rowspan="5"| 片仮名<br>(カナ)<br>164字
|rowspan="3"| 全角カタカナ (93字)
| ァ ~ ヶ<br>ヷヸヹヺ || 0x8340~8396<br>- || U+30A1~30F6<br>U+30F7~30FA || ※SJIS では ヷヸヹヺ の4字は保存不可
|-
| ヽヾ || 0x8152, 8153 || U+30FD, 30FE || 踊り字(繰り返し)
|-
| ヿ || - || U+30FF || 「コト」の合字
|-
| 半角カタカナ (55字) || ヲ ~ ッ<br>ア ~ ン || 0xA6~AF<br>0xB1~DD || U+FF66~FF6F<br>U+FF71~FF9D ||
|-
| カタカナ拡張 (16字) || ㇰ ~ ㇿ || - || U+31F0~31FF || アイヌ語表記などに用いる
|-
!rowspan="5"| 記号<br>8字
|colspan="5"| <span style="color:#c00;">※以下は、<b>仮名の後</b>に続いて出現する場合のみ検索される。</span>例> 複製゜ー<span style="background:#b4e4b4;">コヒ゜ー</span>
|-
| 半角/全角濁点 (2字) || ゙ ゛ || 0xDE, 814A || U+FF9E, 309B ||
|-
| 半角/全角半濁点 (2字) || ゚ ゜ || 0xDF, 814B || U+FF9F, 309C ||
|-
| 結合用濁点/半濁点 (2字) || &#x3099; &#x309A; || - || U+3099, 309A || 結合文字
|-
| 半角/全角長音符 (2字) || ー ー || 0xB0, 815B || U+FF70, 30FC ||
|}
<syntaxhighlight lang="javascript" copy>
f.push(["ひらがなを単語検索","",function(_,$){ //2017-05-28
  $.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(["カタカナを単語検索","",function(_,$){ //2017-05-28
  $.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) }]);
</syntaxhighlight>
 
;CP932依存文字を検索
:Shift_JIS (CP932) の環境依存文字 (NEC特殊文字・IBM拡張文字・ユーザー定義外字・未定義文字) を検索します。
<syntaxhighlight lang="javascript" copy>
f.push(["CP932依存文字を検索","",function(_,$){ //2017-05-28
  $.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) }]);
</syntaxhighlight>
 
;CJK互換漢字を検索
:CJK互換漢字 (U+F900~FAD9, 2F800~2FA1D) を検索します(CJK統合漢字扱いの12字 および 未定義の2字は除く)。
<syntaxhighlight lang="javascript" copy>
f.push(["CJK互換漢字を検索","",function(_,$){ //2018-01-15
  $.Find("[[^﨎﨏﨑﨓﨔﨟﨡﨣﨤﨧﨨﨩\\x{FA6E}\\x{FA6F}]&&[\\x{F900}-\\x{FAD9}\\x{2F800}-\\x{2FA1D}]]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</syntaxhighlight>
 
;サロゲートペアを検索
:UTF-16において2バイト2個組で1文字を形成する文字 (U+10000~10FFFF) を検索します。
<syntaxhighlight lang="javascript" copy>
f.push(["サロゲートペアを検索","",function(_,$){ //2015-09-30
  $.Find("[\\x{10000}-\\x{10FFFF}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</syntaxhighlight>
 
;結合文字列を検索
:他の文字と組み合わせて1文字を形成する文字列を検索します。
:※結合文字列や異体字を表示するには、アプリやフォントの対応が必要です。
:{|class="wikitable" style="text-align:center;"
!
!colspan="4"| ラテン文字
!colspan="3"| ひらがな
!colspan="2"| 漢字(異体字)
!colspan="2"| 囲み文字
|-
! 実際の表示
| ǖ ||colspan="3"| u&#x308;&#x304;
| じ ||colspan="2"| し&#x3099;
|colspan="2"| 辻&#xE0100;
|colspan="2"| あ&#x20DE;
|-
! 文字の構成
| ǖ || u||&#x308;||&#x304;
| じ || し||&#x3099;
| 辻||&#xE0100;
| あ||&#x20DE;
|-
! Unicode
| 01D6 || 0075||0308||0304
| 3058 || 3057||3099
| 8FBB||E0100
| 3042||20DE
|}
<syntaxhighlight lang="javascript" copy>
f.push(["結合文字列を検索","",function(_,$){ //2017-05-28
  $.Find("(?:[^\\p{M}\\n]|^)[\\p{M}]+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</syntaxhighlight>
 
;選択文字列を検索
:下記の条件で検索を行います。
:<b style="color:#c00;">※Mery の仕様上、改行や折り返しを含むと検索強調が不完全になります。</b>
:{|class="wikitable"
! 検索文字列
| ※選択文字列
|-
! フラグ
| 大文字と小文字を区別する (meFindReplaceCase)<br>正規表現を使用する (meFindReplaceRegExp)<br>文末まで検索したら文頭に移動する (meFindAround)<br>下/次を検索 (meFindNext)
|}
<syntaxhighlight lang="javascript" copy>
f.push(["選択文字列を検索","s",function(_,$){ //2019-06-01
  var acp=$.GetActivePos(),anp=$.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; $.Find(_.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext); $.SetActivePos(acp);$.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true; }]);
</syntaxhighlight>
 
;選択文字列をすべて削除
:下記の条件で置換を行い、選択文字列を削除します。
:{|class="wikitable"
! 検索文字列
| ※選択文字列
|-
! 置換文字列
| ※空欄
|-
! フラグ
| 大文字と小文字を区別する (meFindReplaceCase)<br>正規表現を使用する (meFindReplaceRegExp)<br>すべて置換 (meReplaceAll)
|}
|}
<syntaxhighlight lang="javascript" copy>
f.push(["選択文字列をすべて削除","s",function(_,$){ //2019-06-01
  $.Replace(_.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), "", meFindReplaceCase+meFindReplaceRegExp+meReplaceAll) }]);
</syntaxhighlight>
;検索強調をすべて解除
:[検索]→[検索文字列の強調を解除] をすべての文書で実行します。
<syntaxhighlight lang="javascript" copy>
f.push(["検索強調をすべて解除","",function(){ //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}} }]);
</syntaxhighlight>


;★入力文字列を含む/含まない行を削除... (移植)
;検索結果カウント
<source lang="javascript" style="word-wrap:break-word;">
:前回(直前)の検索条件で文書全体を検索し直し、一致した件数をステータスバーに表示します。
f.push(["入力文字列を含む行を削除...","RM",(function(a){
:<b style="color:#c00;">※検索条件が複雑なほど、件数が多いほど処理に時間がかかります</b>(作者の環境では、1000件で約2秒かかりました)。
   var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の文字列を含む行を削除:",""))){Quit()} } return (a.indexOf(c)>=0)? null:a } })()]);
:※処理に時間をかけたくない場合は「<b>[[検索ヒット数表示]]</b>」プラグインの導入をオススメします。
f.push(["入力文字列を含まない行を削除...","RM",(function(a){
<syntaxhighlight lang="javascript" copy>
  var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の文字列を含まない行を削除:",""))){Quit()} } return (a.indexOf(c)>=0)? a:null } })()]);
f.push(["検索結果カウント","",function(_,$){ //2015-09-30
</source>
   var t=new Date(),n=-1,acp=$.GetActivePos(),anp=$.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; Status=""; $.StartOfDocument(); do{$.FindRepeat(meFindNext);n++}while(!Status); $.SetActivePos(acp);$.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true; Status=n+"件の検索結果 (処理時間: "+(new Date()-t)/1000+"秒)" }]);
</syntaxhighlight>


;正規表現に一致する/しない行を削除... (移植)
=== 文書情報 ===
:<span style="color:#c00;">※正規表現は、JScript / JavaScript の仕様に則り記述します。</span>Mery の正規表現 (鬼車) とは仕様が異なる点があるので注意してください。
;総字行数カウント
<source lang="javascript" style="word-wrap:break-word;">
:総文字数と総表示行数をステータスバーに表示します。
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 } })()]);
:※サロゲートペアは2文字と数えます。
f.push(["正規表現に一致しない行を削除...","RM",(function(a){
<syntaxhighlight lang="javascript" copy>
  var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の正規表現に一致しない行を削除:",""))){Quit()}else{c=new RegExp(c)} } return c.test(a)? a:null } })()]);
f.push(["総字行数カウント","",function(){ //2019-06-01
</source>
   Status=Document.Text.length+"文字 ("+Document.GetLines(meGetLineView)+"表示行)" }]);
</syntaxhighlight>


==並べ替え==
;文字数カウント(空白は除く)
:選択範囲または文書全体の文字数(改行/半角空白/全角空白/水平タブは除く)をステータスバーに表示します。
:※サロゲートペアは1文字と数えます。
<syntaxhighlight lang="javascript" copy>
f.push(["文字数カウント(空白は除く)","",function(_){ //2019-06-01
  Status=(_||Document.Text).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").replace(/[\t\n\r  ]/g,"").length+"文字 (改行・空白抜き)" }]);
</syntaxhighlight>


;行の並べ替え(Unicode 昇順/降順) (移植)
;ステータスバーの表示をコピー
:行をUnicode(UTF-16)順で並べ替えます。
:ステータスバーの左端の欄に表示されている文字列をコピーします。
:※より柔軟に並べ替えたい場合は「[[行並べ替え]]」マクロの導入をオススメします。
<syntaxhighlight lang="javascript" copy>
<source lang="javascript">
f.push(["ステータスバーの表示をコピー","",function(){ //2019-06-01
f.push(["行の並べ替え(Unicode 昇順)","RS",function(a){
   ClipboardData.SetData(Status) }]);
   return a.split("\n").sort().join("\n") }]);
</syntaxhighlight>
f.push(["行の並べ替え(Unicode 降順)","RS",function(a){
  return a.split("\n").sort().reverse().join("\n") }]);
</source>


;行の並べ替え(逆順)
;編集中のファイルのパスをコピー
:行を逆順に並べ替えます。
;編集中の全ファイルのパスをコピー
<source lang="javascript">
:現在編集中のファイルのパスをクリップボードにコピーします。
f.push(["行の並べ替え(逆順)","RS",function(a){
:新規作成ファイルなどパスが存在しない場合は、<無題> の文字がコピーされます。
   return a.split("\n").reverse().join("\n") }]);
<syntaxhighlight lang="javascript" copy>
</source>
f.push(["編集中のファイルのパスをコピー","",function(){ //2015-03-14
  ClipboardData.SetData(Document.FullName||"<無題>") }]);
f.push(["編集中の全ファイルのパスをコピー","",function(){ //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")) }]);
</syntaxhighlight>


;行のシャッフル
=== 並べ替え ===
:行をランダムに並べ替えます。
;★行を昇順/降順並べ(Unicode)
<source lang="javascript" style="word-wrap:break-word;">
:Unicode 順に並べ替えます。
f.push(["行のシャッフル","RS",function(a){ //Fisher-Yates shuffle
<syntaxhighlight lang="javascript" copy>
   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") }]);
f.push(["行を昇順並べ(Unicode)","L",function(_){ //2017-06-25
</source>
   return _.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)","L",function(_){ //2017-06-25
  return _.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") }]);
</syntaxhighlight>


;文字の並ベ替え(逆順)
;★行を逆順並べ
:各行の文字を逆順に並べ替えます。
<syntaxhighlight lang="javascript" copy>
:例> <span style="background:#bfdfff;">文字の並ベ替え</span> → え替ベ並の字文
f.push(["行を逆順並べ","L",function(_){ //2014-10-12
:※下位サロゲート (U+DC00~DFFF)、結合文字の一部 (U+0300~036F, 3099, 309A)、異体字セレクタ (U+180B~0D, FE00~0F, E0100~EF) は、位置がズレないよう対処します。
   return _.split("\n").reverse().join("\n") }]);
:例> <span style="background:#bfdfff;">𠮟る/tréma/りんご</span> → ごんり/amért/る𠮟
</syntaxhighlight>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["文字の並べ替え(逆順)","R",function(a){
   return a.replace(/.+/g,function(s){return s.split(/(?![\uDC00-\uDFFF\u0300-\u036F\u3099\u309A\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF])/g).reverse().join("")}) }]);
</source>


;文字のシャッフル
;行をシャッフル
:各行の文字をランダムに並べ替えます。
:ランダムに並べ替えます。
:例> <span style="background:#bfdfff;">文字のシャッフル</span> → フ字のャシッル文
<syntaxhighlight lang="javascript" copy>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["行をシャッフル","L",function(_){ //2014-10-12
f.push(["文字のシャッフル","R",function(a){ //Fisher-Yates shuffle
   var 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") }]);
   return a.replace(/.+/g,function(s){var a=s.split(/(?![\uDC00-\uDFFF\u0300-\u036F\u3099\u309A\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF])/g),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("")}) }]);
</syntaxhighlight>
</source>


==字種/数値変換==
;行を文字数順並べ
:文字数の少ない順に並べ替えます。
:※符号点(コードポイント)の少ない順。結合文字列には対応していません。
:文字数の多い順に並べ替えたい場合は、<code>a.len-b.len</code> を <code>b.len-a.len</code> に書き換えてください。
<syntaxhighlight lang="javascript" copy>
f.push(["行を文字数順並べ","L",function(_){ //2019-06-01
  var b=_.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").split("\n"),a=_.split("\n"); for(var i=0;i<a.length;i++){a[i]={len:b[i].length,txt:a[i]}} a.sort(function(a,b){return a.len-b.len}); for(var i=0;i<a.length;i++){a[i]=a[i].txt} return a.join("\n") }]);
</syntaxhighlight>


;大文字/小文字に変換
;数行毎に逆順並べ...
:Mery の「選択範囲の変換」機能の一部を再現したものです。
:選択範囲を指定した行数で区切り、区間ごとに逆順に並べ替えます。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["大文字に変換","F",function(a){
f.push(["数行毎に逆順並べ...","L",function(_){ //2019-06-01
   a.ChangeCase(meCaseUpperCase) }]);
   var n=parseInt(Prompt("以下の行数毎に逆順並べ: ※半角数字","")); if(n>0)return (_+"\n").replace(new RegExp("(?:^.*$\\n){1,"+n+"}","gm"),function(s){return s.split("\n").reverse().join("\n")}).slice(1) }]);
f.push(["小文字に変換","F",function(a){
</syntaxhighlight>
   a.ChangeCase(meCaseLowerCase) }]);
;数行一組で逆順並べ...
</source>
:選択範囲を指定した行数で一組とし、組単位で逆順に並べ替えます。
<syntaxhighlight lang="javascript" copy>
f.push(["数行一組で逆順並べ...","L",function(_){ //2019-06-01
   var n=parseInt(Prompt("以下の行数を一組として逆順並べ: ※半角数字","")); if(n>0)return (_+"\n").match(new RegExp("(?:^.*$\\n){1,"+n+"}","gm")).reverse().join("").slice(0,-1) }]);
</syntaxhighlight>


;半角/全角に変換
;空行毎に逆順並べ
:Mery の「選択範囲の変換」機能の一部を再現したものです。
:選択範囲を空行(改行のみの行)で区切り、区間ごとに逆順に並べ替えます。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["半角に変換","F",function(a){
f.push(["空行毎に逆順並べ","L",function(_){ //2019-06-01
   a.ChangeWidth(meWidthHalfWidth) }]);
   return (_+"\n").replace(/\n+|[\s\S]*?\n(?=\n|$)/g,function(s){return s.split("\n").reverse().join("\n")}).slice(1) }]);
f.push(["全角に変換","F",function(a){
</syntaxhighlight>
   a.ChangeWidth(meWidthFullWidth) }]);
;空行一組で逆順並べ
</source>
:選択範囲を空行区切りで一組とし、組単位で逆順に並べ替えます。
<syntaxhighlight lang="javascript" copy>
f.push(["空行一組で逆順並べ","L",function(_){ //2019-06-01
   return (_+"\n").match(/\n+|[\s\S]*?\n(?=\n|$)/g).reverse().join("").slice(0,-1) }]);
</syntaxhighlight>


;★半角英数⇒全角 (移植)
;指定見出しで逆順並べ...
;★全角英数⇒半角 (移植)
:入力した文字列から始まる行を「見出し」とし、見出し単位で逆順に並べ替えます。
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["半角英数→全角","R",function(a){
f.push(["指定見出しで逆順並べ...","L",function(_){ //2019-06-01
   return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]);
   var p=Prompt("以下の文字から始まる行を一組として逆順並べ:","■").replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"); if(p){ var r=(_+"\n").match(new RegExp("[\\s\\S]*?\\n(?="+p+"|$)","g")); if(r[0].indexOf(p)!==0)r.push(r.shift()); return r.reverse().join("").slice(0,-1) } }]);
f.push(["全角英数→半角","R",function(a){
</syntaxhighlight>
  return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]);
</source>


;★半角カナ⇒全角
;※行を逆順並べ系コマンドの比較 (☐ は空白/↵ は改行)
;★全角カナ⇒半角
:{|class="wikitable"
<source lang="javascript" style="word-wrap:break-word;">
! 例文 !! 数行毎<br>(3行) !! 数行一組<br>(3行)
f.push(["半角カナ→全角","CR",function(a){
!rowspan="2" width="6px"|
  return [ ["",""],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]}]);
! 例文 !! 空行毎 !! 空行一組
</source>
|-
<source lang="javascript" style="word-wrap:break-word;">
| 1行目1組<br>2行目<br>3行目<br>4行目2組<br>5行目<br>6行目<br>7行目3組<br>8行目<br>9行目<br>10行目4組<br>11行目
f.push(["全角カナ→半角","CR",function(a){
| 3行目<br>2行目<br>1行目1組<br>6行目<br>5行目<br>4行目2組<br>9行目<br>8行目<br>7行目3組<br>11行目<br>10行目4組
  return [ ["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]}]);
| 10行目4組<br>11行目<br>7行目3組<br>8行目<br>9行目<br>4行目2組<br>5行目<br>6行目<br>1行目1組<br>2行目<br>3行目
</source>
| 1行目1組↵<br>2行目↵<br>3行目↵<br>↵<br>5行目2組↵<br>6行目↵<br>☐☐↵<br>8行目↵<br>↵<br>10行目3組↵<br>11行目
| 3行目↵<br>2行目↵<br>1行目1組↵<br>↵<br>8行目↵<br>☐☐↵<br>6行目↵<br>5行目2組↵<br>↵<br>11行目↵<br>10行目3組
| 10行目3組↵<br>11行目↵<br>↵<br>5行目2組↵<br>6行目↵<br>☐☐↵<br>8行目↵<br>↵<br>1行目1組↵<br>2行目↵<br>3行目
|}


;★全角かな⇒カナ
;文字を逆順並べ
;★全角カナ⇒かな
:各行の文字を逆順に並べ替えます。
:例> <span style="background:#bfdfff;">文字を逆順並べ</span> → べ並順逆を字文
:※[https://unicode.org/reports/tr29/ UAX #29] で規定される「拡張書記素クラスタ」に部分的に対応しています。対応していない文字は位置がズレます。
:* サロゲートペア (U+10000~10FFFF)
:* 結合文字の一部 (U+0300~6F, 1AB0~FF, 1DC0~FF, 20D0~FF, 3099~A, FE20~F)
:* 異体字セレクタ (U+180B~D, FE00~F, E0100~EF)
:* ゼロ幅非接合子/接合子 (U+200C~D)
:* 絵文字の国旗 (U+1F1E6~FF)
:* 絵文字の肌色指定 (U+1F3FB~F)
:* 結合不可の制御文字 (U+0000~1F, 007F~9F, 00AD, 2028~9, FEFF)
:例> <span style="background:#bfdfff;">𠮟る/りんこ&#x3099;/tre&#x301;ma</span> → ame&#x301;rt/こ&#x3099;んり/る𠮟
:{|class="wikitable" style="text-align:center;"
! 例文
|colspan="2"|𠮟||る
!rowspan="6" width="6px"|
|り||ん||colspan="2"|こ&#x3099;
!rowspan="6" width="6px"|
|t||r||colspan="2"|e&#x301;||m||a
|-
! Unicode
|colspan="2"|20B9F||308B
|308A||3093||style="background:#fe6;"|3053||style="background:#fcc;"|3099
|0074||0072||style="background:#fe6;"|0065||style="background:#fcc;"|0301||006D||0061
|-
! UTF-16
|style="background:#fe6;"|D842||style="background:#fcc;"|DF9F||308B
|colspan="4"|※同上
|colspan="6"|※同上
|-
!rowspan="3"|実行後
|る||colspan="2"|𠮟
|colspan="2"|こ&#x3099;||ん||り
|a||m||colspan="2"|e&#x301;||r||t
|-
|308B||colspan="2"|20B9F
|style="background:#fe6;"|3053||style="background:#fcc;"|3099||3093||308A
|0061||006D||style="background:#fe6;"|0065||style="background:#fcc;"|0301||0072||0074
|-
|308B||style="background:#fe6;"|D842||style="background:#fcc;"|DF9F
|colspan="4"|※同上
|colspan="6"|※同上
|}
<syntaxhighlight lang="javascript" copy>
f.push(["文字を逆順並べ","s",function(_){ //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 _.replace(/[^\n]+/g,function(s){return s.match(X).reverse().join("")}) }]);
</syntaxhighlight>
 
;文字をシャッフル
:各行の文字をランダムに並べ替えます。
:例> <span style="background:#bfdfff;">文字をシャッフル</span> → フ字をャシッル文
<syntaxhighlight lang="javascript" copy>
f.push(["文字をシャッフル","s",function(_){ //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 _.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("")}) }]);
</syntaxhighlight>
 
=== 字種/数値変換 ===
;★半角英数→全角
;★全角英数→半角
<syntaxhighlight lang="javascript" copy>
f.push(["半角英数→全角","s",function(_){ //2014-02-10
  return _.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]);
f.push(["全角英数→半角","s",function(_){ //2014-02-10
  return _.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]);
</syntaxhighlight>
 
;★半角カナ→全角
;★全角カナ→半角
<syntaxhighlight lang="javascript" copy>
f.push(["半角カナ→全角","s",function(_){ //2015-03-14
  return _.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
f.push(["全角カナ→半角","s",function(_){ //2015-03-14
  return _.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]) }]);
</syntaxhighlight>
 
;★全角かな→カナ
;★全角カナ→かな
:全角ひらがなと全角カタカナを変換します。
:全角ひらがなと全角カタカナを変換します。
:ただし、ヴヵヶ → ゔゕゖ の変換は行いません(Shift_JIS では保存できない文字のため)。
:ただし、ヴヵヶ → ゔゕゖ の変換は行いません(Shift_JIS では保存できない文字のため)。
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["全角かな→カナ","R",function(a){
f.push(["全角かな→カナ","s",function(_){ //2014-02-10
   return a.replace(/[\u3041-\u3096ゝゞ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x60)}) }]);
   return _.replace(/[\u3041-\u3096ゝゞ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x60)}) }]);
f.push(["全角カナ→かな(ヴヵヶ除く)","R",function(a){
f.push(["全角カナ→かな(ヴヵヶ除く)","s",function(_){ //2015-02-14
   return a.replace(/[\u30A1-\u30F3ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
   return _.replace(/[\u30A1-\u30F3ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
</source>
</syntaxhighlight>
:ヴヵヶ → ゔゕゖ の変換も行う場合は、下記の内容に差し替えてください。
:ヴヵヶ → ゔゕゖ の変換も行う場合は、下記の内容に差し替えてください。
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["全角カナ→かな","R",function(a){
f.push(["全角カナ→かな","s",function(_){ //2014-02-10
   return a.replace(/[\u30A1-\u30F6ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
   return _.replace(/[\u30A1-\u30F6ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
</source>
</syntaxhighlight>
 
;全角仮名+濁点を合成
:全角仮名+濁点(結合/全角/半角)の2文字を、1文字に合成可能ならば合成します。
:例> <span style="background:#bfdfff;">あ゙し&#x3099;う゛ヷヘ゜か&#x309A;</span> → あ゙じゔヷペか&#x309A;
:※「あ゙」「か&#x309A;」は合成不能のため変化なし。
<syntaxhighlight lang="javascript" copy>
f.push(["全角仮名+濁点を合成","s",function(_){ //2019-12-21
  var map={"\u3099":"゙","゛":"゙","゙":"゙","\u309A":"゚","゜":"゚","゚":"゚","が":"が","ぎ":"ぎ","ぐ":"ぐ","げ":"げ","ご":"ご","ざ":"ざ","じ":"じ","ず":"ず","ぜ":"ぜ","ぞ":"ぞ","だ":"だ","ぢ":"ぢ","づ":"づ","で":"で","ど":"ど","ば":"ば","び":"び","ぶ":"ぶ","べ":"べ","ぼ":"ぼ","ゞ":"ゞ","ガ":"ガ","ギ":"ギ","グ":"グ","ゲ":"ゲ","ゴ":"ゴ","ザ":"ザ","ジ":"ジ","ズ":"ズ","ゼ":"ゼ","ゾ":"ゾ","ダ":"ダ","ヂ":"ヂ","ヅ":"ヅ","デ":"デ","ド":"ド","バ":"バ","ビ":"ビ","ブ":"ブ","ベ":"ベ","ボ":"ボ","ヾ":"ヾ","ぱ":"ぱ","ぴ":"ぴ","ぷ":"ぷ","ぺ":"ぺ","ぽ":"ぽ","パ":"パ","ピ":"ピ","プ":"プ","ペ":"ペ","ポ":"ポ","ゔ":"ゔ","ヴ":"ヴ","ヷ":"ヷ","ヸ":"ヸ","ヹ":"ヹ","ヺ":"ヺ"}; return _.replace(/([うウかきくけこさしすせそたちつてとはひふへほゝカキクケコサシスセソタチツテトハヒフヘホヽワヰヱヲ])([\u3099゛゙\u309A゜゚])/g,function(s,k,v){return map[k+map[v]]||s}) }]);
</syntaxhighlight>


;標準変換
;標準変換
:マクロ「[[標準変換]]」を移植(一部改変 ※下表参照)したものです。
:マクロ「<b>[[標準変換]]</b>」を移植(一部改変)したものです。
:全角英数・全角記号は半角に、半角カナは全角に変換します。
:全角英数・全角記号は半角に、半角カナは全角に変換します。
:{| class="wikitable"
:{|class="wikitable"
! 文字 !! 変換前
! 文字 !! 変換前
! 文字 !! 標準変換版
! 文字 !! 標準変換版
834行目: 1,272行目:
|-
|-
|align="center"| ‘ || 全角左シングルクォート
|align="center"| ‘ || 全角左シングルクォート
|align="center"| ` || 半角グラーブアクセント
|align="center"| ` || 半角グレーブアクセント
|align="center"| ' || 半角アポストロフィー/シングルクォート
|align="center"| ' || 半角アポストロフィー/シングルクォート
|-
|-
|align="center"| ` || 全角グラーブアクセント
|align="center"| ` || 全角グレーブアクセント
| || ※変換しない
| || ※変換しない
|align="center"| ` || 半角グラーブアクセント
|align="center"| ` || 半角グレーブアクセント/バッククォート
|}
<syntaxhighlight lang="javascript" copy>
f.push(["標準変換","s",function(_){ //2015-03-14
  return _.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"],["{","{"],["|","|"],["}","}"],["~","~"],["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
</syntaxhighlight>
 
;表外漢字→代替
:[https://ja.wiktionary.org/wiki/%E4%BB%98%E9%8C%B2:%E8%A1%A8%E5%A4%96%E6%BC%A2%E5%AD%97%E5%AD%97%E4%BD%93%E8%A1%A8%E3%81%AE%E6%BC%A2%E5%AD%97%E4%B8%80%E8%A6%A7 表外漢字字体表] 1022字のうち <span style="background:#ffee62;">Shift_JIS (CP932) では保存できない文字40字</span>を、保存できる文字に置換します。
:{|class="wikitable" style="font:120% 'ヒラギノ角ゴ ProN W3','ヒラギノ角ゴ ProN','メイリオ',Meiryo,sans-serif;"
|-style="background:#ffee62;"
|啞||焰||鷗||摑||麴||噓||俠||頰||軀||俱||繫||姸||鹼||嚙||攢||𠮟||繡||蔣||醬||蟬||搔||瘦||驒||簞||塡||顚||禱||瀆||吞||囊||剝||潑||醱||屛||幷||麵||萊||屢||沪||蠟
|-
|唖||焔||鴎||掴||麹||嘘||侠||頬||躯||倶||繋||妍||鹸||噛||攅||叱||繍||蒋||醤||蝉||掻||痩||騨||箪||填||顛||祷||涜||呑||嚢||剥||溌||醗||屏||并||麺||莱||屡||濾||蝋
|}
|}
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["標準変換","CR",function(a){
f.push(["表外漢字→代替","s",function(_){ //2017-06-25
   return [ [" "," "],["!","!"],["“",'"'],["”",'"'],["#","#"],["$","$"],["%","%"],["&","&"],["‘","'"],["’","'"],["(","("],[")",")"],["","*"],["","+"],["",","],["","-"],["","."],["","/"],["","0"],["","1"],["","2"],["","3"],["","4"],["","5"],["","6"],["","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"],["","b"],["","c"],["","d"],["","e"],["","f"],["","g"],["","h"],["","i"],["","j"],["","k"],["","l"],["","m"],["","n"],["","o"],["","p"],["","q"],["","r"],["","s"],["","t"],["","u"],["v","v"],["w","w"],["x","x"],["y","y"],["z","z"],["{","{"],["|","|"],["}","}"],["~","~"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]}]);
   return _.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",""] ]) }]);
</source>
</syntaxhighlight>


;★10⇒16進数
;★10→16進数
:半角数字列を10進数値とみなし、16進数値に変換します。
:半角数字列を10進数値とみなし、16進数値に変換します。
:例> <span style="background:#bfdfff;">291/15/44015</span> → 123/F/ABEF
:例> <span style="background:#bfdfff;">291/15/44015</span> → 123/F/ABEF
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["10→16進数","R",function(a){
f.push(["10→16進数","s",function(_){ //2014-05-31
   return a.replace(/[0-9]+/g,function(s){return Number(s).toString(16).toUpperCase()}) }]);
   return _.replace(/[0-9]+/g,function(s){return Number(s).toString(16).toUpperCase()}) }]);
</source>
</syntaxhighlight>
;★16⇒10進数
;★16→10進数
:半角英数字列を16進数値とみなし、10進数値に変換します。英字の大小、0x の有無は問いません。
:半角英数字列を16進数値とみなし、10進数値に変換します。英字の大小、0x の有無は問いません。
:例> <span style="background:#bfdfff;">123/0x0F/abef</span> → 291/15/44015
:例> <span style="background:#bfdfff;">123/0x0F/abef</span> → 291/15/44015
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["16→10進数","R",function(a){
f.push(["16→10進数","s",function(_){ //2017-06-25
   return a.replace(/(?:0x)?([0-9A-Fa-f]+)/g,function(s,n){return Number("0x"+n)}) }]);
   return _.replace(/(?:0x)?([0-9a-f]+)/gi,function(_,x){return Number("0x"+x)}) }]);
</source>
</syntaxhighlight>


;2進接頭辞換算
;2進接頭辞換算
:半角数字列を 2<sup>10</sup> = 1024 の倍量単位 (Ki,Mi,Gi...Yi) に変換します(小数点第3位を四捨五入)。
:半角数字列を 2<sup>10</sup> = 1024 の倍量単位 (Ki,Mi,Gi...Yi) に変換します(小数点第3位を四捨五入)。
:例> <span style="background:#bfdfff;">1023/1024/54321/1,048,576/1,073,741,824</span> → 1023/1.00Ki/53.05Ki/1.00Mi/1.00Gi
:例> <span style="background:#bfdfff;">1023/1024/54321/1,048,576/1,073,741,824</span> → 1023/1.00Ki/53.05Ki/1.00Mi/1.00Gi
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(["2進接頭辞換算","R",function(a){
f.push(["2進接頭辞換算","s",function(_){ //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(x<8&&k<=n){x++;n/=k} return n.toFixed(2)+p.charAt(x)+"i"}) }]);
   var k=1024,p="?KMGTPEZY"; return _.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"}) }]);
</source>
</syntaxhighlight>
 
==符号化/復号化==


=== 符号化/復号化 ===
;URL %エンコード/デコード(UTF-8)
;URL %エンコード/デコード(UTF-8)
:URL アドレスに使用される UTF-8 パーセントエンコーディングの符号化/復号化を行います。
:URL アドレスに使用されるパーセントエンコーディングの符号化/復号化を行います。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["URL %エンコード(UTF-8)","R",function(a){
f.push(["URL %エンコード(UTF-8)","s",function(_){ //2014-02-01
   return encodeURI(a).replace(/%0D%0A|%0D|%0A/g,"\n") }]);
   return encodeURI(_).replace(/%0D%0A|%0D|%0A/g,"\n") }]);
f.push(["URL %デコード(UTF-8)","R",function(a){
f.push(["URL %デコード(UTF-8)","s",function(_){ //2014-02-01
   return decodeURIComponent(a) }]);
   return decodeURIComponent(_) }]);
</source>
</syntaxhighlight>


;Base64エンコード/デコード(UTF-8)
;Base64エンコード/デコード(UTF-8)
:<span style="color:#c00;">※改行は LF (0x0A) でエンコードされます</span>(Mery の内部改行文字が LF のため)。
:[https://ja.wikipedia.org/wiki/Base64 Base64] 形式の符号化/復号化を行います。
:※バイナリデータ(画像や音声など)のデコードは、Mery の [編集]→[選択範囲の変換]→[Base64デコード] をご利用ください。
:※バイナリデータ(画像や音声など)の復号化は、[編集]→[選択範囲の変換]→[Base64デコード] をご利用ください。
<source lang="javascript" style="word-wrap:break-word;">
:<b style="color:#c00;">注意事項</b>
f.push(["Base64エンコード(UTF-8)","R",function(txt){
:* 改行は LF (0x0A) としてエンコードされます。
   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]} return (len%3)? out.slice(0,len%3-3)+"===".slice(len%3): out }]);
:* A~Z a~z 0~9 + / 以外の文字(改行含む)は除去してからデコードされます。
f.push(["Base64デコード(UTF-8)","R",function(txt){
<syntaxhighlight lang="javascript" copy>
  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,(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))}); return (len%4)? out.slice(0,len%4-4): out }]);
f.push(["Base64エンコード(UTF-8)","s",function(_){ //2019-12-21
</source>
   var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), bin=unescape(encodeURIComponent(_)), n=bin.length, asc="", x; for(var i=0;i<n;){x=(bin.charCodeAt(i++)<<16)|(bin.charCodeAt(i++)<<8)|(bin.charCodeAt(i++)); asc+=A[x>>>18&0x3F]+A[x>>>12&0x3F]+A[x>>>6&0x3F]+A[x&0x3F]} if(n%3)asc=asc.slice(0,n%3-3)+"===".slice(n%3); return asc }]);
f.push(["Base64デコード(UTF-8)","s",function(_){ //2019-12-21
  var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", B={}; for(var i=0;i<A.length;i++){B[A.charAt(i)]=i} var asc=_.replace(/[^A-Za-z0-9+/]/g,"").split(""), n=asc.length, bin="", x; for(var i=0;i<n;){x=(B[asc[i++]]<<18)|(B[asc[i++]]<<12)|(B[asc[i++]]<<6)|(B[asc[i++]]); bin+=String.fromCharCode(x>>>16&0xFF,x>>>8&0xFF,x&0xFF)} bin=bin.replace(/(?:[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}|.){1,50}/g,function(bin){return decodeURIComponent(escape(bin))}); if(n%4)bin=bin.slice(0,n%4-4); return bin }]);
</syntaxhighlight>


;Unicode 文字 ⇒ \uHHHH
;\uHHHH エンコード/デコード
;Unicode \uHHHH ⇒ 文字
:JavaScript などで使用される \uHHHH 形式の変換を行います。※HHHH=4桁の16進数
:JavaScript などで使用される \uHHHH 形式の変換を行います。※HHHH=4桁の16進数・UTF-16BEバイナリ値
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">\u0041\u308F\uD867\uDE3D</span>
:例> <span style="background:#bfdfff;">Aわ𠀋</span> \u0041\u308F\uD840\uDC0B
<syntaxhighlight lang="javascript" copy>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["\\uHHHH エンコード","s",function(_){ //2017-06-25
f.push(["Unicode 文字 → \\uHHHH","R",function(a){
   return _.replace(/[^\n]/g,function(s){return "\\u"+("000"+s.charCodeAt(0).toString(16).toUpperCase()).slice(-4)}) }]);
   return a.replace(/./g,function(s){return "\\u"+("000"+s.charCodeAt(0).toString(16).toUpperCase()).slice(-4)}) }]);
f.push(["\\uHHHH デコード","s",function(_){ //2014-10-12
f.push(["Unicode \\uHHHH → 文字","R",function(a){
   return _.replace(/\\u([0-9A-Fa-f]{4})/g,function(_,n){return String.fromCharCode(Number("0x"+n))}) }]);
   return a.replace(/\\u([0-9A-Fa-f]{4})/g,function(s,n){return String.fromCharCode(Number("0x"+n))}) }]);
</syntaxhighlight>
</source>


;Unicode 文字 ⇒ \x{hex}
;\u4H \U8H エンコード/デコード
;Unicode \x{hex} ⇒ 文字
:Unicode で使用される \u4H および \U8H 形式の変換を行います。※4H, 8H=4桁, 8桁の16進数
:Mery の正規表現 (鬼車) などで使用される \x{hex} 形式の変換を行います。※hex=1~6桁の16進数・Unicodeスカラー値
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">\u0041\u308F\U00029E3D</span>
:例> <span style="background:#bfdfff;">Aわ𠀋</span> \x{41}\x{308f}\x{2000b}
<syntaxhighlight lang="javascript" copy>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["\\u4H \\U8H エンコード","s",function(_){ //2017-06-25
f.push(["Unicode 文字 → \\x{hex}","R",function(a){
   return _.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)} }]);
   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(["\\u4H \\U8H デコード","s",function(_){ //2015-09-30
f.push(["Unicode \\x{hex} → 文字","R",function(a){
   return _.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}) }]);
   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}) }]);
</syntaxhighlight>
</source>


;Unicode 文字 ⇒ &#dec;
;\x{hex} エンコード/デコード
;Unicode &#dec; ⇒ 文字
:Mery の正規表現 (鬼車/鬼雲) などで使用される \x{hex} 形式の変換を行います。※hex=1~6桁の16進数
:HTML などで使用される &#dec; 形式の変換を行います。※dec=1~7桁の10進数・Unicodeスカラー値
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">\x{41}\x{308f}\x{29e3d}</span>
:例> <span style="background:#bfdfff;">Aわ𠀋</span> → &amp;#65;&amp;#12431;&amp;#131083;
<syntaxhighlight lang="javascript" copy>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["\\x{hex} エンコード","s",function(_){ //2017-06-25
f.push(["Unicode 文字 → &&#dec;","R",function(a){
   return _.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}) }]);
   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(["\\x{hex} デコード","s",function(_){ //2015-03-14
f.push(["Unicode &&#dec; → 文字","R",function(a){
   return _.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}) }]);
   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}) }]);
</syntaxhighlight>
</source>


;Unicode 文字 ⇒ &#xHEX;
;&#dec; エンコード/デコード
;Unicode &#xHEX; ⇒ 文字
:HTML などで使用される &#dec; 形式の変換を行います。※dec=1~7桁の10進数
:HTML などで使用される &#xHEX; 形式の変換を行います。※HEX=1~6桁の16進数・Unicodeスカラー値
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">&amp;#65;&amp;#12431;&amp;#171581;</span>
:例> <span style="background:#bfdfff;">Aわ𠀋</span> &amp;#x41;&amp;#x308F;&amp;#x2000B;
<syntaxhighlight lang="javascript" copy>
<source lang="javascript" style="word-wrap:break-word;">
f.push(["&&#dec; エンコード","s",function(_){ //2017-06-25
f.push(["Unicode 文字 → &&#xHEX;","R",function(a){
   return _.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}) }]);
   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(["&&#dec; デコード","s",function(_){ //2015-03-14
f.push(["Unicode &&#xHEX; → 文字","R",function(a){
   return _.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}) }]);
   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}) }]);
</syntaxhighlight>
</source>


==コマンド テンプレート==
;&#xHEX; エンコード/デコード
拡張コードの雛形を挿入します。コマンドを自作したい場合にご利用ください。
:HTML などで使用される &#xHEX; 形式の変換を行います。※HEX=1~6桁の16進数
<source lang="javascript" style="word-wrap:break-word;">
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">&amp;#x41;&amp;#x308F;&amp;#x29E3D;</span>
f.push(["コマンド テンプレート",function(f){
<syntaxhighlight lang="javascript" copy>
f.push(["コマンド F (Function)","F",function(a){
f.push(["&&#xHEX; エンコード","s",function(_){ //2017-06-25
   document.Writeln('f.push(["","F",function(a){\n  }]);'); a.CharLeft(false,5) }]);
   return _.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(["コマンド R (Replace)","F",function(a){
f.push(["&&#xHEX; デコード","s",function(_){ //2017-06-25
   document.Writeln('f.push(["","R",function(a){\n return }]);'); a.CharLeft(false,5) }]);
   return _.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(["コマンド RS (Select-line)","F",function(a){
</syntaxhighlight>
   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) }]);
<syntaxhighlight lang="javascript" copy>
f.push(["----"]);
f.push(["拡張コード テンプレート",function(f){ //2019-06-01
f.push(["サブメニュー","F",function(a){
f.push(["コマンド","",function(_,$){
   document.Writeln('f.push(["",function(f){\n'+ a.Text +'}]);'); a.CharLeft(false,5) }]);
   $.StartOfLine(); return ['f.push(["コマンド","",function(_,$){\n  ' , ' }]);\n'] }]);
f.push(["セパレータ","F",function(a){
f.push(["コマンド s (選択必須)","",function(_,$){
   document.Writeln('f.push(["----"]);') }]);
   $.StartOfLine(); return ['f.push(["コマンド","s",function(_,$){\n  return _.replace(' , ') }]);\n'] }]);
f.push(["コマンド L (行選択)","",function(_,$){
   $.StartOfLine(); return ['f.push(["コマンド","L",function(_,$){\n  return _.replace(' , ') }]);\n'] }]);
f.push(["サブメニュー","L",function(_){
   return ['f.push(["' , 'メニュー' , '",function(f){\n'+ _ +'\n}]);'] }]);
f.push(["セパレーター","",function(_,$){
   $.StartOfLine(); return ['f.push(["--------"]);\n' , ''] }]);
}]);
}]);
</source>
</syntaxhighlight>


;モード CR 作成補助
;replaceBatch 補助
:モード CR (連続置換) コマンドの配列作成を補助するコマンド群です。
:[[#replaceBatch メソッド|replaceBatch メソッド]]用の配列作成を補助するコマンド群です。
:<span style="color:#c00;">※書式の解析精度は不完全です。検索/置換文字に <code>" ' , / \ ]</code> を含むリストは誤変換する恐れがあります。</span>
:※書式の解析精度は不完全です。検索/置換文字に <code>" ' , / \ ]</code> を含む配列は誤変換する恐れがあります。
:<span style="color:#c00;">※書式ミスがある場合については考慮していません。誤変換した場合は書式ミスの可能性も疑ってみてください。</span>
:※書式ミスは考慮していません。誤変換した場合は書式ミスの可能性も疑ってみてください。


;交換 ["a","b"] ["b","a"]
;交換 ["a","b"] ["b","a"]
:リストの検索文字列と置換文字列を入れ替えます。※正規表現は検索/置換の役割を交換できないため何もしません(例では <code>■,□</code> のペアが該当)。
:配列の検索文字列と置換文字列を入れ替えます。正規表現は検索側のみ使用可なので交換しません(例では <code>■,□</code> のペアが該当)。
:例> <code style="background:#bfdfff;">["●","○"],['▲','△'],[/■/g,"□"],["◆",'◇']</code> → <code>["○","●"],['△','▲'],[/■/g,"□"],['◇',"◆"]</code>
:例> <code style="background:#bfdfff;">["●","○"],['▲','△'],[/■/g,"□"],["◆",'◇']</code> → <code>["○","●"],['△','▲'],[/■/g,"□"],['◇',"◆"]</code>
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(['交換 ["a","b"] → ["b","a"]',"R",function(a){
f.push(['交換 ["a","b"] → ["b","a"]',"s",function(_){ //2014-05-31
   return a.replace(/\[("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'),("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\]/g,"[$2,$1]") }]);
   return _.replace(/\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'),("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*')\]/g,"[$2,$1]") }]);
</source>
</syntaxhighlight>


;分割 ["a","b"] "a" › "b"↵
;分割 ["a","b"] "a" › "b"↵
;結合 "a" › "b"↵ ["a","b"]
;結合 "a" › "b"↵ ["a","b"]
:リストと TSV 形式を変換します。
:配列と TSV 形式を変換します。
<source lang="javascript" style="word-wrap:break-word;">
<syntaxhighlight lang="javascript" copy>
f.push(['分割 ["a","b"] → "a" \u203A "b"\u21B5',"R",function(a){
f.push(['分割 ["a","b"] → "a" \u203A "b"\u21B5',"L",function(_){ //2017-06-25
   return a.replace(/\[("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|\/.*?\/[gim]*),("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\],?/g,"\n$1\t$2\n").replace(/\n\n/g,"\n") }]);
   return _.replace(/,?\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'|\/.*?\/[gim]*),("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*')\],?/g,"\n$1\t$2\n").replace(/\n\n/g,"\n") }]);
f.push(['結合 "a" \u203A "b"\u21B5 → ["a","b"]',"R",function(a){
f.push(['結合 "a" \u203A "b"\u21B5 → ["a","b"]',"L",function(_){ //2015-03-14
   return a.replace(/\n?(((".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*)+)/g,function(s,s1){return s1.replace(/(".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*/g,"[$1,$2],").replace(/,$/,"")}) }]);
   return _.replace(/\n?(((".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*)+)/g,function(s,r){return r.replace(/(".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*/g,"[$1,$2],").replace(/,$/,"")}) }]);
</source>
</syntaxhighlight>


=拡張コード:コマンド書式=
== 拡張コード:書式 ==
拡張コードは以下の書式に従い、記述してください。<br>
=== コマンド ===
※コマンドの自作・改変には、マクロや正規表現についての知識が要求されます。
<syntaxhighlight lang="javascript" copy>
 
f.push(["コマンド名","オプション",function(引数){ 処理 }]);
==コマンド==
</syntaxhighlight>
<source lang="javascript">
;オプション
f.push(["コマンド名","モード",function(引数){ マクロ }]);
:{|class="wikitable"
</source>
| <code>s</code> || 実行に範囲選択を要求 (require selection)
 
|-
;モード F (Function)
| <code>c</code> || 実行にクリップボードを要求 (require clipboard)
:【マクロ】の記述をそのまま実行するコマンドです。
|-
<source lang="javascript">
| <code>L</code> || 行選択してから処理 (select Line)
f.push(["コマンド名","F",function( Document.Selection ){ マクロ }]);
|-
</source>
| <code>O</code> || 非選択時はすべて選択してから処理 (select OR all)<br>※実験的機能(変更・廃止の可能性あり)
 
|}
;モード R (Replace)
:複数指定する場合、空白で区切ります。順序は問いません。<br>※仕様上、<code>0-9 A-Z a-z _</code> 以外の文字ならば区切りと判定されますが、空白を推奨します。
:選択範囲を【マクロ】の処理結果で置換します。
;引数
:※「[[テキスト変換]]」の replace 関数に相当します。
:第1引数に [[マクロリファレンス:Selection_インターフェイス#Text_プロパティ|Document.Selection.Text]] が、<br>第2引数に [[マクロリファレンス:Selection_インターフェイス|Document.Selection]] が渡されます。
<source lang="javascript">
;処理
f.push(["コマンド名","R",function( Document.Selection.Text ){return マクロ }]);
:String (文字列) か Array (配列) を return すると、選択範囲を置換してカーソルを移動します。それ以外 (undefined など) の場合は、選択範囲に対し何もしません。
</source>
:なお、処理の途中で選択範囲が変化した場合、変化先で置換が行われます。
 
:{|class="wikitable"
;モード RS (Select-line)
! 例 !! 動作
:選択範囲を行頭末まで拡張して【マクロ】の処理結果で置換します。
|-
:※「[[テキスト変換]]」の replaceS 関数に相当します。
| <code>"abcd"</code> || abcd に置換後、abcd を選択 = <code>["","abcd",""]</code>
<source lang="javascript">
|-
f.push(["コマンド名","RS",function( Document.Selection.Text ){return マクロ }]);
| <code>["ab","cd"]</code> || abcd に置換後、ab と cd の間に移動
</source>
|-
 
| <code>["ab","cd",""]</code> || abcd に置換後、cd を選択
;モード RM (Multi-line)
:選択範囲を一行ごとに分割して【マクロ】の処理結果で置換します。
:※「[[テキスト変換]]」の replaceL 関数に相当します。
<source lang="javascript">
f.push(["コマンド名","RM",function( Document.Selection.Text ){return マクロ }]);
</source>
 
;モード CR (Chain Replace)
:選択範囲をリスト(配列)の内容に従い連続置換します。
:正規表現を利用する場合、JScript / JavaScript の仕様に則り記述します。Mery の正規表現 (鬼車) とは仕様が異なる点があるので注意してください。
<source lang="javascript">
f.push(["コマンド名","CR",function(){return [ ["検索文字列","置換文字列"] ]}]);
f.push(["コマンド名","CR",function(){return [ [/パターン/フラグ,"置換文字列"] ]}]);
</source>
:リストは , カンマ区切りで連結することができます。
<source lang="javascript">
f.push(["コマンド名","CR",function(){return [ ["検索1","置換1"],[/パターン2/,"置換2"],["検索3","置換3"] ]}]);
</source>
:置換は、リストの先頭から順番に実行されます。したがって、リストの記述順で結果が変わります。
:たとえば、123 という文字列に対し、例1 と 例2 を実行した結果は 444 と 234 になります。
{|
|<source lang="javascript">
f.push(["例1","CR",function(){
  return [ ["1","2"],["2","3"],["3","4"] ]}]);
</source>
# 123 → 1 を 2 に置換 → 223
# 223 → 2 を 3 に置換 → 333
# 333 → 3 を 4 に置換 → 444 (実行結果)
|<source lang="javascript">
f.push(["例2","CR",function(){
  return [ ["3","4"],["2","3"],["1","2"] ]}]);
</source>
# 123 → 3 を 4 に置換 → 124
# 124 → 2 を 3 に置換 → 134
# 134 → 1 を 2 に置換 → 234 (実行結果)
|}
|}


==サブメニュー==
=== サブメニュー ===
サブメニューを設けます。コマンドをグループやカテゴリに仕分けたり、使用頻度の低いコマンドをまとめたり、と用途は様々です。<br>
サブメニューを設けます。サブメニュー内サブメニュー(階層化)も可能です。
サブメニュー内にサブメニューを作ること(階層化)も可能です。階層の数に制限はありません。
<syntaxhighlight lang="javascript" copy>
<source lang="javascript">
f.push(["メニュー名",function(f){
f.push(["メニュー名",function(f){
【コマンド or サブメニュー or セパレータ】
/* コマンド or サブメニュー or セパレーター */
}]);
}]);
</source>
</syntaxhighlight>
 
=== セパレーター ===
セパレーター(区切り)を設けます。
 
※半角ハイフン <code>-</code> は何個でも含められますが、他の文字は含められません。
<syntaxhighlight lang="javascript" copy>
f.push(["--------"]);
</syntaxhighlight>


==セパレータ==
=== replaceBatch メソッド ===
セパレータ(区切り)を設けます。
<code>replace</code> を連鎖させる記法(メソッドチェーン)の省略記法です。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["----"]);
f.push(["例 replaceBatch","s",function(_){
</source>
  return _.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]);
半角ハイフン - の数は何個でもかまいません。<br>
</syntaxhighlight>
ただし、半角ハイフン以外の文字を含めることはできません。
上記の処理は、下記と同じ処理になります。
<source lang="javascript">
<syntaxhighlight lang="javascript" copy>
f.push(["-"]);        //← OK (1個)
f.push(["例 replace","s",function(_){
f.push(["----------"]); //← OK (10個)
  return _.replace(/ABC/g,"DEF").replace(/\(1\)/g,"①").replace(/GHI/gi,"JKL") }]);
f.push(["--区切り--"]); //← NG
</syntaxhighlight>
</source>

2025年6月30日 (月) 01:38時点における最新版

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

主な改造点[編集]

  • 拡張コードの書式を変更。
    • 簡易書式をベースに単純化。view フラグは削除。
    • 「関数タイプ」は「オプション」に変更。
  • 処理の戻り値により選択範囲を置換するか、再選択するかを制御できるようにした。
  • 行選択してから処理する際、範囲終端の改行は範囲に含めないようにした(正規表現 ^ $ の使い勝手を考え)。
  • メソッド String.replaceBatch を追加。
  • 範囲選択時に対象範囲を選ぶメニューを廃止(毎回選ぶのが面倒なため)。

注意事項[編集]

  • 表示行での処理には対応していません。
  • マクロの仕様上、矩形選択での処理には原則対応していません。

お知らせ[編集]

仕様変更によりモードは廃止されました。

詳しくは #変更履歴 または 利用者:Masme のページをご覧ください。

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

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

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

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

変更履歴[編集]

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

  • 1.3.0 (2019-12-21)
    • 追加 - 全角仮名+濁点を合成
    • 改名 - 行頭に連番挿入 (#/Z)
      • 「#/Σ」→「#/Z」に変更
    • 変更 - Base64エンコード/デコード
      • 変数名を asc, b64, A, B → bin, asc, B, A に変更
        • 関数 btoa() の由来 binary to ascii(=Base64) に倣った
  • 1.2.9 (2019-06-01)
    • 仕様変更 - 戻り値により選択範囲の置換・再選択を制御するようにした
    • 仕様変更 - コマンドの書式を変更
      • マクロ「テキスト変換」の第2引数を復活。モード F は第2引数利用に変更
      • モードを廃止し、オプションに変更。モード RS はオプション L に変更
      • 実行に範囲選択/クリップボードを要求するコマンドにオプション s/c を設定
    • 仕様変更 - メニュー作成処理を変更。falsy な要素があるとループ終了
    • コード整理 - 第2引数追加に伴い、引数名を a → _ と $ に変更
    • コード整理 - 不使用の引数は極力省略するようにした
    • 改名 - ★行頭/行末に貼り付け ¦ 行頭/行末から数文字削除
      • 「各行~」を除去
    • 改名 - ★行頭/行末に挿入
      • 「各行~」を除去。「文字列付加」→「挿入」に変更
    • 改名 - 各行先頭/末尾に挿入 ¦ 行頭に連番挿入 ¦ 行末に<br>を挿入 ¦ ★行頭 // を挿入/削除
      • 「(文字列)付加」→「挿入」に変更
    • 変更 - 複製貼り付け ¦ ★行頭/行末に挿入 ¦ 各行先頭/末尾に挿入 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除 ¦ 行頭/行末から数文字削除
      • 入力判定を中止条件 → 実行条件に変更
      • 戻り値の仕様を利用し、中止時は Quit() → 戻り値なし (undefined) に変更
    • 修正 - 複製貼り付け ¦ 行頭/行末から数文字削除
      • キャンセルまたは数字以外を入力した場合、正常に中止できていないのを修正(NaN<1 は false)
    • 変更 - ★数値参照を文字に変換
      • 正規表現を /&#([0-9]{1,7});|&#[Xx]([0-9A-Fa-f]{1,6});/g/&#(?:([0-9]{1,7})|x([0-9a-f]{1,6}));/gi に短縮
    • 変更 - 挿入 Confirm(|)
      • 戻り値の仕様を利用したものに変更
    • 変更 - Base64エンコード/デコード
      • 引数名を txt → _ に統一。変数名を変更
    • 追加 - ★このマクロを編集 ¦ 連番を出力 ¦ 文字数カウント(空白は除く) ¦ ステータスバーの表示をコピー ¦ 行を文字数順並べ ¦ 数行毎に/数行一組で逆順並べ ¦ 空行毎に/空行一組で逆順並べ ¦ 指定見出しで逆順並べ
    • 変更 - 総字行数カウント
      • GetLines() → GetLines(meGetLineView) に変更(引数を明示)
      • 符号点数&論理行数版を削除
    • 変更 - 選択範囲を eval で評価 ¦ 選択文字列を検索 ¦ 選択文字列をすべて削除
      • オプション s の設定に伴い、選択判定を削除
    • 変更 - 拡張コード テンプレート
      • 仕様変更に伴う改訂
      • サブメニューは、挿入後にメニュー名を選択するようにした
  • 1.2.8 (2019-05-01)
    • 削除 - 大文字/小文字に変換 ¦ 半角/全角に変換
      • Mery 側のメソッドを使う一例として掲載していたが、結構かと判断
    • 削除 - 行を昇順/降順並べ(UTF-16)
    • 改名 - \x{hex} エンコード/デコード
      • コマンド名のエスケープミスを修正
    • 改名 - 拡張コード テンプレート
      • 「コマンド~」→「拡張コード~」に変更
  • 1.2.7 (2018-01-15)
    • 削除 - ☆インデント(半角空白2個)
    • スターター追加 - ★行を昇順/降順並べ(Unicode) ¦ ★行を逆順並べ
    • 追加 - CJK互換漢字を検索
    • 修正 - Base64デコード
      • 最大50字ずつ処理する箇所で、異常なデータ 0xF8~FF をスルーしていたのを改修
    • 修正 - 挿入 Confirm(|)
      • 折り返しが発生した場合、カーソル位置がズレる不具合を修正(カーソル移動を CharLeft(false,移動量) → SetActivePos(GetActivePos()-移動量) に変更)
    • 変更 - ★重複行を単一化 ¦ 重複する/しない行を抽出
      • for(var i=0,n=a.length;i<n;i++)for(var i=0;i<a.length;i++) に単純化
  • 1.2.6 (2017-06-25)
    • 仕様変更 - アイコンファイルに24x24・32x32・48x48の画像を追加
    • 仕様変更 - replaceBatch メソッドで配列先頭/末尾のコンマを許容するようにした
      • 例> String.replaceBatch([ ,[省略],[省略],[省略], ])
    • コード整理 - 基本コードを改訂
    • 追加 - 行を昇順/降順並べ(Unicode) ¦ ★!?を半角/全角に整形 ¦ 空白行の空白を除去 ¦ 行頭/行末から数文字削除 ¦ 重複する/しない行を抽出 ¦ 表外漢字→代替
    • 改名 - 行を昇順/降順並べ(UTF-16) ¦ 行を逆順並べ ¦ 文字を逆順並べ
      • 「~の並べ替え(○順)」→「~を○順並べ」に変更
      • 従来の「行を昇順/降順並べ(Unicode)」は (UTF-16) に訂正
    • 改名 - ★重複行を単一化 ¦ ★連続する重複行を単一化
      • 「~を削除」→「~を単一化」に変更
    • 修正 - ★重複行を単一化
      • 下記の7行を削除してしまう不具合を修正(重複の判定は Object.prototype.hasOwnProperty.call() で行うようにした)
      • 「constructor」「hasOwnProperty」「isPrototypeOf」「propertyIsEnumerable」「toLocaleString」「toString」「valueOf」
    • 変更 - ★全角ダッシュ(――)に整形
      • 罫線(横) ── を変換対象から除外
    • 変更 - ★数値参照を文字に変換 ¦ ★16→10進数 ¦ &#xHEX; デコード
      • 0Xff, &#Xff; など X が大文字の場合に対応
    • 変更 - 文字を逆順並べ ¦ 文字をシャッフル ¦ \uHHHH, \u4H \U8H, \x{hex}, &#dec;, &#xHEX; エンコード
      • 正規表現を . → [^\n] に統一
    • 変更 - 文字を逆順並べ ¦ 文字をシャッフル
      • UAX #29 に一部対応し、\p{Zl}, {Zp}, {Cc}, U+00AD, FEFF は結合不可にした
    • 変更 - 選択文字列を検索
      • カーソル位置・スクロール位置を移動しないようにした
    • 変更 - 選択文字列を検索 ¦ 選択文字列をすべて削除 ¦ replaceBatch メソッド
      • 特殊文字のエスケープ処理を /([$()*+.?[\\\]^{|}])/g,"\\$1"/[$()*+.?\[\\\]^{|}]/g,"\\$&" に統一
    • 変更 - 拡張コード テンプレート(分割)
      • 配列先頭のコンマの仕様に対応(末尾は実質対応済)
  • 1.2.5 (2017-05-28)
    • 追加 - 結合文字列を検索
    • 修正 - CP932依存文字を検索
      • Wiki が 神 → 神 などの正規化(NFC)を行う影響で、漢字22字が意図どおりに検索されないミスを修正
    • 変更 - ASCII文字, 半角カナ, 全角英数, CJK漢字, ひらがな, カタカナを単語検索
      • 変数を使用せず、正規表現 \g<名前> を使用する形式に統一
  • 1.2.4 (2015-12-26)
    • 仕様変更 - アイコンの指定先を "My Macros\テキスト整形.ico" → "テキスト整形.ico" に変更
    • 変更 - マクロフォルダを開く
      • 「My Macros フォルダを開く」→「マクロフォルダを開く」に変更
      • 「テキスト整形」マクロがあるフォルダを開くようにした(Mery 2.4.7 での Macros フォルダ改名に対処)
  • 1.2.3 (2015-09-30)
    • 追加 - CP932依存文字を検索 ¦ サロゲートペアを検索 ¦ 行頭に連番挿入 (#) ¦ 行頭に連番挿入 (#/Z) ¦ 行頭に連番挿入 (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 ○○ → 文字」→「○○ デコード」に変更
  • 1.2.2 (2015-03-26)
    • 変更 - CJK漢字を単語検索
      • 異体字セレクタを考慮するようにした(ただし組合せが適正かは考慮しえない)
    • 変更 - 複製貼り付け
      • 処理中止の条件を 非数字(NaN) or 1 未満 → クリップボードがカラ or 1 未満 に変更
  • 1.2.1 (2015-03-14)
    • 仕様変更 - モード R/RS 実行後、処理した範囲を選択し直すようにした
    • 仕様変更 - モード RM を廃止。既存コマンドはモード RS に移行
      • ★行頭 // を挿入/削除 ¦ ★インデント(半角空白2個) ¦ ★空白行を削除 ¦ ★行頭/行末に貼り付け ¦ ★行頭/行末に挿入 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
    • 仕様変更 - モード CR を廃止し、String.replaceBatch メソッドを追加。既存コマンドは replaceBatch メソッド利用に移行
      • ★連続する!?を整形 ¦ ★実体参照 &"<> → &xxx; ¦ ★実体参照 &xxx; → ␣><"& ¦ ★半角カナ→全角 ¦ ★全角カナ→半角 ¦ 標準変換
    • コード整理 - コマンド各々に更新年月日を付けるようにした
    • スターター除外 - ☆検索強調をすべて解除
    • 削除 - ☆全角英数を検索 ¦ ☆半角カナを検索 ¦ ☆CJK漢字を検索
    • 追加 - ASCII文字を単語検索 ¦ 半角カナを単語検索 ¦ 全角英数を単語検索 ¦ CJK漢字を単語検索 ¦ ひらがなを単語検索 ¦ カタカナを単語検索 ¦ 検索結果カウント ¦ 総字行数カウント
    • 変更 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー
      • パスが存在しない場合の名前を、無題 → <無題> に変更
    • 変更 - ★数値参照を文字に変換 ¦ \x{hex}, &#dec;, &#xHEX; デコード
      • サロゲートペアの計算を + → | に変更し、不要な括弧を除去(演算子の優先順が + - → >> → & → | である事による)
    • 変更 - Base64エンコード/デコード
      • 不要な括弧を除去(同上、演算子の優先順による)
    • 変更 - 拡張コード テンプレート
      • 仕様変更に伴う改訂
      • コマンドおよびセパレーターは、表示行頭に挿入するようにした
  • 1.2.0 (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字ずつ処理するようにした(高速化)
  • 1.1.9 (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) に短縮
  • 1.1.8 (2014-07-27)
    • 修正 - Base64デコード
      • 終端の余分な [NUL] を除去する処理が手抜きだったのを修正
  • 1.1.7 (2014-05-31)
    • 削除 - Base64エンコード(Unicode)
      • Mery の「Base64デコード」機能と同じ方式の Base64エンコード(UTF-8) に差し替え
    • 追加 - Base64エンコード/デコード(UTF-8)
    • 変更 - ★数値を3桁,区切りに
      • 数字列を抽出して処理するように変更(高速化)
    • 変更 - ★数値を3桁,区切りに ¦ 丸数字 (20) → ⑳ ¦ ★10→16進数 ¦ 2進接頭辞換算
      • 正規表現を \d → [0-9] に統一
    • 修正 - 拡張コード テンプレート(モード CR 交換/分割)
      • エスケープ文字 \ をより正確に判定できる正規表現に改修
  • 1.1.6 (2014-05-24)
    • 修正 - 各行末尾に挿入
      • 選択範囲の次行先頭にも挿入してしまう問題に対処
    • 変更 - 複製貼り付け
      • クリップボードの内容を変数に格納しておくように変更(高速化)
    • 変更 - 複製貼り付け ¦ 各行先頭/末尾に挿入
      • Prompt() 関連の処理を単純化(モード RM 以外では冗長だった)
  • 1.1.5 (2014-05-22)
    • 追加 - 2進接頭辞換算
    • 変更 - \x{hex}, &#dec; デコード
      • サロゲートペアの String.fromCharCode() の引数を複数指定に改修、ビット演算に一部変更
  • 1.1.4 (2014-05-16)
    • 変更 - \x{hex}, &#dec; エンコード
      • 処理方法を replace(for ループ) に統一
  • 1.1.3 (2014-04-27)
    • 追加 - &#dec; エンコード/デコード
  • 1.1.2 (2014-03-14)
    • 追加 - 青空文庫 ルビを除去 ¦ 青空文庫 注記を除去
  • 1.1.1 (2014-03-08)
    • 追加 - 選択文字列を検索 ¦ 選択文字列をすべて削除
    • 変更 - ★全角英数を検索 ¦ ★半角カナを検索 ¦ ★CJK漢字を検索
      • 検索方向を 前 → 次 に変更。念の為「大文字と小文字を区別」フラグを追加
  • 1.1.0 (2014-03-01)
    • 追加 - ★連続する!?を整形 ¦ ★全角ダッシュ(――)に整形
    • 変更 - ★括弧前の句読点を除去
      • 全角コンマ , /全角ピリオド . を除去対象に追加
    • 変更 - ★三点リーダー(……)に整形
      • 全角コンマ , /全角ピリオド . /半角中黒 ・ /三点リーダー … /二点リーダー ‥ を変換対象に追加
    • 変更 - マクロフォルダを開く
      • 処理方法を WScript.Shell.Run("explorer") → Shell.Application.Explore() に変更
  • 1.0.9 (2014-02-22)
    • 追加 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳
    • 変更 - 文字を逆順並べ ¦ \uHHHH, \x{hex} エンコード
      • 処理方法を for ループ → replace() に変更(字数削減)
    • 変更 - 拡張コード テンプレート
      • モード CR 作成補助コマンドを追加。モード CR テンプレートを変更
  • 1.0.8 (2014-02-17)
    • 修正 - ★行頭/行末に貼り付け
      • クリップボード終端の改行文字を除去する正規表現を修正 \r\n|\r|\n$ → (\r\n|\r|\n)$
  • 1.0.7 (2014-02-16)
    • 仕様修正 - モード CR で、正規表現の特殊文字があると誤動作する不具合を修正
    • 仕様変更 - モード CR で、正規表現 (JScript) による検索置換に対応
    • コード整理 - コメントアウトしていた基本コードを削除
    • コード整理 - 下記の6カテゴリを3カテゴリに統合。コマンドの名称や配置を見直した
      • (空白の追加 + 各行に追加) (空白の削除 + 行の削除) (数値の変換 + 文字種変換)
    • スターター除外 - ☆標準変換
    • 追加 - 複製貼り付け ¦ 文字を逆順並べ ¦ ★半角カナ→全角 ¦ ★全角カナ→半角
    • 変更 - ★行頭/行末に貼り付け
      • クリップボード終端の改行文字は除去するようにした(行切り取り・行コピーとの相性を考え)
    • 変更 - 拡張コード テンプレート
      • モード CR テンプレートを刷新
  • 1.0.6 (2014-02-10)
    • スターター除外 - ☆空白行を圧縮
    • 追加 - ★空白行を削除 ¦ \uHHHH デコード ¦ \x{hex} エンコード/デコード
    • 変更 - 挿入 Confirm(|)
      • 接尾辞の長さ(s.length)でカーソル移動量を決めるようにした
  • 1.0.5 (2014-02-01)
    • 追加 - \uHHHH エンコード
    • 変更 - ★全角かな→カナ ¦ ★全角カナ→かな
      • 踊り字(繰り返し記号) ゝゞヽヾ を変換対象に追加
  • 1.0.4 (2014-01-24)
    • 追加 - ★半角/全角の間を空ける ¦ ★半角英数/全角の間を空ける
    • 変更 - ★全角カナ→かな
      • ヴヵヶ は対象外とした(Shift_JIS では保存できない文字のため)
  • 1.0.3 (2014-01-12)
    • 仕様変更 - スターターパックにアイコンファイルを同梱
    • 修正 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー
      • 改行を LF → CR+LF に変更し、メモ帳でも正しく改行されるようにした
    • 修正 - ★数値を3桁,区切りに
      • 小数点以下(ピリオド以降)は桁区切りしないようにした
  • 1.0.2 (2014-01-08)
    • 仕様変更 - コマンド実行時、スクロール位置を記憶・復元しないように(コメントアウト)した
      • 検索系コマンドと相性が悪く、Mery の検索機能と挙動が合っていないため
    • スターター追加 - ★CJK漢字を検索 ¦ ★検索強調をすべて解除
    • 追加 - ★全角英数を検索 ¦ ★半角カナを検索
    • 修正 - ★16→10進数
      • 16進数に使用しない英字 G~Z を変換対象に含めていたミスを修正
  • 1.0.1 (2013-12-30)
    • 追加 - 挿入 Confirm(|) ¦ ★数値を3桁,区切りに ¦ ★10→16進数 ¦ ★16→10進数
    • 修正 - My Macros フォルダを開く (現「マクロフォルダを開く」)
      • 「テキスト整形」マクロのあるフォルダではなく Mery.exe 直下の My Macros フォルダを開くようにした
  • 1.0.0 (2013-09-15)
    • 初版公開

基本コード[編集]

//■テキスト整形
// 2013-09-15 - 2019-06-01

//■拡張コード:リスト
var f = [];
// ----------------- ↓ここより下に拡張コードを追加

// ----------------- ↑ここより上に拡張コードを追加
/*■拡張コード:書式
//▼コマンド
f.push(["コマンド名","オプション",function(引数){ 処理 }]);
//▽オプション
  s : 実行に範囲選択を要求 (require selection)
  c : 実行にクリップボードを要求 (require clipboard)
  L : 行選択してから処理 (select Line)
  O : 非選択時はすべて選択してから処理 (select OR all) ※実験的
//▽引数(arguments)
  第1引数 = Document.Selection.Text
  第2引数 = Document.Selection
//▽処理の戻り値(return value)
  String/Array以外 : 選択範囲に対し何もしない
  "abcd"           : abcd に置換後、abcd を選択
  ["ab","cd"]      : abcd に置換後、ab と cd の間に移動
  ["ab","cd",""]   : abcd に置換後、cd を選択
//▼サブメニュー
f.push(["メニュー名",function(f){ コマンドなど }]);
//▼セパレーター
f.push(["--------"]);
// ----------------- */

//■メソッド:連続置換
//"string".replaceBatch([ [検索1,置換1],[検索2,置換2],… ]);
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 isSelEmpty = Sel.IsEmpty;
var isClipEmpty = !ClipboardData.GetData();
var cmd = [], cid = 0; //コマンド, ID
//リストからメニュー作成
var Menu = CreatePopupMenu();
(function ListToMenu(List, Menu) {
  for (var i=0,_L; _L=List[i]; i++) {
    if (typeOf(_L[0]) !== "String") continue;
    switch (_L.length) {
    case 3: //◆コマンド      _L = ["コマンド名","オプション",function]
      if (typeOf(_L[1]) !== "String") break;
      if (typeOf(_L[2]) !== "Function") break;
      ++cid;
      var isGray = (/\bs\b/.test(_L[1]) && isSelEmpty)
                || (/\bc\b/.test(_L[1]) && isClipEmpty) ;
      Menu.Add(_L[0]+"\t"+_L[1], cid, isGray? meMenuGrayed: 0);
      if (isGray) break;
      cmd[cid] = { func: _L[2]
      , selLine:  /\bL\b/.test(_L[1])
      , selOrAll: /\bO\b/.test(_L[1])
      };
    break;
    case 2: //◆サブメニュー  _L = ["メニュー名",function]
      if (typeOf(_L[1]) !== "Function") break;
      var sub_f = [], sub_Menu = CreatePopupMenu();
      _L[1](sub_f);
      Menu.AddPopup(_L[0], sub_Menu);
      ListToMenu(sub_f, sub_Menu); //再帰:サブメニュー作成
    break;
    case 1: //◆セパレーター  _L = ["--------"]
      if (!/^-+$/.test(_L[0])) break;
      Menu.Add("", 0, meMenuSeparator);
    break;
    }
  }
}(f, Menu));
//ポップアップメニューを表示して処理
main: if (cid = Menu.Track(mePosMouse)) { //※キャンセル(Esc)時は 0 で終了
  var invertPos = Sel.GetActivePos() < Sel.GetAnchorPos();
  if (cmd[cid].selLine) selectLine(Sel);
  if (cmd[cid].selOrAll && isSelEmpty) Sel.SelectAll();
  var res = cmd[cid].func(Sel.Text, Sel);
  if (typeOf(res) === "String") res = ["",res,""];
  if (typeOf(res) !== "Array") break main;
  
  var head = res.shift(), tail = res.pop() || "", body = res.join("");
  Sel.Text = head + body + tail;
  var acp = Sel.GetActivePos() - tail.replace(/\r\n/g,"\n").length;
  var anp = acp                - body.replace(/\r\n/g,"\n").length;
    //※クリップボードなどCR+LFが含まれる場合、1字と数えなければズレる
  Sel.SetActivePos(invertPos? anp: acp);
  Sel.SetAnchorPos(invertPos? acp: anp);
}

//■型判別
function typeOf(obj) {
  return (obj===null)? "Null": (obj==null)? "Undefined":
    Object.prototype.toString.call(obj).slice(8,-1); //"[object Type]".slice
};
//■論理行選択
function selectLine(Sel) {
  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);
};

}());

拡張コード[編集]

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

小説/作文[編集]

★地の文の行頭を字下げ
開き括弧類 ‘ “ ( 〔 [ { 〈 《 「 『 【 または 半角空白/全角空白/水平タブ/改行 以外の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。
f.push(["地の文の行頭を字下げ","L",function(_){ //2015-02-14
  return _.replace(/^([^‘“(〔[{〈《「『【  \t\n])/gm," $1") }]);
★括弧前の句読点を除去
閉じ括弧類 ’ ” ) 〕 ] } 〉 》 」 』 】 の直前に句読点 、 。 , . がある場合、除去します。
f.push(["括弧前の句読点を除去","s",function(_){ //2014-03-01
  return _.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]);
★!?を半角/全角に整形
感嘆符・疑問符を、直前の文字が半角なら半角に、全角なら全角に整形します。
直前の文字がない場合(範囲先頭か行頭)は何もしません。
半角文字=ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。
例> What!?/あ!? → What!?/あれ!?(※赤字が直前の文字)
f.push(["!?を半角/全角に整形","s",function(_){ //2017-06-25
  return _.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(["連続する!?を整形","s",function(_){ //2015-03-14
  return _.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(["三点リーダー(……)に整形","s",function(_){ //2014-03-01
  return _.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(["全角ダッシュ(――)に整形","s",function(_){ //2017-06-25
  return _.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}/g,"――") }]);
青空文庫 ルビを除去
で始まり で終わる箇所を除去します。ルビ開始位置を表す がある場合、 も除去します。
例> 一応《いちおう》何時《いつ》もの/霧の|ロンドン警視庁《スコットランドヤード》 → 一応何時もの/霧のロンドン警視庁
f.push(["青空文庫 ルビを除去","s",function(_){ //2015-09-30
  return _.replace(/(?:|([^《\n]+))?《.*?》/g,"$1") }]);
青空文庫 注記を除去
[# で始まり で終わる箇所を除去します。
例> [#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり] → 名※
f.push(["青空文庫 注記を除去","s",function(_){ //2014-03-14
  return _.replace(/[#.*?]/g,"") }]);
青空文庫 注記(外字以外)を除去
外字を表す注記 ※[# ~ ] は例外とし、除去しません。
例> [#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり] → 名※[#二の字点、1-2-22]
f.push(["青空文庫 注記(外字以外)を除去","s",function(_){ //2014-03-14
  return _.replace(/(※[#.*?])|[#.*?]/g,"$1") }]);

Web/HTML[編集]

★HTMLタグを除去
f.push(["HTMLタグを除去","s",function(_){ //2015-09-30
  return _.replace(/<("[^"]*"|'[^']*'|[^"'>])*>/g,"") }]);
行末に<br>を挿入
f.push(["行末に<br>を挿入","L",function(_){ //2015-02-14
  return _.replace(/$/gm,"<br>") }]);
<br>を改行に変換
改行タグを改行に変換します。ただし、改行タグ直後に改行が含まれている場合は、二重改行にならないようタグのみ削除します。
※対応タグは <br> <br/> <br /> の3種類です。英字の大小は問いません。
※属性付きには対応していません。例> <br clear="all"> など
f.push(["<br>を改行に変換","s",function(_){ //2015-02-14
  return _.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;',"s",function(_){ //2015-03-14
  return _.replaceBatch([ ["&","&amp;amp;"],['"',"&amp;quot;"],["<","&amp;lt;"],[">","&amp;gt;"] ]) }]);
f.push(['実体参照 &&xxx; → \u2423><"&&',"s",function(_){ //2015-03-14
  return _.replaceBatch([ ["&amp;nbsp;"," "],["&amp;gt;",">"],["&amp;lt;","<"],["&amp;quot;",'"'],["&amp;amp;","&"] ]) }]);
半角空白 → &nbsp; の変換も行う場合は、下記の内容に差し替えてください。
f.push(['実体参照 &&"<>\u2423 → &&xxx;',"s",function(_){ //2015-03-14
  return _.replaceBatch([ ["&","&amp;amp;"],['"',"&amp;quot;"],["<","&amp;lt;"],[">","&amp;gt;"],[" ","&amp;nbsp;"] ]) }]);
★数値参照 &#dec; に変換
文字列を数値文字参照(10進)形式に変換します。(dec=decimal/十進法)
例> Aわ𩸽 → &#65;&#12431;&#171581;
#符号化/復号化 の節の &#dec; エンコード を参照
★数値参照 &#xHEX; に変換
文字列を数値文字参照(16進)形式に変換します。(HEX=hexadecimal/十六進法)
例> Aわ𩸽 → &#x41;&#x308F;&#x29E3D;
#符号化/復号化 の節の &#xHEX; エンコード を参照
★数値参照を文字に変換
数値文字参照(10進/16進)を文字列に変換します。
例> &#65;&#x308F;&#x29e3d; → Aわ𩸽
f.push(["数値参照を文字に変換","s",function(_){ //2019-06-01
  return _.replace(/&#(?:([0-9]{1,7})|x([0-9a-f]{1,6}));/gi,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(["行頭 \/\/ を挿入/削除","L",function(_){ //2015-03-14
  return _.replace(/^(\/\/)?/gm,function(s){return s? "": "\/\/"}) }]);
★このマクロを編集
実行中のマクロ(テキスト整形)を Mery で開きます。
※マクロを実行後、[マクロ]→[編集] でファイルを開くのと同様です。
f.push(["このマクロを編集","",function(){ //2019-06-01
  Editor.OpenFile(ScriptFullName, meEncodingNone, meOpenAllowNewWindow) }]);
マクロフォルダを開く
エクスプローラを起動し、実行中のマクロ(テキスト整形)があるフォルダを開きます。
f.push(["マクロフォルダを開く","",function(){ //2015-12-26
  new ActiveXObject("Shell.Application").Explore(new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(ScriptFullName)) }]);
挿入 Confirm(|)
文字列 if(!Confirm( ))Quit(); を挿入します。
f.push(["挿入 Confirm(|)","",function(_){ //2019-06-01
  return ["if(!Confirm(" , _ , "))Quit();"] }]);
選択範囲を eval で評価
ステータスバーに eval(選択範囲) の結果を表示します。
たとえば、選択範囲が 10*(5+20) なら、250 と表示されます。
f.push(["選択範囲を eval で評価","s",function(_){ //2019-06-01
  Status=eval(_) }]);

挿入/貼付[編集]

★半角/全角の間を空ける
★半角英数/全角の間を空ける
半角文字/半角英数と全角文字の間に半角空白を挿入します。
半角文字=ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。
f.push(["半角/全角の間を空ける","s",function(_){ //2014-02-16
  return _.replace(/([!-~。-゚](?=[^!-~。-゚  \t\n])|[^!-~。-゚  \t\n](?=[!-~。-゚]))/g,"$1 ") }]);
f.push(["半角英数/全角の間を空ける","s",function(_){ //2014-02-16
  return _.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桁,区切りに","s",function(_){ //2014-10-12
  return _.replace(/([^.0-9]|^)([0-9]+)/g,function(_,p,n){return p+n.replace(/([0-9])(?=(?:[0-9]{3})+$)/g,"$1,")}) }]);
複製貼り付け...
クリップボードの文字列を、入力した回数分複製してから貼り付けます。
f.push(["複製貼り付け...","c",function(){ //2019-06-01
  var r=[],c=ClipboardData.GetData(),n=parseInt(Prompt("複製回数: ※半角数字","")); if(n>0){ while(n--){r.push(c)} return r.join("") } }]);
★行頭/行末に貼り付け
クリップボードの文字列を、各行の行頭/行末に貼り付けます。
f.push(["行頭に貼り付け","L c",function(_){ //2015-09-30
  var c=ClipboardData.GetData().replace(/(\r\n|[\r\n])$/,""); return _.replace(/^/gm,c) }]);
f.push(["行末に貼り付け","L c",function(_){ //2015-09-30
  var c=ClipboardData.GetData().replace(/(\r\n|[\r\n])$/,""); return _.replace(/$/gm,c) }]);
★行頭/行末に挿入...
入力した文字列を、各行の行頭/行末に挿入します。
f.push(["行頭に挿入...","L",function(_){ //2019-06-01
  var p=Prompt("行頭に挿入する文字列:",""); if(p)return _.replace(/^/gm,p) }]);
f.push(["行末に挿入...","L",function(_){ //2019-06-01
  var p=Prompt("行末に挿入する文字列:",""); if(p)return _.replace(/$/gm,p) }]);
各行先頭/末尾に挿入...
下記の条件で置換を行い、入力した文字列を各行の先頭/末尾に挿入します。
※矩形対応には Mery 2.1.0 以降が必要です。
※Mery の仕様上、ゼロ幅には対応していません。ゼロ幅で実行すると、表示行頭に文字列が挿入されます。
検索文字列 (先頭) ^(?=.|\n)
検索文字列 (末尾) (?<=.)$|^(?=\n)
置換文字列 ※入力した文字列
フラグ 正規表現を使用する (meFindReplaceRegExp)
選択した範囲のみ (meReplaceSelOnly)
すべて置換 (meReplaceAll)
f.push(["各行先頭に挿入...","",function(_,$){ //2019-06-01
  var p=Prompt("各行先頭に挿入する文字列:",""); if(p)$.Replace("^(?=.|\\n)", p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]);
f.push(["各行末尾に挿入...","",function(_,$){ //2019-06-01
  var p=Prompt("各行末尾に挿入する文字列:",""); if(p)$.Replace("(?<=.)$|^(?=\\n)", p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]);
行頭に連番挿入 (#)
行頭に連番 (1), (2), (3) … を挿入します。
f.push(["行頭に連番挿入 (#)","L",function(_){ //2015-09-30
  var re=/^/gm, n=1, pf="(", sf=")"; return _.replace(re,function(){return pf+(n++)+sf}) }]);
行頭に連番挿入 (#/Z)
選択行数を Z として、連番 (1/Z), (2/Z), (3/Z) … を挿入します。
f.push(["行頭に連番挿入 (#/Z)","L",function(_){ //2015-09-30
  var re=/^/gm, n=1, m=(_.match(re)||[]).length, pf="(", sf="/"+m+")"; return _.replace(re,function(){return pf+(n++)+sf}) }]);
行頭に連番挿入 (0#)
連番が2桁以上になる場合、桁揃えした連番 (01), (02), (03) … を挿入します。
f.push(["行頭に連番挿入 (0#)","L",function(_){ //2015-09-30
  var re=/^/gm, n=1, m=(_.match(re)||[]).length, pf="(", sf=")", sp="0", k=String(m).length, sp=new Array(k).join(sp); return _.replace(re,function(){return pf+(sp+(n++)).slice(-k)+sf}) }]);
※行頭に連番挿入系コマンドの比較
例文 (#) (#/Z) (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行目
連番を出力...
数値..数値を含む文字列(数値は 0 以上の整数)を入力すると、連番に展開して書き出します。
8..10 10..8 第01..3章 第1..003章 1..3..9
結果 8
9
10
10
9
8
第01章
第02章
第03章
第001章
第002章
第003章
1..9
2..9
3..9
補足 降順可 ゼロ始まりならゼロ埋め 最初のみ展開
f.push(["連番を出力...","",function(_){ //2019-06-01
  var p=Prompt("連番を出力: ※例> 第1..10章",_.match(/^.*/)[0]), q=p.replace(/^([\s\S]*?)((0*)[0-9]+)\.\.((0*)[0-9]+)([\s\S]*)$/,function(_,p,n,nz,m,mz,q){var r=[],d=Math.max(n.length,m.length),z=(nz||mz)?new Array(d+1).join("0"):"",n=Number(n),m=Number(m); if(n<=m){for(;n<=m;n++)r.push(p+(z+n).slice(-d)+q);}else{for(;n>=m;n--)r.push(p+(z+n).slice(-d)+q);} return r.join("\n")}); if(q!==p)return q }]);

除去/削除[編集]

★空白文字を除去
空白文字(半角空白/全角空白/水平タブ)を除去します。
f.push(["空白文字を除去","s",function(_){ //2013-09-15
  return _.replace(/[  \t]+/g,"") }]);
★行頭行末/行頭/行末の空白を除去
f.push(["行頭行末の空白を除去","L",function(_){ //2013-09-15
  return _.replace(/^[  \t]+|[  \t]+$/gm,"") }]);
f.push(["行頭の空白を除去","L",function(_){ //2015-02-14
  return _.replace(/^[  \t]+/gm,"") }]);
f.push(["行末の空白を除去","L",function(_){ //2015-02-14
  return _.replace(/[  \t]+$/gm,"") }]);
空白行の空白を除去
空白行を、改行のみの空行にします。
f.push(["空白行の空白を除去","L",function(_){ //2017-06-25
  return _.replace(/^[  \t]+$/gm,"") }]);
★空白行を削除
空白行(半角空白/全角空白/水平タブ/改行のみの行)を削除します。
f.push(["空白行を削除","L",function(_){ //2015-03-14
  return _.replace(/^[  \t]*$\n?/gm,"") }]);
空白行を圧縮
連続する空白行を1行の空行に変換します。連続しない(=1行の)空白行は削除します。
f.push(["空白行を圧縮","L",function(_){ //2015-02-14
  return _.replace(/^[  \t]+$/gm,"").replace(/^(\n)\n+|^\n/gm,"$1") }]);
空白行を減量
連続する空白行を1行分削減します。
空白行の連続が3行なら2行に、2行なら1行に、1行なら0行(=削除)になります。
f.push(["空白行を減量","L",function(_){ //2015-02-14
  return _.replace(/((?:^[  \t]*$\n?)*)(?:^[  \t]*$\n?)/gm,"$1") }]);
★重複行を単一化
同じ内容の行が2個以上ある場合、2個目以降を削除します。
f.push(["重複行を単一化","L",function(_){ //2018-01-15
  var a=_.split("\n"),b=[],map={}; for(var i=0;i<a.length;i++){ if(!Object.prototype.hasOwnProperty.call(map,a[i])){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]);
重複行を単一化(空白行は除く)
空白行(半角空白/全角空白/水平タブ/改行のみの行)は例外とし、削除しません。
f.push(["重複行を単一化(空白行は除く)","L",function(_){ //2018-01-15
  var a=_.split("\n"),b=[],map={}; for(var i=0;i<a.length;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(["連続する重複行を単一化","L",function(_){ //2015-02-14
  return _.replace(/(^.*$)\n(^\1$\n?)+/gm,"$2") }]);
重複する/しない行を抽出
f.push(["重複する行を抽出","L",function(_){ //2018-01-15
  var a=_.split("\n"),b=[],k=0,map={}; for(var i=0;i<a.length;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(["重複しない行を抽出","L",function(_){ //2018-01-15
  var a=_.split("\n"),b=[],k=0,map={}; for(var i=0;i<a.length;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(["入力文字列を含む行を削除...","L",function(_){ //2019-06-01
  var p=Prompt("以下の文字列を含む行を削除:",""); if(p)return _.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? "":s}) }]);
f.push(["入力文字列を含まない行を削除...","L",function(_){ //2019-06-01
  var p=Prompt("以下の文字列を含まない行を削除:",""); if(p)return _.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? s:""}) }]);
正規表現に一致する/しない行を削除...
※正規表現は JavaScript (JScript) の仕様で記述します。
f.push(["正規表現に一致する行を削除...","L",function(_){ //2019-06-01
  var p=Prompt("以下の正規表現に一致する行を削除:",""); if(p){ p=new RegExp(p); return _.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? "":s}) } }]);
f.push(["正規表現に一致しない行を削除...","L",function(_){ //2019-06-01
  var p=Prompt("以下の正規表現に一致しない行を削除:",""); if(p){ p=new RegExp(p); return _.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? s:""}) } }]);
行頭/行末から数文字削除...
各行の行頭/行末から指定した文字数分を削除します。
※結合文字列には対応していません。
f.push(["行頭から数文字削除...","L",function(_){ //2019-06-01
  var n=parseInt(Prompt("行頭から削除する字数: ※半角数字","")); if(n>0)return _.replace(new RegExp("^(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}","gm"),"") }]);
f.push(["行末から数文字削除...","L",function(_){ //2019-06-01
  var n=parseInt(Prompt("行末から削除する字数: ※半角数字","")); if(n>0)return _.replace(new RegExp("(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}$","gm"),"") }]);

検索/置換[編集]

ASCII文字を単語検索
空白文字などを除く ASCII 印字可能文字 (U+0021~007E) が1文字以上連続する箇所を検索します。
f.push(["ASCII文字を単語検索","",function(_,$){ //2017-05-28
  $.Find("(?<!\\g<Graph>)(?<Graph>[!-~])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
半角カナを単語検索
半角カナ類 (ヲ~ッ ア~ン 。 「 」 、 ・ ー ゙ ゚) が1文字以上連続する箇所を検索します。
f.push(["半角カナを単語検索","",function(_,$){ //2017-05-28
  $.Find("(?<!\\g<HKana>)(?<HKana>[。-゚])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
全角英数を単語検索
全角英数字 (0~9 A~Z a~z) が1文字以上連続する箇所を検索します。
f.push(["全角英数を単語検索","",function(_,$){ //2017-05-28
  $.Find("(?<!\\g<FAlnm>)(?<FAlnm>[0-9A-Za-z])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
CJK漢字を単語検索
CJK (China/Japan/Korea) の漢字が1文字以上連続する箇所を検索します。
f.push(["CJK漢字を単語検索","",function(_,$){ //2017-05-28
  $.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字
全角ひらがな (89字) ぁ ~ ん
ゔゕゖ
0x829F~82F1
-
U+3041~3093
U+3094~3096
※SJIS では ゔゕゖ の3字は保存不可
ゝゞ 0x8154, 8155 U+309D, 309E 踊り字(繰り返し)
- U+309F 「より」の合字
片仮名
(カナ)
164字
全角カタカナ (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 アイヌ語表記などに用いる
記号
8字
※以下は、仮名の後に続いて出現する場合のみ検索される。例> 複製゜ーコヒ゜ー
半角/全角濁点 (2字) ゙ ゛ 0xDE, 814A U+FF9E, 309B
半角/全角半濁点 (2字) ゚ ゜ 0xDF, 814B U+FF9F, 309C
結合用濁点/半濁点 (2字) ゙ ゚ - U+3099, 309A 結合文字
半角/全角長音符 (2字) ー ー 0xB0, 815B U+FF70, 30FC
f.push(["ひらがなを単語検索","",function(_,$){ //2017-05-28
  $.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(["カタカナを単語検索","",function(_,$){ //2017-05-28
  $.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依存文字を検索","",function(_,$){ //2017-05-28
  $.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) }]);
CJK互換漢字を検索
CJK互換漢字 (U+F900~FAD9, 2F800~2FA1D) を検索します(CJK統合漢字扱いの12字 および 未定義の2字は除く)。
f.push(["CJK互換漢字を検索","",function(_,$){ //2018-01-15
  $.Find("[[^﨎﨏﨑﨓﨔﨟﨡﨣﨤﨧﨨﨩\\x{FA6E}\\x{FA6F}]&&[\\x{F900}-\\x{FAD9}\\x{2F800}-\\x{2FA1D}]]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
サロゲートペアを検索
UTF-16において2バイト2個組で1文字を形成する文字 (U+10000~10FFFF) を検索します。
f.push(["サロゲートペアを検索","",function(_,$){ //2015-09-30
  $.Find("[\\x{10000}-\\x{10FFFF}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
結合文字列を検索
他の文字と組み合わせて1文字を形成する文字列を検索します。
※結合文字列や異体字を表示するには、アプリやフォントの対応が必要です。
ラテン文字 ひらがな 漢字(異体字) 囲み文字
実際の表示 ǖ ǖ じ 辻󠄀 あ⃞
文字の構成 ǖ u ̈ ̄ 󠄀
Unicode 01D6 0075 0308 0304 3058 3057 3099 8FBB E0100 3042 20DE
f.push(["結合文字列を検索","",function(_,$){ //2017-05-28
  $.Find("(?:[^\\p{M}\\n]|^)[\\p{M}]+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
選択文字列を検索
下記の条件で検索を行います。
※Mery の仕様上、改行や折り返しを含むと検索強調が不完全になります。
検索文字列 ※選択文字列
フラグ 大文字と小文字を区別する (meFindReplaceCase)
正規表現を使用する (meFindReplaceRegExp)
文末まで検索したら文頭に移動する (meFindAround)
下/次を検索 (meFindNext)
f.push(["選択文字列を検索","s",function(_,$){ //2019-06-01
  var acp=$.GetActivePos(),anp=$.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; $.Find(_.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext); $.SetActivePos(acp);$.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true; }]);
選択文字列をすべて削除
下記の条件で置換を行い、選択文字列を削除します。
検索文字列 ※選択文字列
置換文字列 ※空欄
フラグ 大文字と小文字を区別する (meFindReplaceCase)
正規表現を使用する (meFindReplaceRegExp)
すべて置換 (meReplaceAll)
f.push(["選択文字列をすべて削除","s",function(_,$){ //2019-06-01
  $.Replace(_.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), "", meFindReplaceCase+meFindReplaceRegExp+meReplaceAll) }]);
検索強調をすべて解除
[検索]→[検索文字列の強調を解除] をすべての文書で実行します。
f.push(["検索強調をすべて解除","",function(){ //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(["検索結果カウント","",function(_,$){ //2015-09-30
  var t=new Date(),n=-1,acp=$.GetActivePos(),anp=$.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; Status=""; $.StartOfDocument(); do{$.FindRepeat(meFindNext);n++}while(!Status); $.SetActivePos(acp);$.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true; Status=n+"件の検索結果 (処理時間: "+(new Date()-t)/1000+"秒)" }]);

文書情報[編集]

総字行数カウント
総文字数と総表示行数をステータスバーに表示します。
表示される数値は「すべて選択」時に表示される字数・行数と同値になります。
※サロゲートペアは2文字と数えます。
f.push(["総字行数カウント","",function(){ //2019-06-01
  Status=Document.Text.length+"文字 ("+Document.GetLines(meGetLineView)+"表示行)" }]);
文字数カウント(空白は除く)
選択範囲または文書全体の文字数(改行/半角空白/全角空白/水平タブは除く)をステータスバーに表示します。
※サロゲートペアは1文字と数えます。
f.push(["文字数カウント(空白は除く)","",function(_){ //2019-06-01
  Status=(_||Document.Text).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").replace(/[\t\n\r  ]/g,"").length+"文字 (改行・空白抜き)" }]);
ステータスバーの表示をコピー
ステータスバーの左端の欄に表示されている文字列をコピーします。
f.push(["ステータスバーの表示をコピー","",function(){ //2019-06-01
  ClipboardData.SetData(Status) }]);
編集中のファイルのパスをコピー
編集中の全ファイルのパスをコピー
現在編集中のファイルのパスをクリップボードにコピーします。
新規作成ファイルなどパスが存在しない場合は、<無題> の文字がコピーされます。
f.push(["編集中のファイルのパスをコピー","",function(){ //2015-03-14
  ClipboardData.SetData(Document.FullName||"<無題>") }]);
f.push(["編集中の全ファイルのパスをコピー","",function(){ //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")) }]);

並べ替え[編集]

★行を昇順/降順並べ(Unicode)
Unicode 順に並べ替えます。
f.push(["行を昇順並べ(Unicode)","L",function(_){ //2017-06-25
  return _.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)","L",function(_){ //2017-06-25
  return _.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(["行を逆順並べ","L",function(_){ //2014-10-12
  return _.split("\n").reverse().join("\n") }]);
行をシャッフル
ランダムに並べ替えます。
f.push(["行をシャッフル","L",function(_){ //2014-10-12
  var 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") }]);
行を文字数順並べ
文字数の少ない順に並べ替えます。
※符号点(コードポイント)の少ない順。結合文字列には対応していません。
文字数の多い順に並べ替えたい場合は、a.len-b.lenb.len-a.len に書き換えてください。
f.push(["行を文字数順並べ","L",function(_){ //2019-06-01
  var b=_.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").split("\n"),a=_.split("\n"); for(var i=0;i<a.length;i++){a[i]={len:b[i].length,txt:a[i]}} a.sort(function(a,b){return a.len-b.len}); for(var i=0;i<a.length;i++){a[i]=a[i].txt} return a.join("\n") }]);
数行毎に逆順並べ...
選択範囲を指定した行数で区切り、区間ごとに逆順に並べ替えます。
f.push(["数行毎に逆順並べ...","L",function(_){ //2019-06-01
  var n=parseInt(Prompt("以下の行数毎に逆順並べ: ※半角数字","")); if(n>0)return (_+"\n").replace(new RegExp("(?:^.*$\\n){1,"+n+"}","gm"),function(s){return s.split("\n").reverse().join("\n")}).slice(1) }]);
数行一組で逆順並べ...
選択範囲を指定した行数で一組とし、組単位で逆順に並べ替えます。
f.push(["数行一組で逆順並べ...","L",function(_){ //2019-06-01
  var n=parseInt(Prompt("以下の行数を一組として逆順並べ: ※半角数字","")); if(n>0)return (_+"\n").match(new RegExp("(?:^.*$\\n){1,"+n+"}","gm")).reverse().join("").slice(0,-1) }]);
空行毎に逆順並べ
選択範囲を空行(改行のみの行)で区切り、区間ごとに逆順に並べ替えます。
f.push(["空行毎に逆順並べ","L",function(_){ //2019-06-01
  return (_+"\n").replace(/\n+|[\s\S]*?\n(?=\n|$)/g,function(s){return s.split("\n").reverse().join("\n")}).slice(1) }]);
空行一組で逆順並べ
選択範囲を空行区切りで一組とし、組単位で逆順に並べ替えます。
f.push(["空行一組で逆順並べ","L",function(_){ //2019-06-01
  return (_+"\n").match(/\n+|[\s\S]*?\n(?=\n|$)/g).reverse().join("").slice(0,-1) }]);
指定見出しで逆順並べ...
入力した文字列から始まる行を「見出し」とし、見出し単位で逆順に並べ替えます。
f.push(["指定見出しで逆順並べ...","L",function(_){ //2019-06-01
  var p=Prompt("以下の文字から始まる行を一組として逆順並べ:","■").replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"); if(p){ var r=(_+"\n").match(new RegExp("[\\s\\S]*?\\n(?="+p+"|$)","g")); if(r[0].indexOf(p)!==0)r.push(r.shift()); return r.reverse().join("").slice(0,-1) } }]);
※行を逆順並べ系コマンドの比較 (☐ は空白/↵ は改行)
例文 数行毎
(3行)
数行一組
(3行)
例文 空行毎 空行一組
1行目1組
2行目
3行目
4行目2組
5行目
6行目
7行目3組
8行目
9行目
10行目4組
11行目
3行目
2行目
1行目1組
6行目
5行目
4行目2組
9行目
8行目
7行目3組
11行目
10行目4組
10行目4組
11行目
7行目3組
8行目
9行目
4行目2組
5行目
6行目
1行目1組
2行目
3行目
1行目1組↵
2行目↵
3行目↵

5行目2組↵
6行目↵
☐☐↵
8行目↵

10行目3組↵
11行目
3行目↵
2行目↵
1行目1組↵

8行目↵
☐☐↵
6行目↵
5行目2組↵

11行目↵
10行目3組
10行目3組↵
11行目↵

5行目2組↵
6行目↵
☐☐↵
8行目↵

1行目1組↵
2行目↵
3行目
文字を逆順並べ
各行の文字を逆順に並べ替えます。
例> 文字を逆順並べ → べ並順逆を字文
UAX #29 で規定される「拡張書記素クラスタ」に部分的に対応しています。対応していない文字は位置がズレます。
  • サロゲートペア (U+10000~10FFFF)
  • 結合文字の一部 (U+0300~6F, 1AB0~FF, 1DC0~FF, 20D0~FF, 3099~A, FE20~F)
  • 異体字セレクタ (U+180B~D, FE00~F, E0100~EF)
  • ゼロ幅非接合子/接合子 (U+200C~D)
  • 絵文字の国旗 (U+1F1E6~FF)
  • 絵文字の肌色指定 (U+1F3FB~F)
  • 結合不可の制御文字 (U+0000~1F, 007F~9F, 00AD, 2028~9, FEFF)
例> 𠮟る/りんご/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(["文字を逆順並べ","s",function(_){ //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 _.replace(/[^\n]+/g,function(s){return s.match(X).reverse().join("")}) }]);
文字をシャッフル
各行の文字をランダムに並べ替えます。
例> 文字をシャッフル → フ字をャシッル文
f.push(["文字をシャッフル","s",function(_){ //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 _.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("")}) }]);

字種/数値変換[編集]

★半角英数→全角
★全角英数→半角
f.push(["半角英数→全角","s",function(_){ //2014-02-10
  return _.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]);
f.push(["全角英数→半角","s",function(_){ //2014-02-10
  return _.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]);
★半角カナ→全角
★全角カナ→半角
f.push(["半角カナ→全角","s",function(_){ //2015-03-14
  return _.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
f.push(["全角カナ→半角","s",function(_){ //2015-03-14
  return _.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]) }]);
★全角かな→カナ
★全角カナ→かな
全角ひらがなと全角カタカナを変換します。
ただし、ヴヵヶ → ゔゕゖ の変換は行いません(Shift_JIS では保存できない文字のため)。
f.push(["全角かな→カナ","s",function(_){ //2014-02-10
  return _.replace(/[\u3041-\u3096ゝゞ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x60)}) }]);
f.push(["全角カナ→かな(ヴヵヶ除く)","s",function(_){ //2015-02-14
  return _.replace(/[\u30A1-\u30F3ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
ヴヵヶ → ゔゕゖ の変換も行う場合は、下記の内容に差し替えてください。
f.push(["全角カナ→かな","s",function(_){ //2014-02-10
  return _.replace(/[\u30A1-\u30F6ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
全角仮名+濁点を合成
全角仮名+濁点(結合/全角/半角)の2文字を、1文字に合成可能ならば合成します。
例> あ゙じう゛ヷヘ゜か゚ → あ゙じゔヷペか゚
※「あ゙」「か゚」は合成不能のため変化なし。
f.push(["全角仮名+濁点を合成","s",function(_){ //2019-12-21
  var map={"\u3099":"゙","゛":"゙","゙":"゙","\u309A":"゚","゜":"゚","゚":"゚","が":"が","ぎ":"ぎ","ぐ":"ぐ","げ":"げ","ご":"ご","ざ":"ざ","じ":"じ","ず":"ず","ぜ":"ぜ","ぞ":"ぞ","だ":"だ","ぢ":"ぢ","づ":"づ","で":"で","ど":"ど","ば":"ば","び":"び","ぶ":"ぶ","べ":"べ","ぼ":"ぼ","ゞ":"ゞ","ガ":"ガ","ギ":"ギ","グ":"グ","ゲ":"ゲ","ゴ":"ゴ","ザ":"ザ","ジ":"ジ","ズ":"ズ","ゼ":"ゼ","ゾ":"ゾ","ダ":"ダ","ヂ":"ヂ","ヅ":"ヅ","デ":"デ","ド":"ド","バ":"バ","ビ":"ビ","ブ":"ブ","ベ":"ベ","ボ":"ボ","ヾ":"ヾ","ぱ":"ぱ","ぴ":"ぴ","ぷ":"ぷ","ぺ":"ぺ","ぽ":"ぽ","パ":"パ","ピ":"ピ","プ":"プ","ペ":"ペ","ポ":"ポ","ゔ":"ゔ","ヴ":"ヴ","ヷ":"ヷ","ヸ":"ヸ","ヹ":"ヹ","ヺ":"ヺ"}; return _.replace(/([うウかきくけこさしすせそたちつてとはひふへほゝカキクケコサシスセソタチツテトハヒフヘホヽワヰヱヲ])([\u3099゛゙\u309A゜゚])/g,function(s,k,v){return map[k+map[v]]||s}) }]);
標準変換
マクロ「標準変換」を移植(一部改変)したものです。
全角英数・全角記号は半角に、半角カナは全角に変換します。
文字 変換前 文字 標準変換版 文字 テキスト整形版
全角左シングルクォート ` 半角グレーブアクセント ' 半角アポストロフィー/シングルクォート
全角グレーブアクセント ※変換しない ` 半角グレーブアクセント/バッククォート
f.push(["標準変換","s",function(_){ //2015-03-14
  return _.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(["表外漢字→代替","s",function(_){ //2017-06-25
  return _.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進数","s",function(_){ //2014-05-31
  return _.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進数","s",function(_){ //2017-06-25
  return _.replace(/(?:0x)?([0-9a-f]+)/gi,function(_,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進接頭辞換算","s",function(_){ //2015-03-14
  var k=1024,p="?KMGTPEZY"; return _.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 アドレスに使用されるパーセントエンコーディングの符号化/復号化を行います。
f.push(["URL %エンコード(UTF-8)","s",function(_){ //2014-02-01
  return encodeURI(_).replace(/%0D%0A|%0D|%0A/g,"\n") }]);
f.push(["URL %デコード(UTF-8)","s",function(_){ //2014-02-01
  return decodeURIComponent(_) }]);
Base64エンコード/デコード(UTF-8)
Base64 形式の符号化/復号化を行います。
※バイナリデータ(画像や音声など)の復号化は、[編集]→[選択範囲の変換]→[Base64デコード] をご利用ください。
注意事項
  • 改行は LF (0x0A) としてエンコードされます。
  • A~Z a~z 0~9 + / 以外の文字(改行含む)は除去してからデコードされます。
f.push(["Base64エンコード(UTF-8)","s",function(_){ //2019-12-21
  var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), bin=unescape(encodeURIComponent(_)), n=bin.length, asc="", x; for(var i=0;i<n;){x=(bin.charCodeAt(i++)<<16)|(bin.charCodeAt(i++)<<8)|(bin.charCodeAt(i++)); asc+=A[x>>>18&0x3F]+A[x>>>12&0x3F]+A[x>>>6&0x3F]+A[x&0x3F]} if(n%3)asc=asc.slice(0,n%3-3)+"===".slice(n%3); return asc }]);
f.push(["Base64デコード(UTF-8)","s",function(_){ //2019-12-21
  var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", B={}; for(var i=0;i<A.length;i++){B[A.charAt(i)]=i} var asc=_.replace(/[^A-Za-z0-9+/]/g,"").split(""), n=asc.length, bin="", x; for(var i=0;i<n;){x=(B[asc[i++]]<<18)|(B[asc[i++]]<<12)|(B[asc[i++]]<<6)|(B[asc[i++]]); bin+=String.fromCharCode(x>>>16&0xFF,x>>>8&0xFF,x&0xFF)} bin=bin.replace(/(?:[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}|.){1,50}/g,function(bin){return decodeURIComponent(escape(bin))}); if(n%4)bin=bin.slice(0,n%4-4); return bin }]);
\uHHHH エンコード/デコード
JavaScript などで使用される \uHHHH 形式の変換を行います。※HHHH=4桁の16進数
例> Aわ𩸽 ←→ \u0041\u308F\uD867\uDE3D
f.push(["\\uHHHH エンコード","s",function(_){ //2017-06-25
  return _.replace(/[^\n]/g,function(s){return "\\u"+("000"+s.charCodeAt(0).toString(16).toUpperCase()).slice(-4)}) }]);
f.push(["\\uHHHH デコード","s",function(_){ //2014-10-12
  return _.replace(/\\u([0-9A-Fa-f]{4})/g,function(_,n){return String.fromCharCode(Number("0x"+n))}) }]);
\u4H \U8H エンコード/デコード
Unicode で使用される \u4H および \U8H 形式の変換を行います。※4H, 8H=4桁, 8桁の16進数
例> Aわ𩸽 ←→ \u0041\u308F\U00029E3D
f.push(["\\u4H \\U8H エンコード","s",function(_){ //2017-06-25
  return _.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 デコード","s",function(_){ //2015-09-30
  return _.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進数
例> Aわ𩸽 ←→ \x{41}\x{308f}\x{29e3d}
f.push(["\\x{hex} エンコード","s",function(_){ //2017-06-25
  return _.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} デコード","s",function(_){ //2015-03-14
  return _.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進数
例> Aわ𩸽 ←→ &#65;&#12431;&#171581;
f.push(["&&#dec; エンコード","s",function(_){ //2017-06-25
  return _.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; デコード","s",function(_){ //2015-03-14
  return _.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進数
例> Aわ𩸽 ←→ &#x41;&#x308F;&#x29E3D;
f.push(["&&#xHEX; エンコード","s",function(_){ //2017-06-25
  return _.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; デコード","s",function(_){ //2017-06-25
  return _.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){ //2019-06-01
f.push(["コマンド","",function(_,$){
  $.StartOfLine(); return ['f.push(["コマンド","",function(_,$){\n  ' , ' }]);\n'] }]);
f.push(["コマンド s (選択必須)","",function(_,$){
  $.StartOfLine(); return ['f.push(["コマンド","s",function(_,$){\n  return _.replace(' , ') }]);\n'] }]);
f.push(["コマンド L (行選択)","",function(_,$){
  $.StartOfLine(); return ['f.push(["コマンド","L",function(_,$){\n  return _.replace(' , ') }]);\n'] }]);
f.push(["サブメニュー","L",function(_){
  return ['f.push(["' , 'メニュー' , '",function(f){\n'+ _ +'\n}]);'] }]);
f.push(["セパレーター","",function(_,$){
  $.StartOfLine(); return ['f.push(["--------"]);\n' , ''] }]);
}]);
replaceBatch 補助
replaceBatch メソッド用の配列作成を補助するコマンド群です。
※書式の解析精度は不完全です。検索/置換文字に " ' , / \ ] を含む配列は誤変換する恐れがあります。
※書式ミスは考慮していません。誤変換した場合は書式ミスの可能性も疑ってみてください。
交換 ["a","b"] → ["b","a"]
配列の検索文字列と置換文字列を入れ替えます。正規表現は検索側のみ使用可なので交換しません(例では ■,□ のペアが該当)。
例> ["●","○"],['▲','△'],[/■/g,"□"],["◆",'◇']["○","●"],['△','▲'],[/■/g,"□"],['◇',"◆"]
f.push(['交換 ["a","b"] → ["b","a"]',"s",function(_){ //2014-05-31
  return _.replace(/\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'),("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*')\]/g,"[$2,$1]") }]);
分割 ["a","b"] → "a" › "b"↵
結合 "a" › "b"↵ → ["a","b"]
配列と TSV 形式を変換します。
f.push(['分割 ["a","b"] → "a" \u203A "b"\u21B5',"L",function(_){ //2017-06-25
  return _.replace(/,?\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'|\/.*?\/[gim]*),("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*')\],?/g,"\n$1\t$2\n").replace(/\n\n/g,"\n") }]);
f.push(['結合 "a" \u203A "b"\u21B5 → ["a","b"]',"L",function(_){ //2015-03-14
  return _.replace(/\n?(((".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*)+)/g,function(s,r){return r.replace(/(".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*/g,"[$1,$2],").replace(/,$/,"")}) }]);

拡張コード:書式[編集]

コマンド[編集]

f.push(["コマンド名","オプション",function(引数){ 処理 }]);
オプション
s 実行に範囲選択を要求 (require selection)
c 実行にクリップボードを要求 (require clipboard)
L 行選択してから処理 (select Line)
O 非選択時はすべて選択してから処理 (select OR all)
※実験的機能(変更・廃止の可能性あり)
複数指定する場合、空白で区切ります。順序は問いません。
※仕様上、0-9 A-Z a-z _ 以外の文字ならば区切りと判定されますが、空白を推奨します。
引数
第1引数に Document.Selection.Text が、
第2引数に Document.Selection が渡されます。
処理
String (文字列) か Array (配列) を return すると、選択範囲を置換してカーソルを移動します。それ以外 (undefined など) の場合は、選択範囲に対し何もしません。
なお、処理の途中で選択範囲が変化した場合、変化先で置換が行われます。
動作
"abcd" abcd に置換後、abcd を選択 = ["","abcd",""]
["ab","cd"] abcd に置換後、ab と cd の間に移動
["ab","cd",""] abcd に置換後、cd を選択

サブメニュー[編集]

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

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

セパレーター[編集]

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

※半角ハイフン - は何個でも含められますが、他の文字は含められません。

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

replaceBatch メソッド[編集]

replace を連鎖させる記法(メソッドチェーン)の省略記法です。

f.push(["例 replaceBatch","s",function(_){
  return _.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]);

上記の処理は、下記と同じ処理になります。

f.push(["例 replace","s",function(_){
  return _.replace(/ABC/g,"DEF").replace(/\(1\)/g,"①").replace(/GHI/gi,"JKL") }]);
スポンサーリンク