Как сохранить javascript в шаблоне ограбления от побега? - PullRequest
2 голосов
/ 01 января 2011

Я использую Snap Framework с движком шаблонов Heist. Проблема в том, что Heist повреждает код JavaScript, встроенный в html:

<script type="text/javascript">alert('hello');</script> 

Преобразовано в:

<script type="text/javascript">alert(&apos;hello&apos;);</script>

Как я могу сказать Heist сохранить содержимое тега script?

Редактировать: Я только что реализовал такое соединение:

verbatimSplice :: MonadIO m => Splice m
verbatimSplice = do
    node <- getParamNode       -- get <script> node
    stopRecursion              -- stop recursive processing of splices
    lift $ liftIO $ print node -- show me the node
    return [node]              -- return <script> as is

Но привязка этого соединения к тегу скрипта не помогает. Это печатает

Element "script" [("type","text/javascript")] [Text "alert('hello');"]

так что, я думаю, html-подстановка сущности происходит после запуска всех соединений.

Ответы [ 2 ]

2 голосов
/ 02 января 2011

Heist использует hexpat для своей обработки.Я считаю, что проблема в том, что hexpat использует expat, который требует правильно сформированного XML.К сожалению, HTML-документы со встроенным JavaScript недействительны, поэтому он избегает их.Мы знаем об этой проблеме.Решение состоит в том, чтобы переключиться на парсер HTML5 вместо парсера XML.К сожалению, для Haskell нет хороших библиотек для анализа HTML5.

Пока этого не произойдет, решение состоит в том, чтобы переместить весь ваш javascript из шаблонов во внешние файлы.Мы понимаем, что это не адекватное решение в долгосрочной перспективе.Мы планируем или написать один или переключиться на один в конце концов.Вклад в эту область был бы очень признателен.

Обновление:

С февраля 2011 года Heist перешел с использования hexpat на использование нашей собственной библиотеки HTML-разбора XmlHtml, которая решает эту проблему.1007 *

1 голос
/ 02 января 2011

В идеале вы должны обернуть свой скрипт в теги CDATA

<script>
//<!CDATA[
  alert('hello');
//]]>
</script>

, что сделает его допустимым XML

Увы, Хейст, похоже, игнорирует их.

...