テキスト整形
ks 氏作のマクロ「テキスト変換」の改造版です。
※用途が変換に限らなくなったため、名称を変更しました。
【主な改造点】
- コマンド書式を変更した。
- 簡易書式をベースに単純化。オプション・第2引数は削除。
- 関数タイプ replace/S/L は、モード R/RS/RM に改称。
- モード F (関数を実行) を追加。JScript や Mery の関数をそのまま実行することができます。
- モード CR (連続置換) を追加。配列を利用した文字列置換ができます。
- モード RS/RM で行選択した場合、次行行頭=範囲終了行末の改行を範囲に含めないようにした。
- 範囲選択時に対象範囲を選ぶメニューを廃止した。(毎回範囲を選ぶのが面倒なため)。
- 非選択時に文書全体を対象範囲とする仕様を廃止した。(文字列挿入系コマンドを利用できるようにするため)。
※文書全体を対象にしたい場合は「すべて選択」 (Ctrl+A) してから実行してください。
【注意点】
- マクロの仕様上、矩形置換には対応していません。※Mery 2.1.0 以降の Replace メソッドを利用すれば一応は可能です。
- 表示行での処理には対応していません。※このページで解説される 各行・行頭・行末 という言葉は、論理行を基準としています。
スターターパック
ダウンロード→ テキスト整形.zip (2014/03/08 更新)
- 基本コード と 拡張コード(★印の項目) をまとめて、すぐ使えるようにしてあります。
ファイル:テキスト整形.zip のページに収録コマンド一覧が掲載されています。 - 拙作ですがアイコンファイルを同梱してあります。
Mery の My Macros フォルダにアイコンファイル (テキスト整形.ico) を配置すれば、ツールバーにアイコンが読み込まれます。
更新履歴
- 2014/05/24
- コマンド修正 - 各行末尾に文字列付加
- 選択範囲の次行先頭にも文字列付加してしまう問題に対処。
- コマンド変更 - 複製貼り付け
- クリップボードの内容を変数に格納して利用するように変更(高速化)。
- コマンド変更 - 複製貼り付け/各行先頭に文字列付加/各行末尾に文字列付加
- Prompt() 関連の処理を単純にした(モード RM 以外では冗長なため)。
- コマンド修正 - 各行末尾に文字列付加
- 2014/05/22
- コマンド追加 - 2進接頭辞換算(Ki,Mi,Gi...)
- コマンド変更 - Unicode \x{hex} → 文字/Unicode &#dec; → 文字
- サロゲートペアの String.fromCharCode() の引数を複数指定に改修、ビット演算に変更。
- 2014/05/16
- コマンド変更 - Unicode 文字 → \x{hex}/Unicode 文字 → &#dec;
- 処理方法を replace(for ループ) に統一(手法を改善)。
- コマンド変更 - Unicode 文字 → \x{hex}/Unicode 文字 → &#dec;
- 2014/04/27
- コマンド追加 - Unicode 文字 → &#dec;/Unicode &#dec; → 文字
- 2014/03/14
- コマンド追加 - 青空文庫 ルビを除去/青空文庫 注記を除去
- 2014/03/08
- コマンド追加 - 選択文字列を検索/選択文字列をすべて削除
- コマンド修正 - ★全角英数を検索/★半角カナを検索/★CJK漢字を検索
- 前ではなく次を検索するように変更。念の為「大文字と小文字を区別」フラグをオンにした。
- 2014/03/01
- コマンド追加 - ★連続する!?を整形/★全角ダッシュ(――)に整形
- コマンド変更 - ★括弧前の句読点を除去
- 全角カンマ , /全角ピリオド . を除去対象に追加。
- コマンド変更 - ★三点リーダー(……)に整形
- 全角カンマ , /全角ピリオド . /半角中黒 ・ /三点リーダー … /二点リーダー ‥ を変換対象に追加。
- コマンド変更 - My Macros フォルダを開く
- 処理方法を WScript.Shell.Run("explorer") → Shell.Application.Explore() に変更。
- 2014/02/22
- コマンド追加 - 丸数字 ⑳ → (20)/丸数字 (20) → ⑳
- コマンド変更 - 文字の並び順を逆転/Unicode 文字 → \uHHHH/Unicode 文字 → \x{hex}
- 処理方法を for ループ → replace() に変更(字数削減)。
- コマンド変更 - コマンド テンプレート
- モード CR 作成補助コマンドを追加。モード CR テンプレートを変更。
- 2014/02/17
- コマンド修正 - ★各行行頭に貼り付け/★各行行末に貼り付け
- クリップボード終端の改行文字を除去する正規表現にミスがあったのを修正。\r\n|\r|\n$ → (\r\n|\r|\n)$
- コマンド修正 - ★各行行頭に貼り付け/★各行行末に貼り付け
- 2014/02/16
- 仕様変更 - モード CR の仕様ミスを修正し、正規表現 (JScript) に正式対応した。参照→ コマンド書式
- 正規表現の特殊文字を含む場合が考慮されていなかった。
- コード整理 - コメントアウトしていたコードを削除した(→2014/01/08 スクロール位置)。
- カテゴリ再編 - 下記の6グループを3グループに統合。コマンドの名称や配置を見直した。
- 空白の追加 + 各行に追加/空白の削除 + 行の削除/数値の変換 + 文字種変換
- コマンド追加 - 複製貼り付け/文字の並び順を逆転/★半角カナ→全角/★全角カナ→半角
- スターター除外 - ☆標準変換
- コマンド変更 - ★各行行頭に貼り付け/★各行行末に貼り付け
- 行コピーと連携しやすくするため、クリップボード終端の改行文字は除去するようにした。
- コマンド変更 - コマンド テンプレート
- モード CR テンプレートを刷新。
- 仕様変更 - モード CR の仕様ミスを修正し、正規表現 (JScript) に正式対応した。参照→ コマンド書式
- 2014/02/10
- コマンド追加 - ★空白行を削除/Unicode \uHHHH → 文字/Unicode 文字 → \x{hex}/Unicode \x{hex} → 文字
- スターター除外 - ☆空白行を圧縮
- コマンド変更 - 挿入 confirm(|)
- 接尾辞の長さ(s.length)でカーソル移動量を決めるようにした。
- 2014/02/01
- コマンド追加 - Unicode 文字 → \uHHHH
- コマンド変更 - ★全角かな→カナ/★全角カナ→かな
- 踊り字(繰り返し記号) ゝゞヽヾ を変換対象に追加。
- 2014/01/24
- コマンド追加 - ★半角/全角の間を空ける/★半角英数/全角の間を空ける
- コマンド変更 - ★全角カナ→かな
- ヴヵヶ → ゔゕゖ の変換を行わないようにした(Shift_JIS では保存できない文字のため)。
- 2014/01/12
- 仕様変更 - スターターパックにアイコンファイルを同梱し、読み込むようにした。
- コマンド修正 - 編集中のファイルのパスをコピー/編集中の全ファイルのパスをコピー
- join("\n") を join("\r\n") に変更し、メモ帳でも正しく改行されるようにした。
- コマンド変更 - ★数値を3桁,区切りに
- 小数点以下(ピリオド . 以降の半角数字列)を桁区切りしないようにした。
- 2014/01/08
- 仕様変更 - コマンド実行時、スクロール位置を記憶・復元しないように(コメントアウト)した。
- 検索系コマンドと相性が悪く、Mery の検索機能と挙動が合っていないため。
- コマンド追加 - ★全角英数を検索/★半角カナを検索
- スターター追加 - ★CJK漢字を検索/★検索文字列の強調をすべて解除
- コマンド修正 - ★16→10進数
- 16進数に使用しない英字 G~Z を変換対象に含めていたミスを修正。コマンド名を改正(旧名:10進数に変換)。
- 仕様変更 - コマンド実行時、スクロール位置を記憶・復元しないように(コメントアウト)した。
- 2013/12/30
- コマンド追加 - 挿入 confirm(|)/★数値を3桁,区切りに/★10→16進数/★16→10進数
- コマンド修正 - My Macros フォルダを開く
- マクロの場所からではなく Mery.exe の場所からパスを取得するようにした。
- 2013/09/15
- 初版公開。
基本コード
//■テキスト整形
// 2013/09/15-2014/02/16
//■拡張コード:コマンド一覧
var f = [];
// ----------------- ↓ここより下に拡張コードを追加
// ----------------- ↑ここより上に拡張コードを追加
/*■拡張コード:コマンド書式
//▼コマンド
f.push(["コマンド名","モード",function(引数){マクロ}]);
【モード】
F (Function) - 関数を実行
R (Replace) - 選択範囲を置換
RS (Select-line) - 選択範囲を行頭末まで拡張して置換
RM (Multi-line) - 選択範囲を一行ごとに分割して置換
CR (Chain) - リスト(配列)の内容に従い連続置換
【引数】
(モード F) - Document.Selection
(モード R/RS/RM) - Document.Selection.Text
(モード CR) - (引数なし)
//▼サブメニュー
f.push(["メニュー名",function(f){コマンドなど}]);
//▼セパレータ
f.push(["----"]);
// ----------------- */
//■実行コード
(function(){
var sel = Document.Selection;
var cmd = [], cid = 1; //コマンド格納用,ID
//メニュー生成用関数
function ListToMenu(List, Menu) {
for (var i=0; i<List.length; i++) {
var $L = List[i], $Ln = List[i].length;
if (typeof $L[0]!="string") continue;
switch (true) {
case ($Ln==3): //コマンド $L = ["コマンド名","モード",function]
if (typeof $L[2]=="function" && /^(F|R|RS|RM|CR)$/.test($L[1])) {
cmd[cid] = {"mode":$L[1], "func":$L[2]};
Menu.Add($L[0]+"\t"+$L[1], cid++);
} break;
case ($Ln==2): //サブメニュー $L = ["メニュー名",function]
if (typeof $L[1]=="function") {
var sub_popup = CreatePopupMenu();
Menu.AddPopup($L[0], sub_popup);
var sub_f = [];
$L[1](sub_f);
ListToMenu(sub_f, sub_popup); //再帰処理:サブメニュー作成
} break;
case ($Ln==1): //セパレータ $L = ["----"]
if (/^-+$/.test($L[0])) {
Menu.Add("", 0, meMenuSeparator);
} break;
}
}
};
//コマンド一覧からメニュー生成
var popup = CreatePopupMenu();
ListToMenu(f, popup);
//ポップアップメニューを表示して処理
var tr = popup.Track(mePosMouse);
if (tr) { //※キャンセル(Esc)時は0が返る
var $C = cmd[tr];
switch ($C["mode"]) {
case "F": //関数を実行
$C["func"](sel);
break;
case "R": //選択範囲を置換
sel.Text = $C["func"](sel.Text);
break;
case "RS": //行頭行末まで拡張
sel.Text = $C["func"](SelectLine(sel));
break;
case "RM": //一行ごとに処理
sel.Text = MultiLine($C["func"], sel);
break;
case "CR": //連続置換
sel.Text = ChainReplace($C["func"](), sel);
break;
}
}
//モード RS/RM 用関数:選択範囲を行頭行末まで拡張して返す
function SelectLine(sel) {
var meP = mePosLogical;
var ty = sel.GetTopPointY(meP); //範囲開始行
var by = sel.GetBottomPointY(meP); //範囲終了行
var bx = sel.GetBottomPointX(meP);
if (ty!=by && bx==1) by--; //行選択時、次行を含めないよう対策
sel.SetActivePoint(meP, 1, by);
sel.EndOfLine(false, meP);
sel.SetAnchorPoint(meP, 1, ty);
return sel.Text;
};
//モード RM 用関数:選択範囲を一行ごとに分割して処理
function MultiLine(func, sel) {
var result = [];
var lines = SelectLine(sel).split("\n");
for (var i=0; i<lines.length; i++) {
var text = func(lines[i]);
if (text != null) result.push(text); //戻値がnullの場合、破棄(行削除)
}
return result.join("\n");
};
//モード CR 用関数:リストに従い選択範囲を連続置換
function ChainReplace(list, sel) {
var text = sel.Text;
for (var i=0; i<list.length; i++) {
switch (true) {
case (typeof list[i][0]=="string"): //list[i] = ["検索","置換"]
text = text.split(list[i][0]).join(list[i][1]);
break;
case (list[i][0] instanceof RegExp): //list[i] = [/検索/,"置換"]
text = text.replace(list[i][0],list[i][1]);
break;
}
}
return text;
};
})();
拡張コード:コマンド
- (移植) の項目は、マクロ「テキスト変換」から移植したコマンドです。
- ★印の項目は、スターターパックに含まれているコマンドです。
小説/作文 用途
- ★地の文の行頭を字下げ
- 左引用符 ‘ “ /開き括弧 ( 〔 [ { 〈 《 「 『 【 および 半角空白/全角空白/水平タブ/改行以外の文字で始まる行を「地の文」とみなし、行頭に全角空白を挿入します。
f.push(["地の文の行頭を字下げ","RS",function(a){
return a.replace(/^([^‘“(〔[{〈《「『【 \t\n])/mg," $1") }]);
- ★括弧前の句読点を除去
- 右引用符 ’ ” /閉じ括弧 ) 〕 ] } 〉 》 」 』 】 の直前に句読点 、。,. がある場合、除去します。
f.push(["括弧前の句読点を除去","R",function(a){
return a.replace(/[、。,.](?=[’”)〕]}〉》」』】])/g,"") }]);
- ★連続する!?を整形
- 2文字以上連続する感嘆符 ! /疑問符 ? を半角2文字に整形します。
- 例> !!/!!?/?!!!/?!!!? → !!/!?/?!/??
f.push(["連続する!?を整形","CR",function(a){
return [ [/[!!][!?!?]*[!!]/g,"!!"],[/[!!][!?!?]*[??]/g,"!?"],[/[??][!?!?]*[!!]/g,"?!"],[/[??][!?!?]*[??]/g,"??"] ]}]);
- ★三点リーダー(……)に整形
- 3文字以上連続する中黒・句点・読点などを、三点リーダー2文字 …… に整形します。
- 例> そんな・・・・。 → そんな……。
- 変換対象となるのは以下の8パターンです。
名称 連続字数 例 Shift_JIS Unicode 全角読点 3字以上 、、、 0x8141 U+3001 全角句点 。。。 0x8142 U+3002 全角カンマ ,,, 0x8143 U+FF0C 全角ピリオド ... 0x8144 U+FF0E 全角中黒 ・・・ 0x8145 U+30FB 半角中黒 ・・・ 0xA5 U+FF65 三点リーダー 1字以上 … 0x8163 U+2026 二点リーダー ‥ 0x8164 U+2025
f.push(["三点リーダー(……)に整形","R",function(a){
return a.replace(/、{3,}|。{3,}|,{3,}|.{3,}|・{3,}|・{3,}|…{1,}|‥{1,}/g,"……") }]);
- ★全角ダッシュ(――)に整形
- 2文字以上連続する長音・罫線などを、全角ダッシュ2文字 ―― に整形します。
- 例> そんなーーー。 → そんな――。
- 変換対象となるのは以下の5パターンです。
名称 連続字数 例 Shift_JIS Unicode 全角長音符号 2字以上 ーー 0x815B U+30FC em ダッシュ
(全角ダッシュ)—— - U+2014 全角ダッシュ
(水平線)―― 0x815C U+2015 全角マイナス -- 0x817C U+FF0D 罫線(横) ── 0x849F U+2500
f.push(["全角ダッシュ(――)に整形","R",function(a){
return a.replace(/ー{2,}|\u2014{2,}|―{2,}|-{2,}|─{2,}/g,"――") }]);
- 青空文庫 ルビを除去
- 《 で始まり 》 で終わる箇所を除去します。ルビ開始位置を表す | がある場合、| も除去します。
- 例> 一応《いちおう》何時《いつ》もの/霧の|ロンドン警視庁《スコットランドヤード》 → 一応何時もの/霧のロンドン警視庁
f.push(["青空文庫 ルビを除去","R",function(a){
return a.replace(/(?:|(.+?))?《.*?》/g,"$1") }]);
- 青空文庫 注記を除去
- [# で始まり ] で終わる箇所を除去します。
- 例> [#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり] → 名※
f.push(["青空文庫 注記を除去","R",function(a){
return a.replace(/[#.*?]/g,"") }]);
- 外字を表す注記 ※[#~] を除去したくない場合は、下記の内容に差し替えてください。
- 例> [#注記付き]名※[#二の字点、1-2-22][#「(銘々)」の注記付き終わり] → 名※[#二の字点、1-2-22]
f.push(["青空文庫 注記(外字以外)を除去","R",function(a){
return a.replace(/(※[#.*?])|[#.*?]/g,"$1") }]);
Web/HTML 用途
- ★HTMLタグを除去
f.push(["HTMLタグを除去","R",function(a){
return a.replace(/<(".*?"|'.*?'|[^'"])*?>/g,"") }]);
- ★実体参照 &"<> ⇒ &xxx;/★実体参照 &xxx; ⇒ ␣><"&
- HTML で使用される文字実体参照の変換を行います。
文字 実体参照 備考 < ⇔ < 小なり不等号 (less than) > > 大なり不等号 (greater than) " " 引用符 (quotes) & & アンド (ampersand) ← 改行禁止空白 (no-break space)
- は U+00A0 (No-Break Space) ではなく、U+0020 (半角空白) に変換します。
- 空白文字から への変換は、実用上不都合が多いため行いません。
f.push(['実体参照 &&"<> → &&xxx;',"CR",function(a){
return [ ["&","&"],['"',"""],["<","<"],[">",">"] ]}]);
f.push(['実体参照 &&xxx; → \u2423><"&&',"CR",function(a){
return [ [" "," "],[">",">"],["<","<"],[""",'"'],["&","&"] ]}]);
- 数値参照 文字 ⇒ &#dec;/数値参照 &#dec; ⇒ 文字
- → 符号化/復号化 の節の Unicode 文字 ⇒ &#dec;/Unicode &#dec; ⇒ 文字 を参照
マクロ/コード 用途
- ★行頭 // を付加/削除
- 行頭に // が無い行なら // を付加し、有る行なら // を削除します。
- ※このコマンドをよく利用される場合は「コメントマーク付け外し」マクロの導入をオススメします。
f.push(["行頭 \/\/ を付加/削除","RM",function(a){
return a.match(/^\/\/.*$/)? a.slice(2): "\/\/"+a }]);
- ★インデント(半角空白2個)
- 各行の行頭に半角空白2文字を挿入します。
- ※このコマンドをよく利用される場合は「字下げ・字上げ」マクロの導入をオススメします。
f.push(["インデント(半角空白2個)","RM",function(a){
return " "+a }]);
- 編集中のファイルのパスをコピー/編集中の全ファイルのパスをコピー
- 現在編集中のファイルの絶対パスをクリップボードにコピーします。
- 新規作成ファイルなどパスが存在しない場合は、無題 の2文字がコピーされます。
f.push(["編集中のファイルのパスをコピー","F",function(a){
ClipboardData.SetData(document.FullName||"無題") }]);
f.push(["編集中の全ファイルのパスをコピー","F",function(a){
var list=[],d=Editor.Documents; for(var i=0;i<d.Count;i++){list.push(d.Item(i).FullName||"無題")} ClipboardData.SetData(list.join("\r\n")) }]);
- My Macros フォルダを開く
- Mery の My Macros フォルダをエクスプローラで開きます。
f.push(["My Macros フォルダを開く","F",function(a){
new ActiveXObject("Shell.Application").Explore((new ActiveXObject("Scripting.FileSystemObject").GetParentFolderName(Editor.FullName))+"\\My Macros") }]);
- 挿入 confirm(|)
- 文字列
if(!confirm())Quit();を挿入します。 alert()と違い、[キャンセル] ボタンを押すとマクロを強制終了できるため、無限ループにハマっても対処できます。
f.push(["挿入 confirm(|)","F",function(a){
var p="if(!confirm(",s="))Quit();"; a.Text=p+a.Text+s; a.CharLeft(false,s.length) }]);
- 選択範囲を eval で評価
- ステータスバーに eval(選択範囲) した結果を表示します。
- たとえば、選択範囲が 10*(5+20) なら、250 と表示されます。
f.push(["選択範囲を eval で評価","F",function(a){
if(a.Text){Status=eval(a.Text)} }]);
検索/置換
- ★全角英数を検索
- 全角英数字を検索します。
f.push(["全角英数を検索","F",function(a){
a.Find("[0-9A-Za-z]",meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
- ★半角カナを検索
- 半角カナ類を検索します。
f.push(["半角カナを検索","F",function(a){
a.Find("[。-゚]",meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
- ★CJK漢字を検索
- CJK(中国/日本/韓国)で使用される漢字を検索します。
f.push(["CJK漢字を検索","F",function(a){
a.Find("\\p{Han}",meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
- 選択文字列を検索
- 「検索する文字列」に選択文字列を設定して「次/下を検索」します。
- ※仕様上、複数行=改行をまたぐ場合は検索文字列が強調されません。
f.push(["選択文字列を検索","F",function(a){
if(a.Text)a.Find(a.Text.replace(/([!$()*+./:=?[\\\]^{|}])/g,"\\$1"),"",meFindReplaceRegExp+meFindReplaceCase+meFindNext+meFindAround) }]);
- 選択文字列をすべて削除
- 「検索する文字列」に選択文字列を、「置換後の文字列」に空欄を設定して「すべて置換」します。
- ※検索文字列の強調が変更されます。仕様上、複数行=改行をまたぐ場合は検索文字列が強調されません。
f.push(["選択文字列をすべて削除","F",function(a){
if(a.Text)a.Replace(a.Text.replace(/([!$()*+./:=?[\\\]^{|}])/g,"\\$1"),"",meFindReplaceRegExp+meFindReplaceCase+meReplaceAll) }]);
- ★検索文字列の強調をすべて解除
- 「検索文字列の強調を解除」をすべての文書で実行します。ひとつひとつ解除するのが面倒な場合にご利用ください。
f.push(["検索文字列の強調をすべて解除","F",function(a){
var d=Editor.Documents; for(var i=0;i<d.Count;i++){d.Item(i).HighlightFind=false} }]);
挿入/貼付
- ★半角/全角の間を空ける/★半角英数/全角の間を空ける
- 半角文字/半角英数と全角文字の間に半角空白を挿入します。
- ※ここでは、半角文字=ASCII文字+半角カナ、全角文字=それ以外の文字、を意味しています。
f.push(["半角/全角の間を空ける","R",function(a){
return a.replace(/([!-~。-゚](?=[^!-~。-゚ \t\n])|[^!-~。-゚ \t\n](?=[!-~。-゚]))/g,"$1 ") }]);
f.push(["半角英数/全角の間を空ける","R",function(a){
return a.replace(/([0-9A-Za-z](?=[^!-~。-゚ \t\n])|[^!-~。-゚ \t\n](?=[0-9A-Za-z]))/g,"$1 ") }]);
- ★数値を3桁,区切りに
- 半角数字列を、3桁毎にカンマで区切ります。小数点以下(ピリオド . 以降の半角数字列)は桁区切りしません。
- 例> 12345678/1234.1234 → 12,345,678/1,234.1234
f.push(["数値を3桁,区切りに","R",function(a){
return a.split("").reverse().join("") .replace(/(\d{3})(?=\d)(?!\d*\.)/g,"$1,") .split("").reverse().join("") }]);
- 複製貼り付け
- クリップボードにコピーされた文字列を、入力した回数分複製してから貼り付けます。
f.push(["複製貼り付け","R",function(a){
var r=[],c=ClipboardData.GetData(),n=Prompt("複製回数: ※半角数字",""); if(!n)Quit(); for(var i=0,n=parseInt(n);i<n;i++){r.push(c)} return r.join("") }]);
- ★各行行頭/各行行末に貼り付け
- クリップボードにコピーされた文字列を、各行の行頭/行末に貼り付けます。
f.push(["各行行頭に貼り付け","RM",function(a){
return ClipboardData.GetData().replace(/(\r\n|\r|\n)$/,"")+a }]);
f.push(["各行行末に貼り付け","RM",function(a){
return a+ClipboardData.GetData().replace(/(\r\n|\r|\n)$/,"") }]);
- ★各行行頭/各行行末に文字列付加 (移植)
- 入力した文字列を、各行の行頭/行末に挿入します。
f.push(["各行行頭に文字列付加","RM",(function(a){
var c=null; return function(a){ if(!c){ if(!(c=Prompt("各行行頭に付加する文字列:",""))){Quit()} } return c+a } })()]);
f.push(["各行行末に文字列付加","RM",(function(a){
var c=null; return function(a){ if(!c){ if(!(c=Prompt("各行行末に付加する文字列:",""))){Quit()} } return a+c } })()]);
- 各行先頭/各行末尾に文字列付加 (矩形対応/Mery 2.1.0~)
- 入力した文字列を、Mery の置換機能を利用して各行の先頭/末尾に挿入します。
- ※矩形対応には Mery 2.1.0 以降が必要です。動作は Mery の矩形置換の仕様に準じます。
- ※Mery の置換機能を利用するため検索文字列の強調が解除されます(正確には解除でなく変更)。
- ※Mery の仕様上、零幅での文字挿入や矩形置換はできません。零幅で実行すると、行頭(表示行)に文字列が挿入されます。
f.push(["各行先頭に文字列付加","F",function(a){
var c=Prompt("各行先頭に付加する文字列:",""); if(!c)Quit(); a.Replace("^",c,meReplaceSelOnly+meReplaceAll+meFindReplaceRegExp) }]);
f.push(["各行末尾に文字列付加","F",function(a){
var c=Prompt("各行末尾に付加する文字列:",""); if(!c)Quit(); a.Replace("(?<=.|^)$",c,meReplaceSelOnly+meReplaceAll+meFindReplaceRegExp) }]);
除去/削除
- ★空白文字を除去
- 空白文字(半角空白/全角空白/水平タブ)を除去します。
f.push(["空白文字を除去","R",function(a){
return a.replace(/[ \t]+/g,"") }]);
- ★行頭行末の空白を除去 (移植)
- 行頭および行末にある空白文字(半角空白/全角空白/水平タブ)を除去します。
f.push(["行頭行末の空白を除去","RS",function(a){
return a.replace(/^[ \t]+|[ \t]+$/mg,"") }]);
- ★空白行を削除
- 改行のみの行、空白文字(半角空白/全角空白/水平タブ)のみの行を削除します。
f.push(["空白行を削除","RM",function(a){
return a.match(/^[ \t]*$/)? null:a }]);
- 空白行を圧縮
- 1行の空白行は削除し、2行以上の空白行は1行に圧縮します。
- ネット小説など、行空けを多用しているテキストの行間を詰めることができます。
f.push(["空白行を圧縮","R",function(a){
return a.replace(/\n([ \t]*\n){2,}/mg,"\n\n\n").replace(/\n([ \t]*\n)/mg,"\n") }]);
- ★入力文字列を含む行/含まない行を削除 (移植)
f.push(["入力文字列を含む行を削除","RM",(function(a){
var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の文字列を含む行を削除:",""))){Quit()} } return (a.indexOf(c)>=0)? null:a } })()]);
f.push(["入力文字列を含まない行を削除","RM",(function(a){
var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の文字列を含まない行を削除:",""))){Quit()} } return (a.indexOf(c)>=0)? a:null } })()]);
- ★正規表現に一致する行/一致しない行を削除 (移植)
f.push(["正規表現に一致する行を削除","RM",(function(a){
var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の正規表現に一致する行を削除:",""))){Quit()}else{c=new RegExp(c)} } return c.test(a)? null:a } })()]);
f.push(["正規表現に一致しない行を削除","RM",(function(a){
var c=null; return function(a){ if(!c){ if(!(c=Prompt("以下の正規表現に一致しない行を削除:",""))){Quit()}else{c=new RegExp(c)} } return c.test(a)? a:null } })()]);
- ★重複行を削除 (移植)
- まったく同じ内容の行が2個以上ある場合、2個目以降を削除します。
f.push(["重複行を削除","RS",function(a){
a=a.split("\n"); var b=[],map={}; for(var i=0;i<a.length;i++){ if(!map[a[i]]){map[a[i]]=true;b.push(a[i])} } return b.join("\n") }]);
並べ替え
- 行の並べ替え(Unicode 昇順/降順) (移植)
- 行をUnicode順で並べ替えます。
- ※より柔軟に並べ替えたい場合は「行並べ替え」マクロの導入をオススメします。
f.push(["行の並べ替え(Unicode 昇順)","RS",function(a){
return a.split("\n").sort().join("\n") }]);
f.push(["行の並べ替え(Unicode 降順)","RS",function(a){
return a.split("\n").sort().reverse().join("\n") }]);
- 文字の並び順を逆転
- 行単位で文字列を左右逆転させます。
- 例> 文字の並び順を逆転 → 転逆を順び並の字文
- ※サロゲートペアは対策済ですが、異体字セレクタや結合文字列などは未対策です(位置がズレます)。
f.push(["文字の並び順を逆転","R",function(a){
return a.replace(/.+/g,function(s){return s.split("").reverse().join("").replace(/([\uDC00-\uDFFF])([\uD800-\uDBFF])/g,"$2$1")}) }]);
字種/数値変換
- 大文字に変換/小文字に変換
- Mery の「選択範囲の変換」機能の一部を再現したものです。
f.push(["大文字に変換","F",function(a){
a.ChangeCase(meCaseUpperCase) }]);
f.push(["小文字に変換","F",function(a){
a.ChangeCase(meCaseLowerCase) }]);
- 半角に変換/全角に変換
- Mery の「選択範囲の変換」機能の一部を再現したものです。
f.push(["半角に変換","F",function(a){
a.ChangeWidth(meWidthHalfWidth) }]);
f.push(["全角に変換","F",function(a){
a.ChangeWidth(meWidthFullWidth) }]);
- ★半角英数⇒全角/★全角英数⇒半角 (移植)
f.push(["半角英数→全角","R",function(a){
return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0xFEE0)}) }]);
f.push(["全角英数→半角","R",function(a){
return a.replace(/[0-9A-Za-z]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0)}) }]);
- ★半角カナ⇒全角/★全角カナ⇒半角
f.push(["半角カナ→全角","CR",function(a){
return [ ["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]}]);
f.push(["全角カナ→半角","CR",function(a){
return [ ["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゛","゙"],["゜","゚"] ]}]);
- ★全角かな⇒カナ/★全角カナ⇒かな
- 全角ひらがなと全角カタカナを変換します。ただし、ヴヵヶ → ゔゕゖ の変換は行いません(ゔゕゖ の3文字が Shift_JIS では保存できないため)。
f.push(["全角かな→カナ","R",function(a){
return a.replace(/[\u3041-\u3096ゝゞ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x60)}) }]);
f.push(["全角カナ→かな","R",function(a){
return a.replace(/[\u30A1-\u30F3ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
- ヴヵヶ → ゔゕゖ を変換したい場合は、下記の内容に差し替えてください。
f.push(["全角カナ→かな","R",function(a){
return a.replace(/[\u30A1-\u30F6ヽヾ]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0x60)}) }]);
- 標準変換
- マクロ「標準変換」を移植(一部改変 ※下表参照)したものです。
全角英数・全角記号は半角に、半角カナは全角に変換します。
変換前 標準変換版 テキスト整形版 ‘ 全角左シングルクォート ` 半角グラーブアクセント ' 半角アポストロフィー/半角シングルクォート ` 全角グラーブアクセント ※変換しない ` 半角グラーブアクセント
f.push(["標準変換","CR",function(a){
return [ [" "," "],["!","!"],["“",'"'],["”",'"'],["#","#"],["$","$"],["%","%"],["&","&"],["‘","'"],["’","'"],["(","("],[")",")"],["*","*"],["+","+"],[",",","],["-","-"],[".","."],["/","/"],["0","0"],["1","1"],["2","2"],["3","3"],["4","4"],["5","5"],["6","6"],["7","7"],["8","8"],["9","9"],[":",":"],[";",";"],["<","<"],["=","="],[">",">"],["?","?"],["@","@"],["A","A"],["B","B"],["C","C"],["D","D"],["E","E"],["F","F"],["G","G"],["H","H"],["I","I"],["J","J"],["K","K"],["L","L"],["M","M"],["N","N"],["O","O"],["P","P"],["Q","Q"],["R","R"],["S","S"],["T","T"],["U","U"],["V","V"],["W","W"],["X","X"],["Y","Y"],["Z","Z"],["[","["],["¥","\\"],["]","]"],["^","^"],["_","_"],["`","`"],["a","a"],["b","b"],["c","c"],["d","d"],["e","e"],["f","f"],["g","g"],["h","h"],["i","i"],["j","j"],["k","k"],["l","l"],["m","m"],["n","n"],["o","o"],["p","p"],["q","q"],["r","r"],["s","s"],["t","t"],["u","u"],["v","v"],["w","w"],["x","x"],["y","y"],["z","z"],["{","{"],["|","|"],["}","}"],["~","~"],["。","。"],["「","「"],["」","」"],["、","、"],["・","・"],["ヲ","ヲ"],["ァ","ァ"],["ィ","ィ"],["ゥ","ゥ"],["ェ","ェ"],["ォ","ォ"],["ャ","ャ"],["ュ","ュ"],["ョ","ョ"],["ッ","ッ"],["ー","ー"],["ア","ア"],["イ","イ"],["ヴ","ヴ"],["ウ","ウ"],["エ","エ"],["オ","オ"],["ガ","ガ"],["ギ","ギ"],["グ","グ"],["ゲ","ゲ"],["ゴ","ゴ"],["カ","カ"],["キ","キ"],["ク","ク"],["ケ","ケ"],["コ","コ"],["ザ","ザ"],["ジ","ジ"],["ズ","ズ"],["ゼ","ゼ"],["ゾ","ゾ"],["サ","サ"],["シ","シ"],["ス","ス"],["セ","セ"],["ソ","ソ"],["ダ","ダ"],["ヂ","ヂ"],["ヅ","ヅ"],["デ","デ"],["ド","ド"],["タ","タ"],["チ","チ"],["ツ","ツ"],["テ","テ"],["ト","ト"],["ナ","ナ"],["ニ","ニ"],["ヌ","ヌ"],["ネ","ネ"],["ノ","ノ"],["バ","バ"],["ビ","ビ"],["ブ","ブ"],["ベ","ベ"],["ボ","ボ"],["パ","パ"],["ピ","ピ"],["プ","プ"],["ペ","ペ"],["ポ","ポ"],["ハ","ハ"],["ヒ","ヒ"],["フ","フ"],["ヘ","ヘ"],["ホ","ホ"],["マ","マ"],["ミ","ミ"],["ム","ム"],["メ","メ"],["モ","モ"],["ヤ","ヤ"],["ユ","ユ"],["ヨ","ヨ"],["ラ","ラ"],["リ","リ"],["ル","ル"],["レ","レ"],["ロ","ロ"],["ワ","ワ"],["ン","ン"],["゙","゛"],["゚","゜"] ]}]);
- 丸数字 ⑳ ⇒ (20)/丸数字 (20) ⇒ ⑳
- 丸付き数字 ①~⑳ と (1)~(20) を変換します。(01)~(09) も変換対象に含まれます。
f.push(["丸数字 ⑳ → (20)","R",function(a){
return a.replace(/[①-⑳]/g,function(s){return "("+(s.charCodeAt(0)-0x245F)+")"}) }]);
f.push(["丸数字 (20) → ⑳","R",function(a){
return a.replace(/\((\d{1,2})\)/g,function(s,s1){s1=Number(s1); return (0<s1&&s1<21)?String.fromCharCode(s1+0x245F): s}) }]);
- ★10⇒16進数
- 半角数字列を10進数値とみなし、16進数値に変換します。
- 例> 291/15/44015 → 123/F/ABEF
f.push(["10→16進数","R",function(a){
return a.replace(/\d+/g,function(s){return Number(s).toString(16).toUpperCase()}) }]);
- ★16⇒10進数
- 半角英数字列を16進数値とみなし、10進数値に変換します。英字の大小、0x の有無は問いません。
- 例> 123/0x0F/abef → 291/15/44015
f.push(["16→10進数","R",function(a){
return a.replace(/(?:0x)?([0-9A-Fa-f]+)/g,function(s,s1){return Number("0x"+s1)}) }]);
- 2進接頭辞換算(Ki,Mi,Gi...)
- 210 = 1024 の倍量単位に変換します(小数点第3位を四捨五入)。
- 例> 1023/1024/54321/1,048,576/1,073,741,824 → 1023/1.00Ki/53.05Ki/1.00Mi/1.00Gi
f.push(["2進接頭辞換算(Ki,Mi,Gi...)","R",function(a){
return a.replace(/\d+(?:,?\d{3})+(?:\.\d+)?/g,function(s){var n=s.replace(/,/g,""); if(n<1024)return s; var x=0; while(x<8&&n>=1024){x++;n/=1024} return n.toFixed(2)+" KMGTPEZY".charAt(x)+"i"}) }]);
符号化/復号化
- URL %エンコード/デコード(UTF-8)
- URL アドレスに使用される UTF-8 パーセントエンコーディングの符号化/復号化を行います。
f.push(["URL %エンコード(UTF-8)","R",function(a){
return encodeURI(a).replace(/%0D%0A|%0D|%0A/g,"\n") }]);
f.push(["URL %デコード(UTF-8)","R",function(a){
return decodeURIComponent(a) }]);
- Unicode 文字 ⇒ \uHHHH
- 文字列を \uHHHH 形式に変換します。※HHHH=4桁の16進数(大文字)・UTF-16BEバイト列
- 例> Aわ𠀋 → \u0041\u308F\uD840\uDC0B
f.push(["Unicode 文字 → \\uHHHH","R",function(a){
return a.replace(/./g,function(s){return "\\u"+("000"+s.charCodeAt(0).toString(16).toUpperCase()).slice(-4)}) }]);
- Unicode \uHHHH ⇒ 文字
- \uHHHH 形式を文字列に変換します。※HHHH=4桁の16進数(英字の大小問わず)・UTF-16BEバイト列
f.push(["Unicode \\uHHHH → 文字","R",function(a){
return a.replace(/\\u([0-9A-Fa-f]{4})/g,function(s,s1){return String.fromCharCode(Number("0x"+s1))}) }]);
- Unicode 文字 ⇒ \x{hex}
- 文字列を \x{hex} 形式に変換します。※hex=1~6桁の16進数(小文字)・Unicodeスカラー値
- 例> Aわ𠀋 → \x{41}\x{308f}\x{2000b}
f.push(["Unicode 文字 → \\x{hex}","R",function(a){
return a.replace(/.+/g,function(s){var r=[]; for(var i=0;i<s.length;i++){var u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){var v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r.push("\\x{"+u.toString(16)+"}")} return r.join("")}) }]);
- Unicode \x{hex} ⇒ 文字
- \x{hex} 形式を文字列に変換します。※hex=1~6桁の16進数(英字の大小問わず)・Unicodeスカラー値
f.push(["Unicode \\x{hex} → 文字","R",function(a){
return a.replace(/\\x{([0-9A-Fa-f]{1,6})}/g,function(s,s1){s1=Number("0x"+s1); return (s1<=0xFFFF)?String.fromCharCode(s1): (s1<=0x10FFFF)?String.fromCharCode((s1-0x10000>>10)+0xD800,(s1-0x10000&0x3FF)+0xDC00): s}) }]);
- Unicode 文字 ⇒ &#dec;
- 文字列を &#dec; 形式に変換します。※dec=1~7桁の10進数・Unicodeスカラー値
- 例> Aわ𠀋 → Aわ𠀋
f.push(["Unicode 文字 → &&#dec;","R",function(a){
return a.replace(/.+/g,function(s){var r=[]; for(var i=0;i<s.length;i++){var u=s.charCodeAt(i); if(0xD800<=u&&u<=0xDBFF){var v=s.charCodeAt(i+1); if(0xDC00<=v&&v<=0xDFFF){i++;u=0x10000+(u-0xD800<<10)+(v-0xDC00)}} r.push("&#"+u+";")} return r.join("")}) }]);
- Unicode &#dec; ⇒ 文字
- &#dec; 形式を文字列に変換します。※dec=1~7桁の10進数・Unicodeスカラー値
f.push(["Unicode &&#dec; → 文字","R",function(a){
return a.replace(/&#([0-9]{1,7});/g,function(s,s1){s1=Number(s1); return (s1<=0xFFFF)?String.fromCharCode(s1): (s1<=0x10FFFF)?String.fromCharCode((s1-0x10000>>10)+0xD800,(s1-0x10000&0x3FF)+0xDC00): s}) }]);
- Base64エンコード(Unicode) (移植)
f.push(["Base64エンコード(Unicode)","R",function(text){
var map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); var Ch=function(n){return n<text.length? text.charCodeAt(n):0}; var len=text.length, pad=len%3, s=""; for(var i=0;i<len;i+=3){var tmp=(Ch(i)<<16)|(Ch(i+1)<<8)|Ch(i+2); s+=map[(tmp>>>18)&0x3F]+map[(tmp>>>12)&0x3F]+map[(tmp>>>6)&0x3F]+map[tmp&0x3F]} if(pad){s=s.substring(0, s.length-(3-pad))+"===".substring(pad)} return s }]);
コマンド テンプレート
拡張コードの雛形を挿入します。コマンドを自作したい場合にご利用ください。
f.push(["コマンド テンプレート",function(f){
f.push(["コマンド F (Function)","F",function(a){
document.Writeln('f.push(["","F",function(a){\n }]);'); a.CharLeft(false,5) }]);
f.push(["コマンド R (Replace)","F",function(a){
document.Writeln('f.push(["","R",function(a){\n return }]);'); a.CharLeft(false,5) }]);
f.push(["コマンド RS (Select-line)","F",function(a){
document.Writeln('f.push(["","RS",function(a){\n return }]);'); a.CharLeft(false,5) }]);
f.push(["コマンド RM (Multi-line)","F",function(a){
document.Writeln('f.push(["","RM",function(a){\n return }]);'); a.CharLeft(false,5) }]);
f.push(['コマンド CR (Chain)',"F",function(a){
document.Writeln('f.push(["","CR",function(a){\n return [ '+ a.Text.replace(/\n$/,"") +' ]}]);'); a.CharLeft(false,7) }]);
f.push(["----"]);
f.push(["サブメニュー","F",function(a){
document.Writeln('f.push(["",function(f){\n'+ a.Text +'}]);'); a.CharLeft(false,5) }]);
f.push(["セパレータ","F",function(a){
document.Writeln('f.push(["----"]);') }]);
}]);
- モード CR 作成補助
- モード CR (連続置換) コマンドの配列作成を補助するコマンド群です。
- ※書式の解析精度は不完全です。検索/置換文字に
" ' , / \ ]を含むリストは誤変換する恐れがあります。 - ※書式ミスがある場合については考慮していません。誤変換した場合は書式ミスの可能性も疑ってみてください。
- 交換 ["a","b"] ⇒ ["b","a"]
- リストの検索文字列と置換文字列を入れ替えます。※正規表現は検索/置換の役割を交換できないため何もしません(例では
■,□のペアが該当)。 - 例>
["●","○"],['▲','△'],[/■/g,"□"],["◆",'◇']→["○","●"],['△','▲'],[/■/g,"□"],['◇',"◆"]
f.push(['交換 ["a","b"] → ["b","a"]',"R",function(a){
return a.replace(/\[((?:"(?:(?:\\\\)*\\"|[^"])*?")|(?:'(?:(?:\\\\)*\\'|[^'])*?')),((?:"(?:(?:\\\\)*\\"|[^"])*?")|(?:'(?:(?:\\\\)*\\'|[^'])*?'))\]/g,"[$2,$1]") }]);
- 分割 ["a","b"] ⇒ "a" › "b"↲
- 結合 "a" › "b"↲ ⇒ ["a","b"]
- リストと TSV 形式を変換します。
["●","○"],['▲','△'],[/■/g,"□"]
分割→
←結合"●" "○" '▲' '△' /■/g "□"
f.push(['分割 ["a","b"] → "a" \u203A "b"\u21B2',"R",function(a){
return a.replace(/\[((?:"(?:(?:\\\\)*\\"|[^"])*?")|(?:'(?:(?:\\\\)*\\'|[^'])*?')|(?:\/.*?\/[igm]*)),((?:"(?:(?:\\\\)*\\"|[^"])*?")|(?:'(?:(?:\\\\)*\\'|[^'])*?'))\],?/g,"\n$1\t$2\n").replace(/\n\n/g,"\n") }]);
f.push(['結合 "a" \u203A "b"\u21B2 → ["a","b"]',"R",function(a){
return a.replace(/\n?(((".*"|'.*'|\/.*\/[igm]*)\t(".*"|'.*')\n*)+)/g,function(s,s1){return s1.replace(/(".*"|'.*'|\/.*\/[igm]*)\t(".*"|'.*')\n*/g,"[$1,$2],").replace(/,$/,"")}) }]);
拡張コード:コマンド書式
拡張コードは以下の書式に従い、記述してください。
※コマンドの自作・改変には、マクロや正規表現についての知識が要求されます。
コマンド
f.push(["コマンド名","モード",function(引数){ マクロ }]);
- モード F (Function)
- 【マクロ】の記述をそのまま実行するコマンドです。
f.push(["コマンド名","F",function( Document.Selection ){ マクロ }]);
- モード R (Replace)
- 選択範囲を【マクロ】の処理結果で置換します。
- ※「テキスト変換」の replace 関数に相当します。
f.push(["コマンド名","R",function( Document.Selection.Text ){return マクロ }]);
- モード RS (Select-line)
- 選択範囲を行頭末まで拡張して【マクロ】の処理結果で置換します。
- ※「テキスト変換」の replaceS 関数に相当します。
f.push(["コマンド名","RS",function( Document.Selection.Text ){return マクロ }]);
- モード RM (Multi-line)
- 選択範囲を一行ごとに分割して【マクロ】の処理結果で置換します。
- ※「テキスト変換」の replaceL 関数に相当します。
f.push(["コマンド名","RM",function( Document.Selection.Text ){return マクロ }]);
- モード CR (Chain Replace)
- 選択範囲をリスト(配列)の内容に従い連続置換します。
- 正規表現を利用する場合、JScript (JavaScript) の仕様に則り記述します。Mery の正規表現 (鬼車ライブラリ) とは仕様が異なる点があるので注意してください。
f.push(["コマンド名","CR",function(){return [ ["検索文字列","置換文字列"] ]}]);
f.push(["コマンド名","CR",function(){return [ [/パターン/フラグ,"置換文字列"] ]}]);
- リストは , カンマ区切りで連結することができます。
f.push(["コマンド名","CR",function(){return [ ["検索1","置換1"],[/パターン2/,"置換2"],["検索3","置換3"] ]}]);
- 置換は、リストの先頭から順番に実行されます。したがって、リストの記述順で結果が変わります。
- たとえば、123 という文字列に対し、例1 と 例2 を実行した結果は 444 と 234 になります。
f.push(["例1","CR",function(){
return [ ["1","2"],["2","3"],["3","4"] ]}]);
|
f.push(["例2","CR",function(){
return [ ["3","4"],["2","3"],["1","2"] ]}]);
|
サブメニュー
サブメニューを設けます。コマンドをグループやカテゴリに仕分けたり、使用頻度の低いコマンドをまとめたり、と用途は様々です。
サブメニュー内にサブメニューを作ること(階層化)も可能です。階層の数に制限はありません。
f.push(["メニュー名",function(f){
【コマンド or サブメニュー or セパレータ】
}]);
セパレータ
メニューに区切り(セパレータ)を設けます。
f.push(["----"]);
半角ハイフン - の数は何個でもかまいません。
ただし、半角ハイフン以外の文字を含めてはいけません。
f.push(["-"]); //← OK (1個)
f.push(["----------"]); //← OK (10個)
f.push(["--区切り--"]); //← NG
スポンサーリンク