1. Anonymous

    04.12.2009

    0 ↑
    0 ↓
    В моем сценарии я не могу воспользоваться атрибутом 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,
  2. Иван Сагалаев

    04.12.2009

    0 ↑
    0 ↓

    Вообще, самое стандартное решение для такой ситуации — это HTML-комментирование внутренностей скрипта:

    <script type="application/javascript">
    <!--
    Текст скрипта
    //-->
    </script>
    

    Или я что-то упускаю?

  3. Anonymous

    04.12.2009

    0 ↑
    0 ↓
    Спасибо, о таком подходе я не знал.
    Попробую так сделать и обязательно отпишусь тут о результате.
  4. Anonymous

    05.12.2009

    0 ↑
    0 ↓
    > Вообще, самое стандартное решение для такой ситуации — это HTML-комментирование внутренностей скрипта

    Попробовал сейчас в firefox и opera. Не помогло.

    Однако любой из вышеописанных мной выше трех подходов приводит к желаемому результату - кусок JavaScript, следующий за проблемным участком, перестает показываться в браузере как текст и код начинает раскрашиваться. Не знаю, насколько это может служить доказательством тому, что парсер браузера по-прежнему неадекватно воспринимает этот </script> в html-xml.js.

    Не буду настаивать на правке данной проблемы в официальной bzr репозитории, это уже на ваше усмотрение. Свою задачу я решаю элементарной правкой кода вручную в одном месте и мне этого достаточно.
  5. Иван Сагалаев

    05.12.2009

    0 ↑
    0 ↓

    А у вас, случаем, документ не с XHTML'ным Content-type'ом выдаётся? Просто, эта штука с комментариями — это в прицнипе очень древний рекомендуемый способ включать скрипты в страницы, именно для избегания таких проблем. И в HTML он поддерживается всеми браузерами уже с десяток лет точно.

    А вот если вы честный XHTML выдаёте, там заклинание покривее должно быть:

    <script type="application/javascript">
    <!--//--><![CDATA[//><!--
    Текст скрипта
    //--><!]]>
    </script>
    
  6. Anonymous

    05.12.2009

    0 ↑
    0 ↓
    > А у вас, случаем, документ не с 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.
  7. Иван Сагалаев

    05.12.2009

    0 ↑
    0 ↓

    Посмотрел. Скорее всего проблема в многочисленных операциях "—" в скрипте, которые то включают, то выключают закомментированные области HTML.

    Тем не менее, мне совсем не хочется поддерживать в дальнейшем код в таком состоянии, чтобы он допускал вставку внутрь HTML. То, что в этом случае оно починилось разделением слова "</script>" — просто везение. Вообще же, он будет ломаться периодически в самых нежиданных местах.

    Так что, я рад, что вы нашли для себя работающий workaround :-)

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.