-
В моем сценарии я не могу воспользоваться атрибутом src тэга <script> для подключения внешнего файла, содержащего код JavaScript. Комментировать, почему так, я не стану, чтобы не уходить в сторону от проблемы.
Чтобы обойти это ограничение, я включаю код JavaScript напрямую в HTML шаблон, внутри
<script type="text/javascript"> </script>
Туда идут:
- содержимое highlight.js
- содержимое нужных файлов languages/*.js
- и в конце:
hljs.initHighlightingOnLoad();
так как описано в README.
Но существуют следующая проблема: в файле languages/html-xml.js есть такой кусочек:
{
className: 'javascript',
end: '</script>', returnEnd: true,
subLanguage: 'javascript'
},
Парсер браузера считает этот </script> окончанием тэга из моего HTML шаблона и соответственно режет дальшейший JavaScript код, понимая его как простой текст. Естественно, это ломает раскраску кода, так как "hljs.initHighlightingOnLoad();", находящийся в самом конце, не выполняется никогда + не учитывается логика парсинга для языков, включенных ниже html-xml. Тестировал в четырех браузерах (firefox, opera, arora, midori) - результат одинаковый.
Не могу сделать конструктивное рабочее предложение по выходу из вышеописанной ситуации в силу своего очень ограниченного знания JavaScript. Понимаю лишь что надо как-то изменить стринг "</script>" в приведенном выше участке кода, чтобы парсер браузера на нем не спотыкался. Предположения о том, как это можно было бы сделать:
- использовать "end: '/script>'" вместо "end: '</script>'", если это не будет иметь каких-то негативных побочных эффектов
- использовать что-то вроде "end: '</scri' + 'pt>'" вместо "end: '</script>'", если JavaScript позволяет так делать
- разделить правило поиска "</script>" на две части (если это возможно), как в следующем примере из того же файла:
{
className: 'tag',
lexems: [hljs.IDENT_RE],
keywords: hljs.HTML_TAGS,
begin: '<script', end: '>',
contains: ['attribute'],
illegal: '[\\+\\.]',
starts: 'javascript'
},
что-то наподобии:
begin: '</script', end: '>', returnEnd: true, -
Вообще, самое стандартное решение для такой ситуации — это HTML-комментирование внутренностей скрипта:
<script type="application/javascript"> <!-- Текст скрипта //--> </script>Или я что-то упускаю?
-
Спасибо, о таком подходе я не знал.
Попробую так сделать и обязательно отпишусь тут о результате. -
> Вообще, самое стандартное решение для такой ситуации — это HTML-комментирование внутренностей скрипта
Попробовал сейчас в firefox и opera. Не помогло.
Однако любой из вышеописанных мной выше трех подходов приводит к желаемому результату - кусок JavaScript, следующий за проблемным участком, перестает показываться в браузере как текст и код начинает раскрашиваться. Не знаю, насколько это может служить доказательством тому, что парсер браузера по-прежнему неадекватно воспринимает этот </script> в html-xml.js.
Не буду настаивать на правке данной проблемы в официальной bzr репозитории, это уже на ваше усмотрение. Свою задачу я решаю элементарной правкой кода вручную в одном месте и мне этого достаточно. -
А у вас, случаем, документ не с XHTML'ным Content-type'ом выдаётся? Просто, эта штука с комментариями — это в прицнипе очень древний рекомендуемый способ включать скрипты в страницы, именно для избегания таких проблем. И в HTML он поддерживается всеми браузерами уже с десяток лет точно.
А вот если вы честный XHTML выдаёте, там заклинание покривее должно быть:
<script type="application/javascript"> <!--//--><![CDATA[//><!-- Текст скрипта //--><!]]> </script> -
> А у вас, случаем, документ не с XHTML'ным Content-type'ом выдаётся?
Увы, такие тонкости мне не знакомы. Следую советам вслепую.
Сейчас попробовал поменять комментарии - результат тот же.
Как и раньше - замена '</script>' на '<'+'/script>' решает.
Я залил статическую версию сюда, если будет интересно посмотреть:
http://pastebin.ca/1702435
Собственно, это стандартный Header из fossil (http://fossil-scm.org).
Туда я добавил это (в самом начале):
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
и еще большущий <script>, начинающийся чуть ниже и содержащий почти весь highlight за исключением нескольких файлов из директории languages. -
Посмотрел. Скорее всего проблема в многочисленных операциях "—" в скрипте, которые то включают, то выключают закомментированные области HTML.
Тем не менее, мне совсем не хочется поддерживать в дальнейшем код в таком состоянии, чтобы он допускал вставку внутрь HTML. То, что в этом случае оно починилось разделением слова "</script>" — просто везение. Вообще же, он будет ломаться периодически в самых нежиданных местах.
Так что, я рад, что вы нашли для себя работающий workaround :-)
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
