Как запретить sitemesh анализировать html в текстовой области

Я использую sitemesh для оформления страницы в своем веб-приложении.

У меня есть форма, в которой содержимое поля textarea представляет собой полную html-страницу.

Проблема в том, что когда Sitemesh анализирует эту страницу, он извлекает заголовок, заголовок и тело из моего текстового поля и украшает ими страницу.

<textarea name="page_content">
    <!-- tags below should not be parsed by Sitemesh -->
    <html>
         <head>...</head>
         <body>...</body>
    </html>
</textarea>

Кажется, парсер страниц Sitemesh заботится о том, чтобы он уже видел эти теги на странице.

Есть ли у вас какие-либо идеи о том, как запретить Sitemesh анализировать содержимое текстовой области?


person henrik_lundgren    schedule 07.03.2010    source источник
comment
Возможно, с объектами символов HTML в содержимом текстовой области: en.wikipedia.org/wiki/.   -  person PeterMmm    schedule 07.03.2010


Ответы (2)


Вы не можете поместить <tags> в текстовое поле. Это совершенно недействительно. Элементы textarea не являются «элементами CDATA», такими как <script> и <style>, любой <, который вы помещаете внутрь них, является реальной разметкой, а не строковым литералом.

На практике браузеры обычно позволяют вам обойтись без этого (пока вы, конечно, не попытаетесь включить еще одно текстовое поле внутри), но вы должны написать следующее:

<textarea name="page_content">
    &lt;html>
        ...
    &lt;/html>
</textarea>
person bobince    schedule 07.03.2010

Я решил это сам. Решение становится очевидным, когда вы изучаете исходный код HTMLPageParser.

Хитрость заключается в том, чтобы написать собственный PageParser, который добавляет новое состояние со своим собственным набором правил, то есть вообще без правил:

public class CustomPageParser extends HTMLPageParser {

    @Override
    protected void addUserDefinedRules(State html, PageBuilder page) {
        super.addUserDefinedRules(html, page);
        // Ensure that while in <textarea> tag, none of the other rules kick in.
        State textarea = new State();
        html.addRule(new StateTransitionRule("textarea", textarea));

    }
}
person henrik_lundgren    schedule 07.03.2010