// 秀丸専用
// この版はベータ版です。一応動きますが、特定の条件下で些細な誤変換が残ってます。
// このマクロは編集中のファイルに変更を加えます。実行する前に必ず保存してください。
// マクロのバグで無限ループに陥ったりすると、取り返しのつかないことになりかねません。
// で。
// これはプログラムなどの文字列をHTMLで表示できるようにするためのコンバータっぽいものです。
// HTMLのメタ文字である < を < にしたり、& を & にしたりします。
// また、タブも再現します。(字下げはスペース2文字分)
// ついでに、行末に改行タグを付加します。
// 認識しているタグが だった場合はOFFになります。
//大文字小文字は pre PRE Pre textarea TEXTAREA Textarea TextArea textArea のみ認識します。
$$br = "
";
##brask = 1; // 1 にすると毎回確認してきます。
//■プログラムのコメントを以下のタグでマークアップする
$$commentBegin = ""; //開始タグ("" にするとこの機能を使用しない)
$$commentEnd = ""; //終了タグ
$$defaultComment = "#"; //入力ダイアログに入ってるデフォルトの文字
// 対応コメント形式は // # ' ; % /* */ です。セミコロン(*.iniなど)は行頭からのみ対応します。
// 行コメントは開始位置から改行までをマークアップします。
// 範囲コメントの開始と終了の対応を間違えるとマークアップも間違えます。
// コメントの認識は、直前の文字とペアでマッチングします。
// 直前の文字が 行頭 スペース タブ ; ) ] } でないと認識しません。
// もしかしたら誤認識するケースがあるかもしれません。
// 例1:if (a > b && c)//条件分岐
// → if (a > b && b)//条件分岐
// 例2:
// → if ($#a) #行コメントを#にした場合
// → if ($#a) #行コメントを#にした場合
//■置換するリスト
//一番重要な設定。上から順に検索置換していきます。
//\n と \t だけは正規表現で検索置換するので、メタ文字はエスケープする必要があります。
//ここは特に無限置換の可能性が高いのでご注意を。
##i = 0;
$$sch[##i] = "&"; // & → & 検索文字
$$rep[##i] = "&"; //置換後の文字
##i = ##i +1;
$$sch[##i] = "<"; // < → <
$$rep[##i] = "<";
##i = ##i +1;
$$sch[##i] = ">"; // > → >
$$rep[##i] = ">";
##i = ##i +1;
$$sch[##i] = "\""; // " → " (これは変換しなくても文法違反にはならない)
$$rep[##i] = """;
##i = ##i +1;
$$sch[##i] = "\\t"; // タブ → +スペース(正規表現)
$$rep[##i] = " ";
##i = ##i +1;
$$sch[##i] = " "; // 2連続スペース → +スペース(1回目)
$$rep[##i] = " ";
##i = ##i +1;
$$sch[##i] = " "; //2回目(空白数が奇数だと1回目で最後が空白2つになる)
$$rep[##i] = " ";
##i = ##i +1;
//問い合わせダイアログでキャンセルした時、選択範囲を…
// 0 = 解除する
// 1 = 選択したまま
// 2 = いちいち問い合わせる
#exitselect = 1;
// せっかくタグの中身を綺麗に範囲選択できるということで、こんなオプションもご用意。
// 選択させておくと中身のコードを貼りかえる時なんかに便利かも?
// あまり出番の多いマクロではないから、2でもいいかもね。
// 範囲選択判定 //
disabledraw;
#currentX = column +1; #currentY = lineno;
$sbuffer = searchbuffer; #soption = searchoption;
##i = 0;
$codereg = ""; $codelist = "";
while ($$codes[##i] != "") {
$codereg = $codereg + $$codes[##i];
$codelist = $codelist + "<" + $$codes[##i] + "> ";
if ($$codes[##i +1] != "")
$codereg = $codereg + "|";
##i = ##i +1;
}
if (!selecting) {
if (!##autoSearch)
goto exit;
if (##autoSearch == 1)
call error "範囲選択されてません。\nマクロファイルの設定を変更すれば自動範囲選択を使うこともできます。\n\nマクロファイルの場所\n" + currentmacrofilename;
else if (##autoSearch == 3) {
call question "範囲選択されてません。タグを自動検出しますか?";
if (!##return)
goto exit;
}
call codeselect $$br;
$$codename = $$return;
} else {
if (rectselecting)
call error "すいません。BOX範囲選択には対応してません。";
##seltopx = seltopx; ##seltopy = seltopy; ##selendx = selendx; ##selendy = selendy;
escape;
moveto ##seltopx, ##seltopy;
#seltopcolumn = column +1;
#seltopline = lineno;
moveto ##selendx, ##selendy;
if (!column)
left;
#selendcolumn = column +1;
#selendline = lineno;
searchdown "(" + $codereg + ")>", regular, nocasesense;
if (result) {
$$codename = gettext(seltopx, seltopy, selendx, selendy);
call namecheck midstr($$codename, 2, strlen($$codename) -3);
$$codename = $$return;
}
moveto ##selendx, ##selendy;
beginsel;
moveto ##seltopx, ##seltopy;
endsel;
}
if (#seltopline == #selendline)
#inline = 1;
// コメント開始記号の取得 //
if ($$commentBegin != "") {
enabledraw;
$$cmt = input("マークアップするコメント開始文字を入力\n対応してる形式: // # ' % /*\n付加したくない時はでたらめな文字を入力", $$defaultComment);
disabledraw;
if ($$cmt == "")
goto cancel;
else if ($$cmt != "//" && $$cmt != "#" && $$cmt != "'" && $$cmt != ";" && $$cmt != "%" && $$cmt != "/*")
goto NOCOMMENT;
else if ($$cmt == "/*") {
$$regcmt = "/\\*";
$$endcmt = "*/";
$$endregcmt = "\\*/";
} else {
$$regcmt = $$cmt;
$$endcmt = "";
$$endregcmt = "";
}
}
NOCOMMENT:
// 前後に改行を入れる //
##seltopx = seltopx; ##seltopy = seltopy; ##selendx = selendx; ##selendy = selendy;
escape;
moveto ##selendx, ##selendy;
insertreturn;
left;
#selendcolumn = column +1;
#selendline = lineno +1;
moveto ##seltopx, ##seltopy;
##tab = 0;
while (1) {
left;
if (code != 9)
break;
##tab = ##tab +1;
}
right;
if (column)
##tab = 0;
moveto ##seltopx, ##seltopy;
insertreturn;
up;
if (code == 9)
##tab = 0;
down;
#seltopcolumn = column +1;
#seltopline = lineno;
call readjustselect;
// 文字参照へ置換 //
##i = 0;
while ($$sch[##i] != "") {
movetolineno #selendcolumn, #selendline;
beginsel;
movetolineno #seltopcolumn, #seltopline;
endsel;
if ($$sch[##i] == "\\t" || $$sch[##i] == "\\n")
replaceallfast $$sch[##i], $$rep[##i], regular, inselect;
else
replaceallfast $$sch[##i], $$rep[##i], casesense, inselect;
##i = ##i +1;
}
call readjustselect;
// コメントのマークアップ //
if ($$regcmt != "") {
##x = #seltopcolumn;
##y = #seltopline;
while (1) {
movetolineno #selendcolumn, #selendline;
beginsel;
movetolineno ##x, ##y;
endsel;
if ($$regcmt == ";")
$$reg = "\n";
else
$$reg = "[\\n\\t ;\\(\\)\\[\\]\\{\\}]";
searchdown $$reg + $$regcmt, regular, nocasesense, inselect;
if (!result)
break;
moveto selendx, selendy;
left strlen($$cmt);
insert $$commentBegin;
right strlen($$cmt);
if ($$endregcmt == "")
golineend2;
else {
searchdown $$endregcmt, regular;
if (result == 0 || lineno > #selendline) {
#currentX = column +1; #currentY = lineno -1;
if (result) {
#currentY = #currentY -1;
$$cmterrmsg = "のコメントがなんかおかしいです。開始コメントの対応がずれてないか確認してください。";
} else
$$cmterrmsg = "から始まってる開始コメント " + $$cmt + " に対応する終了コメントが見つかりませんでした。";
goto COMMENTERROR;
}
right strlen($$endcmt)-1;
}
insert $$commentEnd;
##x = column +1;
##y = lineno;
}
}
COMMENTERROR:
call readjustselect;
// 改行の置換 //
if ($$br != "" && $$codename != "pre" && $$codename != "textarea") {
if (##brask) {
call question "行末に " + $$br + " を付加しますか?\n\n※最後の行には付加されません。";
if (!##return)
goto NOBR;
}
replaceallfast "\\n", $$br + "\\n", regular, inselect;
searchup $$br;
delete;
#selendcolumn = column +1;
#selendline = lineno;
}
call readjustselect;
NOBR:
if ($$cmterrmsg != "")
call message "カーソル位置" + $$cmterrmsg;
// 前後の改行を元に戻す //
escape;
movetolineno #selendcolumn, #selendline;
golineend2;
delete;
movetolineno #seltopcolumn, #seltopline;
golinetop2;
while (##tab) {
tab;
##tab = ##tab -1;
}
golinetop2;
backspace;
#seltopline = #seltopline -1;
#selendline = #selendline -1;
call readjustselect;
goto exit;
// 自動範囲選択 //
codeselect:
$$br = $$1;
searchdown "(" + $codereg + ")>", regular, nocasesense;
if (result) {
$$code = gettext(seltopx, seltopy, selendx, selendy);
$$code = midstr($$code, 2, strlen($$code) -3);
##selendx = seltopx; ##selendy = seltopy;
if (!column)
left;
#selendline = lineno;
#selendcolumn = column +1;
} else
call error $codelist + "の終了タグが見つかりません。\n終了タグより前にカーソルを置く必要があります。";
searchup "<" + $$code + "[ >]", regular, nocasesense;
if (!result)
call error "開始タグ " + $codelist + "が見つかりません。";
searchdown ">";
right;
if (code == 13)
right;
#seltopline = lineno;
#seltopcolumn = column +1;
beginsel;
moveto ##selendx, ##selendy;
endsel;
call namecheck $$code;
$$code = $$return;
if ($$br == "" || $$code == "pre" || $$code == "textarea")
$$msg = "改行タグは付加されません。";
else
$$msg = "行末に " + $$br + " を付加します。(ただし最後の行のみ付加しません)";
enabledraw;
question "<" + $$code + "> を認識しました。この範囲内を変換します。\n\n" + $$msg + "\n\nいいですか?";
if (!result)
goto cancel;
disabledraw;
return $$code;
// その他 //
namecheck:
if ($$1 == "pre" || $$1 == "PRE" || $$1 == "Pre")
return "pre";
else if ($$1 == "textarea" || $$1 == "TEXTAREA" || $$1 == "Textarea" || $$1 == "TextArea" || $$1 == "textArea")
return "textarea";
return $$1;
readjustselect:
movetolineno #selendcolumn, #selendline;
golineend2;
#selendcolumn = column +1; #selendline = lineno;
beginsel;
movetolineno #seltopcolumn, #seltopline;
golinetop2;
endsel;
#seltopcolumn = column +1; #seltopline = lineno;
return;
question:
enabledraw;
question $$1;
disabledraw;
return result;
message:
enabledraw;
message $$1;
disabledraw;
return;
cancel:
enabledraw;
setsearch $sbuffer, #soption;
if (rectselecting == 1 || #exitselect == 1)
endmacro;
else if (#exitselect == 2) {
question "選択範囲を解除しますか?";
if (!result)
endmacro;
}
escape;
moveto #currentX, #currentY;
endmacro;
error:
call message $$1;
exit:
enabledraw;
setsearch $sbuffer, #soption;
if (rectselecting == 1)
endmacro;
escape;
moveto #currentX, #currentY;
endmacro;