[ ダウンロード | 概要 | 使い方 | アルゴリズム | 仕様 | 制限事項 | XHTML で使用する場合 | ベンチマーク | 競合製品のご案内 | 参考文献 | フィードバック ]
CloseTag33.mac Version 3.3 (2002/07/26) 6,591バイト
<A href="../"> 戻る | | → | <A href="../"> 戻る </A>| |
<TABLE> <TR><TD> </TD></TR> | |
→ |
<TABLE> <TR><TD> </TD></TR> </TABLE>| |
<STRONG> 強調 | | → | <STRONG> 強調 </STRONG>| |
このように、基本的には 開始タグ→内容→終了タグ の順で入力するスタイルを想定しています。
<STRONG>| | → | <STRONG>|</STRONG> |
開始タグ→終了タグ→内容 の順で入力するスタイルではこの方法が便利です。
<EM> </STR|ONG> | → | <EM> </EM>| |
<STRONG> 強調 ここまで | → | <STRONG> 強調 </STRONG>| |
<UL> <LI> | |
→ | <UL> <LI> </UL>| |
<UL> <LI> </LI>| |
|
</LI>を省略する 設定のとき |
</LI>を省略しない 設定のとき |
※ ここでは「空要素タグ」と「終了タグを省略する要素の開始タグ」を合わせて「単独タグ」と呼ぶことにします。
<P> <EM> <BIG> </EM> | | → | <P> <EM> <BIG> </EM> </P>| |
<P> <!-- <EM> --> | | → | <P> <!-- <EM> --> </EM>| |
たとえば下図の場合、 HR 要素の前で P 要素は暗黙的に閉じられて(=終了タグが省略されて)いますから </DIV> を挿入するのが正当ですが、 P 要素の終了タグを省略しない設定だと </P> が挿入されてしまいます。
<DIV> <P> <HR> | |
→ |
<DIV> <P> <HR> </DIV>| |
<DIV> <P> <HR> </DIV>| |
<DIV> <P> <HR> </P>| |
||
期待される 実行結果 |
</P>を省略する 設定のとき(正) |
</P>を省略しない 設定のとき(誤) |
このマクロは HTML の要素に関して「単独タグか否か」という情報しか持っていないため、要素の内容モデル(たとえば「P 要素はブロック要素を含むことができない」など)に基づく判断はできないのです。
騙されそうな例をもうひとつ挙げておきましょう。
<DL> <DT> <DD> </DD> | |
→ |
<DL> <DT> <DD> </DD> </DL>| |
<DL> <DT> <DD> </DD> </DL>| |
<DL> <DT> <DD> </DD> </DT>| |
||
正しい実行結果 | </DT>を省略する 設定のとき(正) |
</DT>を省略しない 設定のとき(誤) |
逆に、省略するはずの終了タグが存在した場合は問題なく動作します。
終了タグがあっても対をなす開始タグが見つからない場合、そこから文頭まで全部がその要素の内部と見なされてしまいます。
<HTML> <TITLE> </TITLE> (BODY 要素の開始タグを省略) </BODY> | |
→ | エラー |
同様に、要素同士がオーバーラップしている場合は(それがネストの内側でない限り)必ずエラーになります。
<DIV> <P> <EM> </P> </EM>| | → | エラー |
これは高速化のための実装としてネストの内側をスキップするようになっているからです。上の例では <P> と </P> の間(にある P 以外の要素)が無視されます。それでも、要素同士がきちんとネストしていれば(下記の場合を除いて)正しく解析できるはずです。
HTML の仕様では半角スペースのほかにタブと改行も区切り文字として許されていますが、秀丸マクロの strstr()
関数は検索文字列に正規表現が使えないため、タブや改行で区切られていてもきちんと要素名を取得できるアルゴリズムが私には思いつきませんでした。f(^^;
<BODY> <DIV[改行] class="main"> </DIV> | |
→ | エラー |
終了タグの要素名は「3文字めから n - 1 文字めまで」と決め打ちで取得しているため、終了タグ内に余計な文字があるとそれも要素名の一部と見なしてしまい、開始タグとのマッチングに失敗してエラーになることがあります。
手抜き実装と言われてしまえばそれまでですが、終了タグの「>」をわざわざ離して書く人もいないでしょう。(^^;
タグ内で2回以上改行しているものはタグとして認識されません。その結果、ネストのカウントに失敗してエラーになることがあります。
<BODY> <DIV class="main" id="section1" align="center"> </DIV> | |
→ | エラー |
これは秀丸の仕様によるものです。詳しくは秀丸エディタヘルプの[検索系コマンド - \nを使った複数行検索の際の制限について]を参照してください。
対症療法としては、検索に使っている正規表現の中に「\n」を何個も書けばその数までの改行に対応できるようになりますが、 (1)いったい何個まで対応すれば十分なのか決められない (2)私はタグ内に改行を入れない という理由により、とりあえず1回までとしてあります。どうしても複数回の改行に対応させたい場合は、マクロ本体の89行目を次のように書き換えてご使用ください。
searchup "</?" + $elemexp[#d] + "(/?>|[ \\n][^>]*>)", regular; // 直前のタグを検索 |
↓ |
searchup "</?" + $elemexp[#d] + "(/?>|[ \\n][^>]*\\n?\\n?\\n?>)", regular; // 直前のタグを検索 |
この例では4回までの改行に対応するようになります。必要なだけ「\\n?」を並べればOKです。
<br></br> <br/> <br /> |
簡略終了タグを使う場合、要素名と「/>」の間にスペースがあってもなくてもかまいませんが、上にも書いたように、要素名の直後にタブや改行を置いてはいけません。
<div> <a name="section1" /> | | → | <div> <a name="section1" /> </a>| |
サンプル | ファイルサイズ (2001/10/18 現在) | マクロ Version 3.2 | マクロ Version 2.1 | ||
---|---|---|---|---|---|
処理時間 | 検索タグ数 | 処理時間 | 検索タグ数 | ||
このページ | 22,070バイト | 2.4秒 | 123 | 16.7秒 | 966 |
私のブックマーク | 69,434バイト | 6.4秒 | 328 | 52.5秒 | 2,980 |
HTML 4.01 仕様書 第11章 | 130,423バイト | 7.3秒 | 402 | 200.0秒 | 3,887 |
だいたいタグ1個あたり 18ms 程度で処理していることがわかります。この値は専用の HTML エディタに比べれば遅いでしょうけれども、実用上まったくストレスなく使うことができる速度です。
# 最後のだけ 200000ms / 3887tags = 51ms/tag と有意に長いのはなぜでしょう…? キャッシュに乗らなかったのかな?
多機能な HTML 入力・編集支援マクロです。同じコンセプトのタグ閉じ機能も含まれています。 CloseTag.mac を作るにあたり、大文字/小文字変換ルーチンなどいくつかの部分を参考にさせていただきました。