「
テキスト整形
」を編集中
2017年5月28日 (日) 16:34時点における
Masme
(
トーク
|
投稿記録
)
による版
(「検索/置換」と「文書情報」の配置を移動。)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
<div style="float:right">__TOC__</div> ks 氏作のマクロ「<b>[[テキスト変換]]</b>」の改造版です。 【主な改造点】 * <b>[[#拡張コード:書式|拡張コードの書式]]</b>を変更した。 ** 簡易書式をベースに単純化。オプション・第2引数は削除。 ** 関数タイプ replace/replaceS はモード R/RS に改称。replaceL は廃止。 * モード F (関数を実行) を追加。JScript や Mery の関数をそのまま実行することができます。 * モード RS で、範囲終端の改行=次行行頭は範囲に含めないようにした。(正規表現 <code>^ $</code> の使い勝手を考え) * モード R/RS 実行後、処理した範囲を選択し直すようにした。(選択範囲の維持・調整) * メソッド <code><i>String</i>.replaceBatch</code> (連続置換) を追加。 * 範囲選択時に対象範囲を選ぶメニューを廃止した。(毎回選ぶのが面倒なため) * 非選択時に文書全体を対象範囲とする仕様を廃止した。(挿入/貼付コマンドと相性が悪いため) ** 文書全体を対象にしたい場合は「すべて選択」 (Ctrl+A) してから実行してください。 【注意点】 * <b style="color:#c00;">表示行での処理には対応していません。</b>※特記なき場合、<b>各行・行頭・行末</b> は <b>論理行</b> を意味しています。 * マクロの仕様上、<b style="color:#c00;">矩形選択での処理には対応していません。</b> =お知らせ (2015/03/14)= <b style="color:#c00;">仕様変更によりモード RM / CR は廃止されました。<br> 詳しくは [[#更新履歴]] または [[利用者:Masme]] のページをご覧ください。</b><br> 旧仕様の利用者はお手数ですが基本コードおよび拡張コードの更新をお願いいたします。 =スターターパック= ダウンロード→ <b>[[メディア:テキスト整形.zip|テキスト整形.zip]]</b> (2015/12/26 更新) * 基本コードと拡張コード(★印の項目)をまとめて、すぐ使えるようにした入門用セットです。→ <b>[[:ファイル:テキスト整形.zip|収録コマンド一覧]]</b> * 拙作ですがアイコンファイル (テキスト整形.ico) を同梱してあります。<br>Mery 2.4.7 以降の場合、マクロ (テキスト整形.js) と同じフォルダに、<br>Mery 2.4.6 以前の場合、Mery.exe と同じフォルダに、<br>アイコンファイルを配置しておくとツールバーにアイコンが読み込まれます。 =更新履歴= ※ <code style="background:#fe0;">//2017/05/28</code> でページ内検索すると、その日付で更新されたコマンドを検索できます。 <div style="height:40em; overflow:auto; border:1px dashed #999;"> * 2017/05/28 ** 追加 - 結合文字列を検索 ** 修正 - CP932依存文字を検索 **: Wiki が 神 → 神 などの正規化(NFC)を行う影響で、漢字22字が意図どおりに検索されないミスを修正。 ** 変更 - ASCII文字, 半角カナ, 全角英数, CJK漢字, ひらがな, カタカナを単語検索 **: 変数を使用せず、正規表現 \g<名前> を使用する形式に統一。 * 2015/12/26 ** <b style="color:#c00;">仕様変更 - アイコンの指定先を "My Macros\テキスト整形.ico" ⇒ "テキスト整形.ico" に変更。</b> ** 変更 - マクロフォルダを開く **: コマンド名「My Macros フォルダを開く」→「マクロフォルダを開く」に変更。 **: My Macros フォルダではなく「テキスト整形」マクロがあるフォルダを開くようにした。 * 2015/09/30 ** 追加 - CP932依存文字を検索 ¦ サロゲートペアを検索 ¦ 行頭に連番付加 (#) ¦ 行頭に連番付加 (#/Σ) ¦ 行頭に連番付加 (0#) ¦ \u4H \U8H エンコード/デコード ** 修正 - ひらがなを単語検索 ¦ カタカナを単語検索 **: 選択範囲が記号類の前後で途切れる問題に対処(記号2連続まで対応)。 ** 変更 - 青空文庫 ルビを除去 **: 正規表現を [^《]+ → [^《\n]+ に変更し、改行を跨がないようにした。 ** 変更 - ★HTMLタグを除去 **: 正規表現を .*? → [^<i>文字</i>]* に変更し、改行を跨ぐようにした。 ** 変更 - 文字の並べ替え(逆順) ¦ 文字のシャッフル **: 処理方法を split() → match() に変更。対応文字に結合文字 (U+1AB0~FF, 1DC0~FF, 20D0~FF, FE20~F)、制御文字 (U+200C~D)、絵文字の肌色指定 (U+1F3FB~F)、国旗 (U+1F1E6~FF) を追加。 ** 改名 - \uHHHH / \x{hex} / &#dec; / &#xHEX; エンコード/デコード **: コマンド名「Unicode 文字 → ○○」→「○○ エンコード」に変更。 **: コマンド名「Unicode ○○ → 文字」→「○○ デコード」に変更。 * 2015/03/26 ** 変更 - CJK漢字を単語検索 **: 異体字セレクタを考慮するようにした(ただし組合せが適正かは考慮しえない)。 ** 変更 - 複製貼り付け **: 処理中止の条件を 非数字(NaN) or 1 未満 → クリップボードが空文字 or 1 未満 に変更。 * 2015/03/14 ** <b style="color:#c00;">仕様変更 - モード R/RS 実行後、処理した範囲を選択し直すようにした。</b> ** <b style="color:#c00;">仕様変更 - モード RM を廃止した。</b>既存コマンドは、モード RS に作り直した。 **: ★行頭 // を付加/削除 ¦ ★インデント(半角空白2個) ¦ ★空白行を削除 ¦ ★各行行頭/各行行末に貼り付け ¦ ★各行行頭/各行行末に文字列付加 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除 ** <b style="color:#c00;">仕様変更 - モード CR を廃止し、<code><i>String</i>.replaceBatch</code> メソッドを追加した。</b>既存コマンドは、replaceBatch メソッドで作り直した。 **: ★連続する!?を整形 ¦ ★実体参照 &"<> → &xxx; ¦ ★実体参照 &xxx; → ␣><"& ¦ ★半角カナ→全角 ¦ ★全角カナ→半角 ¦ 標準変換 ** <b style="color:#c00;">コード整理 - コマンド各々に更新年月日を付けるようにした。</b> ** スターター除外 - ☆検索強調をすべて解除 ** 削除 - ☆全角英数を検索 ¦ ☆半角カナを検索 ¦ ☆CJK漢字を検索 ** 追加 - ASCII文字を単語検索 ¦ 半角カナを単語検索 ¦ 全角英数を単語検索 ¦ CJK漢字を単語検索 ¦ ひらがなを単語検索 ¦ カタカナを単語検索 ¦ 検索結果カウント ¦ 総字行数カウント ** 変更 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー **: パスが存在しない場合の名前を、無題 → <無題> に変更。 ** 変更 - ★数値参照を文字に変換 ¦ \x{hex} デコード ¦ &#dec; デコード ¦ &#xHEX; デコード **: サロゲートペアの計算を + → | に変更し、不必要な括弧を除去した(演算子の優先順が + - → >> → & → | である事による)。 ** 変更 - Base64エンコード/デコード **: 不必要な括弧を除去した(同上、演算子の優先順による)。 ** 変更 - コマンド テンプレート **: モード RM/CR 廃止に伴う改訂。コマンドおよびセパレータは、表示行頭に挿入するようにした。 * 2015/02/14 ** <b style="color:#c00;">仕様修正 - モード RS/RM で、矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。</b> ** コード整理 - 文字入力など追加操作を求めるコマンドは、名称末尾に目印 ... を付けた。 **: 複製貼り付け ¦ ★各行行頭/各行行末に文字列付加 ¦ 各行先頭/各行末尾に文字列付加 ¦ ★入力文字列を含む/含まない行を削除 ¦ 正規表現に一致する/しない行を削除 ** 削除 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳ ** 追加 - 行末に<br>を付加 ¦ <br>を改行に変換 ¦ ★行頭の/行末の空白を除去 ¦ 空白行を減量 ¦ 重複行を削除(空白行は除く) ¦ ★連続する重複行を削除 ¦ 文字のシャッフル ** 修正 - 各行先頭/各行末尾に文字列付加 **: 正規表現が意味的に不適切だったのを修正。 ** 変更 - 空白行を圧縮 **: モード R → RS に。空白行内の空白を除去してから改行を処理するように変更。 ** 変更 - 文字の並べ替え(逆順) **: サロゲートペアの対処方法を変更。結合文字の一部 (U+0300~6F, 3099~A) および異体字セレクタに対応した。 ** 変更 - 2進接頭辞換算 **: 処理対象の正規表現を [0-9]+(,?[0-9]{3})+(\.[0-9]+)? → [0-9]+(,?[0-9]{3})+ に変更(小数は非対応とした)。 ** 変更 - Base64デコード **: JScript 5.x の decodeURIComponent() は字数が多いほど能率が悪くなるようなので、最大50字ずつ処理するようにした(高速化)。 * 2014/10/12 ** スターター除外 - ☆正規表現に一致する/しない行を削除 **: Mery (鬼車) と JScript (ECMAScript) では正規表現の仕様が異なり、意図しない結果を招く怖れがあるため。 ** スターター追加 - ★数値参照 &#dec; に変換 ¦ ★数値参照 &#xHEX; に変換 ** 追加 - ★数値参照を文字に変換 ¦ 行の並べ替え(逆順) ¦ 行のシャッフル ¦ &#xHEX; エンコード/デコード ** 修正 - 選択文字列を検索 **: 引数不一致により動作しないミスを修正。 ** 修正 - 編集中の全ファイルのパスをコピー ¦ ★検索強調をすべて解除 **: 対象範囲を 同ウィンドウ内の全文書 → 全ウィンドウの全文書 に改修。 ** 変更 - 複製貼り付け **: 処理方法を for → while に変更。処理中止の条件を 未入力 → 非数字(NaN) or 1 未満に変更。 ** 変更 - \x{hex} エンコード ¦ &#dec; エンコード **: 処理方法を 配列連結 join("") → 文字列連結 += に変更。 ** 変更 - \x{hex} デコード ¦ &#dec; デコード **: 下位サロゲートの計算を (n-0x10000&0x3FF) → (n&0x3FF) に変更。 * 2014/07/27 ** 修正 - Base64デコード **: 終端の余分な [NUL] を除去する処理が手抜きだったのを修正。 * 2014/05/31 ** 削除 - Base64エンコード(Unicode) (移植) **: Mery の「Base64デコード」機能と同じ方式の Base64エンコード(UTF-8) に差し替え。 ** 追加 - Base64エンコード/デコード(UTF-8) ** 変更 - ★数値を3桁,区切りに **: 数字列を抽出して処理するように変更(高速化)。 ** 変更 - ★数値を3桁,区切りに ¦ 丸数字 (20) → ⑳ ¦ ★10→16進数 ¦ 2進接頭辞換算 **: 正規表現 \d を [0-9] に統一。 ** 修正 - コマンド テンプレート(モード CR 交換/分割) **: 文字列リテラルでのエスケープ \ をより正確に判定できる正規表現に改修。 * 2014/05/24 ** 修正 - 各行末尾に文字列付加 **: 選択範囲の次行先頭にも文字列付加してしまう問題に対処。 ** 変更 - 複製貼り付け **: クリップボードの内容を変数に格納しておくように変更(高速化)。 ** 変更 - 複製貼り付け ¦ 各行先頭/各行末尾に文字列付加 **: Prompt() 関連の処理を単純にした(モード RM 以外では冗長だった)。 * 2014/05/22 ** 追加 - 2進接頭辞換算 ** 変更 - \x{hex} デコード ¦ &#dec; デコード **: サロゲートペアの String.fromCharCode() の引数を複数指定に改修、ビット演算に一部変更。 * 2014/05/16 ** 変更 - \x{hex} エンコード ¦ &#dec; エンコード **: 処理方法を replace(for ループ) に統一。 * 2014/04/27 ** 追加 - &#dec; エンコード/デコード * 2014/03/14 ** 追加 - 青空文庫 ルビを除去 ¦ 青空文庫 注記を除去 * 2014/03/08 ** 追加 - 選択文字列を検索 ¦ 選択文字列をすべて削除 ** 変更 - ★全角英数を検索 ¦ ★半角カナを検索 ¦ ★CJK漢字を検索 **: 検索方向を 前 → 次 に変更。念の為「大文字と小文字を区別」するようにした。 * 2014/03/01 ** 追加 - ★連続する!?を整形 ¦ ★全角ダッシュ(――)に整形 ** 変更 - ★括弧前の句読点を除去 **: 全角カンマ , /全角ピリオド . を除去対象に追加。 ** 変更 - ★三点リーダー(……)に整形 **: 全角カンマ , /全角ピリオド . /半角中黒 ・ /三点リーダー … /二点リーダー ‥ を変換対象に追加。 ** 変更 - My Macros フォルダを開く **: 処理方法を WScript.Shell.Run("explorer") → Shell.Application.Explore() に変更。 * 2014/02/22 ** 追加 - 丸数字 ⑳ → (20) ¦ 丸数字 (20) → ⑳ ** 変更 - 文字の並べ替え(逆順) ¦ \uHHHH エンコード ¦ \x{hex} エンコード **: 処理方法を for ループ → replace() に変更(字数削減)。 ** 変更 - コマンド テンプレート **: モード CR 作成補助コマンドを追加。モード CR テンプレートを変更。 * 2014/02/17 ** 修正 - ★各行行頭/各行行末に貼り付け **: クリップボード終端の改行文字を除去する正規表現を修正。\r\n|\r|\n$ → (\r\n|\r|\n)$ * 2014/02/16 ** <b style="color:#c00;">仕様修正 - モード CR で、正規表現の特殊文字があると誤動作する不具合を修正し、正規表現 (JScript) に正式対応した。</b> ** コード整理 - コメントアウトしていた基本コードを削除した。→ 2014/01/08 スクロール位置 ** コード整理 - 下記の6カテゴリを3カテゴリに統合。コマンドの名称や配置を見直した。 **: (空白の追加 + 各行に追加) (空白の削除 + 行の削除) (数値の変換 + 文字種変換) ** スターター除外 - ☆標準変換 ** 追加 - 複製貼り付け ¦ 文字の並べ替え(逆順) ¦ ★半角カナ→全角 ¦ ★全角カナ→半角 ** 変更 - ★各行行頭/各行行末に貼り付け **: クリップボード終端の改行文字は除去するようにした(行切り取り・行コピーとの相性を考え)。 ** 変更 - コマンド テンプレート **: モード CR テンプレートを刷新。 * 2014/02/10 ** スターター除外 - ☆空白行を圧縮 ** 追加 - ★空白行を削除 ¦ \uHHHH デコード ¦ \x{hex} エンコード/デコード ** 変更 - 挿入 Confirm(|) **: 接尾辞の長さ(s.length)でカーソル移動量を決めるようにした。 * 2014/02/01 ** 追加 - \uHHHH エンコード ** 変更 - ★全角かな→カナ ¦ ★全角カナ→かな **: 踊り字(繰り返し記号) ゝゞヽヾ を変換対象に追加。 * 2014/01/24 ** 追加 - ★半角/全角の間を空ける ¦ ★半角英数/全角の間を空ける ** 変更 - ★全角カナ→かな **: ヴヵヶ → ゔゕゖ の変換を行わないようにした(Shift_JIS では保存できない文字のため)。 * 2014/01/12 ** <b style="color:#c00;">仕様変更 - スターターパックにアイコンファイルを同梱し、読み込むようにした。</b> ** 修正 - 編集中のファイルのパスをコピー ¦ 編集中の全ファイルのパスをコピー **: join("\n") → join("\r\n") に変更し、メモ帳でも正しく改行されるようにした。 ** 修正 - ★数値を3桁,区切りに **: 小数点以下(ピリオド以降)は桁区切りしないようにした。 * 2014/01/08 ** <b style="color:#c00;">仕様変更 - コマンド実行時、スクロール位置を記憶・復元しないように(コメントアウト)した。</b> **: 検索系コマンドと相性が悪く、Mery の検索機能と挙動が合っていないため。 ** スターター追加 - ★CJK漢字を検索 ¦ ★検索強調をすべて解除 ** 追加 - ★全角英数を検索 ¦ ★半角カナを検索 ** 修正 - ★16→10進数 **: 16進数に使用しない英字 G~Z を変換対象に含めていたミスを修正。 * 2013/12/30 ** 追加 - 挿入 Confirm(|) ¦ ★数値を3桁,区切りに ¦ ★10→16進数 ¦ ★16→10進数 ** 修正 - My Macros フォルダを開く **: マクロの場所からではなく Mery.exe の場所からパスを取得するようにした。 * 2013/09/15 ** 初版公開。 </div> =基本コード= <source lang="javascript" style="height:35em; overflow:auto;"> //■テキスト整形 // 2013/09/15-2015/09/30 //■拡張コード:コマンド一覧 var f = []; // ----------------- ↓ここより下に拡張コードを追加 // ----------------- ↑ここより上に拡張コードを追加 /*■拡張コード:書式 //▼コマンド f.push(["コマンド名","モード",function(引数){マクロ}]); //▽モード F (Function) - 関数を実行 function( Document.Selection ) : 戻値なし //▽モード R (Replace) - 選択範囲を置換 //▽モード RS (Select-line) - 選択範囲を行頭行末まで拡張して置換 function( Document.Selection.Text ) : String //▼サブメニュー f.push(["メニュー名",function(f){コマンドなど}]); //▼セパレータ f.push(["----"]); // ----------------- */ //■メソッド:連続置換 //String.replaceBatch([ [検索1,置換1],[検索2,置換2],[検索3,置換3]… ]); String.prototype.replaceBatch = function(a) { //▲引数の型検査はしていない var _this = this; for (var i=0,n=a.length; i<n; i++) { if (typeof a[i][0]==="string") //◆特殊文字をエスケープし、"g"フラグを付加 a[i][0] = new RegExp(a[i][0].replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"),"g"); _this = _this.replace(a[i][0],a[i][1]); } return _this; }; //■実行コード (function(){ var sel = Document.Selection; var cmd = [], cid = 1; //コマンド格納用,ID //メニュー生成用関数 function ListToMenu(List, Menu) { for (var i=0, n=List.length; i<n; i++) { var $L = List[i], $Ln = List[i].length; if (typeof $L[0]!=="string") continue; switch (true) { //◆コマンド $L = ["コマンド名","モード",function] case ($Ln===3 && /^(F|RS?)$/.test($L[1]) && typeof $L[2]==="function"): cmd[cid] = {"mode":$L[1], "func":$L[2]}; Menu.Add($L[0]+"\t"+$L[1], cid++); break; //◆サブメニュー $L = ["メニュー名",function] case ($Ln===2 && typeof $L[1]==="function"): var sub_f = [], sub_popup = CreatePopupMenu(); $L[1](sub_f); Menu.AddPopup($L[0], sub_popup); ListToMenu(sub_f, sub_popup); //再帰処理:サブメニュー作成 break; //◆セパレータ $L = ["----"] case ($Ln===1 && /^-+$/.test($L[0])): Menu.Add("", 0, meMenuSeparator); break; } } }; //コマンド一覧からメニュー生成 var popup = CreatePopupMenu(); ListToMenu(f, popup); //ポップアップメニューを表示して処理 if (cid = popup.Track(mePosMouse)) { //※キャンセル(Esc)時は0が返る var $C = cmd[cid]; switch ($C["mode"]) { case "F": //関数を実行 $C["func"](sel); break; case "RS": //選択範囲を行頭行末まで拡張 selectLine(); //↓FALL THROUGH case "R": //選択範囲を置換 var pos = new Pos(); //選択範囲の記憶 sel.Text = $C["func"](sel.Text); pos.set(); //選択範囲の設定 break; } } //■選択範囲を行頭行末まで拡張 function selectLine() { var sel = Document.Selection; var ty = sel.GetTopPointY(mePosLogical); var by = sel.GetBottomPointY(mePosLogical); var bx = sel.GetBottomPointX(mePosLogical); var br =(sel.Text.match(/\n/g)||[]).length; if (bx==1 && by-ty==br && br) by--; //次行行頭を含めないよう対策 sel.SetActivePoint(mePosLogical, 1, by); sel.EndOfLine(false, mePosLogical); sel.SetAnchorPoint(mePosLogical, 1, ty); }; //■位置情報オブジェクト function Pos() { var sel = Document.Selection; this.get = function() { this.acp = sel.GetActivePos(); this.anp = sel.GetAnchorPos(); this.len = Document.Text.length; }; this.set = function() { //字数変化を加味して範囲選択 var acp = this.acp, anp = this.anp, gap = Document.Text.length - this.len; sel.SetActivePos((acp<anp)? acp: acp+gap); sel.SetAnchorPos((acp<anp)? anp+gap: anp); }; return this.get(); }; })(); </source> =拡張コード:コマンド= * (移植) の項目は、マクロ「<b>[[テキスト変換]]</b>」から移植したコマンドです。 * ★印の項目は、スターターパックに収録されているコマンドです。 ==小説/作文 用途== ;★地の文の行頭を字下げ :左引用符 <span style="color:#c00;">‘ “</span> /開き括弧 <span style="color:#c00;">( 〔 [ { 〈 《 「 『 【</span> および 半角空白/全角空白/水平タブ/改行<b style="color:#c00;">以外</b>の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。 <source lang="javascript"> f.push(["地の文の行頭を字下げ","RS",function(a){ //2015/02/14 return a.replace(/^([^‘“(〔[{〈《「『【 \t\n])/gm," $1") }]); </source> ;★括弧前の句読点を除去 :右引用符 <span style="color:#c00;">’ ”</span> /閉じ括弧 <span style="color:#c00;">) 〕 ] } 〉 》 」 』 】</span> の直前に句読点 、。,. がある場合、除去します。 <source lang="javascript"> f.push(["括弧前の句読点を除去","R",function(a){ //2014/03/01 return a.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]); </source> ;★連続する!?を整形 :2文字以上連続する感嘆符 ! /疑問符 ? を半角2文字に整形します。 :例> <span style="background:#bfdfff;">!!/!!?/?!!!/?!!!?</span> → !!/!?/?!/?? <source lang="javascript" style="word-wrap:break-word;"> f.push(["連続する!?を整形","R",function(a){ //2015/03/14 return a.replaceBatch([ [/[!!][!!??]*[!!]/g,"!!"],[/[!!][!!??]*[??]/g,"!?"],[/[??][!!??]*[!!]/g,"?!"],[/[??][!!??]*[??]/g,"??"] ]) }]); </source> ;★三点リーダー(……)に整形 :1~3文字以上連続する中黒・句点・読点などを、三点リーダー2文字 …… に整形します。 :例> <span style="background:#bfdfff;">そんな・・・・。</span> → そんな……。 :※変換対象となるのは以下の8パターンです。 :{|class="wikitable" style="text-align:center;" ! 名称 !! 連続字数 !! 例 !! Shift_JIS !! Unicode |- | 全角読点 ||rowspan="6"| 3字以上 || 、、、 || 0x8141 || U+3001 |- | 全角句点 || 。。。 || 0x8142 || U+3002 |- | 全角カンマ || ,,, || 0x8143 || U+FF0C |- | 全角ピリオド || ... || 0x8144 || U+FF0E |- | 全角中黒 || ・・・ || 0x8145 || U+30FB |- | 半角中黒 || ・・・ || 0xA5 || U+FF65 |- | 三点リーダー ||rowspan="2"| 1字以上 || … || 0x8163 || U+2026 |- | 二点リーダー || ‥ || 0x8164 || U+2025 |} <source lang="javascript"> f.push(["三点リーダー(……)に整形","R",function(a){ //2014/03/01 return a.replace(/、{3,}|。{3,}|,{3,}|.{3,}|・{3,}|・{3,}|…{1,}|‥{1,}/g,"……") }]); </source> ;★全角ダッシュ(――)に整形 :2文字以上連続する長音・罫線などを、全角ダッシュ2文字 ―― に整形します。 :例> <span style="background:#bfdfff;">そんなーーー。</span> → そんな――。 :※変換対象となるのは以下の5パターンです。 :{|class="wikitable" style="text-align:center;" ! 名称 !! 連続字数 !! 例 !! Shift_JIS !! Unicode |- | 全角長音符 ||rowspan="5"| 2字以上 || ーー || 0x815B || U+30FC |- | em ダッシュ<br>(全角ダッシュ) || —— || - || U+2014 |- | 全角ダッシュ<br>(水平線) || ―― || 0x815C || U+2015 |- | 全角マイナス || -- || 0x817C || U+FF0D |- | 罫線(横) || ── || 0x849F || U+2500 |} <source lang="javascript"> f.push(["全角ダッシュ(――)に整形","R",function(a){ //2014/03/01 return a.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}|─{2,}/g,"――") }]); </source> ;青空文庫 ルビを除去 :<span style="color:#c00;">《</span> で始まり <span style="color:#c00;">》</span> で終わる箇所を除去します。ルビ開始位置を表す <span style="color:#c00;">|</span> がある場合、| も除去します。 :例> <span style="background:#bfdfff;">一応《いちおう》何時《いつ》もの/霧の|ロンドン警視庁《スコットランドヤード》</span> → 一応何時もの/霧のロンドン警視庁 <source lang="javascript"> f.push(["青空文庫 ルビを除去","R",function(a){ //2015/09/30 return a.replace(/(?:|([^《\n]+))?《.*?》/g,"$1") }]); </source> ;青空文庫 注記を除去 :<span style="color:#c00;">[#</span> で始まり <span style="color:#c00;">]</span> で終わる箇所を除去します。 :例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※ <source lang="javascript"> f.push(["青空文庫 注記を除去","R",function(a){ //2014/03/14 return a.replace(/[#.*?]/g,"") }]); </source> ;青空文庫 注記(外字以外)を除去 :外字を表す注記 <span style="color:#c00;">※[#~]</span> は例外とし、除去しません。 :例> <span style="background:#bfdfff;">[#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり]</span> → 名※[#二の字点、1-2-22] <source lang="javascript"> f.push(["青空文庫 注記(外字以外)を除去","R",function(a){ //2014/03/14 return a.replace(/(※[#.*?])|[#.*?]/g,"$1") }]); </source> ==Web/HTML 用途== ;★HTMLタグを除去 <source lang="javascript"> f.push(["HTMLタグを除去","R",function(a){ //2015/09/30 return a.replace(/<("[^"]*"|'[^']*'|[^"'>])*>/g,"") }]); </source> ;行末に<br>を付加 <source lang="javascript"> f.push(["行末に<br>を付加","RS",function(a){ //2015/02/14 return a.replace(/$/gm,"<br>") }]); </source> ;<br>を改行に変換 :改行タグを改行に変換します。ただしタグ直後に改行を含む場合は、タグのみ削除します。 :※対応タグは <code><br> <br/> <br /></code> の3種類です。英字の大小は問いません。 :<b style="color:#c00;">※属性付きには対応していません。</b>例> <code><br clear="all"></code> など <source lang="javascript"> f.push(["<br>を改行に変換","R",function(a){ //2015/02/14 return a.replace(/<br( ?\/)?>\n?/ig,"\n") }]); </source> ;★実体参照 &"<> ⇒ &xxx; ;★実体参照 &xxx; ⇒ ␣><"& :HTML で使用される文字実体参照の変換を行います。 :{|class="wikitable" ! 文字 !! 実体参照 !! 備考 |- |align="center"| < || &lt; || 小なり不等号 (less-than sign) |- |align="center"| > || &gt; || 大なり不等号 (greater-than sign) |- |align="center"| " || &quot; || 引用符 (quotation mark) |- |align="center"| & || &amp; || アンド (ampersand) |- |align="center"| || &nbsp; || 折り返し禁止空白 (no-break space) |} :&nbsp; は U+00A0 (No-Break Space) ではなく、U+0020 (半角空白) に変換します。 :空白文字 → &nbsp; の変換は、実用上不都合が多いため行いません。 <source lang="javascript"> f.push(['実体参照 &&"<> → &&xxx;',"R",function(a){ //2015/03/14 return a.replaceBatch([ ["&","&"],['"',"""],["<","<"],[">",">"] ]) }]); f.push(['実体参照 &&xxx; → \u2423><"&&',"R",function(a){ //2015/03/14 return a.replaceBatch([ [" "," "],[">",">"],["<","<"],[""",'"'],["&","&"] ]) }]); </source> :半角空白 → &nbsp; の変換も行う場合は、下記の内容に差し替えてください。 <source lang="javascript"> f.push(['実体参照 &&"<>\u2423 → &&xxx;',"R",function(a){ //2015/03/14 return a.replaceBatch([ ["&","&"],['"',"""],["<","<"],[">",">"],[" "," "] ]) }]); </source> ;★数値参照 &#dec; に変換 :文字列を数値文字参照(10進)形式に変換します。(dec=decimal/十進法) :例> <span style="background:#bfdfff;">Aわ𠀋</span> → &#65;&#12431;&#131083; :→ <b>[[#符号化/復号化]]</b> の節の <b>&#dec; エンコード</b> を参照 ;★数値参照 &#xHEX; に変換 :文字列を数値文字参照(16進)形式に変換します。(HEX=hexadecimal/十六進法) :例> <span style="background:#bfdfff;">Aわ𠀋</span> → &#x41;&#x308F;&#x2000B; :→ <b>[[#符号化/復号化]]</b> の節の <b>&#xHEX; エンコード</b> を参照 ;★数値参照を文字に変換 :数値文字参照(10進/16進)を文字列に変換します。 :例> <span style="background:#bfdfff;">&#65;&#x308F;&#x2000b;</span> → Aわ𠀋 <source lang="javascript" style="word-wrap:break-word;"> f.push(["数値参照を文字に変換","R",function(a){ //2015/03/14 return a.replace(/&#([0-9]{1,7});|&#x([0-9A-Fa-f]{1,6});/g,function(s,nd,nx){var n=Number(nd||"0x"+nx); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]); </source> ==マクロ/コード 用途== ;★行頭 // を付加/削除 :行頭に // が無い行なら // を付加し、有る行なら // を削除します。 :※このコマンドをよく利用される場合は「<b>[[コメントマーク付け外し]]</b>」マクロの導入をオススメします。 <source lang="javascript"> f.push(["行頭 \/\/ を付加/削除","RS",function(a){ //2015/03/14 return a.replace(/^(\/\/)?/gm,function(s){return s? "": "\/\/"}) }]); </source> ;★インデント(半角空白2個) :各行の行頭に半角空白2文字を挿入します。 :※このコマンドをよく利用される場合は「<b>[[字下げ・字上げ]]</b>」マクロの導入をオススメします。 <source lang="javascript"> f.push(["インデント(半角空白2個)","RS",function(a){ //2015/03/14 return a.replace(/^/gm," ") }]); </source> ;挿入 Confirm(|) :文字列 <code>if(!Confirm())Quit();</code> を挿入します。 :<code>Alert()</code> と違い、[キャンセル] ボタンを押すとマクロを強制終了できるため、無限ループにハマっても対処できます。 <source lang="javascript"> f.push(["挿入 Confirm(|)","F",function(a){ //2014/05/31 var p="if(!Confirm(",s="))Quit();"; a.Text=p+a.Text+s; a.CharLeft(false,s.length) }]); </source> ;マクロフォルダを開く :エクスプローラを起動し、「テキスト整形」マクロがあるフォルダを開きます。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["マクロフォルダを開く","F",function(a){ //2015/12/26 new ActiveXObject("Shell.Application").Explore(new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(ScriptFullName)) }]); </source> ;選択範囲を eval で評価 :ステータスバーに eval(選択範囲) した結果を表示します。 :たとえば、選択範囲が <span style="background:#bfdfff;">10*(5+20)</span> なら、250 と表示されます。 <source lang="javascript"> f.push(["選択範囲を eval で評価","F",function(a){ //2014/02/01 if(a.Text){Status=eval(a.Text)} }]); </source> ==挿入/貼付== ;★半角/全角の間を空ける ;★半角英数/全角の間を空ける :半角文字/半角英数と全角文字の間に半角空白を挿入します。 :<b style="color:#c00;">※半角文字=ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。</b> <source lang="javascript"> f.push(["半角/全角の間を空ける","R",function(a){ //2014/02/16 return a.replace(/([!-~。-゚](?=[^!-~。-゚ \t\n])|[^!-~。-゚ \t\n](?=[!-~。-゚]))/g,"$1 ") }]); f.push(["半角英数/全角の間を空ける","R",function(a){ //2014/02/16 return a.replace(/([0-9A-Za-z](?=[^!-~。-゚ \t\n])|[^!-~。-゚ \t\n](?=[0-9A-Za-z]))/g,"$1 ") }]); </source> ;★数値を3桁,区切りに :半角数字列を、3桁毎にカンマで区切ります。小数点以下(ピリオド以降)は桁区切りしません。 :例> <span style="background:#bfdfff;">87654321/0.12345/54321.12345</span> → 87,654,321/0.12345/54,321.12345 <source lang="javascript" style="word-wrap:break-word;"> f.push(["数値を3桁,区切りに","R",function(a){ //2014/10/12 return a.replace(/([^.0-9]|^)([0-9]+)/g,function(s,s1,s2){return s1+s2.replace(/([0-9])(?=(?:[0-9]{3})+$)/g,"$1,")}) }]); </source> ;複製貼り付け... :クリップボードの文字列を、入力した回数分複製してから貼り付けます。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["複製貼り付け...","R",function(a){ //2015/03/26 var r=[],c=ClipboardData.GetData(),n=parseInt(Prompt("複製回数: ※半角数字","")); if(!c||n<1)Quit(); while(n--){r.push(c)} return r.join("") }]); </source> ;★各行行頭/各行行末に貼り付け :クリップボードの文字列を、各行の行頭/行末に貼り付けます。 <source lang="javascript"> f.push(["各行行頭に貼り付け","RS",function(a){ //2015/09/30 var c=ClipboardData.GetData().replace(/(\r\n|[\r\n])$/,""); return a.replace(/^/gm,c) }]); f.push(["各行行末に貼り付け","RS",function(a){ //2015/09/30 var c=ClipboardData.GetData().replace(/(\r\n|[\r\n])$/,""); return a.replace(/$/gm,c) }]); </source> ;★各行行頭/各行行末に文字列付加... :入力した文字列を、各行の行頭/行末に挿入します。 <source lang="javascript"> f.push(["各行行頭に文字列付加...","RS",function(a){ //2015/03/14 var p=Prompt("各行行頭に付加する文字列:",""); if(!p)Quit(); return a.replace(/^/gm,p) }]); f.push(["各行行末に文字列付加...","RS",function(a){ //2015/03/14 var p=Prompt("各行行末に付加する文字列:",""); if(!p)Quit(); return a.replace(/$/gm,p) }]); </source> ;各行先頭/各行末尾に文字列付加... (矩形対応/Mery 2.1.0~) :入力した文字列を、Mery の置換機能を利用して各行の先頭/末尾に挿入します。 :<b style="color:#c00;">※矩形対応には Mery 2.1.0 以降が必要です。</b> :<b style="color:#c00;">※Mery の仕様上、零幅には対応していません。</b>零幅で実行すると、<b>表示行頭</b>に文字列が挿入されます。 :<b style="color:#c00;">※検索強調が解除されます</b>(正確には変更)。 :※コマンド実行時、下記の条件で置換が行われます。 :{|class="wikitable" ! 検索文字列 (先頭) | <code>^(?=.|\n)</code> |- ! 検索文字列 (末尾) | <code>(?<=.)$|^(?=\n)</code> |- ! 置換文字列 | ※入力した文字列 |- ! フラグ | 正規表現を使用する (meFindReplaceRegExp)<br>選択した範囲のみ (meReplaceSelOnly)<br>すべて置換 (meReplaceAll) |} <source lang="javascript" style="word-wrap:break-word;"> f.push(["各行先頭に文字列付加...","F",function(a){ //2015/02/14 var p=Prompt("各行先頭に付加する文字列:",""); if(!p)Quit(); a.Replace("^(?=.|\\n)",p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]); f.push(["各行末尾に文字列付加...","F",function(a){ //2015/02/14 var p=Prompt("各行末尾に付加する文字列:",""); if(!p)Quit(); a.Replace("(?<=.)$|^(?=\\n)",p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]); </source> ;行頭に連番付加 (#) :選択範囲の行頭に連番 (1), (2), (3) … を挿入します。 :※より多彩な連番付加を行いたい場合は「<b>[[連番の挿入]]</b>」「<b>[[連番を挿入]]</b>」マクロの導入をオススメします。 <source lang="javascript"> f.push(["行頭に連番付加 (#)","RS",function(a){ //2015/09/30 var re=/^/gm, n=1, pf="(", sf=")"; return a.replace(re,function(s){return pf+(n++)+sf}) }]); </source> ;行頭に連番付加 (#/Σ) :選択行数を Σ として、連番 (1/Σ), (2/Σ), (3/Σ) … を挿入します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["行頭に連番付加 (#/Σ)","RS",function(a){ //2015/09/30 var re=/^/gm, n=1, m=(a.match(re)||[]).length, pf="(", sf="/"+m+")"; return a.replace(re,function(s){return pf+(n++)+sf}) }]); </source> ;行頭に連番付加 (0#) :連番が2桁以上になる場合、桁揃えした連番 (01), (02), (03) … を挿入します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["行頭に連番付加 (0#)","RS",function(a){ //2015/09/30 var re=/^/gm, n=1, m=(a.match(re)||[]).length, pf="(", sf=")", sp="0", k=String(m).length, sp=new Array(k).join(sp); return a.replace(re,function(s){return pf+(sp+(n++)).slice(-k)+sf}) }]); </source> ;※行頭に連番付加系コマンドの違い :{|class="wikitable" ! 実行前 !! (#) !! (#/Σ) !! (0#) |- | 1行目<br>2行目<br>…<br>9行目<br>10行目<br>11行目<br>…<br>99行目<br>100行目 | (1)1行目<br>(2)2行目<br>…<br>(9)9行目<br>(10)10行目<br>(11)11行目<br>…<br>(99)99行目<br>(100)100行目 | (1/100)1行目<br>(2/100)2行目<br>…<br>(9/100)9行目<br>(10/100)10行目<br>(11/100)11行目<br>…<br>(99/100)99行目<br>(100/100)100行目 | (001)1行目<br>(002)2行目<br>…<br>(009)9行目<br>(010)10行目<br>(011)11行目<br>…<br>(099)99行目<br>(100)100行目 |} ==除去/削除== ;★空白文字を除去 :空白文字(半角空白/全角空白/水平タブ)を除去します。 <source lang="javascript"> f.push(["空白文字を除去","R",function(a){ //2014/02/16 return a.replace(/[ \t]+/g,"") }]); </source> ;★行頭行末の空白を除去 (移植) ;★行頭の/行末の空白を除去 (移植) :行頭および行末にある空白文字を除去します。 <source lang="javascript"> f.push(["行頭行末の空白を除去","RS",function(a){ //2015/02/14 return a.replace(/^[ \t]+|[ \t]+$/gm,"") }]); f.push(["行頭の空白を除去","RS",function(a){ //2015/02/14 return a.replace(/^[ \t]+/gm,"") }]); f.push(["行末の空白を除去","RS",function(a){ //2015/02/14 return a.replace(/[ \t]+$/gm,"") }]); </source> ;★空白行を削除 :空白行(改行/半角空白/全角空白/水平タブのみの行)を削除します。 <source lang="javascript"> f.push(["空白行を削除","RS",function(a){ //2015/03/14 return a.replace(/^[ \t]*$\n?/gm,"") }]); </source> ;空白行を圧縮 :連続する空白行を1行の空行に変換します。連続しない(=1行の)空白行は削除します。 <source lang="javascript"> f.push(["空白行を圧縮","RS",function(a){ //2015/02/14 return a.replace(/^[ \t]+$/gm,"").replace(/^(\n)\n+|^\n/gm,"$1") }]); </source> ;空白行を減量 :連続する空白行を1行分削減します。 :空白行の連続が3行なら2行に、2行なら1行に、1行なら0行(=削除)になります。 <source lang="javascript"> f.push(["空白行を減量","RS",function(a){ //2015/02/14 return a.replace(/((?:^[ \t]*$\n?)*)(?:^[ \t]*$\n?)/gm,"$1") }]); </source> ;★重複行を削除 (移植) :同じ内容の行が2個以上ある場合、2個目以降を削除します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["重複行を削除","RS",function(a){ //2015/02/14 var a=a.split("\n"),b=[],map={}; for(var i=0,n=a.length;i<n;i++){ if(!map[a[i]]){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]); </source> ;重複行を削除(空白行は除く) :空白行(改行/半角空白/全角空白/水平タブのみの行)は例外とし、削除しません。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["重複行を削除(空白行は除く)","RS",function(a){ //2015/02/14 var a=a.split("\n"),b=[],map={}; for(var i=0,n=a.length;i<n;i++){ if(/^[ \t]*$/.test(a[i])||!map[a[i]]){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]); </source> ;★連続する重複行を削除 <source lang="javascript"> f.push(["連続する重複行を削除","RS",function(a){ //2015/02/14 return a.replace(/(^.*$)\n(^\1$\n?)+/gm,"$2") }]); </source> ;※空白行/重複行削除系コマンドの違い (☐ は空白/↵ は改行) :{|class="wikitable" !colspan="4"| 空白行 !rowspan="3" width="6px"| !colspan="4"| 重複行 |- ! 実行前 !! ~を削除 !! ~を圧縮 !! ~を減量 ! 実行前 !! ~を削除 !! 空白行は除く !! 連続する~ |-style="vertical-align:top;" | 1行目↵<br>☐↵<br>2行目↵<br>☐↵<br>☐☐↵<br>3行目↵<br>☐↵<br>☐☐↵<br>☐☐☐↵<br>4行目 | 1行目↵<br>2行目↵<br>3行目↵<br>4行目 | 1行目↵<br>2行目↵<br>↵<br>3行目↵<br>↵<br>4行目 | 1行目↵<br>2行目↵<br>☐↵<br>3行目↵<br>☐↵<br>☐☐↵<br>4行目 | あいうえお↵<br>☐↵<br>☐↵<br>カキクケコ↵<br>カキクケコ↵<br>☐↵<br>☐☐↵<br>☐↵<br>あいうえお↵<br>あいうえお | あいうえお↵<br>☐↵<br>カキクケコ↵<br>☐☐ | あいうえお↵<br>☐↵<br>☐↵<br>カキクケコ↵<br>☐↵<br>☐☐↵<br>☐ | あいうえお↵<br>☐↵<br>カキクケコ↵<br>☐↵<br>☐☐↵<br>☐↵<br>あいうえお |} ;★入力文字列を含む/含まない行を削除... <source lang="javascript" style="word-wrap:break-word;"> f.push(["入力文字列を含む行を削除...","RS",function(a){ //2015/03/14 var p=Prompt("以下の文字列を含む行を削除:",""); if(!p)Quit(); return a.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? "":s}) }]); f.push(["入力文字列を含まない行を削除...","RS",function(a){ //2015/03/14 var p=Prompt("以下の文字列を含まない行を削除:",""); if(!p)Quit(); return a.replace(/^(.*)$\n?/gm,function(s,t){return (t.indexOf(p)>=0)? s:""}) }]); </source> ;正規表現に一致する/しない行を削除... :<b style="color:#c00;">※正規表現は、JScript / JavaScript の仕様に則り記述します。</b>Mery の正規表現 (鬼車) と仕様が異なる点があるので注意してください。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["正規表現に一致する行を削除...","RS",function(a){ //2015/03/14 var p=Prompt("以下の正規表現に一致する行を削除:",""); if(!p)Quit(); p=new RegExp(p); return a.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? "":s}) }]); f.push(["正規表現に一致しない行を削除...","RS",function(a){ //2015/03/14 var p=Prompt("以下の正規表現に一致しない行を削除:",""); if(!p)Quit(); p=new RegExp(p); return a.replace(/^(.*)$\n?/gm,function(s,t){return p.test(t)? s:""}) }]); </source> ==検索/置換== ;ASCII文字を単語検索 :空白文字などを除く ASCII 印字可能文字 (U+0021~007E) が1文字以上連続する箇所を検索します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["ASCII文字を単語検索","F",function(a){ //2017/05/28 a.Find("(?<!\\g<Graph>)(?<Graph>[!-~])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); </source> ;半角カナを単語検索 :半角カナ類 (。 「 」 、 ・ ヲ~ッ ー ア~ン ゙ ゚) が1文字以上連続する箇所を検索します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["半角カナを単語検索","F",function(a){ //2017/05/28 a.Find("(?<!\\g<HKana>)(?<HKana>[。-゚])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); </source> ;全角英数を単語検索 :全角英数字 (0~9 A~Z a~z) が1文字以上連続する箇所を検索します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["全角英数を単語検索","F",function(a){ //2017/05/28 a.Find("(?<!\\g<FAlnm>)(?<FAlnm>[0-9A-Za-z])+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); </source> ;CJK漢字を単語検索 :CJK (China/Japan/Korea) の漢字が1文字以上連続する箇所を検索します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["CJK漢字を単語検索","F",function(a){ //2017/05/28 a.Find("(?<!\\g<Han>\\g<VS>|\\g<Han>)(?:(?<Han>[\\p{Han}])(?<VS>[\\x{FE00}-\\x{FE02}\\x{E0100}-\\x{E01EF}])?)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); </source> ;ひらがなを単語検索 ;カタカナを単語検索 :平仮名/片仮名が1文字以上連続する箇所を検索します。 :※検索対象となる文字は、下表のとおりです。囲み文字 ㋐ や組み文字 ㍍ は除外しています。 :{|class="wikitable" style="text-align:center;" ! !! 種別 !! 文字 !! Shift_JIS !! Unicode !! 備考 |- !rowspan="3"| 平仮名<br>(かな) |rowspan="3"| 全角ひらがな (89字) | ぁ ~ ん<br>ゔゕゖ || 0x829F~82F1<br>- || U+3041~3093<br>U+3094~3096 || ※SJIS では ゔゕゖ の3字は保存不可 |- | ゝゞ || 0x8154, 8155 || U+309D, 309E || 踊り字(繰り返し) |- | ゟ || - || U+309F || 「より」の合字 |- !rowspan="5"| 片仮名<br>(カナ) |rowspan="3"| 全角カタカナ (93字) | ァ ~ ヶ<br>ヷヸヹヺ || 0x8340~8396<br>- || U+30A1~30F6<br>U+30F7~30FA || ※SJIS では ヷヸヹヺ の4字は保存不可 |- | ヽヾ || 0x8152, 8153 || U+30FD, 30FE || 踊り字(繰り返し) |- | ヿ || - || U+30FF || 「コト」の合字 |- | 半角カタカナ (55字) || ヲ ~ ッ<br>ア ~ ン || 0xA6~AF<br>0xB1~DD || U+FF66~FF6F<br>U+FF71~FF9D || |- | カタカナ拡張 (16字) || ㇰ ~ ㇿ || - || U+31F0~31FF || アイヌ語表記などに用いる |- !rowspan="5"| 記号 |colspan="5"| <span style="color:#c00;">※以下は、<b>仮名の後</b>に続いて出現する場合のみ検索される。</span>例> 複製゜ー<span style="background:#b4e4b4;">コヒ゜ー</span> |- | 半角/全角濁点 (2字) || ゙ ゛ || 0xDE, 814A || U+FF9E, 309B || |- | 半角/全角半濁点 (2字) || ゚ ゜ || 0xDF, 814B || U+FF9F, 309C || |- | 結合用濁点/半濁点 (2字) || ゙ ゚ || - || U+3099, 309A || 結合文字 |- | 半角/全角長音符 (2字) || ー ー || 0xB0, 815B || U+FF70, 30FC || |} <source lang="javascript" style="word-wrap:break-word;"> f.push(["ひらがなを単語検索","F",function(a){ //2017/05/28 a.Find("(?<!\\g<Kana>\\g<Mark>\\g<Mark>|\\g<Kana>\\g<Mark>|\\g<Kana>)(?:(?<Kana>[ぁ-\\x{3096}ゝゞ\\x{309F}])(?<Mark>[\\x{3099}\\x{309A}゛゙゜゚ーー])*)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); f.push(["カタカナを単語検索","F",function(a){ //2017/05/28 a.Find("(?<!\\g<Kana>\\g<Mark>\\g<Mark>|\\g<Kana>\\g<Mark>|\\g<Kana>)(?:(?<Kana>[ァ-\\x{30FA}ヽヾ\\x{30FF}ヲ-ッア-ン\\x{31F0}-\\x{31FF}])(?<Mark>[\\x{3099}\\x{309A}゛゙゜゚ーー])*)+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); </source> ;CP932依存文字を検索 :Shift_JIS (CP932) の環境依存文字 (NEC特殊文字・IBM拡張文字・ユーザー定義外字・未定義文字) を検索します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["CP932依存文字を検索","F",function(a){ //2017/05/28 a.Find("[纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏\\x{FA10}增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙\\x{FA12}晳暙暠暲暿曺朎\\x{F929}杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇\\x{FA15}燁燾犱犾猤\\x{FA16}獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦\\x{FA17}睆劯砡硎硤硺礰\\x{FA18}\\x{FA19}\\x{FA1A}禔\\x{FA1B}禛竑竧\\x{FA1C}竫箞\\x{FA1D}絈絜綷綠緖繒罇羡\\x{FA1E}茁荢荿菇菶葈蒴蕓蕙蕫﨟薰\\x{FA20}﨡蠇裵訒訷詹誧誾諟\\x{FA22}諶譓譿賰賴贒赶﨣軏﨤\\x{FA25}遧郞\\x{FA26}鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒\\x{F9DC}﨩隝隯霳霻靃靍靏靑靕顗顥\\x{FA2A}\\x{FA2B}餧\\x{FA2C}馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫\\x{FA2D}鸙黑①-⑳Ⅰ-Ⅹⅰ-ⅹ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼㍻∮∑∟⊿¦'"\\x{E000}-\\x{E757}\\x{80}\\x{F8F0}-\\x{F8F3}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); </source> ;サロゲートペアを検索 :UTF-16において2バイト2個組で1文字を形成する文字 (U+10000~10FFFF) を検索します。 <source lang="javascript"> f.push(["サロゲートペアを検索","F",function(a){ //2015/09/30 a.Find("[\\x{10000}-\\x{10FFFF}]", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); </source> ;結合文字列を検索 :2要素以上を組み合わせて1文字を形成する文字を検索します。 :※基底文字+結合文字の組合せを検索するため、それ以外の組合せで形成される文字は正しく検索・選択できません。 :※結合文字列や異体字を表示するには、対応するソフトウェアやフォントが必要です。 :{|class="wikitable" style="text-align:center;" ! !colspan="4"| ラテン文字 !colspan="3"| ひらがな !colspan="3"| 漢字(異体字) !colspan="2"| 囲み文字 |- ! 実際の表示 | ǖ ||colspan="3"| ǖ | じ ||colspan="2"| じ | 辻 ||colspan="2"| 辻󠄀 |colspan="2"| あ⃞ |- ! 構成要素 | ǖ || u||̈||̄ | じ || し||゙ | 辻 || 辻||󠄀 | あ||⃞ |- ! Unicode | 01D6 || 0075||0308||0304 | 3058 || 3057||3099 | 8FBB || 8FBB||E0100 | 3042 || 20DE |} <source lang="javascript" style="word-wrap:break-word;"> f.push(["結合文字列を検索","F",function(a){ //2017/05/28 a.Find("(?:[^\\p{M}\\n]|^)[\\p{M}]+", meFindReplaceCase+meFindReplaceRegExp+meFindAround+meFindNext) }]); </source> ;選択文字列を検索 :「検索する文字列」に選択文字列を設定して「次/下を検索」します。 :「次/前の文字列を検索」と異なり、改行を含む文字列(複数行)も検索できるのが特徴です。 :<b style="color:#c00;">※Mery の仕様上、改行を含む場合は検索強調が効きません。</b> <source lang="javascript" style="word-wrap:break-word;"> f.push(["選択文字列を検索","F",function(a){ //2015/02/14 if(a.Text)a.Find(a.Text.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"), meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]); </source> ;選択文字列をすべて削除 :「検索する文字列」に選択文字列を、「置換後の文字列」に空欄を設定して「すべて置換」します。 :上記のコマンド「選択文字列を検索」と同様、改行を含む文字列(複数行)も削除できます。 :<b style="color:#c00;">※検索強調が解除されます</b>(正確には変更)。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["選択文字列をすべて削除","F",function(a){ //2015/02/14 if(a.Text)a.Replace(a.Text.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"),"", meFindReplaceRegExp+meFindReplaceCase+meReplaceAll) }]); </source> ;検索強調をすべて解除 :「検索文字列の強調を解除」をすべての文書で実行します。 :ひとつひとつ解除するのが面倒な場合などにご利用ください。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["検索強調をすべて解除","F",function(a){ //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}} }]); </source> ;検索結果カウント :前回(直前)の検索条件で文書全体を検索し直し、一致した件数をステータスバーに表示します。 :<b style="color:#c00;">※検索条件が複雑なほど、件数が多いほど処理に時間がかかります</b>(作者の環境では、1000件で約2秒かかりました)。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["検索結果カウント","F",function(a){ //2015/09/30 var t=new Date(),n=-1,acp=a.GetActivePos(),anp=a.GetAnchorPos(),sx=ScrollX,sy=ScrollY; Redraw=false; Status=""; a.StartOfDocument(); do{a.FindRepeat(meFindNext);n++}while(!Status); a.SetActivePos(acp);a.SetAnchorPos(anp);ScrollX=sx;ScrollY=sy; Redraw=true; Status=n+"件の検索結果 (処理時間: "+(new Date()-t)/1000+"秒)" }]); </source> ==文書情報== ;総字行数カウント :総文字数と総表示行数をステータスバーに表示します。 :表示される数値は、「すべて選択」時に表示される字数・行数と同値になります。<br>※サロゲートペアは2文字扱い。結合文字や異体字セレクタも字数にカウントする。 <source lang="javascript"> f.push(["総字行数カウント","F",function(a){ //2015/03/14 Status=Document.Text.length+"文字 ("+Document.GetLines()+"表示行)" }]); </source> :※サロゲートペアを1文字と扱い、論理行数をカウントする場合は、下記のようにします。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["総字行数カウント","F",function(a){ //2015/09/30 Status=(Document.Text.length-(Document.Text.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[]).length)+"文字 ("+Document.GetLines(0)+"論理行)" }]); </source> ;編集中のファイルのパスをコピー ;編集中の全ファイルのパスをコピー :現在編集中のファイルのパスをクリップボードにコピーします。 :新規作成ファイルなどパスが存在しない場合は、<無題> の文字がコピーされます。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["編集中のファイルのパスをコピー","F",function(a){ //2015/03/14 ClipboardData.SetData(Document.FullName||"<無題>") }]); f.push(["編集中の全ファイルのパスをコピー","F",function(a){ //2015/03/14 var list=[]; for(var ei=0;ei<Editors.Count;ei++){var d=Editors.Item(ei).Documents; for(var i=0;i<d.Count;i++){list.push(d.Item(i).FullName||"<無題>")}} ClipboardData.SetData(list.join("\r\n")) }]); </source> ==並べ替え== ;行の並べ替え(Unicode 昇順/降順) (移植) :行をUnicode(UTF-16)順で並べ替えます。 :※より柔軟に並べ替えたい場合は「<b>[[行並べ替え]]</b>」マクロの導入をオススメします。 <source lang="javascript"> f.push(["行の並べ替え(Unicode 昇順)","RS",function(a){ //2014/02/16 return a.split("\n").sort().join("\n") }]); f.push(["行の並べ替え(Unicode 降順)","RS",function(a){ //2014/02/16 return a.split("\n").sort().reverse().join("\n") }]); </source> ;行の並べ替え(逆順) :行を逆順に並べ替えます。 <source lang="javascript"> f.push(["行の並べ替え(逆順)","RS",function(a){ //2014/10/12 return a.split("\n").reverse().join("\n") }]); </source> ;行のシャッフル :行をランダムに並べ替えます。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["行のシャッフル","RS",function(a){ //2014/10/12 var a=a.split("\n"),i=a.length,j,t; while(i){j=Math.floor(Math.random()*i--); t=a[i];a[i]=a[j];a[j]=t;} return a.join("\n") }]); </source> ;文字の並べ替え(逆順) :各行の文字を逆順に並べ替えます。 :例> <span style="background:#bfdfff;">文字の並べ替え</span> → え替べ並の字文 :※以下の文字にも対応しています。対応していない文字は位置がズレます。 :* サロゲートペア (U+10000~10FFFF) :* 結合文字の一部 (U+0300~6F, 1AB0~FF, 1DC0~FF, 20D0~FF, 3099~A, FE20~F) :* 制御文字の一部 (U+200C~D) :* 異体字セレクタ (U+180B~D, FE00~F, E0100~EF) :* 絵文字の肌色指定 (U+1F3FB~F) :* 絵文字の国旗 (U+1F1E6~FF) :例> <span style="background:#bfdfff;">𠮟る/りんご/tréma</span> → amért/ごんり/る𠮟 :{|class="wikitable" style="text-align:center;" ! 実行前 |colspan="2"|𠮟||る !rowspan="6" width="6px"| |り||ん||colspan="2"|ご !rowspan="6" width="6px"| |t||r||colspan="2"|é||m||a |- ! Unicode |colspan="2"|20B9F||308B |308A||3093||style="background:#fe6;"|3053||style="background:#fcc;"|3099 |0074||0072||style="background:#fe6;"|0065||style="background:#fcc;"|0301||006D||0061 |- ! UTF-16BE |style="background:#fe6;"|D842||style="background:#fcc;"|DF9F||308B |colspan="4"|※同上 |colspan="6"|※同上 |- !rowspan="3"|実行後 |る||colspan="2"|𠮟 |colspan="2"|ご||ん||り |a||m||colspan="2"|é||r||t |- |308B||colspan="2"|20B9F |style="background:#fe6;"|3053||style="background:#fcc;"|3099||3093||308A |0061||006D||style="background:#fe6;"|0065||style="background:#fcc;"|0301||0072||0074 |- |308B||style="background:#fe6;"|D842||style="background:#fcc;"|DF9F |colspan="4"|※同上 |colspan="6"|※同上 |} <source lang="javascript" style="word-wrap:break-word;"> f.push(["文字の並べ替え(逆順)","R",function(a){ //2015/09/30 var re=new RegExp(/(?:(?:\uD83C[\uDDE6-\uDDFF]){2}|[\uD800-\uDBFF][\uDC00-\uDFFF]|.)(?:[\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\u3099\u309A\uFE20-\uFE2F\u200C\u200D\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF]|\uD83C[\uDFFB-\uDFFF])*|\n/g); return a.replace(/.+/g,function(s){return s.match(re).reverse().join("")}) }]); </source> ;文字のシャッフル :各行の文字をランダムに並べ替えます。 :例> <span style="background:#bfdfff;">文字のシャッフル</span> → フ字のャシッル文 <source lang="javascript" style="word-wrap:break-word;"> f.push(["文字のシャッフル","R",function(a){ //2015/09/30 var re=new RegExp(/(?:(?:\uD83C[\uDDE6-\uDDFF]){2}|[\uD800-\uDBFF][\uDC00-\uDFFF]|.)(?:[\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\u3099\u309A\uFE20-\uFE2F\u200C\u200D\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF]|\uD83C[\uDFFB-\uDFFF])*|\n/g); return a.replace(/.+/g,function(s){var a=s.match(re),i=a.length,j,t; while(i){j=Math.floor(Math.random()*i--); t=a[i];a[i]=a[j];a[j]=t;} return a.join("")}) }]); </source> ==字種/数値変換== ;大文字/小文字に変換 :Mery の「選択範囲の変換」機能の一部を再現したものです。 <source lang="javascript"> f.push(["大文字に変換","F",function(a){ //2013/09/15 a.ChangeCase(meCaseUpperCase) }]); f.push(["小文字に変換","F",function(a){ //2013/09/15 a.ChangeCase(meCaseLowerCase) }]); </source> ;半角/全角に変換 :Mery の「選択範囲の変換」機能の一部を再現したものです。 <source lang="javascript"> f.push(["半角に変換","F",function(a){ //2013/09/15 a.ChangeWidth(meWidthHalfWidth) }]); f.push(["全角に変換","F",function(a){ //2013/09/15 a.ChangeWidth(meWidthFullWidth) }]); </source> ;★半角英数⇒全角 (移植) ;★全角英数⇒半角 (移植) <source lang="javascript"> f.push(["半角英数→全角","R",function(a){ //2014/02/10 return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]); f.push(["全角英数→半角","R",function(a){ //2014/02/10 return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]); </source> ;★半角カナ⇒全角 ;★全角カナ⇒半角 <source lang="javascript" style="word-wrap:break-word;"> f.push(["半角カナ→全角","R",function(a){ //2015/03/14 return a.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]); </source> <source lang="javascript" style="word-wrap:break-word;"> f.push(["全角カナ→半角","R",function(a){ //2015/03/14 return a.replaceBatch([ ["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]) }]); </source> ;★全角かな⇒カナ ;★全角カナ⇒かな :全角ひらがなと全角カタカナを変換します。 :ただし、ヴヵヶ → ゔゕゖ の変換は行いません(Shift_JIS では保存できない文字のため)。 <source lang="javascript"> f.push(["全角かな→カナ","R",function(a){ //2014/02/10 return a.replace(/[\u3041-\u3096ゝゞ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x60)}) }]); f.push(["全角カナ→かな(ヴヵヶ除く)","R",function(a){ //2015/02/14 return a.replace(/[\u30A1-\u30F3ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]); </source> :ヴヵヶ → ゔゕゖ の変換も行う場合は、下記の内容に差し替えてください。 <source lang="javascript"> f.push(["全角カナ→かな","R",function(a){ //2014/02/10 return a.replace(/[\u30A1-\u30F6ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]); </source> ;標準変換 :マクロ「<b>[[標準変換]]</b>」を移植(一部改変)したものです。 :全角英数・全角記号は半角に、半角カナは全角に変換します。 :{|class="wikitable" ! 文字 !! 変換前 ! 文字 !! 標準変換版 ! 文字 !! テキスト整形版 |- |align="center"| ‘ || 全角左シングルクォート |align="center"| ` || 半角グレーブアクセント |align="center"| ' || 半角アポストロフィー/シングルクォート |- |align="center"| ` || 全角グレーブアクセント | || ※変換しない |align="center"| ` || 半角グレーブアクセント |} <source lang="javascript" style="word-wrap:break-word;"> f.push(["標準変換","R",function(a){ //2015/03/14 return a.replaceBatch([ [" "," "],["!","!"],["“",'"'],["”",'"'],["#","#"],["$","$"],["%","%"],["&","&"],["‘","'"],["’","'"],["(","("],[")",")"],["*","*"],["+","+"],[",",","],["-","-"],[".","."],["/","/"],["0","0"],["1","1"],["2","2"],["3","3"],["4","4"],["5","5"],["6","6"],["7","7"],["8","8"],["9","9"],[":",":"],[";",";"],["<","<"],["=","="],[">",">"],["?","?"],["@","@"],["A","A"],["B","B"],["C","C"],["D","D"],["E","E"],["F","F"],["G","G"],["H","H"],["I","I"],["J","J"],["K","K"],["L","L"],["M","M"],["N","N"],["O","O"],["P","P"],["Q","Q"],["R","R"],["S","S"],["T","T"],["U","U"],["V","V"],["W","W"],["X","X"],["Y","Y"],["Z","Z"],["[","["],["¥","\\"],["]","]"],["^","^"],["_","_"],["`","`"],["a","a"],["b","b"],["c","c"],["d","d"],["e","e"],["f","f"],["g","g"],["h","h"],["i","i"],["j","j"],["k","k"],["l","l"],["m","m"],["n","n"],["o","o"],["p","p"],["q","q"],["r","r"],["s","s"],["t","t"],["u","u"],["v","v"],["w","w"],["x","x"],["y","y"],["z","z"],["{","{"],["|","|"],["}","}"],["~","~"],["ヴ","ヴ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]) }]); </source> ;★10⇒16進数 :半角数字列を10進数値とみなし、16進数値に変換します。 :例> <span style="background:#bfdfff;">291/15/44015</span> → 123/F/ABEF <source lang="javascript"> f.push(["10→16進数","R",function(a){ //2014/05/31 return a.replace(/[0-9]+/g,function(s){return Number(s).toString(16).toUpperCase()}) }]); </source> ;★16⇒10進数 :半角英数字列を16進数値とみなし、10進数値に変換します。英字の大小、0x の有無は問いません。 :例> <span style="background:#bfdfff;">123/0x0F/abef</span> → 291/15/44015 <source lang="javascript"> f.push(["16→10進数","R",function(a){ //2014/10/12 return a.replace(/(?:0x)?([0-9A-Fa-f]+)/g,function(s,n){return Number("0x"+n)}) }]); </source> ;2進接頭辞換算 :半角数字列を 2<sup>10</sup> = 1024 の倍量単位 (Ki,Mi,Gi...Yi) に変換します(小数点第3位を四捨五入)。 :例> <span style="background:#bfdfff;">1023/1024/54321/1,048,576/1,073,741,824</span> → 1023/1.00Ki/53.05Ki/1.00Mi/1.00Gi <source lang="javascript" style="word-wrap:break-word;"> f.push(["2進接頭辞換算","R",function(a){ //2015/03/14 var k=1024,p="?KMGTPEZY"; return a.replace(/[0-9]+(,?[0-9]{3})+/g,function(s){var x=0,n=s.replace(/,/g,""); if(n<k)return s; while(n>=k&&x<8){n/=k;x++} return n.toFixed(2)+p.charAt(x)+"i"}) }]); </source> ==符号化/復号化== ;URL %エンコード/デコード(UTF-8) :URL アドレスに使用される UTF-8 パーセントエンコーディングの符号化/復号化を行います。 <source lang="javascript"> f.push(["URL %エンコード(UTF-8)","R",function(a){ //2014/02/01 return encodeURI(a).replace(/%0D%0A|%0D|%0A/g,"\n") }]); f.push(["URL %デコード(UTF-8)","R",function(a){ //2014/02/01 return decodeURIComponent(a) }]); </source> ;Base64エンコード/デコード(UTF-8) :[http://ja.wikipedia.org/wiki/Base64 Base64] 形式の符号化/復号化を行います。 :※バイナリデータ(画像や音声など)の復号化は、[編集]→[選択範囲の変換]→[Base64デコード] をご利用ください。 :<b style="color:#c00;">エンコード時の注意点</b> :* 改行は LF (0x0A) とみなされます(Mery の内部改行文字が LF のため)。 :<b style="color:#c00;">デコード時の注意点</b> :* デコード前に A~Z a~z 0~9 + / 以外の文字(改行含む)は削除されます。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["Base64エンコード(UTF-8)","R",function(txt){ //2015/03/14 txt=unescape(encodeURIComponent(txt)); var len=txt.length, out="", map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); for(var i=0;i<len;i+=3){var tmp=(txt.charCodeAt(i)<<16)|(txt.charCodeAt(i+1)<<8)|(txt.charCodeAt(i+2)); out+=map[tmp>>>18&0x3F]+map[tmp>>>12&0x3F]+map[tmp>>>6&0x3F]+map[tmp&0x3F]} if(len%3)out=out.slice(0,len%3-3)+"===".slice(len%3); return out }]); f.push(["Base64デコード(UTF-8)","R",function(txt){ //2015/03/14 txt=txt.replace(/[^A-Za-z0-9+/]/g,""); var len=txt.length, out="", map=[], chr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for(var i=0;i<chr.length;i++){map[chr.charAt(i)]=i} for(var i=0;i<len;i+=4){var tmp=(map[txt.charAt(i)]<<18)|(map[txt.charAt(i+1)]<<12)|(map[txt.charAt(i+2)]<<6)|(map[txt.charAt(i+3)]); out+=String.fromCharCode(tmp>>>16&0xFF,tmp>>>8&0xFF,tmp&0xFF)} out=out.replace(/([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}){1,50}/g,function(str){return decodeURIComponent(escape(str))}); if(len%4)out=out.slice(0,len%4-4); return out }]); </source> ;\uHHHH エンコード/デコード :JavaScript などで使用される \uHHHH 形式の変換を行います。※HHHH=4桁の16進数・UTF-16BEバイナリ値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> ←→ <span style="background:#bfdfff;">\u0041\u308F\uD840\uDC0B</span> <source lang="javascript" style="word-wrap:break-word;"> f.push(["\\uHHHH エンコード","R",function(a){ //2014/02/22 return a.replace(/./g,function(s){return "\\u"+("000"+s.charCodeAt(0).toString(16).toUpperCase()).slice(-4)}) }]); f.push(["\\uHHHH デコード","R",function(a){ //2014/10/12 return a.replace(/\\u([0-9A-Fa-f]{4})/g,function(s,n){return String.fromCharCode(Number("0x"+n))}) }]); </source> ;\u4H \U8H エンコード/デコード :Unicode で使用される \u4H および \U8H 形式の変換を行います。※4H, 8H=4桁, 8桁の16進数・Unicodeスカラー値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> ←→ <span style="background:#bfdfff;">\u0041\u308F\U0002000B</span> <source lang="javascript" style="word-wrap:break-word;"> f.push(["\\u4H \\U8H エンコード","R",function(a){ //2015/09/30 return a.replace(/.+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00);r+="\\U"+toHex(u,8);continue}} r+="\\u"+toHex(u,4)} return r}); function toHex(n,d){return ("000"+n.toString(16).toUpperCase()).slice(-d)} }]); f.push(["\\u4H \\U8H デコード","R",function(a){ //2015/09/30 return a.replace(/\\u([0-9A-Fa-f]{4})|\\U([0-9A-Fa-f]{8})/g,function(s,u4,U8){var n=Number("0x"+(u4||U8)); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]); </source> ;\x{hex} エンコード/デコード :Mery の正規表現 (鬼車) などで使用される \x{hex} 形式の変換を行います。※hex=1~6桁の16進数・Unicodeスカラー値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> ←→ <span style="background:#bfdfff;">\x{41}\x{308f}\x{2000b}</span> <source lang="javascript" style="word-wrap:break-word;"> f.push(["\x{hex} エンコード","R",function(a){ //2014/10/12 return a.replace(/.+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("\\x{"+u.toString(16)+"}")} return r}) }]); f.push(["\x{hex} デコード","R",function(a){ //2015/03/14 return a.replace(/\\x\{([0-9A-Fa-f]{1,6})\}/g,function(s,n){n=Number("0x"+n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]); </source> ;&#dec; エンコード/デコード :HTML などで使用される &#dec; 形式の変換を行います。※dec=1~7桁の10進数・Unicodeスカラー値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> ←→ <span style="background:#bfdfff;">&#65;&#12431;&#131083;</span> <source lang="javascript" style="word-wrap:break-word;"> f.push(["&&#dec; エンコード","R",function(a){ //2014/10/12 return a.replace(/.+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("&#"+u+";")} return r}) }]); f.push(["&&#dec; デコード","R",function(a){ //2015/03/14 return a.replace(/&#([0-9]{1,7});/g,function(s,n){n=Number(n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]); </source> ;&#xHEX; エンコード/デコード :HTML などで使用される &#xHEX; 形式の変換を行います。※HEX=1~6桁の16進数・Unicodeスカラー値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> ←→ <span style="background:#bfdfff;">&#x41;&#x308F;&#x2000B;</span> <source lang="javascript" style="word-wrap:break-word;"> f.push(["&&#xHEX; エンコード","R",function(a){ //2014/10/12 return a.replace(/.+/g,function(s){var r="",u,v; for(var i=0;i<s.length;i++){u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r+=("&#x"+u.toString(16).toUpperCase()+";")} return r}) }]); f.push(["&&#xHEX; デコード","R",function(a){ //2015/03/14 return a.replace(/&#x([0-9A-Fa-f]{1,6});/g,function(s,n){n=Number("0x"+n); return (n<=0xFFFF)?String.fromCharCode(n): (n<=0x10FFFF)?String.fromCharCode(n-0x10000>>10|0xD800,n&0x3FF|0xDC00): s}) }]); </source> ==コマンド テンプレート== 拡張コードの雛形を挿入します。コマンドを自作したい場合にご利用ください。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["コマンド テンプレート",function(f){ //2015/03/14 f.push(["コマンド F (Function)","F",function(a){ var p='f.push(["","F",function(a){\n ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]); f.push(["コマンド R (Replace)","F",function(a){ var p='f.push(["","R",function(a){\n return ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]); f.push(["コマンド RS (Select-line)","F",function(a){ var p='f.push(["","RS",function(a){\n return ',s=' }]);\n'; a.StartOfLine(); Document.Write(p+s); a.CharLeft(false,s.length) }]); f.push(["サブメニュー","F",function(a){ var p='f.push(["",function(f){\n',s='}]);\n'; Document.Write(p+a.Text+s) }]); f.push(["セパレータ","F",function(a){ a.StartOfLine(); Document.Write('f.push(["----"]);\n') }]); }]); </source> ;連続置換・配列作成補助 :<code>replaceBatch</code> (連続置換メソッド) の配列作成を補助するコマンド群です。 :<b style="color:#c00;">※書式の解析精度は不完全です。検索/置換文字に <code>" ' , / \ ]</code> を含む配列は誤変換する恐れがあります。</b> :<b style="color:#c00;">※書式ミスがある場合については考慮していません。誤変換した場合は書式ミスの可能性も疑ってみてください。</b> ;交換 ["a","b"] ⇒ ["b","a"] :配列の検索文字列と置換文字列を入れ替えます。※正規表現は検索/置換の役割を交換できないため何もしません(例では <code>■,□</code> のペアが該当)。 :例> <code style="background:#bfdfff;">["●","○"],['▲','△'],[/■/g,"□"],["◆",'◇']</code> → <code>["○","●"],['△','▲'],[/■/g,"□"],['◇',"◆"]</code> <source lang="javascript" style="word-wrap:break-word;"> f.push(['交換 ["a","b"] → ["b","a"]',"R",function(a){ //2014/05/31 return a.replace(/\[("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'),("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\]/g,"[$2,$1]") }]); </source> ;分割 ["a","b"] ⇒ "a" › "b"↵ ;結合 "a" › "b"↵ ⇒ ["a","b"] :配列と TSV 形式を変換します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(['分割 ["a","b"] → "a" \u203A "b"\u21B5',"R",function(a){ //2015/03/14 return a.replace(/\[("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|\/.*?\/[igm]*),("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\],?/g,"\n$1\t$2\n").replace(/\n\n/g,"\n") }]); f.push(['結合 "a" \u203A "b"\u21B5 → ["a","b"]',"R",function(a){ //2015/03/14 return a.replace(/\n?(((".*"|'.*'|\/.*\/[igm]*)\t(".*"|'.*')\n*)+)/g,function(s,s1){return s1.replace(/(".*"|'.*'|\/.*\/[igm]*)\t(".*"|'.*')\n*/g,"[$1,$2],").replace(/,$/,"")}) }]); </source> =拡張コード:書式= 拡張コードは、以下の書式に則り記述してください。<br> ※書式ミスがあるコードはメニューから除外されたり、実行時にエラーが発生する原因になります。 ==コマンド== ;モード F (Function) <source lang="javascript"> f.push(["コマンド名","F",function( 引数 ){ マクロ }]); </source> :【マクロ】の記述をそのまま実行します。 :コマンド実行時、以下の処理が行われます。 <source lang="javascript"> (function( 引数 ){ マクロ })( Document.Selection ); </source> ;モード R (Replace) ;モード RS (Select-line) <source lang="javascript"> f.push(["コマンド名","R",function( 引数 ){ マクロ }]); f.push(["コマンド名","RS",function( 引数 ){ マクロ }]); </source> :モード R は、選択範囲を【マクロ】の処理結果で置換します。 :モード RS は、選択範囲を行頭行末まで拡張してから置換します。 :コマンド実行時、以下の処理が行われます。 <source lang="javascript"> Document.Selection.Text = (function( 引数 ){ マクロ })( Document.Selection.Text ); </source> :また、コマンド実行前に選択範囲を記憶し、実行後に処理結果を加味しつつ復元します。 ==サブメニュー== サブメニューを設けます。<br> サブメニュー内にサブメニューを作ること(階層化)も可能です。階層の数に制限はありません。 <source lang="javascript"> f.push(["メニュー名",function(f){ 【コマンド or サブメニュー or セパレータ】 }]); </source> ==セパレータ== セパレータ(区切り)を設けます。 <source lang="javascript"> f.push(["----"]); </source> 半角ハイフン - の数は何個でもかまいません。<br> ただし、半角ハイフン以外の文字を含めることはできません。 <source lang="javascript"> f.push(["-"]); //← OK (1個) f.push(["----------"]); //← OK (10個) f.push(["--区切り--"]); //← NG </source> ==メソッド== ;<code><i>string</i>.replaceBatch(<i>array</i>)</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/ig,"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/ig,"JKL") }]); </source> :<code>replaceBatch</code> は、String のメソッドであるため、どのモードでも利用できます。<br>また、戻値も String であるため、<code>replace</code> のようにメソッドチェーンが行えます。 <source lang="javascript"> //※モード R で利用する(基本形) f.push(["コマンド名","R",function(a){ return a.replaceBatch([ 省略 ]) }]); //※モード RS で利用する(選択範囲を拡張) f.push(["コマンド名","RS",function(a){ return a.replaceBatch([ 省略 ]) }]); //※モード F で利用する(▲非推奨) f.push(["コマンド名","F",function(a){ a.Text = a.Text.replaceBatch([ 省略 ]) }]); </source> <source lang="javascript"> //※replace のようにメソッドチェーンが可能 f.push(["コマンド名","R",function(a){ return a.replace(省略).replaceBatch([ 省略 ]).replace(省略) }]); </source>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク