XHMTLで出力

http://d.hatena.ne.jp/coolstyle/20070417の閉じタグの話について。

DefaultMarkupModelそのままならscriptタグにはEndTagStyle.REQUIREを返すので、ちゃんと レンダリングしてくれます。なので、traditionalなHTMLでよければ問題無さそうで、XHTMLMarkupModelのようなものをちゃんと用意するのが正攻法かと思います。

しかしMarkupModel絡みのソースをざっと見たところ、<br>...</br>とかできないようにするにはorg.apache.tapestry.dom.Elementなどの修正も必要な感じ。概要としてはだいたい以下のようになると思います。

  • EndTagStyleにもうひとつ定数を追加する(仮にNOCHILDという定数名とします)。
  • org.apache.tapestry.dom.ElementクラスのtoMarkupメソッドの中ほどあたりを次のように修正する。
 public void toMarkup(PrintWriter writer) {
     ...
 
     EndTagStyle style = _document.getMarkupModel().getEndTagStyle(_name);
 
     boolean hasChildren = hasChildren();
 
+    if (hasChildren && style == EndTagStyle.NOCHILD) {
+        // 例外投げる
+    }
 
     String close = (!hasChildren && style == EndTagStyle.ABBREVIATE) ? "/>" : ">";
 
     ...
 }
  • brタグなどにはNOCHILDを返すXHTMLMarkupModelを用意する。DefaultMarkupModelを拡張して次のようにしてもとりあえずはOKかな?
public class XHTMLMarkupModel extends DefaultMarkupModel {
    @Override
    public EndTagStyle getEndTagStyle(String element) {
        if ("option".equalsIgnoreCase(element)) {
            return EndTagStyle.REQUIRE;
        }
        EndTagStyle style = super.getEndTagStyle(element);
        return (style == EndTagStyle.OMIT) ? EndTagStyle.NOCHILD : style;
    }
}


# 実際に試してみてはいないですが。