В порыве борьбы с прокрастинацией занялся задачкой, которую давно откладывал — рефакторингом определений языков в highlight.js в новый синтаксис. Да так удачно занялся, что решил заодно и другие мелкие задачки, которые планировал на версию 6.0. И вот без лишних слов представляю бету новой большой версии и прошу её потестировать.
Ссылки
К тестированию предлагаются:
- Проект на GitHub. Исходники, тулзы, тесты.
- Полная упакованная библиотека. 90 КБ, все языки.
- Упакованная версия с 12 популярными языками. 26 КБ, содержит HTML/XML, Javascript, CSS, PHP, Ruby, Perl, Python, C++, C#, Java, SQL, Bash.
- Архив стилей. Для удобства запаковал отдельно.
Ставьте к себе на сайты, ловите баги, пишите в рассылку или в баг-трекер.
Синтаксис
Главная новость этой версии касается не пользователей библиотеки, а разработчиков. Синтаксис определения языков стал проще структурно, умолчания стали более логичными и пропали некоторые атрибуты, нужные раньше для обработки краевых исключительных случаев. Вот упрощённый пример для наглядности.
Было:
defaultMode: {
contains: ['string'],
modes: [
{
className: 'string',
begin: '"', end: '"',
contains: ['escape']
},
{
className: 'escape', noMarkup: true,
begin: '\\\\.', end: hljs.IMMEDIATE_RE
}
]
}
Стало:
defaultMode: {
contains: [
{
className: 'string',
begin: '"', end: '"',
contains: [{begin: '\\\\.'}]
}
]
}
Поменялось вот что:
- определения режимов
modes
и их вложенностиcontains
слились в одну структуру hljs.IMMEDIATE_RE
стал дефолтным значением для регулярок- вместо указания
className
одновременно сnoMarkup
стало можно не указыватьclassName
По большей части код стал более красивым и читаемым, хотя и не без изъянов: прямо сейчас определение Руби насчитывает десять переменных для строк, которые таскаются хвостом по всему файлу :-).
Конвертация всех языков в новый синтаксис была самой долгой и нудной задачей, и именно из-за этого я решил выложить новую версию сначала в виде беты — не верю, чтобы ничего не сломалось, даже несмотря на то, что внутренние тесты проходят. Пользуясь случаем, хочу сказать отдельное спасибо Валерию Хиоре за конвертацию своего определения Objective C!
Тулзы
Точнее, теперь — "тулза". Два скрипта, которые паковали и собирали языки в финальную сборку, стали одним, которым стало удобней пользоваться, в том числе и при отладке.
Языки
В этой версии 4 новых языка:
- Haskell авторства Джереми Халла
- Erlang в двух видах — модуль и REPL — коллективного авторства Николая Захарова, Дмитрия Ковеги и Сергея Игнатова
- Objective C от Валерий Хиоры
- Vala от Антоно Васильева
Общее количество языков таким образом достигло 40!
Кроме того, два старых языка — HTML и CSS — подверглись радикальному изменению. Я решил, что два отдельных определения HTML и XML не имеют смысла и объединил их в одно. А заодно выкинул длинные списки ключевых слов из HTML и CSS, потому что синтаксис обоих языков задуман расширяемым и не зависит от конкретных ключевых слов. Теперь названия тегов и атрибутов раскрашиваются всегда, даже если они нестандартные.
Самое приятное, что выкидывание ключевых слов вместе с переходом на новый синтаксис позволило новой версии библиотеки быть меньше, даже с учётом четырёх совершенно новых языков!
Инфраструктура
Переезд на GitHub себя вполне оправдал: появились новые контрибьюторы! Причём, как хостинг кода, он настолько хорош, что даже скрашивает мне переезд на git, как на новую для меня VCS.
А вот с группой для обсуждений всё сложнее. По большей части там тихо, а те обсуждения, которые велись, вполне могли бы вестись и в частной переписке. Если подумать, то это и не удивительно, потому что автор у ядра хайлайтера с самого начала был один, оно пережило несколько переписываний, и сейчас, наверное, кроме меня, ни один человек этого кода хорошо не знает. Тем не менее, я не думаю, что от группы надо отказываться, потому что каши она не просит, и лучше, если она есть и не нужна, чем вдруг понадобилась — а нету.
Что дальше
План простой и очевидный: я хочу подождать неделю-другую сообщений о багах, починить их (а ещё лучше — просто вмёрджить патчи от самих репортеров) и выпустить финальную версию.
Ещё, как я вскользь упоминал в Твиттере, мне очень хочется получить стили, основанные на палитре Solarized. Сам я за это вряд ли возьмусь, поэтому просто ещё раз протранслирую здесь эту просьбу. Если вам нравится хайлайтер и вы любите внимание к мелочам, ваш вклад будет очень ценен сообществу!
Комментарии: 5
На Николая Захарова можно сослаться хотя бы вот сюда: http://desh.su :)
Сослался, спасибо :-)
Иван, а можно ли в своих проектах ссылаться на highlight.js напрямую с гитхаба? И если да, то как подцепить, что назвается на лету, свое описание языка? Понадобилось выложить пару кусков на Vim script. Засел за составление описания и столкнулся с тем, что распакованный скрипт его прекрасно подхватывает, а вот запаковыанный не хочет. Ну, а поскольку описание еще далеко до завершения, не хочется упаковывать пока. Поэтому приходится пока на хостинге держать копию highlight.js.
И еще один вопрос. Этот чудный VimL имеет такую штуку, как "разворачивание" команд. Например, 'au' или 'aut' по-умолчанию разворачивается в 'autocmd'. А есть еще 'aug'->'augroup' и 'aun'->'aunmenu' и т.д. Понятно, что это сугубо специфичный случай, и проще подготовить исходник к публикации, избавившись от этого сахара. Все же интересно, можно ли как-то это обыграть в highlight?
Ну запретить вам никто не может, но все минусы очевидны: любой апдейт транка может быть обратно несовместимым или поломанным. Если уж куда и ссылаться, то на яндексовый CDN: http://api.yandex.ru/jslibs/libs.xml#highlightjs. Там, правда, пока ещё нет шестой версии, потому что её в принципе нет ещё.
Ну а свой язык вы у себя же держите? Тогда и от второго файла наверное плохо не будет :-).
Ничего не понял, если честно. Комментарии в блоге не шибко удобное место для таких вопросов, напишите мне письмо.