HTML要素の開始タグから終了タグまでを選択するマクロ
カーソル位置を含むHTML要素の開始タグから終了タグまでを選択します。
範囲選択した状態で実行すると、選択範囲を逆方向に選択します。
これにより、開始タグと終了タグが離れていて選択範囲が画面に収まらない場合でも、マクロを再度実行することで要素の範囲を確認できます。
選択範囲がおかしければ、タグの対応関係もおかしいとわかります。
たとえば、終了タグが存在しない要素は選択できません。
終了タグが見つからない要素は無視して、カーソル位置を含む開始タグと終了タグを持つ要素を選択します。
タグを単独で選択したい場合は、HTMLタグを選択するマクロが別にあります。
ダウンロード
更新履歴
- Version 1.10 (2025/2/15)
- 範囲選択に関する修正
- 不要な処理の削除
- BOX選択に関する修正
- ソースコードの整理
過去の履歴
- Version 1.01 (2024/2/25)
- 空要素の定義を削除
- Version 1.00 (2023/12/14)
- 公開
ソースコード
setcompatiblemode 0x20200;
#x = x; #y = y;
disabledraw;
if (selecting) goto SelectReverse;
while (1) {
searchup "<[a-zA-Z][a-zA-Z0-9]*( [^>]+)?>", regular;
if (!result) {
if (x != #x || y != #y) moveto #x, #y;
beep;
goto End;
}
#xr = x; #yr = y;
$stag = gettext(x, y, selendx, selendy); //開始タグ
#len = strstr($stag, " ") - 1; //要素名の長さ
if (#len < 0) #len = strlen($stag) - 2;
$en = midstr($stag, 1, #len); //要素名
while (1) {
searchdown "</" + $en + ">";
if (!result) break;
moveto selendx, selendy;
#xre = x; #yre = y;
$str = gettext(#xr, #yr, x, y); //開始タグから終了タグまでの文字列
call CheckElement $str, $en;
if (##return) break;
}
if (result && (#y < y || (#x < x && #y == y))) break;
moveto #xr, #yr;
}
moveto #xr, #yr;
beginsel;
moveto #xre, #yre;
endsel;
goto End;
SelectReverse: //選択範囲を逆方向に選択
##xo = selopenx; ##yo = selopeny;
if (rectselecting) beginrect;
else beginsel;
moveto ##xo, ##yo;
endsel;
goto End;
CheckElement: //指定文字列における指定要素のタグの対応を調べる
call Count $$1, "<" + $$2 + " ";
##stag = ##return; //開始タグの数
call Count $$1, "<" + $$2 + ">";
##stag = ##stag + ##return;
call Count $$1, "</" + $$2 + ">";
##etag = ##return; //終了タグの数
return ##stag == ##etag;
Count: //文字列の出現回数を調べる
##n = strstr($$1, $$2); //文字列の出現位置
##len = strlen($$2); //文字列長
##i = 0;
while (##n > -1) {
##i = ##i + 1;
$$1 = midstr($$1, ##n + ##len); //未検索文字列
##n = strstr($$1, $$2);
}
return ##i;
End: //終了処理
enabledraw;
endmacro;
開始タグと終了タグの数を比較することで、要素の範囲を判定しています。
選択範囲を逆方向に選択するのはおまけ機能ですが、他の用途で使うことも考えてBOX選択にも対応しています。