|
IKKI です。
たらたら書いてるうちになんかもう紹介されちゃってますが…(汗)
> 上のタグ付き文書も対応するもの同士を機械的に判断することができる
> のでしょうか。
可能です。これが XML か否かで話が変わってきますが…
XML ならば、 ENCODINGSHIFTJIS さんがおっしゃるように
XML パーサに投げ込むのが速いし確実だと思います。
秀丸マクロで処理するには、スタックか再帰呼び出しを使うことになります。
再帰呼び出しを使った単純な例を文末に載せておきます。
のりさんに紹介していただいた CloseTag.mac はスタックを使っています。
HTML だと終了タグの省略があるので話はもっと複雑です。ご参考までに…
http://www18.big.or.jp/~fujiwara/ikki/forum/hidemaru/uptree.cgi?n=1370
//--------------------------------------------------------------------
// XML タグチェッカもどき by IKKI (2005/12/21)
//--------------------------------------------------------------------
//
// ・要素名の大文字小文字は区別される
// ・終了タグは省略できない(簡略終了タグも不可)
// ・要素間の依存関係は考慮されない
//
#debug = yes; // #debug = no; にするとメッセージを抑制
$pattern = "</?[A-Za-z][A-Za-z0-9:_.-]*(?=[ \\t\\n/>])";
searchdown "<[A-Za-z][A-Za-z0-9:_.-]*(?=[ \\t\\n/>])", regular;
if (#debug) message "ここからスタート";
call SeekPairDown midstr(gettext(foundtopx, foundtopy, foundendx, foundendy,
true), 1, 255);
endmacro;
SeekPairDown:
$$name1 = $$1;
searchdown $pattern, regular;
if (!result) goto NotFound;
while (true) {
$$name2 = midstr(gettext(foundtopx, foundtopy, foundendx, foundendy, true),
1, 255);
if (leftstr($$name2, 2) == "</") {
$$name2 = midstr($$name2, 1, 255);
if ($$name1 == $$name2) {
if (#debug) message "<" + $$name1 + "> → </" + $$name2 + ">\n終了タグが
現れた\n外へ";
return true;
} else {
if (#debug) message "<" + $$name1 + "> → </" + $$name2 + ">\n自分以外の
終了タグが現れた\n外へ";
call Omitted $$name1, $$name2;
return false;
}
} else {
if (#debug) message "<" + $$name1 + "> → <" + $$name2 + ">\n開始タグが現
れた\n中へ";
call SeekPairDown $$name2;
if (!##return) continue;
}
searchdown $pattern, regular;
if (!result) goto NotFound;
}
NotFound:
message "次のタグが見つかりません";
return true;
Omitted:
$$m = "</" + $$2 + "> の前に </" + $$1 + "> が省略されています。\n\n";
$$m = $$m + " △ <" + $$1 + "> 〜 </" + $$2 + ">\n";
$$m = $$m + " ○ <" + $$1 + "> 〜 </" + $$1 + "></" + $$2 + ">\n\n";
$$m = $$m + "</" + $$1 + "> を挿入しますか?";
question $$m;
if (result) {
escape;
insert "</" + $$1 + ">";
searchdown2 $pattern, regular;
}
return;
|
|