У highlight.js снова случилась большая переделка, связанная со способом его упаковки. Посему не могу не понадеяться на активных пользователей библиотеки в помощи по тестированию.

По порядку о новом.

Упаковка

Собственно то, что послужило поводом для смены мажорной версии — это реализация идеи про динамическую сборку языков в один файл. Теперь процесс получения выглядит так: вы идете на страницу скачивания, выбираете галочками нужные языки, и получаете архив с на лету собранным файлом "highlight.pack.js", который содержит и библиотеку, и языки, причем в сильно упакованном формате. Соответственно, больше никакого скрипта для работы не нужно. Но в архиве все равно лежат исходники всех языков и библиотеки.

Упаковка — заслуга в основном yuicompressor'а. Но не целиком. Скрипт очень умный, умеет заменять длинные имена переменных на короткие, но делает это только для локальных переменных, потому что не может знать, где и зачем используются публично видимые. Соответственно, он не может заменить имена публичных библиотечных регулярок и режимов, которые предназначены для авторов языков и называются довольно длинно (hljs.C_LINE_COMMENT_MODE). Аналогично и атрибуты в описаниях языков, которые использует библиотека, тоже объявлены публично. Но поскольку я сам знаю, что это не публичный API, а API разработчика, то их вполне можно заменить на короткие имена, лишь бы одинаково. Поэтому перед упаковкой yuicompressor'ом я прогоняю все исходники через собственную таблицу замен в таком духе:

...
'relevance': 'r',
'IDENT_RE': 'IR',
'UNDERSCORE_IDENT_RE': 'UIR',
'NUMBER_RE': 'NR',
'C_NUMBER_RE': 'CNR',
...

Ну а после отдельно упакованные файлы уже просто конкатенируются в один. Этот код написан на Питоне. А yuicompressor — на Java. И все это пакует библиотеку на Javascript :-).

И собственно, главное. Результаты всех этих усилий не могут не радовать. У меня на блоге сейчас 12 языков. Файл для них всех, включая библиотеку, весит 27K, которые при передаче gzip'уются до 10K. Раньше этим же самым занимались 7 файлов общим весом 60K, ужимающимся до где-то 15K (это прикидка, точно не считал).

Регэкспы и деления

Еще одна приятная штука в это релизе — починка бага про то, что в javascript'е литеральный синтаксис для регулярок мешался операции деления. То есть вот тут:

var x = 5 / 2;

Слеш считается началом регулярки. Это само по себе плохо, да еще и когда парсер доходит до конца строки, он думает, что так в javascript'е не бывает, и бросает раскраску совсем.

Баг чинился сложно :-(. Долго пытался придумать, в каких контекстах бывают регулярки, а в каких деления. Читал спецификацию ECMAScript, из которой понял, что это один из фундаментальных вопросов для парсера. Но в итоге живой рабочий список "препинаторов", после которых имеют смысл регулярки, подсмотрел у конкурентов :-).

noMarkup

В результате починки бага с регулярками родился еще один специальный атрибут для синтаксических режимов. Но тут нужна предыстория.

Все конструкции языков, которые highlight.js разбирает, оборачиваются в <span class="..."> ... </span>. Однако далеко не все они потом как-то визуально раскрашиваются, потому что многие режимы нужно только для обеспечения правильного парсинга, а сами по себе ценности не представляют. Например экранированные обратным слешом кавычки внутри строк ("look ma, a quote: \".") — это отдельная конструкция. Но назначать им свой отдельный стиль было бы экстремально :-).

А вот с введением распознавания контекстов, в которых может встречаться литеральная регулярка, таких мусорных <span class="regexp_container">ов стало просто немеряно: фактически после каждой скобочки (любого рода), каждой операции, каждой точечки и т.п. Причем реально регулярки встречаются не так часто, поэтому все эти <span>ы были еще и пустыми :-). Пришлось придумать атрибут noMarkup, по которому режим работает, но разметки не генерирует.


Ну вот. Пишите о багах!

Комментарии: 3

  1. Sam

    Пущу сегодня побегать у себя…

  2. Aleksei Miheev

    О, я как раз на новый сервер, новую версию блогового (мамачки!© какое слово уродливое!) движка и юникод. Завтра попробую hljs.

  3. Sam

    Пока полёт нормальный.

Добавить комментарий