Библиотеки подсветки кода для Ruby

ruby-code-highligters-performance

В связи с переводом моего блога на 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")

Передаваемые в функцию параметры:


  1. text – исходный код

  2. “xhtml” – выходной синтаксис

  3. “ruby” – входной язык

  4. true – рендерить номера строк

  5. “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)

А также график:

ruby-code-highligters-performance

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

Ссылки

 Подписаться на RSS

 #  #  #  #  #  #  #  #  #  #

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