「
テキスト整形
」を編集中
2015年2月14日 (土) 10:03時点における
Masme
(
トーク
|
投稿記録
)
による版
(収録コマンド一覧のパイプが機能してないため文言修正。)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
<div style="float:right">__TOC__</div> ks 氏作のマクロ「[[テキスト変換]]」の改造版です。 【主な改造点】 * [[#拡張コード:コマンド書式|コマンド書式]]を変更した。 ** 簡易書式をベースに単純化。オプション・第2引数は削除。 ** 関数タイプ replace/S/L は、モード R/RS/RM に改称。 * モード F (関数を実行) を追加。JScript や Mery の関数をそのまま実行することができます。 * モード CR (連続置換) を追加。配列を利用した文字列置換ができます。 * モード RS/RM で、範囲末尾の改行=次行行頭は範囲に含めないようにした。 * 範囲選択時に対象範囲を選ぶメニューを廃止した。(毎回範囲を選ぶのが面倒なため)。 * 非選択時に文書全体を対象範囲とする仕様を廃止した。(文字列挿入系コマンドを利用できるようにするため)。<br>※文書全体を対象にしたい場合は「すべて選択」 (Ctrl+A) してから実行してください。 【注意点】 * <span style="color:#c00;">マクロの仕様上、矩形選択での処理には対応していません。</span>※Mery 2.1.0 以降の Replace メソッドを利用すれば一応は可能です。 * <span style="color:#c00;">表示行での処理には対応していません。</span>※このページで使用される <b>各行・行頭・行末</b> とは、<b>論理行</b>を意味しています。 =お知らせ= ;2015/02/14 <span style="color:#c00;">次回の更新で、下記3点の仕様変更を行う予定です。</span> * モード R/RS 実行後、処理した範囲を選択し直すように。 ** コマンドの効果範囲が分かりやすくなり、また、連続してコマンドを実行しやすくなります。 * モード RM を廃止。 ** モード R/RS に比べ処理が異質である事、RS で代替可能な事などの理由により。 ** 既存コマンド全11個は、モード RS に作り直し、掲載する予定です。 * モード CR を廃止し、<code><i>String</i>.replaceBatch</code> メソッドを追加。 ** モードではなくメソッドにすることで <code>replace</code> のように取り扱うことができ、応用が効くため。 ** 既存コマンド全6個は、replaceBatch メソッドで作り直し、掲載する予定です。 <span style="color:#c00;">詳しくは、[[利用者:Masme]] のページをご覧ください。</span> =スターターパック= ダウンロード→ [[メディア:テキスト整形.zip|テキスト整形.zip]] (2015/02/14 更新) * 基本コード と 拡張コード(★印の項目) をまとめて、すぐ使えるようにしたものです。収録コマンド一覧→ [[ファイル:テキスト整形.zip]] * 拙作ですがアイコンファイルを同梱してあります。<br>Mery の My Macros フォルダにアイコンファイル (テキスト整形.ico) を配置すれば、ツールバーにアイコンが読み込まれます。 =更新履歴= [[ファイル:テキスト整形.zip]] <div style="height:35em; overflow:auto; border:1px dashed #999;"> * 2015/02/14 ** <span style="color:#c00;">仕様修正 - モード RS/RM で、矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。</span> ** コード整理 - 文字入力など追加操作を要求するコマンドは、名称末尾に目印 ... を付けた。 ** コマンド追加 - 行末に<br>を付加/<br>を改行に変換/★行頭の空白を除去/★行末の空白を除去/空白行を減量/重複行を削除(空白行は除く)/★連続する重複行を削除/文字のシャッフル ** コマンド削除 - 丸数字 ⑳ → (20)/丸数字 (20) → ⑳ ** コマンド修正 - 各行先頭に文字列付加/各行末尾に文字列付加 **: 正規表現が意味的に不適切だったのを修正。 ** コマンド変更 - 空白行を圧縮 **: モード R → RS に。空白行内の空白を除去してから改行を処理するように変更。 ** コマンド変更 - 文字の並ベ替え(逆順) **: サロゲートペアの対処方法を変更。結合文字の一部 (U+0300~036F, 3099, 309A) および異体字セレクタに対応した。 ** コマンド変更 - 2進接頭辞換算 **: 処理対象の正規表現を [0-9]+(,?[0-9]{3})+(\.[0-9]+)? → [0-9]+(,?[0-9]{3})+ に変更(小数は非対応とした)。 ** コマンド変更 - Base64デコード(UTF-8) **: JScript 5.x の decodeURIComponent() は字数が多いほど能率が悪くなるようなので、最大50字毎に分割処理するようにした(高速化)。 * 2014/10/12 ** コマンド追加 - ★数値参照を文字に変換/行の並べ替え(逆順)/行のシャッフル/Unicode 文字 → &#xHEX;/Unicode &#xHEX; → 文字 ** スターター追加 - ★数値参照 &#dec; に変換/★数値参照 &#xHEX; に変換 ** スターター除外 - ☆正規表現に一致する行を削除/☆正規表現に一致しない行を削除 **: Mery (鬼車) と JScript (ECMAScript) では正規表現の仕様に差異があり、意図しない結果を招く怖れがあるため。 ** コマンド修正 - 選択文字列を検索 **: 引数不一致により動作しないミスを修正。 ** コマンド修正 - 編集中の全ファイルのパスをコピー/★検索強調をすべて解除 **: 対象範囲を 同ウィンドウ内の全文書 → 全ウィンドウの全文書 に改修。 ** コマンド変更 - 複製貼り付け **: 処理方法を for → while に変更。非数字(NaN) または 1 未満を入力した場合、処理を中止するようにした。 ** コマンド変更 - Unicode 文字 → \x{hex}/Unicode 文字 → &#dec; **: 処理方法を 配列連結 join("") → 文字列連結 += に変更。 ** コマンド変更 - Unicode \x{hex} → 文字/Unicode &#dec; → 文字 **: 下位サロゲートの計算を (n-0x10000&0x3FF) → (n&0x3FF) に変更(減算は不要だった)。 * 2014/07/27 ** コマンド修正 - Base64デコード(UTF-8) **: 終端の余分な [NUL] を除去する処理が手抜きだったのを修正。 * 2014/05/31 ** コマンド追加 - Base64エンコード(UTF-8)/Base64デコード(UTF-8) ** コマンド削除 - Base64エンコード(Unicode) (移植) **: Mery の「Base64デコード」機能と同じ方式の Base64エンコード(UTF-8) に差し替え。 ** コマンド変更 - ★数値を3桁,区切りに **: 数字列を抽出して処理するように変更(高速化)。 ** コマンド変更 - ★数値を3桁,区切りに/丸数字 (20) → ⑳/★10→16進数/2進接頭辞換算 **: 正規表現 \d を [0-9] に統一。 ** コマンド修正 - コマンド テンプレート(モード CR 交換/分割) **: 文字列リテラルでのエスケープ \ をより正確に判定できる正規表現に改修。 * 2014/05/24 ** コマンド修正 - 各行末尾に文字列付加 **: 選択範囲の次行先頭にも文字列付加してしまう問題に対処。 ** コマンド変更 - 複製貼り付け **: クリップボードの内容を変数に格納しておくように変更(高速化)。 ** コマンド変更 - 複製貼り付け/各行先頭に文字列付加/各行末尾に文字列付加 **: Prompt() 関連の処理を単純にした(モード RM 以外では冗長だった)。 * 2014/05/22 ** コマンド追加 - 2進接頭辞換算 ** コマンド変更 - Unicode \x{hex} → 文字/Unicode &#dec; → 文字 **: サロゲートペアの String.fromCharCode() の引数を複数指定に改修、ビット演算に変更。 * 2014/05/16 ** コマンド変更 - Unicode 文字 → \x{hex}/Unicode 文字 → &#dec; **: 処理方法を replace(for ループ) に統一(手法を改善)。 * 2014/04/27 ** コマンド追加 - Unicode 文字 → &#dec;/Unicode &#dec; → 文字 * 2014/03/14 ** コマンド追加 - 青空文庫 ルビを除去/青空文庫 注記を除去 * 2014/03/08 ** コマンド追加 - 選択文字列を検索/選択文字列をすべて削除 ** コマンド変更 - ★全角英数を検索/★半角カナを検索/★CJK漢字を検索 **: 前ではなく次を検索するように変更。念の為「大文字と小文字を区別」フラグをオンにした。 * 2014/03/01 ** コマンド追加 - ★連続する!?を整形/★全角ダッシュ(――)に整形 ** コマンド変更 - ★括弧前の句読点を除去 **: 全角カンマ , /全角ピリオド . を除去対象に追加。 ** コマンド変更 - ★三点リーダー(……)に整形 **: 全角カンマ , /全角ピリオド . /半角中黒 ・ /三点リーダー … /二点リーダー ‥ を変換対象に追加。 ** コマンド変更 - My Macros フォルダを開く **: 処理方法を WScript.Shell.Run("explorer") → Shell.Application.Explore() に変更。 * 2014/02/22 ** コマンド追加 - 丸数字 ⑳ → (20)/丸数字 (20) → ⑳ ** コマンド変更 - 文字の並ベ替え(逆順)/Unicode 文字 → \uHHHH/Unicode 文字 → \x{hex} **: 処理方法を for ループ → replace() に変更(字数削減)。 ** コマンド変更 - コマンド テンプレート **: モード CR 作成補助コマンドを追加。モード CR テンプレートを変更。 * 2014/02/17 ** コマンド修正 - ★各行行頭に貼り付け/★各行行末に貼り付け **: クリップボード終端の改行文字を除去する正規表現を修正。\r\n|\r|\n$ → (\r\n|\r|\n)$ * 2014/02/16 ** <span style="color:#c00;">仕様修正 - モード CR の仕様ミスを修正し、正規表現 (JScript) に正式対応した。</span> **: 正規表現の特殊文字があると誤動作していたのでエスケープするようにした。 ** コード整理 - コメントアウトしていた基本コードを削除した(→2014/01/08 スクロール位置)。 ** コード整理 - 下記の6カテゴリを3カテゴリに統合。コマンドの名称や配置を見直した。 **: 空白の追加 + 各行に追加/空白の削除 + 行の削除/数値の変換 + 文字種変換 ** コマンド追加 - 複製貼り付け/文字の並ベ替え(逆順)/★半角カナ→全角/★全角カナ→半角 ** スターター除外 - ☆標準変換 ** コマンド変更 - ★各行行頭に貼り付け/★各行行末に貼り付け **: 行コピーと連携しやすくするため、クリップボード終端の改行文字は除去するようにした。 ** コマンド変更 - コマンド テンプレート **: モード CR テンプレートを刷新。 * 2014/02/10 ** コマンド追加 - ★空白行を削除/Unicode \uHHHH → 文字/Unicode 文字 → \x{hex}/Unicode \x{hex} → 文字 ** スターター除外 - ☆空白行を圧縮 ** コマンド変更 - 挿入 Confirm(|) **: 接尾辞の長さ(s.length)でカーソル移動量を決めるようにした。 * 2014/02/01 ** コマンド追加 - Unicode 文字 → \uHHHH ** コマンド変更 - ★全角かな→カナ/★全角カナ→かな **: 踊り字(繰り返し記号) ゝゞヽヾ を変換対象に追加。 * 2014/01/24 ** コマンド追加 - ★半角/全角の間を空ける/★半角英数/全角の間を空ける ** コマンド変更 - ★全角カナ→かな **: ヴヵヶ → ゔゕゖ の変換を行わないようにした(Shift_JIS では保存できない文字のため)。 * 2014/01/12 ** <span style="color:#c00;">仕様変更 - スターターパックにアイコンファイルを同梱し、読み込むようにした。</span> ** コマンド修正 - 編集中のファイルのパスをコピー/編集中の全ファイルのパスをコピー **: join("\n") → join("\r\n") に変更し、メモ帳でも正しく改行されるようにした。 ** コマンド変更 - ★数値を3桁,区切りに **: 小数点以下(ピリオド . 以降の半角数字列)を桁区切りしないようにした。 * 2014/01/08 ** <span style="color:#c00;">仕様変更 - コマンド実行時、スクロール位置を記憶・復元しないように(コメントアウト)した。</span> **: 検索系コマンドと相性が悪く、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/02/14 //■拡張コード:コマンド一覧 var f = []; // ----------------- ↓ここより下に拡張コードを追加 // ----------------- ↑ここより上に拡張コードを追加 /*■拡張コード:コマンド書式 //▼コマンド f.push(["コマンド名","モード",function(引数){マクロ}]); 【モード】 F (Function) - 関数を実行 R (Replace) - 選択範囲を置換 RS (Select-line) - 選択範囲を行頭末まで拡張して置換 RM (Multi-line) - 選択範囲を一行ごとに分割して置換 CR (Chain) - リスト(配列)の内容に従い連続置換 【引数】 (モード F) - Document.Selection (モード R/RS/RM) - Document.Selection.Text (モード CR) - (引数なし) //▼サブメニュー f.push(["メニュー名",function(f){コマンドなど}]); //▼セパレータ f.push(["----"]); // ----------------- */ //■実行コード (function(){ var sel = Document.Selection; var cmd = [], cid = 1; //コマンド格納用,ID //メニュー生成用関数 function ListToMenu(List, Menu) { for (var i=0; i<List.length; i++) { var $L = List[i], $Ln = List[i].length; if (typeof $L[0]!="string") continue; switch (true) { case ($Ln==3): //コマンド $L = ["コマンド名","モード",function] if (typeof $L[2]=="function" && /^(F|R|RS|RM|CR)$/.test($L[1])) { cmd[cid] = {"mode":$L[1], "func":$L[2]}; Menu.Add($L[0]+"\t"+$L[1], cid++); } break; case ($Ln==2): //サブメニュー $L = ["メニュー名",function] if (typeof $L[1]=="function") { var sub_popup = CreatePopupMenu(); Menu.AddPopup($L[0], sub_popup); var sub_f = []; $L[1](sub_f); ListToMenu(sub_f, sub_popup); //再帰処理:サブメニュー作成 } break; case ($Ln==1): //セパレータ $L = ["----"] if (/^-+$/.test($L[0])) { Menu.Add("", 0, meMenuSeparator); } break; } } }; //コマンド一覧からメニュー生成 var popup = CreatePopupMenu(); ListToMenu(f, popup); //ポップアップメニューを表示して処理 var tr = popup.Track(mePosMouse); if (tr) { //※キャンセル(Esc)時は0が返る var $C = cmd[tr]; switch ($C["mode"]) { case "F": //関数を実行 $C["func"](sel); break; case "R": //選択範囲を置換 sel.Text = $C["func"](sel.Text); break; case "RS": //行頭行末まで拡張 sel.Text = $C["func"](SelectLine(sel)); break; case "RM": //一行ごとに処理 sel.Text = MultiLine($C["func"], sel); break; case "CR": //連続置換 sel.Text = ChainReplace($C["func"](), sel); break; } } //モード RS/RM 用関数:選択範囲を行頭行末まで拡張して返す function SelectLine(sel) { var meP = mePosLogical; var ty = sel.GetTopPointY(meP); //範囲開始行 var by = sel.GetBottomPointY(meP); //範囲終了行 var bx = sel.GetBottomPointX(meP); var br =(sel.Text.match(/\n/g)||[]).length; if (bx==1 && by-ty==br && br) by--; //次行行頭を含めないよう対策 sel.SetActivePoint(meP, 1, by); sel.EndOfLine(false, meP); sel.SetAnchorPoint(meP, 1, ty); return sel.Text; }; //モード RM 用関数:選択範囲を一行ごとに分割して処理 function MultiLine(func, sel) { var result = []; var lines = SelectLine(sel).split("\n"); for (var i=0; i<lines.length; i++) { var text = func(lines[i]); if (text != null) result.push(text); //戻値がnullの場合、破棄(行削除) } return result.join("\n"); }; //モード CR 用関数:リストに従い選択範囲を連続置換 function ChainReplace(list, sel) { var text = sel.Text; for (var i=0; i<list.length; i++) { switch (true) { case (typeof list[i][0]=="string"): //list[i] = ["検索","置換"] text = text.split(list[i][0]).join(list[i][1]); break; case (list[i][0] instanceof RegExp): //list[i] = [/検索/,"置換"] text = text.replace(list[i][0],list[i][1]); break; } } return text; }; })(); </source> =拡張コード:コマンド= * (移植) の項目は、マクロ「[[テキスト変換]]」から移植したコマンドです。 * ★印の項目は、スターターパックに含まれているコマンドです。 ==小説/作文 用途== ;★地の文の行頭を字下げ :左引用符 <span style="color:#c00;">‘ “</span> /開き括弧 <span style="color:#c00;">( 〔 [ { 〈 《 「 『 【</span> および 半角空白/全角空白/水平タブ/改行<b style="color:#c00;">以外</b>の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。 <source lang="javascript"> f.push(["地の文の行頭を字下げ","RS",function(a){ return a.replace(/^(?![‘“(〔[{〈《「『【 \t\n])/gm," ") }]); </source> ;★括弧前の句読点を除去 :右引用符 <span style="color:#c00;">’ ”</span> /閉じ括弧 <span style="color:#c00;">) 〕 ] } 〉 》 」 』 】</span> の直前に句読点 、。,. がある場合、除去します。 <source lang="javascript"> f.push(["括弧前の句読点を除去","R",function(a){ return a.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]); </source> ;★連続する!?を整形 :2文字以上連続する感嘆符 ! /疑問符 ? を半角2文字に整形します。 :例> <span style="background:#bfdfff;">!!/!!?/?!!!/?!!!?</span> → !!/!?/?!/?? <source lang="javascript" style="word-wrap:break-word;"> f.push(["連続する!?を整形","CR",function(a){ return [ [/[!!][!?!?]*[!!]/g,"!!"],[/[!!][!?!?]*[??]/g,"!?"],[/[??][!?!?]*[!!]/g,"?!"],[/[??][!?!?]*[??]/g,"??"] ]}]); </source> ;★三点リーダー(……)に整形 :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){ 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){ 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){ return a.replace(/(?:|([^《]+))?《.*?》/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){ 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){ return a.replace(/(※[#.*?])|[#.*?]/g,"$1") }]); </source> ==Web/HTML 用途== ;★HTMLタグを除去 <source lang="javascript"> f.push(["HTMLタグを除去","R",function(a){ return a.replace(/<(".*?"|'.*?'|[^'"])*?>/g,"") }]); </source> ;行末に<br>を付加 <source lang="javascript"> f.push(["行末に<br>を付加","RS",function(a){ return a.replace(/$/gm,"<br>") }]); </source> ;<br>を改行に変換 :改行タグを改行に変換します。ただしタグ直後に改行を含む場合は、タグのみ削除します。 :※対応タグは <code><br> <br/> <br /></code> の3種類です。英字の大小は問いません。 :<span style="color:#c00;">※属性付きには対応していません。</span>例> <code><br clear="all"></code> など <source lang="javascript"> f.push(["<br>を改行に変換","R",function(a){ return a.replace(/<br( ?\/)?>\n?/gi,"\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;',"CR",function(a){ return [ ["&","&"],['"',"""],["<","<"],[">",">"] ]}]); f.push(['実体参照 &&xxx; → \u2423><"&&',"CR",function(a){ return [ [" "," "],[">",">"],["<","<"],[""",'"'],["&","&"] ]}]); </source> :半角空白 → &nbsp; の変換も行う場合は、下記の内容に差し替えてください。 <source lang="javascript"> f.push(['実体参照 &&"<>\u2423 → &&xxx;',"CR",function(a){ return [ ["&","&"],['"',"""],["<","<"],[">",">"],[" "," "] ]}]); </source> ;★数値参照 &#dec; に変換 :文字列を数値文字参照(10進)形式に変換します。(dec=decimal/十進法) :例> <span style="background:#bfdfff;">Aわ𠀋</span> → &#65;&#12431;&#131083; :→ コードは [[#符号化/復号化|符号化/復号化]] の節の <b>Unicode 文字 ⇒ &#dec;</b> を参照 ;★数値参照 &#xHEX; に変換 :文字列を数値文字参照(16進)形式に変換します。(HEX=hexadecimal/十六進法) :例> <span style="background:#bfdfff;">Aわ𠀋</span> → &#x41;&#x308F;&#x2000B; :→ コードは [[#符号化/復号化|符号化/復号化]] の節の <b>Unicode 文字 ⇒ &#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){ 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> ==マクロ/コード 用途== ;★行頭 // を付加/削除 :行頭に // が無い行なら // を付加し、有る行なら // を削除します。 :※このコマンドをよく利用される場合は「[[コメントマーク付け外し]]」マクロの導入をオススメします。 <source lang="javascript"> f.push(["行頭 \/\/ を付加/削除","RM",function(a){ return a.match(/^\/\/.*$/)? a.slice(2): "\/\/"+a }]); </source> ;★インデント(半角空白2個) :各行の行頭に半角空白2文字を挿入します。 :※このコマンドをよく利用される場合は「[[字下げ・字上げ]]」マクロの導入をオススメします。 <source lang="javascript"> f.push(["インデント(半角空白2個)","RM",function(a){ return " "+a }]); </source> ;編集中のファイルのパスをコピー ;編集中の全ファイルのパスをコピー :現在編集中のファイルの絶対パスをクリップボードにコピーします。 :新規作成ファイルなどパスが存在しない場合は、無題 の2文字がコピーされます。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["編集中のファイルのパスをコピー","F",function(a){ ClipboardData.SetData(Document.FullName||"無題") }]); f.push(["編集中の全ファイルのパスをコピー","F",function(a){ var list=[]; for(var j=0;j<Editors.Count;j++){var d=Editors.Item(j).Documents; for(var i=0;i<d.Count;i++){list.push(d.Item(i).FullName||"無題")}} ClipboardData.SetData(list.join("\r\n")) }]); </source> ;My Macros フォルダを開く :Mery の My Macros フォルダをエクスプローラで開きます。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["My Macros フォルダを開く","F",function(a){ new ActiveXObject("Shell.Application").Explore((new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(Editor.FullName))+"\\My Macros") }]); </source> ;挿入 Confirm(|) :文字列 <code>if(!Confirm())Quit();</code> を挿入します。 :<code>Alert()</code> と違い、[キャンセル] ボタンを押すとマクロを強制終了できるため、無限ループにハマっても対処できます。 <source lang="javascript"> f.push(["挿入 Confirm(|)","F",function(a){ var p="if(!Confirm(",s="))Quit();"; a.Text=p+a.Text+s; a.CharLeft(false,s.length) }]); </source> ;選択範囲を eval で評価 :ステータスバーに eval(選択範囲) した結果を表示します。 :たとえば、選択範囲が <span style="background:#bfdfff;">10*(5+20)</span> なら、250 と表示されます。 <source lang="javascript"> f.push(["選択範囲を eval で評価","F",function(a){ if(a.Text){Status=eval(a.Text)} }]); </source> ==検索/置換== ;★全角英数を検索 :全角英数字を検索します。 <source lang="javascript"> f.push(["全角英数を検索","F",function(a){ a.Find("[0-9A-Za-z]", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]); </source> ;★半角カナを検索 :半角カナ類を検索します。 <source lang="javascript"> f.push(["半角カナを検索","F",function(a){ a.Find("[。-゚]", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]); </source> ;★CJK漢字を検索 :CJK (China/Japan/Korea 漢字文化圏) の漢字を検索します。 <source lang="javascript"> f.push(["CJK漢字を検索","F",function(a){ a.Find("[\\p{Han}]", meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]); </source> ;選択文字列を検索 :「検索する文字列」に選択文字列を設定して「次/下を検索」します。 :「次/前の文字列を検索」と異なり、改行を含む文字列(複数行)も検索できるのが特徴です。 :<span style="color:#c00;">※Mery の仕様上、改行を含む場合は検索強調が効きません。</span> <source lang="javascript" style="word-wrap:break-word;"> f.push(["選択文字列を検索","F",function(a){ if(a.Text)a.Find(a.Text.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"), meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]); </source> ;選択文字列をすべて削除 :「検索する文字列」に選択文字列を、「置換後の文字列」に空欄を設定して「すべて置換」します。 :上記のコマンド「選択文字列を検索」と同様、改行を含む文字列(複数行)も削除できます。 :<span style="color:#c00;">※検索強調が変更されます。</span> <source lang="javascript" style="word-wrap:break-word;"> f.push(["選択文字列をすべて削除","F",function(a){ if(a.Text)a.Replace(a.Text.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"),"", meFindReplaceRegExp+meFindReplaceCase+meReplaceAll) }]); </source> ;★検索強調をすべて解除 :「検索文字列の強調を解除」をすべての文書で実行します。 :ひとつひとつ解除するのが面倒な場合などにご利用ください。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["検索強調をすべて解除","F",function(a){ for(var j=0;j<Editors.Count;j++){var d=Editors.Item(j).Documents; for(var i=0;i<d.Count;i++){d.Item(i).HighlightFind=false}} }]); </source> ==挿入/貼付== ;★半角/全角の間を空ける ;★半角英数/全角の間を空ける :半角文字/半角英数と全角文字の間に半角空白を挿入します。 :※半角文字=ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。 <source lang="javascript"> f.push(["半角/全角の間を空ける","R",function(a){ return a.replace(/([!-~。-゚](?=[^!-~。-゚ \t\n])|[^!-~。-゚ \t\n](?=[!-~。-゚]))/g,"$1 ") }]); f.push(["半角英数/全角の間を空ける","R",function(a){ return a.replace(/([0-9A-Za-z](?=[^!-~。-゚ \t\n])|[^!-~。-゚ \t\n](?=[0-9A-Za-z]))/g,"$1 ") }]); </source> ;★数値を3桁,区切りに :半角数字列を、3桁毎にカンマで区切ります。小数点以下(ピリオド以降)は桁区切りしません。 :例> <span style="background:#bfdfff;">87654321/54321.12345/.12345</span> → 87,654,321/54,321.12345/.12345 <source lang="javascript" style="word-wrap:break-word;"> f.push(["数値を3桁,区切りに","R",function(a){ 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){ var r=[],c=ClipboardData.GetData(),n=parseInt(Prompt("複製回数: ※半角数字","")); if(!n||n<1)Quit(); while(n--){r.push(c)} return r.join("") }]); </source> ;★各行行頭/各行行末に貼り付け :クリップボードの文字列を、各行の行頭/行末に貼り付けます。 <source lang="javascript"> f.push(["各行行頭に貼り付け","RM",function(a){ return ClipboardData.GetData().replace(/(\r\n|\r|\n)$/,"")+a }]); f.push(["各行行末に貼り付け","RM",function(a){ return a+ClipboardData.GetData().replace(/(\r\n|\r|\n)$/,"") }]); </source> ;★各行行頭/各行行末に文字列付加... (移植) :入力した文字列を、各行の行頭/行末に挿入します。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["各行行頭に文字列付加...","RM",(function(a){ var c=null; return function(a){ if(!c){ if(!(c=Prompt("各行行頭に付加する文字列:",""))){Quit()} } return c+a } })()]); f.push(["各行行末に文字列付加...","RM",(function(a){ var c=null; return function(a){ if(!c){ if(!(c=Prompt("各行行末に付加する文字列:",""))){Quit()} } return a+c } })()]); </source> ;各行先頭/各行末尾に文字列付加... (矩形対応/Mery 2.1.0~) :入力した文字列を、Mery の置換機能を利用して各行の先頭/末尾に挿入します。 :<span style="color:#c00;">※矩形対応には Mery 2.1.0 以降が必要です。</span>動作は Mery の矩形置換の仕様に準じます。 :<span style="color:#c00;">※Mery の置換機能を利用するため検索強調が解除されます</span>(正確には解除ではなく変更)。 :<span style="color:#c00;">※Mery の仕様上、零幅には対応していません。</span>零幅で実行すると、行頭(表示行)に文字列が挿入されます。 :※コマンド実行時、下記の条件で置換が行われます。 :{| 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){ var p=Prompt("各行先頭に付加する文字列:",""); if(!p)Quit(); a.Replace("^(?=.|\\n)",p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]); f.push(["各行末尾に文字列付加...","F",function(a){ var p=Prompt("各行末尾に付加する文字列:",""); if(!p)Quit(); a.Replace("(?<=.)$|^(?=\\n)",p, meFindReplaceRegExp+meReplaceSelOnly+meReplaceAll) }]); </source> ==除去/削除== ;★空白文字を除去 :空白文字(半角空白/全角空白/水平タブ)を除去します。 <source lang="javascript"> f.push(["空白文字を除去","R",function(a){ return a.replace(/[ \t]+/g,"") }]); </source> ;★行頭行末の空白を除去 (移植) ;★行頭の/行末の空白を除去 (移植) :行頭および行末にある空白文字を除去します。 <source lang="javascript"> f.push(["行頭行末の空白を除去","RS",function(a){ return a.replace(/^[ \t]+|[ \t]+$/gm,"") }]); f.push(["行頭の空白を除去","RS",function(a){ return a.replace(/^[ \t]+/gm,"") }]); f.push(["行末の空白を除去","RS",function(a){ return a.replace(/[ \t]+$/gm,"") }]); </source> ;★空白行を削除 :空白行(改行/半角空白/全角空白/水平タブのみの行)を削除します。 <source lang="javascript"> f.push(["空白行を削除","RM",function(a){ return a.match(/^[ \t]*$/)? null:a }]); </source> ;空白行を圧縮 :連続する空白行を1行の空行に変換します。連続しない(=1行の)空白行は削除します。 <source lang="javascript"> f.push(["空白行を圧縮","RS",function(a){ 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){ 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){ 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){ 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){ return a.replace(/(^.*$)\n(^\1$\n?)+/gm,"$2") }]); </source> ;※空白行/重複行削除系コマンドの違い (☐ は空白/↵ は改行) :{| class="wikitable" !colspan="4"| 空白行 !! !!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(["入力文字列を含む行を削除...","RM",(function(a){ var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の文字列を含む行を削除:",""))){Quit()} } return (a.indexOf(c)>=0)? null:a } })()]); f.push(["入力文字列を含まない行を削除...","RM",(function(a){ var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の文字列を含まない行を削除:",""))){Quit()} } return (a.indexOf(c)>=0)? a:null } })()]); </source> ;正規表現に一致する/しない行を削除... (移植) :<span style="color:#c00;">※正規表現は、JScript / JavaScript の仕様に則り記述します。</span>Mery の正規表現 (鬼車) とは仕様が異なる点があるので注意してください。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["正規表現に一致する行を削除...","RM",(function(a){ var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の正規表現に一致する行を削除:",""))){Quit()}else{c=new RegExp(c)} } return c.test(a)? null:a } })()]); f.push(["正規表現に一致しない行を削除...","RM",(function(a){ var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の正規表現に一致しない行を削除:",""))){Quit()}else{c=new RegExp(c)} } return c.test(a)? a:null } })()]); </source> ==並べ替え== ;行の並べ替え(Unicode 昇順/降順) (移植) :行をUnicode(UTF-16)順で並べ替えます。 :※より柔軟に並べ替えたい場合は「[[行並べ替え]]」マクロの導入をオススメします。 <source lang="javascript"> f.push(["行の並べ替え(Unicode 昇順)","RS",function(a){ return a.split("\n").sort().join("\n") }]); f.push(["行の並べ替え(Unicode 降順)","RS",function(a){ return a.split("\n").sort().reverse().join("\n") }]); </source> ;行の並べ替え(逆順) :行を逆順に並べ替えます。 <source lang="javascript"> f.push(["行の並べ替え(逆順)","RS",function(a){ return a.split("\n").reverse().join("\n") }]); </source> ;行のシャッフル :行をランダムに並べ替えます。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["行のシャッフル","RS",function(a){ //Fisher-Yates shuffle 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+DC00~DFFF)、結合文字の一部 (U+0300~036F, 3099, 309A)、異体字セレクタ (U+180B~0D, FE00~0F, E0100~EF) は、位置がズレないよう対処します。 :例> <span style="background:#bfdfff;">𠮟る/tréma/りんご</span> → ごんり/amért/る𠮟 <source lang="javascript" style="word-wrap:break-word;"> f.push(["文字の並べ替え(逆順)","R",function(a){ return a.replace(/.+/g,function(s){return s.split(/(?![\uDC00-\uDFFF\u0300-\u036F\u3099\u309A\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF])/g).reverse().join("")}) }]); </source> ;文字のシャッフル :各行の文字をランダムに並べ替えます。 :例> <span style="background:#bfdfff;">文字のシャッフル</span> → フ字のャシッル文 <source lang="javascript" style="word-wrap:break-word;"> f.push(["文字のシャッフル","R",function(a){ //Fisher-Yates shuffle return a.replace(/.+/g,function(s){var a=s.split(/(?![\uDC00-\uDFFF\u0300-\u036F\u3099\u309A\u180B-\u180D\uFE00-\uFE0F]|\uDB40[\uDD00-\uDDEF])/g),i=a.length,j,t; while(i){j=Math.floor(Math.random()*i--); t=a[i];a[i]=a[j];a[j]=t;} return a.join("")}) }]); </source> ==字種/数値変換== ;大文字/小文字に変換 :Mery の「選択範囲の変換」機能の一部を再現したものです。 <source lang="javascript"> f.push(["大文字に変換","F",function(a){ a.ChangeCase(meCaseUpperCase) }]); f.push(["小文字に変換","F",function(a){ a.ChangeCase(meCaseLowerCase) }]); </source> ;半角/全角に変換 :Mery の「選択範囲の変換」機能の一部を再現したものです。 <source lang="javascript"> f.push(["半角に変換","F",function(a){ a.ChangeWidth(meWidthHalfWidth) }]); f.push(["全角に変換","F",function(a){ a.ChangeWidth(meWidthFullWidth) }]); </source> ;★半角英数⇒全角 (移植) ;★全角英数⇒半角 (移植) <source lang="javascript" style="word-wrap:break-word;"> f.push(["半角英数→全角","R",function(a){ return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]); f.push(["全角英数→半角","R",function(a){ return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]); </source> ;★半角カナ⇒全角 ;★全角カナ⇒半角 <source lang="javascript" style="word-wrap:break-word;"> f.push(["半角カナ→全角","CR",function(a){ return [ ["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]}]); </source> <source lang="javascript" style="word-wrap:break-word;"> f.push(["全角カナ→半角","CR",function(a){ return [ ["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]}]); </source> ;★全角かな⇒カナ ;★全角カナ⇒かな :全角ひらがなと全角カタカナを変換します。 :ただし、ヴヵヶ → ゔゕゖ の変換は行いません(Shift_JIS では保存できない文字のため)。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["全角かな→カナ","R",function(a){ return a.replace(/[\u3041-\u3096ゝゞ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x60)}) }]); f.push(["全角カナ→かな(ヴヵヶ除く)","R",function(a){ return a.replace(/[\u30A1-\u30F3ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]); </source> :ヴヵヶ → ゔゕゖ の変換も行う場合は、下記の内容に差し替えてください。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["全角カナ→かな","R",function(a){ return a.replace(/[\u30A1-\u30F6ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]); </source> ;標準変換 :マクロ「[[標準変換]]」を移植(一部改変 ※下表参照)したものです。 :全角英数・全角記号は半角に、半角カナは全角に変換します。 :{| class="wikitable" ! 文字 !! 変換前 ! 文字 !! 標準変換版 ! 文字 !! テキスト整形版 |- |align="center"| ‘ || 全角左シングルクォート |align="center"| ` || 半角グラーブアクセント |align="center"| ' || 半角アポストロフィー/シングルクォート |- |align="center"| ` || 全角グラーブアクセント | || ※変換しない |align="center"| ` || 半角グラーブアクセント |} <source lang="javascript" style="word-wrap:break-word;"> f.push(["標準変換","CR",function(a){ return [ [" "," "],["!","!"],["“",'"'],["”",'"'],["#","#"],["$","$"],["%","%"],["&","&"],["‘","'"],["’","'"],["(","("],[")",")"],["*","*"],["+","+"],[",",","],["-","-"],[".","."],["/","/"],["0","0"],["1","1"],["2","2"],["3","3"],["4","4"],["5","5"],["6","6"],["7","7"],["8","8"],["9","9"],[":",":"],[";",";"],["<","<"],["=","="],[">",">"],["?","?"],["@","@"],["A","A"],["B","B"],["C","C"],["D","D"],["E","E"],["F","F"],["G","G"],["H","H"],["I","I"],["J","J"],["K","K"],["L","L"],["M","M"],["N","N"],["O","O"],["P","P"],["Q","Q"],["R","R"],["S","S"],["T","T"],["U","U"],["V","V"],["W","W"],["X","X"],["Y","Y"],["Z","Z"],["[","["],["¥","\\"],["]","]"],["^","^"],["_","_"],["`","`"],["a","a"],["b","b"],["c","c"],["d","d"],["e","e"],["f","f"],["g","g"],["h","h"],["i","i"],["j","j"],["k","k"],["l","l"],["m","m"],["n","n"],["o","o"],["p","p"],["q","q"],["r","r"],["s","s"],["t","t"],["u","u"],["v","v"],["w","w"],["x","x"],["y","y"],["z","z"],["{","{"],["|","|"],["}","}"],["~","~"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]}]); </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){ 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){ 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){ var k=1024,p="?KMGTPEZY"; return a.replace(/[0-9]+(,?[0-9]{3})+/g,function(s){var x=0,n=s.replace(/,/g,""); if(n<k)return s; while(x<8&&k<=n){x++;n/=k} return n.toFixed(2)+p.charAt(x)+"i"}) }]); </source> ==符号化/復号化== ;URL %エンコード/デコード(UTF-8) :URL アドレスに使用される UTF-8 パーセントエンコーディングの符号化/復号化を行います。 <source lang="javascript"> f.push(["URL %エンコード(UTF-8)","R",function(a){ return encodeURI(a).replace(/%0D%0A|%0D|%0A/g,"\n") }]); f.push(["URL %デコード(UTF-8)","R",function(a){ return decodeURIComponent(a) }]); </source> ;Base64エンコード/デコード(UTF-8) :<span style="color:#c00;">※改行は LF (0x0A) でエンコードされます</span>(Mery の内部改行文字が LF のため)。 :※バイナリデータ(画像や音声など)のデコードは、Mery の [編集]→[選択範囲の変換]→[Base64デコード] をご利用ください。 <source lang="javascript" style="word-wrap:break-word;"> f.push(["Base64エンコード(UTF-8)","R",function(txt){ txt=unescape(encodeURIComponent(txt)); var len=txt.length, out="", map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); for(var i=0;i<len;i+=3){var tmp=(txt.charCodeAt(i)<<16)|(txt.charCodeAt(i+1)<<8)|(txt.charCodeAt(i+2)); out+=map[(tmp>>>18)&0x3F]+map[(tmp>>>12)&0x3F]+map[(tmp>>>6)&0x3F]+map[tmp&0x3F]} return (len%3)? out.slice(0,len%3-3)+"===".slice(len%3): out }]); f.push(["Base64デコード(UTF-8)","R",function(txt){ txt=txt.replace(/[^A-Za-z0-9+/]/g,""); var len=txt.length, out="", map=[], chr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for(var i=0;i<chr.length;i++){map[chr.charAt(i)]=i} for(var i=0;i<len;i+=4){var tmp=(map[txt.charAt(i)]<<18)|(map[txt.charAt(i+1)]<<12)|(map[txt.charAt(i+2)]<<6)|(map[txt.charAt(i+3)]); out+=String.fromCharCode(tmp>>>16,(tmp>>>8)&0xFF,tmp&0xFF)} out=out.replace(/([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}){1,50}/g,function(str){return decodeURIComponent(escape(str))}); return (len%4)? out.slice(0,len%4-4): out }]); </source> ;Unicode 文字 ⇒ \uHHHH ;Unicode \uHHHH ⇒ 文字 :JavaScript などで使用される \uHHHH 形式の変換を行います。※HHHH=4桁の16進数・UTF-16BEバイナリ値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> → \u0041\u308F\uD840\uDC0B <source lang="javascript" style="word-wrap:break-word;"> f.push(["Unicode 文字 → \\uHHHH","R",function(a){ return a.replace(/./g,function(s){return "\\u"+("000"+s.charCodeAt(0).toString(16).toUpperCase()).slice(-4)}) }]); f.push(["Unicode \\uHHHH → 文字","R",function(a){ return a.replace(/\\u([0-9A-Fa-f]{4})/g,function(s,n){return String.fromCharCode(Number("0x"+n))}) }]); </source> ;Unicode 文字 ⇒ \x{hex} ;Unicode \x{hex} ⇒ 文字 :Mery の正規表現 (鬼車) などで使用される \x{hex} 形式の変換を行います。※hex=1~6桁の16進数・Unicodeスカラー値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> → \x{41}\x{308f}\x{2000b} <source lang="javascript" style="word-wrap:break-word;"> f.push(["Unicode 文字 → \\x{hex}","R",function(a){ 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(["Unicode \\x{hex} → 文字","R",function(a){ 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> ;Unicode 文字 ⇒ &#dec; ;Unicode &#dec; ⇒ 文字 :HTML などで使用される &#dec; 形式の変換を行います。※dec=1~7桁の10進数・Unicodeスカラー値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> → &#65;&#12431;&#131083; <source lang="javascript" style="word-wrap:break-word;"> f.push(["Unicode 文字 → &&#dec;","R",function(a){ 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(["Unicode &&#dec; → 文字","R",function(a){ 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> ;Unicode 文字 ⇒ &#xHEX; ;Unicode &#xHEX; ⇒ 文字 :HTML などで使用される &#xHEX; 形式の変換を行います。※HEX=1~6桁の16進数・Unicodeスカラー値 :例> <span style="background:#bfdfff;">Aわ𠀋</span> → &#x41;&#x308F;&#x2000B; <source lang="javascript" style="word-wrap:break-word;"> f.push(["Unicode 文字 → &&#xHEX;","R",function(a){ 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(["Unicode &&#xHEX; → 文字","R",function(a){ 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){ f.push(["コマンド F (Function)","F",function(a){ document.Writeln('f.push(["","F",function(a){\n }]);'); a.CharLeft(false,5) }]); f.push(["コマンド R (Replace)","F",function(a){ document.Writeln('f.push(["","R",function(a){\n return }]);'); a.CharLeft(false,5) }]); f.push(["コマンド RS (Select-line)","F",function(a){ document.Writeln('f.push(["","RS",function(a){\n return }]);'); a.CharLeft(false,5) }]); f.push(["コマンド RM (Multi-line)","F",function(a){ document.Writeln('f.push(["","RM",function(a){\n return }]);'); a.CharLeft(false,5) }]); f.push(['コマンド CR (Chain)',"F",function(a){ document.Writeln('f.push(["","CR",function(a){\n return [ '+ a.Text.replace(/\n$/,"") +' ]}]);'); a.CharLeft(false,7) }]); f.push(["----"]); f.push(["サブメニュー","F",function(a){ document.Writeln('f.push(["",function(f){\n'+ a.Text +'}]);'); a.CharLeft(false,5) }]); f.push(["セパレータ","F",function(a){ document.Writeln('f.push(["----"]);') }]); }]); </source> ;モード CR 作成補助 :モード CR (連続置換) コマンドの配列作成を補助するコマンド群です。 :<span style="color:#c00;">※書式の解析精度は不完全です。検索/置換文字に <code>" ' , / \ ]</code> を含むリストは誤変換する恐れがあります。</span> :<span style="color:#c00;">※書式ミスがある場合については考慮していません。誤変換した場合は書式ミスの可能性も疑ってみてください。</span> ;交換 ["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){ 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){ return a.replace(/\[("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|\/.*?\/[gim]*),("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\],?/g,"\n$1\t$2\n").replace(/\n\n/g,"\n") }]); f.push(['結合 "a" \u203A "b"\u21B5 → ["a","b"]',"R",function(a){ return a.replace(/\n?(((".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*)+)/g,function(s,s1){return s1.replace(/(".*"|'.*'|\/.*\/[gim]*)\t(".*"|'.*')\n*/g,"[$1,$2],").replace(/,$/,"")}) }]); </source> =拡張コード:コマンド書式= 拡張コードは以下の書式に従い、記述してください。<br> ※コマンドの自作・改変には、マクロや正規表現についての知識が要求されます。 ==コマンド== <source lang="javascript"> f.push(["コマンド名","モード",function(引数){ マクロ }]); </source> ;モード F (Function) :【マクロ】の記述をそのまま実行するコマンドです。 <source lang="javascript"> f.push(["コマンド名","F",function( Document.Selection ){ マクロ }]); </source> ;モード R (Replace) :選択範囲を【マクロ】の処理結果で置換します。 :※「[[テキスト変換]]」の replace 関数に相当します。 <source lang="javascript"> f.push(["コマンド名","R",function( Document.Selection.Text ){return マクロ }]); </source> ;モード RS (Select-line) :選択範囲を行頭末まで拡張して【マクロ】の処理結果で置換します。 :※「[[テキスト変換]]」の replaceS 関数に相当します。 <source lang="javascript"> f.push(["コマンド名","RS",function( Document.Selection.Text ){return マクロ }]); </source> ;モード RM (Multi-line) :選択範囲を一行ごとに分割して【マクロ】の処理結果で置換します。 :※「[[テキスト変換]]」の replaceL 関数に相当します。 <source lang="javascript"> f.push(["コマンド名","RM",function( Document.Selection.Text ){return マクロ }]); </source> ;モード CR (Chain Replace) :選択範囲をリスト(配列)の内容に従い連続置換します。 :正規表現を利用する場合、JScript / JavaScript の仕様に則り記述します。Mery の正規表現 (鬼車) とは仕様が異なる点があるので注意してください。 <source lang="javascript"> f.push(["コマンド名","CR",function(){return [ ["検索文字列","置換文字列"] ]}]); f.push(["コマンド名","CR",function(){return [ [/パターン/フラグ,"置換文字列"] ]}]); </source> :リストは , カンマ区切りで連結することができます。 <source lang="javascript"> f.push(["コマンド名","CR",function(){return [ ["検索1","置換1"],[/パターン2/,"置換2"],["検索3","置換3"] ]}]); </source> :置換は、リストの先頭から順番に実行されます。したがって、リストの記述順で結果が変わります。 :たとえば、123 という文字列に対し、例1 と 例2 を実行した結果は 444 と 234 になります。 {| |<source lang="javascript"> f.push(["例1","CR",function(){ return [ ["1","2"],["2","3"],["3","4"] ]}]); </source> # 123 → 1 を 2 に置換 → 223 # 223 → 2 を 3 に置換 → 333 # 333 → 3 を 4 に置換 → 444 (実行結果) |<source lang="javascript"> f.push(["例2","CR",function(){ return [ ["3","4"],["2","3"],["1","2"] ]}]); </source> # 123 → 3 を 4 に置換 → 124 # 124 → 2 を 3 に置換 → 134 # 134 → 1 を 2 に置換 → 234 (実行結果) |} ==サブメニュー== サブメニューを設けます。コマンドをグループやカテゴリに仕分けたり、使用頻度の低いコマンドをまとめたり、と用途は様々です。<br> サブメニュー内にサブメニューを作ること(階層化)も可能です。階層の数に制限はありません。 <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>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク