(2003年8月のニフティへの書き込み) ざっと TSUITAG2 を読んでみました。 理解はしていませんが、なんとなくすばらしいコードに思えます。 いや、あくまでも私の印象なんで、どこがどのように、と言うようなことはさっ ぱりわからないのですが。 さて、コードの中で、mb を操作している部分に気がつきました。 そういえば、自分のマクロでは全く考慮していなかったなぁと思い、ブロックモ ードにしてから起動してみたら・・・ぎゃぁ。 全く動かないでやんの。 やっぱり、こういう細かいところまで気がつくのって、マクロを作り込んだ経験 なんでしょうかね。 ということで、ちょっとブロックモード対応にして見ました。 ただ、スマートな方法が思いつかなかった関係で、マークの3番だけでなくマー クの2番も汚してしまう事になりました。退避すれば済む話なんですが。 = complement tag * M 80 ^QG "対応するHTMLタグ" ?. Ew[+, Ec[+, Zh[-, ps[=pw, d=mb, mb-, &s &#M(3) b=ky, (cd=='>')?{#58} ;タグ閉じ括弧なら開き括弧にジャンプ :L (cd=='<')?{>M} ;タグ開き括弧なら処理 (cd=='>')?{>Q} ;タグの外にいた時は終了 #s (r)?{>e}?{>L} ;開き括弧に到着するまでまわる :M &#M(3) #d a0, ;カウンタ0クリア c1, (cd=='/')?{ ;終了タグなら (d)?{ ;ブロックモードなら #s #58 #d &#M(2) ;タグの尻尾の位置記憶 #s #58 #d } #d c0, } #G ;要素名取得し :N &o(#r+c) ;タグ検索 (r)?{>Y} ;見つからなかった時は終了 #s ;見つけたものが (cd=='<')?{ ;本当に開始タグなら (a||c)??{ (d)?{ ;ブロックモードなら #b &#U(2) #B ;記憶した位置までブロック } >Z } (a)?{ a=a+2*c-1, &o(#s+c) }?{ a++, #d } >N ;再検索 } (cd=='/')?{ ;終了タグらしきものの場合 #s (cd=='<')?{ ;本当に終了タグなら (a==0 && c)?{ (d)?{ ;ブロックモードなら #58 #d ;タグの尻尾に飛ばして #b &#U(3) #B ;記憶した位置までブロック } >Z } (a)?{ a=a+1-2*c, (c)?{#d#d} }?{ a++, } >N } } #d >N ;タグでなかった場合も再検索 :Y &m("対応するタグが見つかりません") :Q &#U(3) ky=b, mb=d, :Z ps], Zh], Ec], Ew], &d . * a:ネストカウンタ b:カーソル位置テンポラリ c:開始・終了タグ種別 d:ブロックモード保存 なんとなく動いているような気はするのですが。