web404

HTML要素の開始タグから終了タグまでを範囲選択するマクロ

カーソルを含むHTML要素の開始タグから終了タグまでを範囲選択します。
範囲選択した状態で実行すると、逆方向に範囲選択します。

これにより、開始タグと終了タグが離れていて選択範囲が画面に収まらない場合でも、マクロを再度実行することで要素の範囲を確認できます
このマクロにショートカットキーを割り当てて使うと便利です。

範囲選択がおかしければ、タグの対応関係もおかしいとわかります。
たとえば、終了タグが存在しない要素は選択できません。
終了タグが見つからない要素は無視して、カーソルを含む開始タグと終了タグを持つ要素を範囲選択します。

タグを単独で選択したい場合は、HTMLタグを選択するマクロが別にあります。


ダウンロード

element.zip


更新履歴

Version 1.01 (2024/2/25)
  • 空要素の定義を削除
Version 1.00 (2023/12/14)
  • 公開

ソースコード

setcompatiblemode 0x20200;
#x = x; #y = y;
disabledraw;

call SelectReverse;

while (1) {
	if (selecting) escape;
	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;
	$tag = gettext(x, y, selendx, selendy);	//開始タグ
	#len = strstr($tag, " ") - 1;	//要素名の長さ
	if (#len < 0) #len = strlen($tag) - 2;
	$en = midstr($tag, 1, #len);	//要素名
	while (1) {
		if (selecting) escape;
		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 > #yr || (#x > #xr && #y == #yr)) && (#y < y || (#x < x && #y == y))) break;
	moveto #xr, #yr;
}

moveto #xr, #yr;
beginsel;
moveto #xre, #yre;
endsel;

goto End;

SelectReverse:	//逆方向に選択
	if (!selecting) return;
	##xt = seltopx; ##yt = seltopy; ##xe = selendx; ##ye = selendy;
	
	if (rectselecting) beginrect;
	else beginsel;
	if (x == ##xe && y == ##ye) moveto ##xt, ##yt;
	else moveto ##xe, ##ye;
	endsel;
	
	goto End;

CheckElement:	//指定文字列における指定要素のタグの対応を調べる
	call Count $$1, "<" + $$2 + " ";
	##stag = ##return;	//開始タグの数
	call Count $$1, "<" + $$2 + ">";
	##stag = ##stag + ##return;
	call Count $$1, "</" + $$2 + ">";
	##etag = ##return;	//終了タグの数
	##match = 0;
	if (##stag == ##etag) ##match = 1;
	return ##match;

Count:	//文字列の出現回数を調べる
	$$str = $$1;	//検索対象文字列
	##n = strstr($$1, $$2);	//文字列の出現位置
	##len = strlen($$2);	//文字列長
	##i = 0;
	while (##n > -1) {
		##i = ##i + 1;
		$$str = midstr($$str, ##n + ##len);	//未検索文字列
		##n = strstr($$str, $$2);
	}
	return ##i;

End:	//終了処理
	enabledraw;
	endmacro;

開始タグと終了タグの数を比較することで、要素の範囲を判定しています。

逆方向に選択するのはおまけ機能ですが、他の用途で使うことも考えてBOX選択にも対応しています。