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

Masme (トーク | 投稿記録)
仕様変更予告。見出し一部変更。コマンド削除6個、改名3個。
Masme (トーク | 投稿記録)
仕様変更。コマンド追加10個・削除1個・変更17(+3)個・改名11個。
3行目: 3行目:
ks 氏作のマクロ「<b>[[テキスト変換]]</b>」の改造版です。
ks 氏作のマクロ「<b>[[テキスト変換]]</b>」の改造版です。


【主な改造点】
;主な改造点
* <b>[[#拡張コード:書式|拡張コードの書式]]</b>を変更した。
* <b>[[#拡張コード:書式|拡張コードの書式]]</b>を変更。
** 簡易書式をベースに単純化。オプション・第2引数は削除。
** 簡易書式をベースに単純化。view フラグは削除。
** 関数タイプ replace/replaceS はモード R/RS に改称。replaceL は廃止。
** 「関数タイプ」は「オプション」に変更。
* モード F (関数を実行) を追加。JScript や Mery の関数をそのまま実行することができます。
* 処理の戻り値により選択範囲を置換するか、再選択するかを制御できるようにした。
* モード RS で、範囲終端の改行=次行行頭は範囲に含めないようにした。(正規表現 <code>^ $</code> の使い勝手を考え)
* 行選択してから処理する際、範囲終端の改行は範囲に含めないようにした(正規表現 <code>^ $</code> の使い勝手を考え)。
* モード R/RS 実行後、処理した範囲を選択し直すようにした。(選択範囲の維持)
* メソッド <code><i>String</i>.replaceBatch</code> を追加。
* メソッド <code><i>String</i>.replaceBatch</code> (連続置換) を追加。
* 範囲選択時に対象範囲を選ぶメニューを廃止(毎回選ぶのが面倒なため)。
* 範囲選択時に対象範囲を選ぶメニューを廃止した。(毎回選ぶのが面倒なため)
;注意点
* 非選択時に文書全体を対象範囲とする仕様を廃止した。(挿入/貼付コマンドと相性が悪いため)
* <b style="color:#c00;">表示行での処理には対応していません。</b>
** 文書全体を対象にしたい場合は「すべて選択」 (Ctrl+A) してから実行してください。
* マクロの仕様上、<b style="color:#c00;">矩形選択での処理には原則対応していません。</b>
【注意点】
* <b style="color:#c00;">表示行での処理には対応していません。</b>※特記なき場合、<b>各行・行頭・行末</b> は <b>論理行</b> を意味しています。
* マクロの仕様上、<b style="color:#c00;">矩形選択での処理には対応していません。</b>


=お知らせ (2019/05/01)=
=お知らせ (2019/06/01)=
<b style="color:#c00;">下記の仕様変更を考えています。</b>
<b style="color:#c00;">仕様変更によりモードは廃止されました。</b><br>
* 処理の戻り値により選択範囲の置換・再選択を制御する仕組みを導入。
詳しくは [[#更新履歴]] または [[利用者:Masme]] のページをご覧ください。<br>
* マクロ「[[テキスト変換]]」の第2引数を復活。モード F は第2引数利用に変更。
旧仕様の利用者はお手数ですが基本コードおよび拡張コードの更新をお願いいたします。
* モードを廃止し、オプションに変更。モード RS はオプション L に変更。
** 非選択時/貼り付け不能時は項目がグレーになるオプション s/c を追加。
<b style="color:#c00;">詳しくは [[利用者:Masme]] のページをご覧ください。</b>


=スターターパック=
=スターターパック=
ダウンロード→ <b>[[メディア:テキスト整形.zip|テキスト整形.zip]]</b> (2018/01/15 更新)
ダウンロード→ <b>[[メディア:テキスト整形.zip|テキスト整形.zip]]</b> (2019/06/01)
 
* 基本コードと拡張コード(★印の項目)をまとめて、すぐ使えるようにした入門用セットです。→ <b>[[:ファイル:テキスト整形.zip|収録コマンド一覧]]</b>
* 基本コードと拡張コード(★印の項目)をまとめて、すぐ使えるようにした入門用セットです。→ <b>[[:ファイル:テキスト整形.zip|収録コマンド一覧]]</b>
* 拙作ですがアイコンファイル (テキスト整形.ico) を同梱してあります。<br>Mery 2.4.7 以降の場合、マクロ (テキスト整形.js) と同じフォルダに、<br>Mery 2.4.6 以前の場合、Mery.exe と同じフォルダに、<br>アイコンファイルを配置しておくとツールバーにアイコンが読み込まれます。
* 拙作ですがアイコンファイル (テキスト整形.ico) を同梱してあります。<br>Mery 2.4.7 以降の場合、マクロ (テキスト整形.js) と同じフォルダに、<br>Mery 2.4.6 以前の場合、Mery.exe と同じフォルダに、<br>アイコンファイルを配置しておくとツールバーにアイコンが読み込まれます。


=更新履歴=
=更新履歴=
<code style="background:#fe0;">//2018/01/15</code> でページ内検索すると、その日付で更新されたコマンドを検索できます。
<code style="background:#fe0;">//2019/06/01</code> でページ内検索すると、その日付で更新されたコマンドを検索できます。
<div style="height:40em; overflow:auto; border:1px dashed #999;">
<div style="height:40em; overflow:auto; border:1px dashed #999;">
* 2019/06/01
** <b style="color:#c00;">仕様変更 - 戻り値により選択範囲の置換・再選択を制御するようにした。</b>
** <b style="color:#c00;">仕様変更 - [[#コマンド|コマンドの書式]]を変更。</b>
*** マクロ「[[テキスト変換]]」の第2引数を復活。モード F は第2引数利用に変更。
*** モードを廃止し、オプションに変更。モード RS はオプション L に変更。
*** 実行に範囲選択/クリップボードを要求するコマンドにオプション s/c を設定。
** <b>仕様変更 - メニュー作成処理を変更。</b>falsy な要素があるとループ終了。
** <b>コード整理 - 第2引数追加に伴い、引数名を a → _ と $ に変更。</b>
** <b>コード整理 - 不使用の引数は極力省略するようにした。</b>
** 改名 - ★行頭/行末に貼り付け ¦ 行頭/行末から数文字削除
**: 「各行~」を除去。
** 改名 - ★行頭/行末に挿入
**: 「各行~」を除去。「文字列付加」→「挿入」に変更。
** 改名 - 各行先頭/末尾に挿入 ¦ 行頭に連番挿入 ¦ 行末に&lt;br&gt;を挿入 ¦ ★行頭 // を挿入/削除
**: 「(文字列)付加」→「挿入」に変更。
** 変更 - 複製貼り付け ¦ ★行頭/行末に挿入 ¦ 各行先頭/末尾に挿入 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除 ¦ 行頭/行末から数文字削除
**: 入力判定を中止条件 → 実行条件に変更。
**: 戻り値の仕様を利用し、中止時は Quit(); → 戻り値なし (undefined) に変更。
** 修正 - 複製貼り付け ¦ 行頭/行末から数文字削除
**: キャンセルまたは数字以外を入力した場合、正常に中止できていないのを修正(NaN<1 は false)。
** 変更 - ★数値参照を文字に変換
**: 正規表現を <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> に短縮。
** 変更 - 挿入 Confirm(|)
**: 戻り値の仕様を利用したものに変更。
** 変更 - Base64エンコード/デコード
**: 引数名を txt → _ に統一。変数名を変更。
** 追加 - ★このマクロを編集 ¦ 連番を出力 ¦ 文字数カウント(空白は除く) ¦ ステータスバーの表示をコピー ¦ 行を文字数順並べ ¦ 数行毎に/数行一組で逆順並べ ¦ 空行毎に/空行一組で逆順並べ ¦ 指定見出しで逆順並べ
** 変更 - 総字行数カウント
**: GetLines() → GetLines(meGetLineView) に変更(引数を明示)。
**: 符号点数&論理行数版を削除。
** 変更 - 拡張コード テンプレート
**: 仕様変更に伴う改訂。
**: サブメニューは、挿入後にメニュー名を選択するようにした。
* 2019/05/01
* 2019/05/01
** 削除 - 大文字/小文字に変換 ¦ 半角/全角に変換
** 削除 - 大文字/小文字に変換 ¦ 半角/全角に変換
47行目: 75行目:
** 追加 - CJK互換漢字を検索
** 追加 - CJK互換漢字を検索
** 修正 - Base64デコード
** 修正 - Base64デコード
**: 最大50字ずつ処理する箇所で、異常なデータ 0xF8~FF はスルーしていたのを改修。
**: 最大50字ずつ処理する箇所で、異常なデータ 0xF8~FF をスルーしていたのを改修。
** 修正 - 挿入 Confirm(|)
** 修正 - 挿入 Confirm(|)
**: 折り返しが発生した場合、カーソル位置がズレる不具合を修正(カーソル移動を CharLeft(false,移動量) → SetActivePos(GetActivePos()-移動量) に変更)。
**: 折り返しが発生した場合、カーソル位置がズレる不具合を修正(カーソル移動を CharLeft(false,移動量) → SetActivePos(GetActivePos()-移動量) に変更)。
** 変更 - ★重複行を単一化 ¦ 重複する/しない行を抽出
** 変更 - ★重複行を単一化 ¦ 重複する/しない行を抽出
**: for(var i=0,n=a.length;i<n;i++) → for(var i=0;i<a.length;i++) に単純化。
**: <code>for(var i=0,n=a.length;i<n;i++)</code> → <code>for(var i=0;i<a.length;i++)</code> に単純化。
* 2017/06/25
* 2017/06/25
** <b>仕様変更 - アイコンファイルに24x24・32x32・48x48の画像を追加。</b>
** <b>仕様変更 - アイコンファイルに24x24・32x32・48x48の画像を追加。</b>
** <b style="color:#c00;">仕様変更 - <samp>replaceBatch</samp> メソッドで配列先頭/末尾のコンマを許容するようにした。</b>
** <b style="color:#c00;">仕様変更 - <samp>replaceBatch</samp> メソッドで配列先頭/末尾のコンマを許容するようにした。</b>
**: 例> <code>a.replaceBatch([ <b style="background:#fcc;">,</b>[省略],[省略],[省略]<b style="background:#fcc;">,</b> ])</code>
**: 例> <code><i>String</i>.replaceBatch([ <b style="background:#fcc;">,</b>[省略],[省略],[省略]<b style="background:#fcc;">,</b> ])</code>
** コード整理 - 基本コードを改訂。
** コード整理 - 基本コードを改訂。
** 追加 - 行を昇順/降順並べ(Unicode) ¦ ★!?を半角/全角に整形 ¦ 空白行の空白を除去 ¦ 各行行頭/各行行末から数文字削除 ¦ 重複する/しない行を抽出 ¦ 表外漢字→代替
** 追加 - 行を昇順/降順並べ(Unicode) ¦ ★!?を半角/全角に整形 ¦ 空白行の空白を除去 ¦ 行頭/行末から数文字削除 ¦ 重複する/しない行を抽出 ¦ 表外漢字→代替
** 改名 - 行を昇順/降順並べ(UTF-16) ¦ 行を逆順並べ ¦ 文字を逆順並べ
** 改名 - 行を昇順/降順並べ(UTF-16) ¦ 行を逆順並べ ¦ 文字を逆順並べ
**: コマンド名「~の並べ替え(○順)」→「~を○順並べ」に変更。
**: 「~の並べ替え(○順)」→「~を○順並べ」に変更。
**: 「行を昇順/降順並べ(Unicode)」は (UTF-16) に訂正。
**: 従来の「行を昇順/降順並べ(Unicode)」は (UTF-16) に訂正。
** 改名 - ★重複行を単一化 ¦ ★連続する重複行を単一化
** 改名 - ★重複行を単一化 ¦ ★連続する重複行を単一化
**: コマンド名「~を削除」→「~を単一化」に変更。
**: 「~を削除」→「~を単一化」に変更。
** 修正 - ★重複行を単一化
** 修正 - ★重複行を単一化
**: 下記の7行を削除してしまう不具合を修正(重複の判定に Object.prototype.hasOwnProperty.call() を使用するようにした)。
**: 下記の7行を削除してしまう不具合を修正(重複の判定は Object.prototype.hasOwnProperty.call() で行うようにした)。
**: 「constructor」「hasOwnProperty」「isPrototypeOf」「propertyIsEnumerable」「toLocaleString」「toString」「valueOf」
**: 「constructor」「hasOwnProperty」「isPrototypeOf」「propertyIsEnumerable」「toLocaleString」「toString」「valueOf」
** 変更 - ★全角ダッシュ(――)に整形
** 変更 - ★全角ダッシュ(――)に整形
77行目: 105行目:
**: カーソル位置・スクロール位置を移動しないようにした。
**: カーソル位置・スクロール位置を移動しないようにした。
** 変更 - 選択文字列を検索 ¦ 選択文字列をすべて削除 ¦ <samp>replaceBatch</samp> メソッド
** 変更 - 選択文字列を検索 ¦ 選択文字列をすべて削除 ¦ <samp>replaceBatch</samp> メソッド
**: 特殊文字のエスケープ処理を /([$()*+.?[\\\]^{|}])/g,"\\$1" → /[$()*+.?\[\\\]^{|}]/g,"\\$&" に統一。
**: 特殊文字のエスケープ処理を <code>/([$()*+.?[\\\]^{|}])/g,"\\$1"</code> → <code>/[$()*+.?\[\\\]^{|}]/g,"\\$&"</code> に統一。
** 変更 - コマンド テンプレート(分割)
** 変更 - 拡張コード テンプレート(分割)
**: 配列先頭のコンマの仕様に対応(末尾は実質対応済)。
**: 配列先頭のコンマの仕様に対応(末尾は実質対応済)。
* 2017/05/28
* 2017/05/28
89行目: 117行目:
** <b style="color:#c00;">仕様変更 - アイコンの指定先を "My Macros\テキスト整形.ico" → "テキスト整形.ico" に変更。</b>
** <b style="color:#c00;">仕様変更 - アイコンの指定先を "My Macros\テキスト整形.ico" → "テキスト整形.ico" に変更。</b>
** 変更 - マクロフォルダを開く
** 変更 - マクロフォルダを開く
**: コマンド名「My Macros フォルダを開く」→「マクロフォルダを開く」に変更。
**: 「My Macros フォルダを開く」→「マクロフォルダを開く」に変更。
**: 「テキスト整形」マクロがあるフォルダを開くようにした(Mery 2.4.7 での Macros フォルダ改名に対処)。
**: 「テキスト整形」マクロがあるフォルダを開くようにした(Mery 2.4.7 での Macros フォルダ改名に対処)。
* 2015/09/30
* 2015/09/30
** 追加 - CP932依存文字を検索 ¦ サロゲートペアを検索 ¦ 行頭に連番付加 (#) ¦ 行頭に連番付加 (#/Σ) ¦ 行頭に連番付加 (0#) ¦ \u4H \U8H エンコード/デコード
** 追加 - CP932依存文字を検索 ¦ サロゲートペアを検索 ¦ 行頭に連番挿入 (#) ¦ 行頭に連番挿入 (#/Σ) ¦ 行頭に連番挿入 (0#) ¦ \u4H \U8H エンコード/デコード
** 修正 - ひらがなを単語検索 ¦ カタカナを単語検索
** 修正 - ひらがなを単語検索 ¦ カタカナを単語検索
**: 選択範囲が記号の前後で途切れる問題に対処(記号2連続まで対応)。
**: 選択範囲が記号の前後で途切れる問題に対処(記号2連続まで対応)。
102行目: 130行目:
**: 処理方法を split() → match() に変更。対応文字に結合文字 (U+1AB0~FF, 1DC0~FF, 20D0~FF, FE20~F)、制御文字 (U+200C~D)、絵文字の国旗 (U+1F1E6~FF)、肌色指定 (U+1F3FB~F) を追加。
**: 処理方法を 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; エンコード/デコード
** 改名 - \uHHHH, \x{hex}, &#dec;, &#xHEX; エンコード/デコード
**: コマンド名「Unicode 文字 → ○○」→「○○ エンコード」に変更。
**: 「Unicode 文字 → ○○」→「○○ エンコード」に変更。
**: コマンド名「Unicode ○○ → 文字」→「○○ デコード」に変更。
**: 「Unicode ○○ → 文字」→「○○ デコード」に変更。
* 2015/03/26
* 2015/03/26
** 変更 - CJK漢字を単語検索
** 変更 - CJK漢字を単語検索
**: 異体字セレクタを考慮するようにした(ただし組合せが適正かは考慮しえない)。
**: 異体字セレクタを考慮するようにした(ただし組合せが適正かは考慮しえない)。
** 変更 - 複製貼り付け
** 変更 - 複製貼り付け
**: 処理中止の条件を 非数字(NaN) or 1 未満 → クリップボードが空文字 or 1 未満 に変更。
**: 処理中止の条件を 非数字(NaN) or 1 未満 → クリップボードがカラ or 1 未満 に変更。
* 2015/03/14
* 2015/03/14
** <b style="color:#c00;">仕様変更 - モード R/RS 実行後、処理した範囲を選択し直すようにした。</b>
** <b style="color:#c00;">仕様変更 - モード R/RS 実行後、処理した範囲を選択し直すようにした。</b>
** <b style="color:#c00;">仕様変更 - モード RM を廃止した。</b>既存コマンドはモード RS で作り直した。
** <b style="color:#c00;">仕様変更 - モード RM を廃止。</b>既存コマンドはモード RS に移行。
**: ★行頭 // を付加/削除 ¦ ★インデント(半角空白2個) ¦ ★空白行を削除 ¦ ★各行行頭/各行行末に貼り付け ¦ ★各行行頭/各行行末に文字列付加 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
**: ★行頭 // を挿入/削除 ¦ ★インデント(半角空白2個) ¦ ★空白行を削除 ¦ ★行頭/行末に貼り付け ¦ ★行頭/行末に挿入 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
** <b style="color:#c00;">仕様変更 - モード CR を廃止し、<code><i>String</i>.replaceBatch</code> メソッドを追加した。</b>既存コマンドは <samp>replaceBatch</samp> メソッドで作り直した。
** <b style="color:#c00;">仕様変更 - モード CR を廃止し、<code><i>String</i>.replaceBatch</code> メソッドを追加。</b>既存コマンドは <samp>replaceBatch</samp> メソッド利用に移行。
**: ★連続する!?を整形 ¦ ★実体参照 &"<> → &xxx; ¦ ★実体参照 &xxx; → ␣><"& ¦ ★半角カナ→全角 ¦ ★全角カナ→半角 ¦ 標準変換
**: ★連続する!?を整形 ¦ ★実体参照 &"<> → &xxx; ¦ ★実体参照 &xxx; → ␣><"& ¦ ★半角カナ→全角 ¦ ★全角カナ→半角 ¦ 標準変換
** <b>コード整理 - コマンド各々に更新年月日を付けるようにした。</b>
** <b>コード整理 - コマンド各々に更新年月日を付けるようにした。</b>
122行目: 150行目:
**: パスが存在しない場合の名前を、無題 → <無題> に変更。
**: パスが存在しない場合の名前を、無題 → <無題> に変更。
** 変更 - ★数値参照を文字に変換 ¦ \x{hex}, &#dec;, &#xHEX; デコード
** 変更 - ★数値参照を文字に変換 ¦ \x{hex}, &#dec;, &#xHEX; デコード
**: サロゲートペアの計算を + → | に変更し、不必要な括弧を除去した(演算子の優先順が + - → >> → & → | である事による)。
**: サロゲートペアの計算を + → | に変更し、不要な括弧を除去(演算子の優先順が + - → >> → & → | である事による)。
** 変更 - Base64エンコード/デコード
** 変更 - Base64エンコード/デコード
**: 不必要な括弧を除去した(同上、演算子の優先順による)。
**: 不要な括弧を除去(同上、演算子の優先順による)。
** 変更 - コマンド テンプレート
** 変更 - 拡張コード テンプレート
**: モード RM/CR 廃止に伴う改訂。コマンドおよびセパレータは、表示行頭に挿入するようにした。
**: 仕様変更に伴う改訂。
**: コマンドおよびセパレーターは、表示行頭に挿入するようにした。
* 2015/02/14
* 2015/02/14
** <b style="color:#c00;">仕様修正 - モード RS/RM で、矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。</b>
** <b style="color:#c00;">仕様修正 - モード RS/RM で、矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。</b>
** <b>コード整理 - 文字入力など追加操作を求めるコマンドは、名称末尾に目印 ... を付けた。</b>
** <b>コード整理 - 文字入力など追加操作を求めるコマンドは、名称末尾に目印 ... を付けた。</b>
**: 複製貼り付け ¦ ★各行行頭/各行行末に文字列付加 ¦ 各行先頭/各行末尾に文字列付加 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
**: 複製貼り付け ¦ ★行頭/行末に挿入 ¦ 各行先頭/末尾に挿入 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除
** 削除 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳
** 削除 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳
** 追加 - 行末に&lt;br&gt;を付加 ¦ &lt;br&gt;を改行に変換 ¦ ★行頭の/行末の空白を除去 ¦ 空白行を減量 ¦ 重複行を単一化(空白行は除く) ¦ ★連続する重複行を単一化 ¦ 文字のシャッフル
** 追加 - 行末に&lt;br&gt;を挿入 ¦ &lt;br&gt;を改行に変換 ¦ ★行頭の/行末の空白を除去 ¦ 空白行を減量 ¦ 重複行を単一化(空白行は除く) ¦ ★連続する重複行を単一化 ¦ 文字のシャッフル
** 修正 - 各行先頭/各行末尾に文字列付加
** 修正 - 各行先頭/末尾に挿入
**: 正規表現が意味的に不適切だったのを修正。
**: 正規表現が意味的に不適切だったのを修正。
** 変更 - 空白行を圧縮
** 変更 - 空白行を圧縮
140行目: 169行目:
**: サロゲートペアの対処方法を変更。結合文字の一部 (U+0300~6F, 3099~A) および異体字セレクタに対応した。
**: サロゲートペアの対処方法を変更。結合文字の一部 (U+0300~6F, 3099~A) および異体字セレクタに対応した。
** 変更 - 2進接頭辞換算
** 変更 - 2進接頭辞換算
**: 正規表現を [0-9]+(,?[0-9]{3})+(\.[0-9]+)? → [0-9]+(,?[0-9]{3})+ に変更(小数は非対応とした)。
**: 正規表現を <code>[0-9]+(,?[0-9]{3})+(\.[0-9]+)?</code> → <code>[0-9]+(,?[0-9]{3})+</code> に変更(小数は非対応とした)。
** 変更 - Base64デコード
** 変更 - Base64デコード
**: JScript 5.x の decodeURIComponent() は字数が多すぎると能率が悪くなるようなので、最大50字ずつ処理するようにした(高速化)。
**: JScript 5.x の decodeURIComponent() は字数が多すぎると能率が悪くなるようなので、最大50字ずつ処理するようにした(高速化)。
169行目: 198行目:
** 変更 - ★数値を3桁,区切りに ¦ 丸数字 (20) → ⑳ ¦ ★10→16進数 ¦ 2進接頭辞換算
** 変更 - ★数値を3桁,区切りに ¦ 丸数字 (20) → ⑳ ¦ ★10→16進数 ¦ 2進接頭辞換算
**: 正規表現を \d → [0-9] に統一。
**: 正規表現を \d → [0-9] に統一。
** 修正 - コマンド テンプレート(モード CR 交換/分割)
** 修正 - 拡張コード テンプレート(モード CR 交換/分割)
**: エスケープ文字 \ をより正確に判定できる正規表現に改修。
**: エスケープ文字 \ をより正確に判定できる正規表現に改修。
* 2014/05/24
* 2014/05/24
** 修正 - 各行末尾に文字列付加
** 修正 - 各行末尾に挿入
**: 選択範囲の次行先頭にも文字列付加してしまう問題に対処。
**: 選択範囲の次行先頭にも挿入してしまう問題に対処。
** 変更 - 複製貼り付け
** 変更 - 複製貼り付け
**: クリップボードの内容を変数に格納しておくように変更(高速化)。
**: クリップボードの内容を変数に格納しておくように変更(高速化)。
** 変更 - 複製貼り付け ¦ 各行先頭/各行末尾に文字列付加
** 変更 - 複製貼り付け ¦ 各行先頭/末尾に挿入
**: Prompt() 関連の処理を単純にした(モード RM 以外では冗長だった)。
**: Prompt() 関連の処理を単純化(モード RM 以外では冗長だった)。
* 2014/05/22
* 2014/05/22
** 追加 - 2進接頭辞換算
** 追加 - 2進接頭辞換算
205行目: 234行目:
** 変更 - 文字を逆順並べ ¦ \uHHHH, \x{hex} エンコード
** 変更 - 文字を逆順並べ ¦ \uHHHH, \x{hex} エンコード
**: 処理方法を for ループ → replace() に変更(字数削減)。
**: 処理方法を for ループ → replace() に変更(字数削減)。
** 変更 - コマンド テンプレート
** 変更 - 拡張コード テンプレート
**: モード CR 作成補助コマンドを追加。モード CR テンプレートを変更。
**: モード CR 作成補助コマンドを追加。モード CR テンプレートを変更。
* 2014/02/17
* 2014/02/17
** 修正 - ★各行行頭/各行行末に貼り付け
** 修正 - ★行頭/行末に貼り付け
**: クリップボード終端の改行文字を除去する正規表現を修正。\r\n|\r|\n$ → (\r\n|\r|\n)$
**: クリップボード終端の改行文字を除去する正規表現を修正。\r\n|\r|\n$ → (\r\n|\r|\n)$
* 2014/02/16
* 2014/02/16
** <b style="color:#c00;">仕様修正 - モード CR で、正規表現の特殊文字があると誤動作する不具合を修正。</b>
** <b style="color:#c00;">仕様修正 - モード CR で、正規表現の特殊文字があると誤動作する不具合を修正。</b>
** <b style="color:#c00;">仕様変更 - モード CR で、正規表現 (JScript) による検索置換に対応した。</b>
** <b style="color:#c00;">仕様変更 - モード CR で、正規表現 (JScript) による検索置換に対応。</b>
** コード整理 - コメントアウトしていた基本コードを削除した。→ 2014/01/08 スクロール位置
** コード整理 - コメントアウトしていた基本コードを削除。
** コード整理 - 下記の6カテゴリを3カテゴリに統合。コマンドの名称や配置を見直した。
** コード整理 - 下記の6カテゴリを3カテゴリに統合。コマンドの名称や配置を見直した。
**: (空白の追加 + 各行に追加) (空白の削除 + 行の削除) (数値の変換 + 文字種変換)
**: (空白の追加 + 各行に追加) (空白の削除 + 行の削除) (数値の変換 + 文字種変換)
** スターター除外 - ☆標準変換
** スターター除外 - ☆標準変換
** 追加 - 複製貼り付け ¦ 文字を逆順並べ ¦ ★半角カナ→全角 ¦ ★全角カナ→半角
** 追加 - 複製貼り付け ¦ 文字を逆順並べ ¦ ★半角カナ→全角 ¦ ★全角カナ→半角
** 変更 - ★各行行頭/各行行末に貼り付け
** 変更 - ★行頭/行末に貼り付け
**: クリップボード終端の改行文字は除去するようにした(行切り取り・行コピーとの相性を考え)。
**: クリップボード終端の改行文字は除去するようにした(行切り取り・行コピーとの相性を考え)。
** 変更 - コマンド テンプレート
** 変更 - 拡張コード テンプレート
**: モード CR テンプレートを刷新。
**: モード CR テンプレートを刷新。
* 2014/02/10
* 2014/02/10
234行目: 263行目:
** 追加 - ★半角/全角の間を空ける ¦ ★半角英数/全角の間を空ける
** 追加 - ★半角/全角の間を空ける ¦ ★半角英数/全角の間を空ける
** 変更 - ★全角カナ→かな
** 変更 - ★全角カナ→かな
**: ヴヵヶ → ゔゕゖ の変換を行わないようにした(Shift_JIS では保存できない文字のため)。
**: ヴヵヶ は対象外とした(Shift_JIS では保存できない文字のため)。
* 2014/01/12
* 2014/01/12
** <b>仕様変更 - スターターパックにアイコンファイルを同梱し、読み込むようにした。</b>
** <b>仕様変更 - スターターパックにアイコンファイルを同梱。</b>
** 修正 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー
** 修正 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー
**: 改行を LF → CR+LF に変更し、メモ帳でも正しく改行されるようにした。
**: 改行を LF → CR+LF に変更し、メモ帳でも正しく改行されるようにした。
259行目: 288行目:
<source lang="javascript" style="height:35em; overflow:auto;">
<source lang="javascript" style="height:35em; overflow:auto;">
//■テキスト整形
//■テキスト整形
// 2013/09/15-2017/06/25
// 2013/09/15-2019/06/01


//■拡張コード:コマンド一覧
//■拡張コード:リスト
var f = [];
var f = [];
// ----------------- ↓ここより下に拡張コードを追加
// ----------------- ↓ここより下に拡張コードを追加
268行目: 297行目:
/*■拡張コード:書式
/*■拡張コード:書式
//▼コマンド
//▼コマンド
f.push(["コマンド名","モード",function(引数){マクロ}]);
f.push(["コマンド名","オプション",function(引数){ 処理 }]);
//▽モード F (Function)     - 関数を実行
//▽オプション
   function( Document.Selection ) : 戻値なし
  s : 実行に範囲選択を要求 (require selection)
//▽モード R (Replace)     - 選択範囲を置換
   c : 実行にクリップボードを要求 (require clipboard)
//▽モード RS (Select-line) - 選択範囲を行頭行末まで拡張して置換
  L : 行選択してから処理 (select Line)
   function( Document.Selection.Text ) : String
  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(["メニュー名",function(f){ コマンドなど }]);
//▼セパレータ
//▼セパレーター
f.push(["----"]);
f.push(["--------"]);
// ----------------- */
// ----------------- */


//■メソッド:連続置換
//■メソッド:連続置換
//"string".replaceBatch([ [検索1,置換1],[検索2,置換2],[検索3,置換3],… ]);
//"string".replaceBatch([ [検索1,置換1],[検索2,置換2],… ]);
String.prototype.replaceBatch = function(a) { //▲引数の型はチェックしてない
String.prototype.replaceBatch = function(a){ //▲引数の型はチェックしてない
   var $this = this, i = 0, n = a.length;
   var _this=this, i=0, n=a.length;
   if (!a[0]) i++;
   if (!a[0]) i++;
   if (!a[n-1]) n--;
   if (!a[n-1]) n--;
289行目: 326行目:
     if (typeof a[i][0]==="string") //◆特殊文字をエスケープし、"g"フラグを付加
     if (typeof a[i][0]==="string") //◆特殊文字をエスケープし、"g"フラグを付加
       a[i][0] = new RegExp(a[i][0].replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"),"g");
       a[i][0] = new RegExp(a[i][0].replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"),"g");
     $this = $this.replace(a[i][0],a[i][1]);
     _this = _this.replace(a[i][0],a[i][1]);
   }
   }
   return $this;
   return _this;
};
};


297行目: 334行目:
//■実行コード
//■実行コード
var Sel = Document.Selection;
var Sel = Document.Selection;
var cmd = [], cid = 1; //コマンド, ID
var isSelEmpty = Sel.IsEmpty;
//コマンド一覧からメニュー作成
var isClipEmpty = !ClipboardData.GetData();
var cmd = [], cid = 0; //コマンド, ID
//リストからメニュー作成
var Menu = CreatePopupMenu();
var Menu = CreatePopupMenu();
(function ListToMenu(List, Menu) {
(function ListToMenu(List, Menu) {
   for (var i=0,n=List.length; i<n; i++) {
   for (var i=0,_L; _L=List[i]; i++) {
    var $L = List[i], $Ln = $L.length;
     if (typeOf(_L[0]) !== "String") continue;
     if (typeof $L[0]!=="string") continue;
     switch (_L.length) {
     switch (true) {
     case 3: //◆コマンド     _L = ["コマンド名","オプション",function]
     //◆コマンド $L = ["コマンド名","モード",function]
      if (typeOf(_L[1]) !== "String") break;
    case ($Ln===3 && /^(F|RS?)$/.test($L[1]) && typeof $L[2]==="function"):
      if (typeOf(_L[2]) !== "Function") break;
       cmd[cid] = {mode:$L[1], func:$L[2]};
      ++cid;
       Menu.Add($L[0]+"\t"+$L[1], cid++);
      var isGray = (/\bs\b/.test(_L[1]) && isSelEmpty)
      break;
                || (/\bc\b/.test(_L[1]) && isClipEmpty) ;
     //◆サブメニュー $L = ["メニュー名",function]
      Menu.Add(_L[0]+"\t"+_L[1], cid, isGray? meMenuGrayed: 0);
    case ($Ln===2 && typeof $L[1]==="function"):
      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();
       var sub_f = [], sub_Menu = CreatePopupMenu();
       $L[1](sub_f);
       _L[1](sub_f);
       Menu.AddPopup($L[0], sub_Menu);
       Menu.AddPopup(_L[0], sub_Menu);
       ListToMenu(sub_f, sub_Menu); //再帰処理:サブメニュー作成
       ListToMenu(sub_f, sub_Menu); //再帰:サブメニュー作成
      break;
    break;
     //◆セパレータ $L = ["----"]
     case 1: //◆セパレーター  _L = ["--------"]
    case ($Ln===1 && /^-+$/.test($L[0])):
      if (!/^-+$/.test(_L[0])) break;
       Menu.Add("", 0, meMenuSeparator);
       Menu.Add("", 0, meMenuSeparator);
      break;
    break;
     }
     }
   }
   }
}(f, Menu));
}(f, Menu));
//ポップアップメニューを表示して処理
//ポップアップメニューを表示して処理
if (cid = Menu.Track(mePosMouse)) { //※キャンセル(Esc)時は0が返る
main: if (cid = Menu.Track(mePosMouse)) { //※キャンセル(Esc)時は 0 で終了
   switch (cmd[cid].mode) {
   var invertPos = Sel.GetActivePos() < Sel.GetAnchorPos();
   case "F": //関数を実行
  if (cmd[cid].selLine) selectLine(Sel);
    cmd[cid].func(Sel);
   if (cmd[cid].selOrAll && isSelEmpty) Sel.SelectAll();
    break;
  var res = cmd[cid].func(Sel.Text, Sel);
   case "RS": //選択範囲を行頭行末まで拡張
  if (typeOf(res) === "String") res = ["",res,""];
    selectLine(Sel);
   if (typeOf(res) !== "Array") break main;
    //↓FALL THROUGH
 
   case "R": //選択範囲を置換
   var head = res.shift(), tail = res.pop() || "", body = res.join("");
    var pos = new Pos(Sel);
  Sel.Text = head + body + tail;
    Sel.Text = cmd[cid].func(Sel.Text);
  var acp = Sel.GetActivePos() - tail.replace(/\r\n/g,"\n").length;
    pos.restore();
  var anp = acp                - body.replace(/\r\n/g,"\n").length;
     break;
     //※クリップボードなどCR+LFが含まれる場合、1字と数えなければズレる
   }
  Sel.SetActivePos(invertPos? anp: acp);
   Sel.SetAnchorPos(invertPos? acp: anp);
}
}


//■選択範囲を行頭行末まで拡張
//■型判別
function selectLine(Sel, includeBreak) {
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 ty = Sel.GetTopPointY(mePosLogical);
   var by = Sel.GetBottomPointY(mePosLogical);
   var by = Sel.GetBottomPointY(mePosLogical);
   var bx = Sel.GetBottomPointX(mePosLogical);
   var bx = Sel.GetBottomPointX(mePosLogical);
   var nn =(Sel.Text.match(/\n/g)||[]).length;
   var nn =(Sel.Text.match(/\n/g)||[]).length;
   if (bx===1 && nn<=by-ty && nn) by--; //下端行頭を含めない
   if (bx===1 && nn<=by-ty && nn) by--; //末尾改行対策
    //下端が論理行頭 && 矩形選択でない && 複数行
   Sel.SetActivePoint(mePosLogical, 1, by);
   Sel.SetActivePoint(mePosLogical, 1, by);
   Sel.EndOfLine(false, mePosLogical);
   Sel.EndOfLine(false, mePosLogical);
   Sel.SetAnchorPoint(mePosLogical, 1, ty);
   Sel.SetAnchorPoint(mePosLogical, 1, ty);
  if (includeBreak) Sel.CharRight(true); //末尾改行を含める
};
//■位置情報オブジェクト
function Pos(Sel) {
  this.acp = Sel.GetActivePos();
  this.anp = Sel.GetAnchorPos();
  this.len = Document.Text.length;
  this.restore = function(isCollapse) {
    var isRev = this.acp<this.anp, gap = Document.Text.length - this.len;
    Sel.SetAnchorPos(this.anp+(isRev? gap : 0));
    Sel.SetActivePos(this.acp+(isRev? 0 : gap), !isCollapse);
  };
};
};


369行目: 410行目:


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


==小説/作文==
==小説/作文==


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


;★括弧前の句読点を除去
;★括弧前の句読点を除去
:閉じ括弧類 <code style="color:#c00;">’ ” ) 〕 ] } 〉 》 」 』 】</code> の直前に句読点 <code style="color:#c00;">、 。 , .</code> がある場合、除去します。
:閉じ括弧類 <code>’ ” ) 〕 ] } 〉 》 」 』 】</code> の直前に句読点 <code>、 。 , .</code> がある場合、除去します。
<pre>
<pre>
f.push(["括弧前の句読点を除去","R",function(a){ //2014/03/01
f.push(["括弧前の句読点を除去","s",function(_){ //2014/03/01
   return a.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]);
   return _.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]);
</pre>
</pre>


;★!?を半角/全角に整形
;★!?を半角/全角に整形
:感嘆符・疑問符 <code style="color:#c00;">! ?</code> を、直前の文字が半角なら半角に、全角なら全角に整形します。
:感嘆符・疑問符を、直前の文字が半角なら半角に、全角なら全角に整形します。
:直前の文字がない場合(範囲先頭や行頭)は整形しません。
:直前の文字がない場合(範囲先頭か行頭)は何もしません。
:※<b style="color:#c00;">半角文字</b>=半角空白+ASCII文字+半角カナ、<b style="color:#c00;">全角文字</b>=それ以外の文字、を意味しています。
:※<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>が直前の文字)
:例> <span style="background:#bfdfff;">Wha<b style="color:#c00;">t</b>!?/あ<b style="color:#c00;">れ</b>!?</span> → What!?/あれ!?(※<b style="color:#c00;">赤字</b>が直前の文字)
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["!?を半角/全角に整形","R",function(a){ //2017/06/25
f.push(["!?を半角/全角に整形","s",function(_){ //2017/06/25
   return a.replace(/[!?!?]+/g,function(s,i,c){c=c.charAt(i-1); return (!c||c==="\n")? s: /[ -~。-゚]/.test(c)? s.replace(/!/g,"!").replace(/?/g,"?"): s.replace(/\!/g,"!").replace(/\?/g,"?")}) }]);
   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,"?")}) }]);
</pre>
</pre>


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


429行目: 470行目:
|}
|}
<pre>
<pre>
f.push(["三点リーダー(……)に整形","R",function(a){ //2014/03/01
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,"……") }]);
</pre>
</pre>


449行目: 490行目:
|}
|}
<pre>
<pre>
f.push(["全角ダッシュ(――)に整形","R",function(a){ //2017/06/25
f.push(["全角ダッシュ(――)に整形","s",function(_){ //2017/06/25
   return a.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}/g,"――") }]);
   return _.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}/g,"――") }]);
</pre>
</pre>


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


;青空文庫 注記を除去
;青空文庫 注記を除去
:<code style="color:#c00;">[#</code> で始まり <code style="color:#c00;">]</code> で終わる箇所を除去します。
:<code>[#</code> で始まり <code>]</code> で終わる箇所を除去します。
:例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※
:例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※
<pre>
<pre>
f.push(["青空文庫 注記を除去","R",function(a){ //2014/03/14
f.push(["青空文庫 注記を除去","s",function(_){ //2014/03/14
   return a.replace(/[#.*?]/g,"") }]);
   return _.replace(/[#.*?]/g,"") }]);
</pre>
</pre>
;青空文庫 注記(外字以外)を除去
;青空文庫 注記(外字以外)を除去
:外字を表す注記 <code style="color:#c00;">※[#~]</code> は例外とし、除去しません。
:外字を表す注記 <code>※[# ~ ]</code> は例外とし、除去しません。
:例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※[#二の字点、1-2-22]
:例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※[#二の字点、1-2-22]
<pre>
<pre>
f.push(["青空文庫 注記(外字以外)を除去","R",function(a){ //2014/03/14
f.push(["青空文庫 注記(外字以外)を除去","s",function(_){ //2014/03/14
   return a.replace(/(※[#.*?])|[#.*?]/g,"$1") }]);
   return _.replace(/(※[#.*?])|[#.*?]/g,"$1") }]);
</pre>
</pre>


480行目: 521行目:
;★HTMLタグを除去
;★HTMLタグを除去
<pre>
<pre>
f.push(["HTMLタグを除去","R",function(a){ //2015/09/30
f.push(["HTMLタグを除去","s",function(_){ //2015/09/30
   return a.replace(/<("[^"]*"|'[^']*'|[^"'>])*>/g,"") }]);
   return _.replace(/<("[^"]*"|'[^']*'|[^"'>])*>/g,"") }]);
</pre>
</pre>


;行末に&lt;br&gt;を付加
;行末に&lt;br&gt;を挿入
<pre>
<pre>
f.push(["行末に<br>を付加","RS",function(a){ //2015/02/14
f.push(["行末に<br>を挿入","L",function(_){ //2015/02/14
   return a.replace(/$/gm,"<br>") }]);
   return _.replace(/$/gm,"<br>") }]);
</pre>
</pre>
;&lt;br&gt;を改行に変換
;&lt;br&gt;を改行に変換
494行目: 535行目:
:<b style="color:#c00;">※属性付きには対応していません。</b>例> <code>&lt;br clear="all"&gt;</code> など
:<b style="color:#c00;">※属性付きには対応していません。</b>例> <code>&lt;br clear="all"&gt;</code> など
<pre>
<pre>
f.push(["<br>を改行に変換","R",function(a){ //2015/02/14
f.push(["<br>を改行に変換","s",function(_){ //2015/02/14
   return a.replace(/<br( ?\/)?>\n?/gi,"\n") }]);
   return _.replace(/<br( ?\/)?>\n?/gi,"\n") }]);
</pre>
</pre>


517行目: 558行目:
:空白文字 → &amp;nbsp; の変換は、実用上不都合が多いため行いません。
:空白文字 → &amp;nbsp; の変換は、実用上不都合が多いため行いません。
<pre>
<pre>
f.push(['実体参照 &&"<> → &&xxx;',"R",function(a){ //2015/03/14
f.push(['実体参照 &&"<> → &&xxx;',"s",function(_){ //2015/03/14
   return a.replaceBatch([ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"] ]) }]);
   return _.replaceBatch([ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"] ]) }]);
f.push(['実体参照 &&xxx; → \u2423><"&&',"R",function(a){ //2015/03/14
f.push(['実体参照 &&xxx; → \u2423><"&&',"s",function(_){ //2015/03/14
   return a.replaceBatch([ ["&nbsp;"," "],["&gt;",">"],["&lt;","<"],["&quot;",'"'],["&amp;","&"] ]) }]);
   return _.replaceBatch([ ["&nbsp;"," "],["&gt;",">"],["&lt;","<"],["&quot;",'"'],["&amp;","&"] ]) }]);
</pre>
</pre>
:半角空白 → &amp;nbsp; の変換も行う場合は、下記の内容に差し替えてください。
:半角空白 → &amp;nbsp; の変換も行う場合は、下記の内容に差し替えてください。
<pre>
<pre>
f.push(['実体参照 &&"<>\u2423 → &&xxx;',"R",function(a){ //2015/03/14
f.push(['実体参照 &&"<>\u2423 → &&xxx;',"s",function(_){ //2015/03/14
   return a.replaceBatch([ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"],[" ","&nbsp;"] ]) }]);
   return _.replaceBatch([ ["&","&amp;"],['"',"&quot;"],["<","&lt;"],[">","&gt;"],[" ","&nbsp;"] ]) }]);
</pre>
</pre>


542行目: 583行目:
:例> <span style="background:#bfdfff;">&amp;#65;&amp;#x308F;&amp;#x29e3d;</span> → Aわ𩸽
:例> <span style="background:#bfdfff;">&amp;#65;&amp;#x308F;&amp;#x29e3d;</span> → Aわ𩸽
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["数値参照を文字に変換","R",function(a){ //2017/06/25
f.push(["数値参照を文字に変換","s",function(_){ //2019/06/01
   return a.replace(/&#([0-9]{1,7});|&#[Xx]([0-9A-Fa-f]{1,6});/g,function(s,d,x){var n=Number(d||"0x"+x); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);
   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}) }]);
</pre>
</pre>


==マクロ/コード==
==マクロ/コード==


;★行頭 // を付加/削除
;★行頭 // を挿入/削除
:行頭に // が無い行なら // を付加し、有る行なら // を削除します。
:行頭に // が無い行なら // を挿入し、有る行なら // を削除します。
:※このコマンドをよく利用される場合は「<b>[[コメントマーク付け外し]]</b>」マクロの導入をオススメします。
:※このコマンドをよく利用される場合は「<b>[[コメントマーク付け外し]]</b>」マクロの導入をオススメします。
<pre>
<pre>
f.push(["行頭 \/\/ を付加/削除","RS",function(a){ //2015/03/14
f.push(["行頭 \/\/ を挿入/削除","L",function(_){ //2015/03/14
   return a.replace(/^(\/\/)?/gm,function(s){return s? "": "\/\/"}) }]);
   return _.replace(/^(\/\/)?/gm,function(s){return s? "": "\/\/"}) }]);
</pre>
</pre>


;挿入 Confirm(|)
;★このマクロを編集
:文字列 <code>if(!Confirm())Quit();</code> を挿入します。
:実行中のマクロ(テキスト整形)を Mery で開きます。
:<code>Alert()</code> と違い、[キャンセル] ボタンを押すとマクロを強制終了できるため、無限ループにハマっても対処できます。
:※マクロを実行後、[マクロ]→[編集] でファイルを開くのと同様です。
<pre>
<pre>
f.push(["挿入 Confirm(|)","F",function(a){ //2018/01/15
f.push(["このマクロを編集","",function(){ //2019/06/01
   var p="if(!Confirm(",s="))Quit();"; a.Text=p+a.Text+s; a.SetActivePos(a.GetActivePos()-s.length) }]);
   Editor.OpenFile(ScriptFullName, meEncodingNone, meOpenAllowNewWindow) }]);
</pre>
</pre>


;マクロフォルダを開く
;マクロフォルダを開く
:エクスプローラを起動し、「テキスト整形」マクロがあるフォルダを開きます。
:エクスプローラを起動し、実行中のマクロ(テキスト整形)があるフォルダを開きます。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["マクロフォルダを開く","F",function(a){ //2015/12/26
f.push(["マクロフォルダを開く","",function(){ //2015/12/26
   new ActiveXObject("Shell.Application").Explore(new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(ScriptFullName)) }]);
   new ActiveXObject("Shell.Application").Explore(new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(ScriptFullName)) }]);
</pre>
;挿入 Confirm(|)
:文字列 <code>if(!Confirm(</code> <code>))Quit();</code> を挿入します。
<pre>
f.push(["挿入 Confirm(|)","",function(_){ //2019/06/01
  return ["if(!Confirm(" , _ , "))Quit();"] }]);
</pre>
</pre>


;選択範囲を eval で評価
;選択範囲を eval で評価
:ステータスバーに eval(選択範囲) した結果を表示します。
:ステータスバーに eval(<i>選択範囲</i>) の結果を表示します。
:たとえば、選択範囲が <code style="background:#bfdfff;">10*(5+20)</code> なら、250 と表示されます。
:たとえば、選択範囲が <code style="background:#bfdfff;">10*(5+20)</code> なら、250 と表示されます。
<pre>
<pre>
f.push(["選択範囲を eval で評価","F",function(a){ //2014/02/01
f.push(["選択範囲を eval で評価","s",function(_){ //2019/06/01
   if(a.Text){Status=eval(a.Text)} }]);
   Status=eval(_) }]);
</pre>
</pre>


586行目: 634行目:
:※<b style="color:#c00;">半角文字</b>=ASCII文字+半角カナ、<b style="color:#c00;">全角文字</b>=それ以外の文字、を意味しています。
:※<b style="color:#c00;">半角文字</b>=ASCII文字+半角カナ、<b style="color:#c00;">全角文字</b>=それ以外の文字、を意味しています。
<pre>
<pre>
f.push(["半角/全角の間を空ける","R",function(a){ //2014/02/16
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){ //2014/02/16
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 ") }]);
</pre>
</pre>


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


603行目: 651行目:
:クリップボードの文字列を、入力した回数分複製してから貼り付けます。
:クリップボードの文字列を、入力した回数分複製してから貼り付けます。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["複製貼り付け...","R",function(a){ //2015/03/26
f.push(["複製貼り付け...","c",function(){ //2019/06/01
   var r=[],c=ClipboardData.GetData(),n=parseInt(Prompt("複製回数: ※半角数字","")); if(!c||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("") } }]);
</pre>
</pre>


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


;★各行行頭/各行行末に文字列付加...
;★行頭/行末に挿入...
:入力した文字列を、各行の行頭/行末に挿入します。
:入力した文字列を、各行の行頭/行末に挿入します。
<pre>
<pre>
f.push(["各行行頭に文字列付加...","RS",function(a){ //2015/03/14
f.push(["行頭に挿入...","L",function(_){ //2019/06/01
   var p=Prompt("各行行頭に付加する文字列:",""); if(!p)Quit(); return a.replace(/^/gm,p) }]);
   var p=Prompt("行頭に挿入する文字列:",""); if(p)return _.replace(/^/gm,p) }]);
f.push(["各行行末に文字列付加...","RS",function(a){ //2015/03/14
f.push(["行末に挿入...","L",function(_){ //2019/06/01
   var p=Prompt("各行行末に付加する文字列:",""); if(!p)Quit(); return a.replace(/$/gm,p) }]);
   var p=Prompt("行末に挿入する文字列:",""); if(p)return _.replace(/$/gm,p) }]);
</pre>
</pre>


;各行先頭/各行末尾に文字列付加...
;各行先頭/末尾に挿入...
:下記の条件で置換を行い、入力した文字列を各行の先頭/末尾に挿入します。
:下記の条件で置換を行い、入力した文字列を各行の先頭/末尾に挿入します。
:<b style="color:#c00;">※矩形対応には Mery 2.1.0 以降が必要です。</b>
:<b style="color:#c00;">※矩形対応には Mery 2.1.0 以降が必要です。</b>
643行目: 691行目:
|}
|}
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["各行先頭に文字列付加...","F",function(a){ //2015/02/14
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){ //2015/02/14
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) }]);
</pre>
</pre>


;行頭に連番付加 (#)
;行頭に連番挿入 (#)
:行頭に連番 (1), (2), (3) … を挿入します。
:行頭に連番 (1), (2), (3) … を挿入します。
<pre>
<pre>
f.push(["行頭に連番付加 (#)","RS",function(a){ //2015/09/30
f.push(["行頭に連番挿入 (#)","L",function(_){ //2015/09/30
   var re=/^/gm, n=1, pf="(", sf=")"; return a.replace(re,function(s){return pf+(n++)+sf}) }]);
   var re=/^/gm, n=1, pf="(", sf=")"; return _.replace(re,function(){return pf+(n++)+sf}) }]);
</pre>
</pre>
;行頭に連番付加 (#/Σ)
;行頭に連番挿入 (#/Σ)
:選択行数を Σ として、連番 (1/Σ), (2/Σ), (3/Σ) … を挿入します。
:選択行数を Σ として、連番 (1/Σ), (2/Σ), (3/Σ) … を挿入します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["行頭に連番付加 (#/Σ)","RS",function(a){ //2015/09/30
f.push(["行頭に連番挿入 (#/Σ)","L",function(_){ //2015/09/30
   var re=/^/gm, n=1, m=(a.match(re)||[]).length, pf="(", sf="/"+m+")"; return a.replace(re,function(s){return pf+(n++)+sf}) }]);
   var re=/^/gm, n=1, m=(_.match(re)||[]).length, pf="(", sf="/"+m+")"; return _.replace(re,function(){return pf+(n++)+sf}) }]);
</pre>
</pre>
;行頭に連番付加 (0#)
;行頭に連番挿入 (0#)
:連番が2桁以上になる場合、桁揃えした連番 (01), (02), (03) … を挿入します。
:連番が2桁以上になる場合、桁揃えした連番 (01), (02), (03) … を挿入します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["行頭に連番付加 (0#)","RS",function(a){ //2015/09/30
f.push(["行頭に連番挿入 (0#)","L",function(_){ //2015/09/30
   var re=/^/gm, n=1, m=(a.match(re)||[]).length, pf="(", sf=")", sp="0", k=String(m).length, sp=new Array(k).join(sp); return a.replace(re,function(s){return pf+(sp+(n++)).slice(-k)+sf}) }]);
   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}) }]);
</pre>
</pre>


;※行頭に連番付加系コマンドの比較
;※行頭に連番挿入系コマンドの比較
:{|class="wikitable"
:{|class="wikitable"
! 実行前 !! (#) !! (#/Σ) !! (0#)
! 例文 !! (#) !! (#/Σ) !! (0#)
|-
|-
| 1行目<br>2行目<br>…<br>9行目<br>10行目<br>11行目<br>…<br>99行目<br>100行目
| 1行目<br>2行目<br>…<br>9行目<br>10行目<br>11行目<br>…<br>99行目<br>100行目
677行目: 725行目:
| (001)1行目<br>(002)2行目<br>…<br>(009)9行目<br>(010)10行目<br>(011)11行目<br>…<br>(099)99行目<br>(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"| ゼロ始まりならゼロ埋め
| 最初のみ展開
|}
<pre>
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 }]);
</pre>


==除去/削除==
==除去/削除==
683行目: 759行目:
:空白文字(半角空白/全角空白/水平タブ)を除去します。
:空白文字(半角空白/全角空白/水平タブ)を除去します。
<pre>
<pre>
f.push(["空白文字を除去","R",function(a){ //2013/09/15
f.push(["空白文字を除去","s",function(_){ //2013/09/15
   return a.replace(/[  \t]+/g,"") }]);
   return _.replace(/[  \t]+/g,"") }]);
</pre>
</pre>
;★行頭行末の/行頭の/行末の空白を除去
;★行頭行末の/行頭の/行末の空白を除去
<pre>
<pre>
f.push(["行頭行末の空白を除去","RS",function(a){ //2013/09/15
f.push(["行頭行末の空白を除去","L",function(_){ //2013/09/15
   return a.replace(/^[  \t]+|[  \t]+$/gm,"") }]);
   return _.replace(/^[  \t]+|[  \t]+$/gm,"") }]);
f.push(["行頭の空白を除去","RS",function(a){ //2015/02/14
f.push(["行頭の空白を除去","L",function(_){ //2015/02/14
   return a.replace(/^[  \t]+/gm,"") }]);
   return _.replace(/^[  \t]+/gm,"") }]);
f.push(["行末の空白を除去","RS",function(a){ //2015/02/14
f.push(["行末の空白を除去","L",function(_){ //2015/02/14
   return a.replace(/[  \t]+$/gm,"") }]);
   return _.replace(/[  \t]+$/gm,"") }]);
</pre>
</pre>


699行目: 775行目:
:空白行を、改行のみの空行にします。
:空白行を、改行のみの空行にします。
<pre>
<pre>
f.push(["空白行の空白を除去","RS",function(a){ //2017/06/25
f.push(["空白行の空白を除去","L",function(_){ //2017/06/25
   return a.replace(/^[  \t]+$/gm,"") }]);
   return _.replace(/^[  \t]+$/gm,"") }]);
</pre>
</pre>


706行目: 782行目:
:空白行(半角空白/全角空白/水平タブ/改行のみの行)を削除します。
:空白行(半角空白/全角空白/水平タブ/改行のみの行)を削除します。
<pre>
<pre>
f.push(["空白行を削除","RS",function(a){ //2015/03/14
f.push(["空白行を削除","L",function(_){ //2015/03/14
   return a.replace(/^[  \t]*$\n?/gm,"") }]);
   return _.replace(/^[  \t]*$\n?/gm,"") }]);
</pre>
</pre>
;空白行を圧縮
;空白行を圧縮
:連続する空白行を1行の空行に変換します。連続しない(=1行の)空白行は削除します。
:連続する空白行を1行の空行に変換します。連続しない(=1行の)空白行は削除します。
<pre>
<pre>
f.push(["空白行を圧縮","RS",function(a){ //2015/02/14
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") }]);
</pre>
</pre>
;空白行を減量
;空白行を減量
719行目: 795行目:
:空白行の連続が3行なら2行に、2行なら1行に、1行なら0行(=削除)になります。
:空白行の連続が3行なら2行に、2行なら1行に、1行なら0行(=削除)になります。
<pre>
<pre>
f.push(["空白行を減量","RS",function(a){ //2015/02/14
f.push(["空白行を減量","L",function(_){ //2015/02/14
   return a.replace(/((?:^[  \t]*$\n?)*)(?:^[  \t]*$\n?)/gm,"$1") }]);
   return _.replace(/((?:^[  \t]*$\n?)*)(?:^[  \t]*$\n?)/gm,"$1") }]);
</pre>
</pre>


726行目: 802行目:
:同じ内容の行が2個以上ある場合、2個目以降を削除します。
:同じ内容の行が2個以上ある場合、2個目以降を削除します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["重複行を単一化","RS",function(a){ //2018/01/15
f.push(["重複行を単一化","L",function(_){ //2018/01/15
   var a=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") }]);
   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") }]);
</pre>
</pre>
;重複行を単一化(空白行は除く)
;重複行を単一化(空白行は除く)
:空白行(半角空白/全角空白/水平タブ/改行のみの行)は例外とし、削除しません。
:空白行(半角空白/全角空白/水平タブ/改行のみの行)は例外とし、削除しません。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["重複行を単一化(空白行は除く)","RS",function(a){ //2018/01/15
f.push(["重複行を単一化(空白行は除く)","L",function(_){ //2018/01/15
   var a=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") }]);
   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") }]);
</pre>
</pre>
;★連続する重複行を単一化
;★連続する重複行を単一化
<pre>
<pre>
f.push(["連続する重複行を単一化","RS",function(a){ //2015/02/14
f.push(["連続する重複行を単一化","L",function(_){ //2015/02/14
   return a.replace(/(^.*$)\n(^\1$\n?)+/gm,"$2") }]);
   return _.replace(/(^.*$)\n(^\1$\n?)+/gm,"$2") }]);
</pre>
</pre>


;重複する/しない行を抽出
;重複する/しない行を抽出
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["重複する行を抽出","RS",function(a){ //2018/01/15
f.push(["重複する行を抽出","L",function(_){ //2018/01/15
   var a=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") }]);
   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(["重複しない行を抽出","RS",function(a){ //2018/01/15
f.push(["重複しない行を抽出","L",function(_){ //2018/01/15
   var a=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") }]);
   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") }]);
</pre>
</pre>


;※空白行系/重複行系コマンドの比較 (☐ は空白/↵ は改行)
;※空白行系/重複行系コマンドの比較 (☐ は空白/↵ は改行)
:{|class="wikitable"
:{|class="wikitable"
! 元の文 !! 空白行<br>を削除 !! 空白行<br>を圧縮 !! 空白行<br>を減量
! 例文 !! 空白行<br>を削除 !! 空白行<br>を圧縮 !! 空白行<br>を減量
!rowspan="2" width="6px"|
!rowspan="2" width="6px"|
! 元の文 !! 重複行を<br>単一化 !! 空白行は<br>除く !! 連続する<br>重複行 !! 重複する<br>行を抽出 !! しない<br>行を抽出
! 例文 !! 重複行を<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行目
769行目: 845行目:
;★入力文字列を含む/含まない行を削除...
;★入力文字列を含む/含まない行を削除...
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["入力文字列を含む行を削除...","RS",function(a){ //2015/03/14
f.push(["入力文字列を含む行を削除...","L",function(_){ //2019/06/01
   var p=Prompt("以下の文字列を含む行を削除:",""); if(!p)Quit(); return a.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? "":s}) }]);
   var p=Prompt("以下の文字列を含む行を削除:",""); if(p)return _.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? "":s}) }]);
f.push(["入力文字列を含まない行を削除...","RS",function(a){ //2015/03/14
f.push(["入力文字列を含まない行を削除...","L",function(_){ //2019/06/01
   var p=Prompt("以下の文字列を含まない行を削除:",""); if(!p)Quit(); return a.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? s:""}) }]);
   var p=Prompt("以下の文字列を含まない行を削除:",""); if(p)return _.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? s:""}) }]);
</pre>
</pre>


;正規表現に一致する/しない行を削除...
;正規表現に一致する/しない行を削除...
:<b style="color:#c00;">※正規表現は JScript / JavaScript の仕様で記述します。</b>Mery の正規表現 (鬼車/鬼雲) と仕様が異なる点があるので注意してください。
:<b style="color:#c00;">※正規表現は JavaScript (JScript) の仕様で記述します。</b>
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["正規表現に一致する行を削除...","RS",function(a){ //2015/03/14
f.push(["正規表現に一致する行を削除...","L",function(_){ //2019/06/01
   var p=Prompt("以下の正規表現に一致する行を削除:",""); if(!p)Quit(); p=new RegExp(p); return a.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? "":s}) }]);
   var p=Prompt("以下の正規表現に一致する行を削除:",""); if(p){ p=new RegExp(p); return _.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? "":s}) } }]);
f.push(["正規表現に一致しない行を削除...","RS",function(a){ //2015/03/14
f.push(["正規表現に一致しない行を削除...","L",function(_){ //2019/06/01
   var p=Prompt("以下の正規表現に一致しない行を削除:",""); if(!p)Quit(); p=new RegExp(p); return a.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? s:""}) }]);
   var p=Prompt("以下の正規表現に一致しない行を削除:",""); if(p){ p=new RegExp(p); return _.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? s:""}) } }]);
</pre>
</pre>


;各行行頭/行末から数文字削除...
;行頭/行末から数文字削除...
:各行の行頭/行末から指定した文字数分を削除します。
:各行の行頭/行末から指定した文字数分を削除します。
:※サロゲートペアには対応していますが、結合文字列などには対応していません。
:※結合文字列には対応していません。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["各行行頭から数文字削除...","RS",function(a){ //2017/06/25
f.push(["行頭から数文字削除...","L",function(_){ //2019/06/01
   var n=parseInt(Prompt("各行行頭から削除する字数: ※半角数字","")); if(!n||n<1)Quit(); return a.replace(new RegExp("^(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}","gm"),"") }]);
   var n=parseInt(Prompt("行頭から削除する字数: ※半角数字","")); if(n>0)return _.replace(new RegExp("^(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}","gm"),"") }]);
f.push(["各行行末から数文字削除...","RS",function(a){ //2017/06/25
f.push(["行末から数文字削除...","L",function(_){ //2019/06/01
   var n=parseInt(Prompt("各行行末から削除する字数: ※半角数字","")); if(!n||n<1)Quit(); return a.replace(new RegExp("(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}$","gm"),"") }]);
   var n=parseInt(Prompt("行末から削除する字数: ※半角数字","")); if(n>0)return _.replace(new RegExp("(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\n]){0,"+n+"}$","gm"),"") }]);
</pre>
</pre>


799行目: 875行目:
:空白文字などを除く ASCII 印字可能文字 (U+0021~007E) が1文字以上連続する箇所を検索します。
:空白文字などを除く ASCII 印字可能文字 (U+0021~007E) が1文字以上連続する箇所を検索します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["ASCII文字を単語検索","F",function(a){ //2017/05/28
f.push(["ASCII文字を単語検索","",function(_,$){ //2017/05/28
   a.Find("(?<!\\g<Graph>)(?<Graph>[!-~])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.Find("(?<!\\g<Graph>)(?<Graph>[!-~])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</pre>
</pre>
;半角カナを単語検索
;半角カナを単語検索
:半角カナ類 (ヲ~ッ ア~ン 。 「 」 、 ・ ー ゙ ゚) が1文字以上連続する箇所を検索します。
:半角カナ類 (ヲ~ッ ア~ン 。 「 」 、 ・ ー ゙ ゚) が1文字以上連続する箇所を検索します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["半角カナを単語検索","F",function(a){ //2017/05/28
f.push(["半角カナを単語検索","",function(_,$){ //2017/05/28
   a.Find("(?<!\\g<HKana>)(?<HKana>[。-゚])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.Find("(?<!\\g<HKana>)(?<HKana>[。-゚])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</pre>
</pre>
;全角英数を単語検索
;全角英数を単語検索
:全角英数字 (0~9 A~Z a~z) が1文字以上連続する箇所を検索します。
:全角英数字 (0~9 A~Z a~z) が1文字以上連続する箇所を検索します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["全角英数を単語検索","F",function(a){ //2017/05/28
f.push(["全角英数を単語検索","",function(_,$){ //2017/05/28
   a.Find("(?<!\\g<FAlnm>)(?<FAlnm>[0-9A-Za-z])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.Find("(?<!\\g<FAlnm>)(?<FAlnm>[0-9A-Za-z])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</pre>
</pre>
;CJK漢字を単語検索
;CJK漢字を単語検索
:CJK (China/Japan/Korea) の漢字が1文字以上連続する箇所を検索します。
:CJK (China/Japan/Korea) の漢字が1文字以上連続する箇所を検索します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["CJK漢字を単語検索","F",function(a){ //2017/05/28
f.push(["CJK漢字を単語検索","",function(_,$){ //2017/05/28
   a.Find("(?<!\\g<Han>\\g<VS>|\\g<Han>)(?:(?<Han>[\\p{Han}])(?<VS>[\\x{FE00}-\\x{FE02}\\x{E0100}-\\x{E01EF}])?)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.Find("(?<!\\g<Han>\\g<VS>|\\g<Han>)(?:(?<Han>[\\p{Han}])(?<VS>[\\x{FE00}-\\x{FE02}\\x{E0100}-\\x{E01EF}])?)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</pre>
</pre>


860行目: 936行目:
|}
|}
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["ひらがなを単語検索","F",function(a){ //2017/05/28
f.push(["ひらがなを単語検索","",function(_,$){ //2017/05/28
   a.Find("(?<!\\g<Kana>\\g<Mark>\\g<Mark>|\\g<Kana>\\g<Mark>|\\g<Kana>)(?:(?<Kana>[ぁ-\\x{3096}ゝゞ\\x{309F}])(?<Mark>[\\x{3099}\\x{309A}゛゙゜゚ーー])*)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.Find("(?<!\\g<Kana>\\g<Mark>\\g<Mark>|\\g<Kana>\\g<Mark>|\\g<Kana>)(?:(?<Kana>[ぁ-\\x{3096}ゝゞ\\x{309F}])(?<Mark>[\\x{3099}\\x{309A}゛゙゜゚ーー])*)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
f.push(["カタカナを単語検索","F",function(a){ //2017/05/28
f.push(["カタカナを単語検索","",function(_,$){ //2017/05/28
   a.Find("(?<!\\g<Kana>\\g<Mark>\\g<Mark>|\\g<Kana>\\g<Mark>|\\g<Kana>)(?:(?<Kana>[ァ-\\x{30FA}ヽヾ\\x{30FF}ヲ-ッア-ン\\x{31F0}-\\x{31FF}])(?<Mark>[\\x{3099}\\x{309A}゛゙゜゚ーー])*)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.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) }]);
</pre>
</pre>


869行目: 945行目:
:Shift_JIS (CP932) の環境依存文字 (NEC特殊文字・IBM拡張文字・ユーザー定義外字・未定義文字) を検索します。
:Shift_JIS (CP932) の環境依存文字 (NEC特殊文字・IBM拡張文字・ユーザー定義外字・未定義文字) を検索します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["CP932依存文字を検索","F",function(a){ //2017/05/28
f.push(["CP932依存文字を検索","",function(_,$){ //2017/05/28
   a.Find("[纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏\\x{FA10}增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙\\x{FA12}晳暙暠暲暿曺朎\\x{F929}杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇\\x{FA15}燁燾犱犾猤\\x{FA16}獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦\\x{FA17}睆劯砡硎硤硺礰\\x{FA18}\\x{FA19}\\x{FA1A}禔\\x{FA1B}禛竑竧\\x{FA1C}竫箞\\x{FA1D}絈絜綷綠緖繒罇羡\\x{FA1E}茁荢荿菇菶葈蒴蕓蕙蕫﨟薰\\x{FA20}﨡蠇裵訒訷詹誧誾諟\\x{FA22}諶譓譿賰賴贒赶﨣軏﨤\\x{FA25}遧郞\\x{FA26}鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒\\x{F9DC}﨩隝隯霳霻靃靍靏靑靕顗顥\\x{FA2A}\\x{FA2B}餧\\x{FA2C}馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫\\x{FA2D}鸙黑①-⑳Ⅰ-Ⅹⅰ-ⅹ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼㍻∮∑∟⊿¦'"\\x{E000}-\\x{E757}\\x{80}\\x{F8F0}-\\x{F8F3}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.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) }]);
</pre>
</pre>


876行目: 952行目:
:CJK互換漢字 (U+F900~FAD9, 2F800~2FA1D) を検索します(CJK統合漢字扱いの12字 および 未定義の2字は除く)。
:CJK互換漢字 (U+F900~FAD9, 2F800~2FA1D) を検索します(CJK統合漢字扱いの12字 および 未定義の2字は除く)。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["CJK互換漢字を検索","F",function(a){ //2018/01/15
f.push(["CJK互換漢字を検索","",function(_,$){ //2018/01/15
   a.Find("[[^﨎﨏﨑﨓﨔﨟﨡﨣﨤﨧﨨﨩\\x{FA6E}\\x{FA6F}]&&[\\x{F900}-\\x{FAD9}\\x{2F800}-\\x{2FA1D}]]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.Find("[[^﨎﨏﨑﨓﨔﨟﨡﨣﨤﨧﨨﨩\\x{FA6E}\\x{FA6F}]&&[\\x{F900}-\\x{FAD9}\\x{2F800}-\\x{2FA1D}]]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</pre>
</pre>


883行目: 959行目:
:UTF-16において2バイト2個組で1文字を形成する文字 (U+10000~10FFFF) を検索します。
:UTF-16において2バイト2個組で1文字を形成する文字 (U+10000~10FFFF) を検索します。
<pre>
<pre>
f.push(["サロゲートペアを検索","F",function(a){ //2015/09/30
f.push(["サロゲートペアを検索","",function(_,$){ //2015/09/30
   a.Find("[\\x{10000}-\\x{10FFFF}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.Find("[\\x{10000}-\\x{10FFFF}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</pre>
</pre>


;結合文字列を検索
;結合文字列を検索
:2文字以上を組み合わせて1文字を形成する文字を検索します。
:他の文字と組み合わせて1文字を形成する文字列を検索します。
:※基底文字+結合文字の組合せを検索するため、それ以外の組合せで形成される文字は正しく検索・選択できません。
:※結合文字列や異体字を表示するには、アプリやフォントの対応が必要です。
:※結合文字列や異体字を表示するには、対応するソフトウェアやフォントが必要です。
:{|class="wikitable" style="text-align:center;"
:{|class="wikitable" style="text-align:center;"
!
!
!colspan="4"| ラテン文字
!colspan="4"| ラテン文字
!colspan="3"| ひらがな
!colspan="3"| ひらがな
!colspan="3"| 漢字(異体字)
!colspan="2"| 漢字(異体字)
!colspan="2"| 囲み文字
!colspan="2"| 囲み文字
|-
|-
901行目: 976行目:
| ǖ ||colspan="3"| u&#x308;&#x304;
| ǖ ||colspan="3"| u&#x308;&#x304;
| じ ||colspan="2"| し&#x3099;
| じ ||colspan="2"| し&#x3099;
| 辻 ||colspan="2"| 辻&#xE0100;
|colspan="2"| 辻&#xE0100;
|colspan="2"| あ&#x20DE;
|colspan="2"| あ&#x20DE;
|-
|-
907行目: 982行目:
| ǖ || u||&#x308;||&#x304;
| ǖ || u||&#x308;||&#x304;
| じ || し||&#x3099;
| じ || し||&#x3099;
| 辻 || 辻||&#xE0100;
| 辻||&#xE0100;
| あ||&#x20DE;
| あ||&#x20DE;
|-
|-
913行目: 988行目:
| 01D6 || 0075||0308||0304
| 01D6 || 0075||0308||0304
| 3058 || 3057||3099
| 3058 || 3057||3099
| 8FBB || 8FBB||E0100
| 8FBB||E0100
| 3042||20DE
| 3042||20DE
|}
|}
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["結合文字列を検索","F",function(a){ //2017/05/28
f.push(["結合文字列を検索","",function(_,$){ //2017/05/28
   a.Find("(?:[^\\p{M}\\n]|^)[\\p{M}]+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
   $.Find("(?:[^\\p{M}\\n]|^)[\\p{M}]+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]);
</pre>
</pre>


932行目: 1,007行目:
|}
|}
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["選択文字列を検索","F",function(a){ //2017/06/25
f.push(["選択文字列を検索","s",function(_,$){ //2019/06/01
   if(a.Text){var acp=a.GetActivePos(),anp=a.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; a.Find(a.Text.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext); a.SetActivePos(acp);a.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true;} }]);
   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; }]);
</pre>
</pre>


949行目: 1,024行目:
|}
|}
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["選択文字列をすべて削除","F",function(a){ //2017/06/25
f.push(["選択文字列をすべて削除","s",function(_,$){ //2019/06/01
   if(a.Text)a.Replace(a.Text.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), "", meFindReplaceCase+meFindReplaceRegExp+meReplaceAll) }]);
   $.Replace(_.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&"), "", meFindReplaceCase+meFindReplaceRegExp+meReplaceAll) }]);
</pre>
</pre>


;検索強調をすべて解除
;検索強調をすべて解除
:「検索文字列の強調を解除」をすべての文書で実行します。
:[検索]→[検索文字列の強調を解除] をすべての文書で実行します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["検索強調をすべて解除","F",function(a){ //2015/03/14
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}} }]);
   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}} }]);
</pre>
</pre>
965行目: 1,040行目:
:※処理に時間をかけたくない場合は「<b>[[検索ヒット数表示]]</b>」プラグインの導入をオススメします。
:※処理に時間をかけたくない場合は「<b>[[検索ヒット数表示]]</b>」プラグインの導入をオススメします。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["検索結果カウント","F",function(a){ //2015/09/30
f.push(["検索結果カウント","",function(_,$){ //2015/09/30
   var t=new Date(),n=-1,acp=a.GetActivePos(),anp=a.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; Status=""; a.StartOfDocument(); do{a.FindRepeat(meFindNext);n++}while(!Status); a.SetActivePos(acp);a.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true; Status=n+"件の検索結果 (処理時間: "+(new Date()-t)/1000+"秒)" }]);
   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+"秒)" }]);
</pre>
</pre>


973行目: 1,048行目:
;総字行数カウント
;総字行数カウント
:総文字数と総表示行数をステータスバーに表示します。
:総文字数と総表示行数をステータスバーに表示します。
:表示される数値は、「すべて選択」時に表示される字数・行数と同値になります。
:表示される数値は「すべて選択」時に表示される字数・行数と同値になります。
:※サロゲートペアは2文字扱い。結合文字や異体字セレクタもカウントされます。
:※サロゲートペアは2文字と数えます。
<pre>
<pre>
f.push(["総字行数カウント","F",function(a){ //2015/03/14
f.push(["総字行数カウント","",function(){ //2019/06/01
   Status=Document.Text.length+"文字 ("+Document.GetLines()+"表示行)" }]);
   Status=Document.Text.length+"文字 ("+Document.GetLines(meGetLineView)+"表示行)" }]);
</pre>
</pre>
:※サロゲートペアを1文字と扱い、論理行数を表示する場合は、下記のようになります。
 
;文字数カウント(空白は除く)
:選択範囲または文書全体の文字数(改行/半角空白/全角空白/水平タブは除く)をステータスバーに表示します。
:※サロゲートペアは1文字と数えます。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["総字行数カウント","F",function(a){ //2015/09/30
f.push(["文字数カウント(空白は除く)","",function(_){ //2019/06/01
   Status=(Document.Text.length-(Document.Text.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[]).length)+"文字 ("+Document.GetLines(0)+"論理行)" }]);
   Status=(_||Document.Text).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").replace(/[\t\n\r  ]/g,"").length+"文字 (改行・空白抜き)" }]);
</pre>
 
;ステータスバーの表示をコピー
:ステータスバーの左端の欄に表示されている文字列をコピーします。
<pre>
f.push(["ステータスバーの表示をコピー","",function(){ //2019/06/01
  ClipboardData.SetData(Status) }]);
</pre>
</pre>


990行目: 1,075行目:
:新規作成ファイルなどパスが存在しない場合は、<無題> の文字がコピーされます。
:新規作成ファイルなどパスが存在しない場合は、<無題> の文字がコピーされます。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["編集中のファイルのパスをコピー","F",function(a){ //2015/03/14
f.push(["編集中のファイルのパスをコピー","",function(){ //2015/03/14
   ClipboardData.SetData(Document.FullName||"<無題>") }]);
   ClipboardData.SetData(Document.FullName||"<無題>") }]);
f.push(["編集中の全ファイルのパスをコピー","F",function(a){ //2015/03/14
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")) }]);
   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")) }]);
</pre>
</pre>
999行目: 1,084行目:


;★行を昇順/降順並べ(Unicode)
;★行を昇順/降順並べ(Unicode)
:Unicode 順に並べ替えます(サロゲートペアが U+FFFF の次に並ぶ)。
:Unicode 順に並べ替えます。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["行を昇順並べ(Unicode)","RS",function(a){ //2017/06/25
f.push(["行を昇順並べ(Unicode)","L",function(_){ //2017/06/25
   return a.replace(/\uFFFF/g,"\uFFFF_").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"\uFFFF$&").split("\n").sort().join("\n").replace(/\uFFFF([\uD800-\uDBFF][\uDC00-\uDFFF])/g,"$1").replace(/\uFFFF_/g,"\uFFFF") }]);
   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)","RS",function(a){ //2017/06/25
f.push(["行を降順並べ(Unicode)","L",function(_){ //2017/06/25
   return a.replace(/\uFFFF/g,"\uFFFF_").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"\uFFFF$&").split("\n").sort().reverse().join("\n").replace(/\uFFFF([\uD800-\uDBFF][\uDC00-\uDFFF])/g,"$1").replace(/\uFFFF_/g,"\uFFFF") }]);
   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") }]);
</pre>
</pre>


;★行を逆順並べ
;★行を逆順並べ
<pre>
<pre>
f.push(["行を逆順並べ","RS",function(a){ //2014/10/12
f.push(["行を逆順並べ","L",function(_){ //2014/10/12
   return a.split("\n").reverse().join("\n") }]);
   return _.split("\n").reverse().join("\n") }]);
</pre>
</pre>


1,016行目: 1,101行目:
:ランダムに並べ替えます。
:ランダムに並べ替えます。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["行をシャッフル","RS",function(a){ //2014/10/12
f.push(["行をシャッフル","L",function(_){ //2014/10/12
   var a=a.split("\n"),i=a.length,j,t; while(i){j=Math.floor(Math.random()*i--); t=a[i];a[i]=a[j];a[j]=t;} return a.join("\n") }]);
   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") }]);
</pre>
 
;行を文字数順並べ
:文字数の少ない順に並べ替えます。
:※符号点(コードポイント)の少ない順。結合文字列には対応していません。
:文字数の多い順に並べ替えたい場合は、<code>a.len-b.len</code> を <code>b.len-a.len</code> に書き換えてください。
<pre style="word-wrap:break-word;">
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") }]);
</pre>
 
;数行毎に逆順並べ...
:選択範囲を指定した行数で区切り、区間ごとに逆順に並べ替えます。
<pre style="word-wrap:break-word;">
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) }]);
</pre>
;数行一組で逆順並べ...
:選択範囲を指定した行数で一組とし、組単位で逆順に並べ替えます。
<pre style="word-wrap:break-word;">
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) }]);
</pre>
 
;空行毎に逆順並べ
:選択範囲を空行(改行のみの行)で区切り、区間ごとに逆順に並べ替えます。
<pre style="word-wrap:break-word;">
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) }]);
</pre>
;空行一組で逆順並べ
:選択範囲を空行区切りで一組とし、組単位で逆順に並べ替えます。
<pre style="word-wrap:break-word;">
f.push(["空行一組で逆順並べ","L",function(_){ //2019/06/01
  return (_+"\n").match(/\n+|[\s\S]*?\n(?=\n|$)/g).reverse().join("").slice(0,-1) }]);
</pre>
 
;指定見出しで逆順並べ...
:入力した文字列から始まる行を「見出し」とし、見出し単位で逆順に並べ替えます。
<pre style="word-wrap:break-word;">
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) } }]);
</pre>
</pre>
;※行を逆順並べ系コマンドの比較 (☐ は空白/↵ は改行)
:{|class="wikitable"
! 例文 !! 数行毎<br>(3行) !! 数行一組<br>(3行)
!rowspan="2" width="6px"|
! 例文 !! 空行毎 !! 空行一組
|-
| 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行目
| 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組
| 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行目
| 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行目
|}


;文字を逆順並べ
;文字を逆順並べ
1,033行目: 1,174行目:
:例> <span style="background:#bfdfff;">𠮟る/りんこ&#x3099;/tre&#x301;ma</span> → ame&#x301;rt/こ&#x3099;んり/る𠮟
:例> <span style="background:#bfdfff;">𠮟る/りんこ&#x3099;/tre&#x301;ma</span> → ame&#x301;rt/こ&#x3099;んり/る𠮟
:{|class="wikitable" style="text-align:center;"
:{|class="wikitable" style="text-align:center;"
! 実行前
! 例文
|colspan="2"|𠮟||る
|colspan="2"|𠮟||る
!rowspan="6" width="6px"|
!rowspan="6" width="6px"|
1,064行目: 1,205行目:
|}
|}
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["文字を逆順並べ","R",function(a){ //2017/06/25
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 a.replace(/[^\n]+/g,function(s){return s.match(X).reverse().join("")}) }]);
   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("")}) }]);
</pre>
</pre>


1,072行目: 1,213行目:
:例> <span style="background:#bfdfff;">文字をシャッフル</span> → フ字をャシッル文
:例> <span style="background:#bfdfff;">文字をシャッフル</span> → フ字をャシッル文
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["文字をシャッフル","R",function(a){ //2017/06/25
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 a.replace(/[^\n]+/g,function(s){var a=s.match(X),i=a.length,j,t; while(i){j=Math.floor(Math.random()*i--); t=a[i];a[i]=a[j];a[j]=t;} return a.join("")}) }]);
   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("")}) }]);
</pre>
</pre>


==字種/数値変換==
==字種/数値変換==
;★半角英数→全角
;★半角英数→全角
;★全角英数→半角
;★全角英数→半角
<pre>
<pre>
f.push(["半角英数→全角","R",function(a){ //2014/02/10
f.push(["半角英数→全角","s",function(_){ //2014/02/10
   return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]);
   return _.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]);
f.push(["全角英数→半角","R",function(a){ //2014/02/10
f.push(["全角英数→半角","s",function(_){ //2014/02/10
   return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]);
   return _.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]);
</pre>
</pre>


1,090行目: 1,230行目:
;★全角カナ→半角
;★全角カナ→半角
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["半角カナ→全角","R",function(a){ //2015/03/14
f.push(["半角カナ→全角","s",function(_){ //2015/03/14
   return a.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
   return _.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
f.push(["全角カナ→半角","R",function(a){ //2015/03/14
f.push(["全角カナ→半角","s",function(_){ //2015/03/14
   return a.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]) }]);
   return _.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]) }]);
</pre>
</pre>


1,101行目: 1,241行目:
:ただし、ヴヵヶ → ゔゕゖ の変換は行いません(Shift_JIS では保存できない文字のため)。
:ただし、ヴヵヶ → ゔゕゖ の変換は行いません(Shift_JIS では保存できない文字のため)。
<pre>
<pre>
f.push(["全角かな→カナ","R",function(a){ //2014/02/10
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){ //2015/02/14
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)}) }]);
</pre>
</pre>
:ヴヵヶ → ゔゕゖ の変換も行う場合は、下記の内容に差し替えてください。
:ヴヵヶ → ゔゕゖ の変換も行う場合は、下記の内容に差し替えてください。
<pre>
<pre>
f.push(["全角カナ→かな","R",function(a){ //2014/02/10
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)}) }]);
</pre>
</pre>


1,129行目: 1,269行目:
|}
|}
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["標準変換","R",function(a){ //2015/03/14
f.push(["標準変換","s",function(_){ //2015/03/14
   return a.replaceBatch([ [" "," "],["!","!"],["“",'"'],["”",'"'],["#","#"],["$","$"],["%","%"],["&","&"],["‘","'"],["’","'"],["(","("],[")",")"],["*","*"],["+","+"],[",",","],["-","-"],[".","."],["/","/"],["0","0"],["1","1"],["2","2"],["3","3"],["4","4"],["5","5"],["6","6"],["7","7"],["8","8"],["9","9"],[":",":"],[";",";"],["<","<"],["=","="],[">",">"],["?","?"],["@","@"],["A","A"],["B","B"],["C","C"],["D","D"],["E","E"],["F","F"],["G","G"],["H","H"],["I","I"],["J","J"],["K","K"],["L","L"],["M","M"],["N","N"],["O","O"],["P","P"],["Q","Q"],["R","R"],["S","S"],["T","T"],["U","U"],["V","V"],["W","W"],["X","X"],["Y","Y"],["Z","Z"],["[","["],["¥","\\"],["]","]"],["^","^"],["_","_"],["`","`"],["a","a"],["b","b"],["c","c"],["d","d"],["e","e"],["f","f"],["g","g"],["h","h"],["i","i"],["j","j"],["k","k"],["l","l"],["m","m"],["n","n"],["o","o"],["p","p"],["q","q"],["r","r"],["s","s"],["t","t"],["u","u"],["v","v"],["w","w"],["x","x"],["y","y"],["z","z"],["{","{"],["|","|"],["}","}"],["~","~"],["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
   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"],["{","{"],["|","|"],["}","}"],["~","~"],["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]);
</pre>
</pre>


1,142行目: 1,282行目:
|}
|}
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["表外漢字→代替","R",function(a){ //2017/06/25
f.push(["表外漢字→代替","s",function(_){ //2017/06/25
   return a.replaceBatch([ ["\u555E","唖"],["\u7130","焔"],["\u9DD7","鴎"],["\u6451","掴"],["\u9EB4","麹"],["\u5653","嘘"],["\u4FE0","侠"],["\u9830","頬"],["\u8EC0","躯"],["\u4FF1","倶"],["\u7E6B","繋"],["\u59F8","妍"],["\u9E7C","鹸"],["\u5699","噛"],["\u6522","攅"],["\uD842\uDF9F","叱"],["\u7E61","繍"],["\u8523","蒋"],["\u91AC","醤"],["\u87EC","蝉"],["\u6414","掻"],["\u7626","痩"],["\u9A52","騨"],["\u7C1E","箪"],["\u5861","填"],["\u985A","顛"],["\u79B1","祷"],["\u7006","涜"],["\u541E","呑"],["\u56CA","嚢"],["\u525D","剥"],["\u6F51","溌"],["\u91B1","醗"],["\u5C5B","屏"],["\u5E77","并"],["\u9EB5","麺"],["\u840A","莱"],["\u5C62","屡"],["\u6CAA","濾"],["\u881F","蝋"] ]) }]);
   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","蝋"] ]) }]);
</pre>
</pre>


1,150行目: 1,290行目:
:例> <span style="background:#bfdfff;">291/15/44015</span> → 123/F/ABEF
:例> <span style="background:#bfdfff;">291/15/44015</span> → 123/F/ABEF
<pre>
<pre>
f.push(["10→16進数","R",function(a){ //2014/05/31
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()}) }]);
</pre>
</pre>
;★16→10進数
;★16→10進数
1,157行目: 1,297行目:
:例> <span style="background:#bfdfff;">123/0x0F/abef</span> → 291/15/44015
:例> <span style="background:#bfdfff;">123/0x0F/abef</span> → 291/15/44015
<pre>
<pre>
f.push(["16→10進数","R",function(a){ //2017/06/25
f.push(["16→10進数","s",function(_){ //2017/06/25
   return a.replace(/(?:0x)?([0-9a-f]+)/gi,function(s,x){return Number("0x"+x)}) }]);
   return _.replace(/(?:0x)?([0-9a-f]+)/gi,function(_,x){return Number("0x"+x)}) }]);
</pre>
</pre>


1,165行目: 1,305行目:
:例> <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
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["2進接頭辞換算","R",function(a){ //2015/03/14
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(n>=k&&x<8){n/=k;x++} 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"}) }]);
</pre>
</pre>


1,172行目: 1,312行目:


;URL %エンコード/デコード(UTF-8)
;URL %エンコード/デコード(UTF-8)
:URL アドレスに使用される UTF-8 パーセントエンコーディングの符号化/復号化を行います。
:URL アドレスに使用されるパーセントエンコーディングの符号化/復号化を行います。
<pre>
<pre>
f.push(["URL %エンコード(UTF-8)","R",function(a){ //2014/02/01
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){ //2014/02/01
f.push(["URL %デコード(UTF-8)","s",function(_){ //2014/02/01
   return decodeURIComponent(a) }]);
   return decodeURIComponent(_) }]);
</pre>
</pre>


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


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


;\u4H \U8H エンコード/デコード
;\u4H \U8H エンコード/デコード
:Unicode で使用される \u4H および \U8H 形式の変換を行います。※4H, 8H=4桁, 8桁の16進数・Unicodeスカラー値
:Unicode で使用される \u4H および \U8H 形式の変換を行います。※4H, 8H=4桁, 8桁の16進数
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">\u0041\u308F\U00029E3D</span>
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">\u0041\u308F\U00029E3D</span>
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["\\u4H \\U8H エンコード","R",function(a){ //2017/06/25
f.push(["\\u4H \\U8H エンコード","s",function(_){ //2017/06/25
   return a.replace(/[^\n]+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00);r+="\\U"+toHex(u,8);continue}} r+="\\u"+toHex(u,4)} return r}); function toHex(n,d){return ("000"+n.toString(16).toUpperCase()).slice(-d)} }]);
   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 デコード","R",function(a){ //2015/09/30
f.push(["\\u4H \\U8H デコード","s",function(_){ //2015/09/30
   return a.replace(/\\u([0-9A-Fa-f]{4})|\\U([0-9A-Fa-f]{8})/g,function(s,u4,U8){var n=Number("0x"+(u4||U8)); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);
   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}) }]);
</pre>
</pre>


;\x{hex} エンコード/デコード
;\x{hex} エンコード/デコード
:Mery の正規表現 (鬼車/鬼雲) などで使用される \x{hex} 形式の変換を行います。※hex=1~6桁の16進数・Unicodeスカラー値
:Mery の正規表現 (鬼車/鬼雲) などで使用される \x{hex} 形式の変換を行います。※hex=1~6桁の16進数
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">\x{41}\x{308f}\x{29e3d}</span>
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">\x{41}\x{308f}\x{29e3d}</span>
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["\\x{hex} エンコード","R",function(a){ //2017/06/25
f.push(["\\x{hex} エンコード","s",function(_){ //2017/06/25
   return a.replace(/[^\n]+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("\\x{"+u.toString(16)+"}")} return r}) }]);
   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} デコード","R",function(a){ //2015/03/14
f.push(["\\x{hex} デコード","s",function(_){ //2015/03/14
   return a.replace(/\\x\{([0-9A-Fa-f]{1,6})\}/g,function(s,n){n=Number("0x"+n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);
   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}) }]);
</pre>
</pre>


;&#dec; エンコード/デコード
;&#dec; エンコード/デコード
:HTML などで使用される &#dec; 形式の変換を行います。※dec=1~7桁の10進数・Unicodeスカラー値
:HTML などで使用される &#dec; 形式の変換を行います。※dec=1~7桁の10進数
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">&amp;#65;&amp;#12431;&amp;#171581;</span>
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">&amp;#65;&amp;#12431;&amp;#171581;</span>
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["&&#dec; エンコード","R",function(a){ //2017/06/25
f.push(["&&#dec; エンコード","s",function(_){ //2017/06/25
   return a.replace(/[^\n]+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("&#"+u+";")} return r}) }]);
   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; デコード","R",function(a){ //2015/03/14
f.push(["&&#dec; デコード","s",function(_){ //2015/03/14
   return a.replace(/&#([0-9]{1,7});/g,function(s,n){n=Number(n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);
   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}) }]);
</pre>
</pre>


;&#xHEX; エンコード/デコード
;&#xHEX; エンコード/デコード
:HTML などで使用される &#xHEX; 形式の変換を行います。※HEX=1~6桁の16進数・Unicodeスカラー値
:HTML などで使用される &#xHEX; 形式の変換を行います。※HEX=1~6桁の16進数
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">&amp;#x41;&amp;#x308F;&amp;#x29E3D;</span>
:例> <span style="background:#bfdfff;">Aわ𩸽</span> ←→ <span style="background:#bfdfff;">&amp;#x41;&amp;#x308F;&amp;#x29E3D;</span>
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["&&#xHEX; エンコード","R",function(a){ //2017/06/25
f.push(["&&#xHEX; エンコード","s",function(_){ //2017/06/25
   return a.replace(/[^\n]+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("&#x"+u.toString(16).toUpperCase()+";")} return r}) }]);
   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; デコード","R",function(a){ //2017/06/25
f.push(["&&#xHEX; デコード","s",function(_){ //2017/06/25
   return a.replace(/&#[Xx]([0-9A-Fa-f]{1,6});/g,function(s,n){n=Number("0x"+n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]);
   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}) }]);
</pre>
</pre>


1,249行目: 1,388行目:
:拡張コードの雛形を挿入します。コマンドを自作したい場合にご利用ください。
:拡張コードの雛形を挿入します。コマンドを自作したい場合にご利用ください。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(["拡張コード テンプレート",function(f){ //2015/03/14
f.push(["拡張コード テンプレート",function(f){ //2019/06/01
f.push(["コマンド F (Function)","F",function(a){
f.push(["コマンド","",function(_,$){
   var p='f.push(["","F",function(a){\n  ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]);
   $.StartOfLine(); return ['f.push(["コマンド","",function(_,$){\n  ' , ' }]);\n'] }]);
f.push(["コマンド R (Replace)","F",function(a){
f.push(["コマンド s (選択必須)","",function(_,$){
   var p='f.push(["","R",function(a){\n  return ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]);
   $.StartOfLine(); return ['f.push(["コマンド","s",function(_,$){\n  return _.replace(' , ') }]);\n'] }]);
f.push(["コマンド RS (Select-line)","F",function(a){
f.push(["コマンド L (行選択)","",function(_,$){
   var p='f.push(["","RS",function(a){\n  return ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]);
   $.StartOfLine(); return ['f.push(["コマンド","L",function(_,$){\n  return _.replace(' , ') }]);\n'] }]);
f.push(["サブメニュー","F",function(a){
f.push(["サブメニュー","L",function(_){
   var p='f.push(["",function(f){\n',s='}]);\n'; Document.Write(p+a.Text+s) }]);
   return ['f.push(["' , 'メニュー' , '",function(f){\n'+ _ +'\n}]);'] }]);
f.push(["セパレータ","F",function(a){
f.push(["セパレーター","",function(_,$){
   a.StartOfLine(); Document.Write('f.push(["----"]);\n') }]);
   $.StartOfLine(); return ['f.push(["--------"]);\n' , ''] }]);
}]);
}]);
</pre>
</pre>


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


;交換 ["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>
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(['交換 ["a","b"] → ["b","a"]',"R",function(a){ //2014/05/31
f.push(['交換 ["a","b"] → ["b","a"]',"s",function(_){ //2014/05/31
   return a.replace(/\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'),("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*')\]/g,"[$2,$1]") }]);
   return _.replace(/\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'),("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*')\]/g,"[$2,$1]") }]);
</pre>
</pre>


1,280行目: 1,419行目:
:配列と TSV 形式を変換します。
:配列と TSV 形式を変換します。
<pre style="word-wrap:break-word;">
<pre style="word-wrap:break-word;">
f.push(['分割 ["a","b"] → "a" \u203A "b"\u21B5',"R",function(a){ //2017/06/25
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){ //2015/03/14
f.push(['結合 "a" \u203A "b"\u21B5 → ["a","b"]',"L",function(_){ //2015/03/14
   return a.replace(/\n?(((".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*)+)/g,function(s,r){return r.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(/,$/,"")}) }]);
</pre>
</pre>


1,289行目: 1,428行目:


==コマンド==
==コマンド==
;モード F (Function)
<source lang="javascript">
<source lang="javascript">
f.push(["コマンド名","F",function( 引数 ){ マクロ }]);
f.push(["コマンド名","オプション",function(引数){ 処理 }]);
</source>
</source>
:【マクロ】の記述をそのまま実行します。
;オプション
:コマンド実行時、以下の処理が行われます。
:{|class="wikitable"
<source lang="javascript">
| <code>s</code> || 実行に範囲選択を要求 (require selection)
(function( 引数 ){ マクロ })( Document.Selection );
|-
</source>
| <code>c</code> || 実行にクリップボードを要求 (require clipboard)
 
|-
;モード R (Replace)
| <code>L</code> || 行選択してから処理 (select Line)
;モード RS (Select-line)
|-
<source lang="javascript">
| <code>O</code> || 非選択時はすべて選択してから処理 (select OR all)<br>※実験的機能(変更・廃止の可能性あり)
f.push(["コマンド名","R",function( 引数 ){ マクロ }]);
|}
f.push(["コマンド名","RS",function( 引数 ){ マクロ }]);
:複数指定する場合、空白で区切ります。順序は問いません。<br>※仕様上、<code>0-9 A-Z a-z _</code> 以外の文字ならば区切りと判定されますが、空白を推奨します。
</source>
;引数
:モード R は、選択範囲を【マクロ】の処理結果で置換します。
:第1引数に [[マクロリファレンス:Selection_インターフェイス#Text_プロパティ|Document.Selection.Text]] が、<br>第2引数に [[マクロリファレンス:Selection_インターフェイス|Document.Selection]] が渡されます。
:モード RS は、選択範囲を行頭行末まで拡張してから置換します。
;処理
:コマンド実行時、以下の処理が行われます。
:String (文字列) か Array (配列) を return すると、選択範囲を置換してカーソルを移動します。それ以外 (undefined など) の場合は、選択範囲に対し何もしません。
<source lang="javascript">
:なお、処理の途中で選択範囲が変化した場合、変化先で置換が行われます。
Document.Selection.Text = (function( 引数 ){ マクロ })( Document.Selection.Text );
:{|class="wikitable"
</source>
! 例 !! 動作
:また、コマンド実行前に選択範囲を記憶し、実行後に処理結果を加味しつつ復元します。
|-
| <code>"abcd"</code> || abcd に置換後、abcd を選択 = <code>["","abcd",""]</code>
|-
| <code>["ab","cd"]</code> || abcd に置換後、ab と cd の間に移動
|-
| <code>["ab","cd",""]</code> || abcd に置換後、cd を選択
|}


==サブメニュー==
==サブメニュー==
サブメニューを設けます。<br>
サブメニューを設けます。サブメニュー内サブメニュー(階層化)も可能です。
サブメニュー内にサブメニューを作ること(階層化)も可能です。
<source lang="javascript">
<source lang="javascript">
f.push(["メニュー名",function(f){
f.push(["メニュー名",function(f){
【コマンド or サブメニュー or セパレータ】
/* コマンド or サブメニュー or セパレーター */
}]);
}]);
</source>
</source>


==セパレータ==
==セパレーター==
セパレータ(区切り)を設けます。
セパレーター(区切り)を設けます。<br>※半角ハイフン <code>-</code> は何個でも含められますが、他の文字は含められません。
<source lang="javascript">
<source lang="javascript">
f.push(["----"]);
f.push(["--------"]);
</source>
半角ハイフン <code>-</code> の数は何個でもかまいません。<br>
ただし、半角ハイフン以外の文字を含めることはできません。
<source lang="javascript">
f.push(["-"]);        //← OK (1個)
f.push(["----------"]); //← OK (10個)
f.push(["--区切り--"]); //← NG
</source>
</source>


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