<A href="../"|> リンク </A> | → | | リンク |
<BIG> +1 <BIG> +2 </BIG> +1 </BIG|> | ||
→ | +1 <BIG> +2 </BIG> +1 | | DeleteTag.mac の実行結果(正) |
<BIG> +1 <BIG> +2 | +1 | 某有名マクロの実行結果(誤) |
<LI> <UL> <LI>ここだけ省略 </UL> </LI|> |
→ |
<UL> <LI>ここだけ省略 </UL> | |
<LI> <UL> |ここだけ省略 </UL> |
|
DeleteTag.mac の 実行結果 |
某有名マクロの 実行結果 |
|<SMALL> 小さく </SMALL> しない | → | | 小さく しない |
<P> 段落 </P><P> 分けない </P> | → | <P> 段落| 分けない </P> |
<TD><P>けろぴー</P><IMG src="frog.gif"></TD> <TD><P>ねこ〜ねこ〜</P><IMG src="cat.jpg"></TD> |
→ |
<TD>|けろぴー</TD> <TD>ねこ〜ねこ〜</TD> |
設定はマクロ本体の冒頭部分を書き換えることで行います。
// (1) 終了タグなし: $MustOmitted = ""; // (2) 終了タグ省略可: $MightOmitted = "dt dd li p option td th tr colgroup tbody thead tfoot head body html";
" " 内に要素名を半角小文字・半角スペース区切りで書き並べます。対象とする文書中に
設定内容が処理速度に与える影響については後述します。
// 0:何もしない // 2:最初に見つけたタグを削除(確認あり) // 3:最初に見つけたタグを削除(確認なし) // 4:カーソル位置の要素を削除(確認あり) // 5:カーソル位置の要素を削除(確認なし) // 9:任意のコマンドを実行(85行目付近で指定) #WhereOutside = 4;
最初のタグはカーソル位置から上方向に探します。
カーソル位置の要素を指定すると、実行時の位置において閉じられていないタグ(言い換えれば、カーソル位置を直接支配する要素)を見つけて削除します。
任意のコマンドを指定すれば、同じキーストロークでもタグ内とタグ外で異なる動作をさせることができます。
// 1:範囲内に含まれるタグをすべて削除(確認あり) // 2:範囲内に含まれるタグをすべて削除(確認なし) #WhereSelecting = 1;
全体が選択範囲に覆われているタグだけを削除する、いわゆる囲み選択です。
旧バージョンでは一部でも選択範囲に入っていれば削除する、いわゆる掛け選択もサポートしていましたが、フェイルセーフでないことと実装が面倒なことから廃止しました。
bgsound spacer wbr
など)
$MustOmitted = " br img hr col input area param basefont base meta link isindex frame " + $MustOmitted + " ";
また、 $AnyTag
の正規表現がすべての要素名にマッチするようにしてください。
$AnyTag = "</?[A-Za-z][A-Za-z0-9:_.-]*" + $Delimiter;
<P> <EM> </P> <P> </EM> <EM> </P|> </EM> | → | <EM> </P> <P> </EM> <EM> | </EM> |
このような書き方はそもそも SGML の原則に違反していますから相手にしません。とはいえ、一応フールプルーフ(馬鹿除け?)な実装をしてるので、たまたま期待どおりの結果になることもあるでしょう。
<BIG>大きく <!-- <BIG>さらに大きく --> </BIG|> | → | <BIG>大きく <!-- さらに大きく -->| |
同様に、文字列リテラル・埋め込みスクリプトなどの中にあるタグ(のような文字列)も、地の文に書かれている(本物の)タグと区別できません。「<」「>」は、文字列リテラル中では文字参照を使って「<」「>」と書きましょう。埋め込みスクリプト中では比較演算子の両側にスペースを入れるようにしましょう。要は「<」とアルファベットが密着しないようにすれば大丈夫です。スクリプト中の文字列リテラルは……どうしましょうね? (^^;
$MustOmitted
から削除してください。
Version 4 からは「終了タグ省略可」の設定により、終了タグが省略されているかもしれない状況にも柔軟に対応できるようになりました。しかし、柔軟さと速さはトレードオフの関係にあります。終了タグが書かれていない要素を「終了タグ省略可」に設定した場合、もちろん正しい結果になりますが、処理にえらい時間がかかることがあります。次の例を見てください。
<SELECT> <OPTION>北海道 <OPTION>青森 … <OPTION>沖縄 </SELECT> |
ここで北海道の <OPTION> を削除しようとしたとき、 option
が「終了タグ省略可」に設定されていると、あるかもしれない </OPTION> を探してはるばる沖縄まで行きます。そして </SELECT> に出会ってはじめて </OPTION> が省略されていたことを知るわけです。 option
が「終了タグなし」に設定されていれば、最初から </OPTION> なんて探しに行きません。
「OPTION 要素は他の要素を含むことができないんだから、青森の <OPTION> に出会った時点で </OPTION> が省略されてることはわかるだろう」と思われるでしょう。おっしゃる通りなんですが、このマクロは要素の内容モデルに基づく判断はできません。そこまでやるとコードが膨大になりすぎるし、特定のバージョンの HTML でしか使えなくなるからです。そこで、代わりに SGML における次の原則を用いました: An end tag closes, back to the matching start tag, all unclosed intervening start tags with omitted end tags.
(the SGML standard, section 7.5.1) つまり、マッチしない終了タグに出会ったらマッチする開始タグまでネストを遡るわけです。この方法はすべての SGML アプリケーションに有効で、時間はかかっても正しい結果が得られます。速さを求める人のために「終了タグなし」と「終了タグあり」の設定も用意しました。妥協点としては妥当だと思うのですが、いかがでしょうか。
いろいろな削除系コマンドをまとめた "delete mode" を実現するマクロです。コマンドのひとつとして DeleteTag.mac が含まれています。
XML / HTML 編集用のマクロ群です。小粒でもぴりりと辛い機能が揃っています。 DeleteTag.mac と同じコンセプトの要素削除マクロも含まれています。
バグ報告・提案・質問・ツッコミなどは 談話室 へどうぞ。