技術ネタ‎ > ‎開発日誌‎ > ‎

WicketのHTML Validationをちょっとまともにしてみるてすと

2009/08/17 4:53 に ユーザー不明 が投稿   [ 2009/09/15 3:12 に かとうまさき さんが更新しました ]
AE/JのEclipseプラグインがアップデートされてからクラウドにdeployする際にporblemsにerrorがあると警告が出るようになりました。
WicketのHTMLを正しく書いているにもかかわらずValidateでエラーが発生します。

これには理由があって、配布、公開されているDTDが適当だからです^^;
 

http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd

<!ENTITY % coreattrs
 "id             ID             #IMPLIED
  class          CDATA          #IMPLIED
  style          %StyleSheet;   #IMPLIED
  title          %Text;         #IMPLIED
  wicket:id      %Text;         #IMPLIED
  wicket:preview %Text;         #IMPLIED"
  >

 
DTDの中にwicket関係の定義はこれしかありません。
coreattsとして、大抵のエレメントにはwicket:idとwicket:previewを書けるよって定義してあるだけです。
 
 
そこでXHTMLのRNGを拡張してみることにしました。
 
まず、WicketBlockを定義します
 
 
 

WicketBlock

  <define name="wicketBlock">
 <zeroOrMore>
   <choice>
  <!-- 
        <element name="wicket:head">
    <ref name="Flow"/>
  </element>
  -->
        <element name="wicket:panel">
    <ref name="coreattrs"/>
    <ref name="Flow"/>
  </element>
        <element name="wicket:remove">
    <!--
    <oneOrMore>
     <element>
      <anyName/>
      <oneOrMore>
       <attribute>
        <anyName/>
       </attribute>
      </oneOrMore>
     </element>
    </oneOrMore
       -->
    <ref name="coreattrs"/>
    <ref name="Flow"/>
       <zeroOrMore>
     <ref name="li"/>
    </zeroOrMore>
  </element>
        <element name="wicket:body">
    <ref name="coreattrs"/>
    <ref name="Flow"/>
  </element>
        <element name="wicket:border">
    <ref name="coreattrs"/>
    <ref name="Flow"/>
  </element>
        <element name="wicket:child">
    <ref name="coreattrs"/>
    <ref name="Flow"/>
  </element>
        <element name="wicket:container">
    <ref name="coreattrs"/>
    <ref name="Flow"/>
  </element>
        <element name="wicket:fragment">
    <ref name="coreattrs"/>
    <ref name="Flow"/>
  </element>
        <element name="wicket:link">
    <ref name="coreattrs"/>
    <ref name="Flow"/>
  </element>
        <element name="wicket:message">
    <attribute name="key">
     <ref name="Text"/>
    </attribute>
    <ref name="coreattrs"/>
    <ref name="Flow"/>
  </element>
   </choice>
 </zeroOrMore>
  </define>
 
このwicketBlockをinlineとblockに追加します。
 

blockとinline

  <define name="block">
    <choice>
      <ref name="p"/>
      <ref name="heading"/>
      <ref name="div"/>
      <ref name="lists"/>
      <ref name="blocktext"/>
      <ref name="fieldset"/>
      <ref name="table"/>
      <ref name="wicketBlock"/>
    </choice>
  </define>
 
  <define name="inline">
    <choice>
      <ref name="a"/>
      <ref name="special"/>
      <ref name="fontstyle"/>
      <ref name="phrase"/>
      <ref name="inline.forms"/>
   <ref name="wicketBlock"/>
    </choice>
  </define>

 
 
このスキーマで少しまともになりました。RNGやXSDに対応したエディターで入力補完やvalidateができるようになります。
 
ただし、根本的にコンテキストを無視したスキーマなのでちゃんとしたものを作るのは難しいです。
 
問題点として、例えば
 
  • <wicket:remove>等はどんなコンテキストにおいても良い
  • tag nameの置き換えを行うのでそれに対応したスキーマを書くのは煩雑
    • <div colspan="2" wicket:id="record"> とか書いて <tr colspan="2">に変換されるが、スキーマ的にはdivにcolspanは無い。
 
validateを通すだけならanyName + excludeを使ったりすれば可能だけど負けた気になります…。
 
自分で使う範囲で適当に拡張するしかないみたいです。
 
 2009/09/15 追記

div/spanの代わりにwicket:containerを使うと少しはスキーマに沿った記述ができそうだ。
 
ċ
wicket-xhtml1-strict.rng
(63k)
かとうまさき,
2009/08/17 5:31
ċ
wicket-xhtml1-strict.xsd
(65k)
かとうまさき,
2009/08/17 5:31
Comments