Библиотеки подсветки кода для Ruby
В связи с переводом моего блога на Radiant у меня возник вопрос с подсветкой кода, который у меня встречается достаточно часто. Сейчас я использую для этого highlight.js, однако рассматриваю возможность использования серверных решений.
Так что, сегодня я расскажу о трех различных Ruby-библиотеках, используемых для подсветки синтаксиса:
Также, я провел замеры производительности, так что в конце вы можете найти сравнение библиотек по производительности.
Syntax
Страница проекта: http://syntax.rubyforge.org/
Поддерживаемые языки: Ruby, XML, YAML
Плюсы: Существует плагин для Rails и описание, как интегрировать его в Radiant.
Минусы: Малое количество поддерживаемых языков и отсутствие готовых тем.
Установка:
gem install syntax
Простейший пример использования:
require 'rubygems'
require 'syntax/convertors/html'
convertor = Syntax::Convertors::HTML.for_syntax “ruby”
html = convertor.convert( File.read( “program.rb” ) )
puts html
Окромя возможности подсветки кода, библиотека предоставляет возможность просто разобрать текст на лексемы, с тем чтобы производить потом какую-то обработку:
require 'syntax'
tokenizer = Syntax.load "ruby"
tokenizer.tokenize( File.read( "file.rb" ) ) do |token|
puts "group(#{token.group}, #{token.instruction}) lexeme(#{token})"
end
P.S: Буквально перед публикацией нашел тему для библиотеки, осуществляющую подсветку как на GitHub.
UltraViolet
Страница проекта: http://ultraviolet.rubyforge.org/
Поддерживаемые языки: C, C++, Ruby, Bibtex, Latex, Diff, HTML, CSS и многие другие
Плюсы: Использует файлы синтаксиса TextMate для подсветки, что сразу дает большое количество поддерживаемых языков.
Минусы: Документация на сайте достаточно скудная. При попытке копирования кода со страницы он копируется вместе с номерами строк (если они сгенерированы). Тянет за собой достаточно много зависимостей и медленней всех работает.
Установка:
gem install ultraviolet
При установке у меня возникла одна проблема: Ultraviolet тянет за собой гем Oniguruma, который требует, чтобы в системе была установлена библиотека Oniguruma, причем вместе с заголовочными файлами. В Ubuntu ее можно установить из пакета:
sudo apt-get install libonig2 libonig-dev
Для остальных – неплохое руководство по установке приведено здесь.
Пример использования:
require 'rubygems'
require 'uv'
result = Uv.parse( text, "xhtml", "ruby", true, "amy")
Передаваемые в функцию параметры:
- text – исходный код
- “xhtml” – выходной синтаксис
- “ruby” – входной язык
- true – рендерить номера строк
- “amy” – тема
CodeRay
Страница проекта: http://coderay.rubychan.de/
Поддерживаемые языки: Ruby, C, Delphi, HTML, RHTML (Rails), Nitro-XHTML, CSS, Diff, Java, JavaScript, JSON, YAML
Плюсы: Судя по моим замерам работает быстрее всех. Имеет достаточно большое число опций, позволяющих настроить вывод.
Минусы: Встроенные темы выглядят немного бедновато, особенно применительно к C и Java.
Установка:
gem install coderay
Пример использования:
require 'rubygems'
require 'coderay'
tokens = CodeRay.scan( text, :ruby )
print tokens.div( :line_numbers => :table, :css => :class, :style => :cycnus )
Методы преобразования (div,html,..) принимают хэш аргументов:
- :tab_width – ширина табуляции в проблеах. По умолчанию: 8
- :css – как включать стили: указывая класс или явный стиль (:class и :style). По умолчанию: :class)
- :wrap – обернуть результат в тэг :page, :div, :span или не оборачивать (nil)
- :line_numbers – как включать номера строк (:table, :inline, :list или nil)
- :line_number_start – с какого номера строки начинать
- :bold_every – выделять каждый n-й номер строки жирным. По умолчанию: 10
CodeRay, также как и Syntax может использоваться для анализа исходного текста, поскольку полученный объект Tokens представляет из себя по сути список лексем с заданными типами.
Сравнение производительности
Ниже приведены замеры производительности библиотек при обработке фргаментов кода на Ruby и Xml:
user system total real
ruby ultraviolet: 10.270000 0.600000 10.870000 ( 11.584088)
ruby coderay: 0.710000 0.030000 0.740000 ( 0.923616)
ruby syntax: 2.030000 0.130000 2.160000 ( 2.830979)
xml ultraviolet: 3.280000 0.190000 3.470000 ( 3.793856)
xml coderay: 0.540000 0.000000 0.540000 ( 0.701140)
xml syntax: 0.660000 0.060000 0.720000 ( 0.854120)
А также график:

Можно увидеть, что самым шустрым оказался CodeRay, а UltraViolet самым медленным. Однако, как мне кажется, некоторая тормознутость UltraViolet окупается наличием огромного количества поддерживаемых языков и готовых тем.
