[mayaa-user:925] Re: HTML5でaタグがブロック要素を含む時、不可解な挙動をします

Susumu ISHIGAMI [E-MAIL ADDRESS DELETED]
2011年 3月 29日 (火) 20:29:28 JST


石上です。

連投失礼致します。
NekohtmlのMLに問い合せてみました。

回答によると、
・Nekohtmlでは最新版でも特別にHTML5の対応は行っていない
・ソースの修正については、テストコードが壊れていなければ良いのではないか
とのことです。テストコードについては、テストケースの該当部分の修正のみでパスすることができました。

私の方では、独自にビルドしたNekohtmlを使用するというマニアックな対応をとることにします。

他の方が、HTML5のサイトでMayaaを使われる場合は、閉じタグを正しく記述することに気をつけて、sugaさんが対応してくださった
TemplateBuilderImpl のbalanceTagパラメータを指定されるのが良いのではないかと思います。

ありがとうございました。

2011年3月29日13:22 Susumu ISHIGAMI <[E-MAIL ADDRESS DELETED]>:
> 石上です。
> 下記の件につきまして、少し進展があったので報告します。
>
> 私の方でnekohtmlのコードを解析してみた結果、
> org.cyberneko.html.HTMLElements の、
> 184:     new Element(A, "A", Element.INLINE, BODY, null),
> を、
> 184:     new Element(A, "A", 0, BODY, null),
> に書き換えてnekohtmlをビルドすることによって、問題を解決することができました。
>
> 参考までに、最新の1.9.14のソースを見てみましたが、
> new Element(A, "A", Element.INLINE, BODY, new short[] {A}),
> となっていました。ですので、仮にnekohtmlを最新にしても動かない気がします。
> 念の為に、nekohtml開発チームに問い合わせてみます。
>
> 2011年3月28日11:52 Susumu ISHIGAMI <[E-MAIL ADDRESS DELETED]>:
>> 石上です。
>>
>> 素早い対応ありがとうございます。
>>
>>> org.seasar.mayaa.provider.ServiceProvider ファイルで TemplateBuilderImpl に
>>> balanceTag という
>>> パラメータを追加しました。デフォルトは true で、これを false にすることで一切のバランス修正をしなくなります。
>>> この場合、省略可能な閉じタグも必ず正しく記述してください。
>>
>> このオプションを有効にすると、今までのテンプレートが動かないということがあると思います。
>> 例えば、brやimg、hrのような要素も閉じる必要があるということでしょうか?
>>
>> 当方のアプリでは、既にPC版をリリースしており、そこでは開発者サイドでコントロールしきれない第三者もテンプレートを書くことがありえます。
>> そのため、一部のテンプレートで動作が変わってしまうと、クレームを受けてしまうかもしれません。
>>
>> また、HTML5では、XHTMLではない書き方も許容してしまっているため、imgやbrタグを閉じないことを否定出来ないところです・・・。
>> (たまたま当方のアプリではテンプレートファイルの拡張子にxhtmlを使用しているため、xhtml文法で書くことを顧客にお願いすることは強引ですができるかもしれませんが、それは最終手段にしたいところです。)
>>
>> 従って、今回は折角対応していただいたオプションを利用するのは、保留したいと思います。
>> 当面は、スマートフォンサイトの顧客は少ないですので、私たちと顧客との間で都度やりとりをして、問題を解決していこうと思います。
>> aタグに関しては、divタグで囲めば動くため、その方法で対処しようと思います。
>>
>> 長期的に見れば、MayaaがHTML5に対応することを強く望みます。
>> こちらとしても、何か手伝えることがあれば出来る範囲で協力したいと思います。
>> aタグの他に、想定外の動作をした場合は、ご連絡します。
>>
>> 以上、よろしくお願いします。
>>
>>
>> 2011年3月27日9:07 suga <[E-MAIL ADDRESS DELETED]>:
>>> suga です。
>>>
>>> HTML5 以前では a タグが inline 要素であるため、NekoHTML が構造を修正することが理由です。
>>> # div が修正されないのはわかりませんが。
>>>
>>> ひとまずタグのバランス修正機能をオフにできるようにします。
>>> HTML5 でのみ対応可能かどうか調査してみて、可能であればこの変更は元に戻すかもしれません。
>>>
>>> org.seasar.mayaa.provider.ServiceProvider ファイルで TemplateBuilderImpl に
>>> balanceTag という
>>> パラメータを追加しました。デフォルトは true で、これを false にすることで一切のバランス修正をしなくなります。
>>> この場合、省略可能な閉じタグも必ず正しく記述してください。
>>>
>>> https://www.seasar.org/maven/maven2-snapshot/org/seasar/mayaa/mayaa/1.1.29-SNAPSHOT/mayaa-1.1.29-20110326.235810-2.jar
>>>
>>>
>>> NekoHTML のバージョンを上げるには Xerces の変更に合わせてカスタマイズ方法を変更しなければ
>>> ならないため、ちょっと時間がかかります。
>>> changelog を見る限りは HTML5 に対応してはいないようなので、おそらくこの問題の解決にはならない
>>> と考えています。
>>>
>>> --
>>> suga ( [E-MAIL ADDRESS DELETED] )
>>>
>>>
>>>
>>> 2011/3/26 Susumu ISHIGAMI <[E-MAIL ADDRESS DELETED]>:
>>>> いつもお世話になっております。
>>>> 石上です。
>>>>
>>>> Mayaaを使用して、HTML5ベースのスマートフォンサイトを作成しております。
>>>> その際不可解な現象が発生したため、報告させていただきます。
>>>>
>>>> HTML5からは、aタグがブロック要素を含むことができるようになりました。
>>>> http://www.w3.org/TR/2011/WD-html5-diff-20110113/
>>>>> The a element without an href attribute now represents a placeholder for where a link otherwise might have been placed. It can also contain flow content rather than being restricted to phrase content.
>>>>
>>>> そこで、下記のようなコードをテンプレートに書いたのですが、
>>>>        <a href="javascript:alert('hello');">
>>>>                <p>aaa</p>
>>>>                <p>aaa</p>
>>>>        </a>
>>>> 出力結果が以下のようになってしまって正しく動作しません。
>>>>        <a href="javascript:alert('hello');">
>>>>                </a><p><a href="javascript:alert('hello');">aaa</a></p>
>>>>                <p>aaa</p>
>>>>
>>>> 一方、以下のようにdiv, for, blockquoteタグで囲むと、正常に出力されます。
>>>>        <a href="javascript:alert('hello');">
>>>>                <div>
>>>>                        <p>aaa</p>
>>>>                        <p>aaa</p>
>>>>                </div>
>>>>        </a>
>>>>
>>>> しかし、section等HTML5の新しいタグでは期待通りに動作しません。
>>>>        <a href="javascript:alert('hello');">
>>>>                <section>
>>>>                        <p>aaa</p>
>>>>                        <p>aaa</p>
>>>>                </section>
>>>>        </a>
>>>> これは以下のようになります。
>>>>        <a href="javascript:alert('hello');">
>>>>                </a><section><a href="javascript:alert('hello');">
>>>>                        </a><p><a href="javascript:alert('hello');">aaa</a></p>
>>>>                        <p>aaa</p>
>>>>                </section>
>>>>
>>>> この現象は、Webサイトで配布されているblankプロジェクトでも再現します。
>>>> 上記テストコードでは、mayaaファイルは作成しておらず、
>>>> テンプレートがほぼそのまま出力されることを期待しています。
>>>>
>>>> Mayaaのソースを読ませて頂いたのですが、原因が分かりませんでした。
>>>>
>>>> もしかしたら、依存する別ライブラリが原因かもしれないと勝手に予想し、
>>>> nekohtmlのバージョンを上げてみたのですが、
>>>> mayaaにバンドルされている0.9.5の次の、1.9.6ではコンパイルは通りましたが上記挙動は変化せず、
>>>> 1.9.6.1から、最新の1.9.1.14までは、コンパイルが通りませんでした:
>>>>   TemplateParserConfiguration.javaの
>>>>     57: fDocumentScanner = scanner;
>>>>   というところでコンパイルエラーになってしまいます。
>>>>
>>>> 参考までにテストに使用したテンプレートのHTML(index.html)と、
>>>> 出力して得られたHTML(output.html)を添付します。
>>>>
>>>> よろしくお願い致します。
>>>>
>>>> _______________________________________________
>>>> mayaa-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>>>>
>>> _______________________________________________
>>> mayaa-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>>>
>>
>


mayaa-user メーリングリストの案内