Добро пожаловать в RuTils

RuTils - простой обработчик русского текста на Ruby. Основная цель RuTils - сделать разработку русскоязычных приложений на Ruby (и Rails) максимально простой и приятной (в идеале - столь же простой как и разработку оных на английском)

Весь функционал RuTils поддерживает только UTF-8 (настройка $KCODE / KanjiCode ‘u’).

Пожалуйста упоминайте версию при сообщении ошибок. Версию RUTILS всегда можно узнать в константе

RuTils::VERSION

Удостоверьтесь, что ваш скрипт правильно обрабатывает Unicode - то есть:

  • Переменная $KCODE включена в режим ‘u’

  • Все строки которые вы собираетесь обрабатывать уже в кодировке UTF-8

Если вы используете RuTils для сайта под mod_ruby воспользуйтесь директивой RubyKanjiCode в своем httpd.conf.

Большое спасибо Роману Иванову aka Kukutz и Николаю Яремко aka Kuso Mendokuzee за реализацию большинства алгоритмов на PHP.

Разработку RuTils ведут Julik и Mash

Cумма прописью и выбор числительного

RuTils реализует сумму прописью для целых и дробных чисел, с дополнительным учетом рода. Например:

4.propisju => "четыре"
345.propisju => "триста сорок пять"
231.propisju(2) => "двести тридцать одна"
341.propisju_items(1, "чемодан", "чемодана", "чемоданов") => "триста сорок один чемодан"
(212.40).propisju_items(2, "сволочь", "сволочи", "сволочей") => "двести двенадцать целых
    четыре десятых сволочи"

Также реализуется выбор варианта числительного в зависимости от числа

15.items("кодер", "кодера", "кодеров") => "кодеров"

и вывод “суммы прописью” для денежных сумм в рублях

(413.2).rublej => "четыреста тринадцать рублей двадцать копеек"

Транслит

RuTils на данный момент реализует простейший транслит “в одну сторону” и “взаимно-однозначный транслит” (BiDi-транслит).

Простейший транслит “в одну сторону”.

"Вот такое вот дело".translify => "Vot takoye vot delo" "Несомненный прогресс по

сравнению с PHP“.dirify => ”nesomnennyi-progress-po-sravneniu-s-php“

BiDi-транслит

Порт BiDiTranslit от Pixel Apes. Реализует транслитерацию “в обе стороны”, предоставляя возможность получить валидный URL из строки, содержащей русские и английские буквы. С некоторыми потерями (запятых и прочих “слабозначащих” символов) возможно восстановление исходной строки.

Два режима работы:

  • Уничтожение всех слешей, которые встретятся во входной строке. В этом случае

методы вызываются с передачей в них false. Например, “Web/Скрипты”.bidi_translify(false) * Пропуск слэшей (используется по умолчанию). Например, “Web/+Skripty”.bidi_detranslify

"WebРазработка/Скрипты".bidi_translify => "Web+Razrabotka+/+Skripty"

“+Ustanovka__+mod_perl”.bidi_detranslify => “Установка mod_perl” “WebРазработка/Мимо”.bidi_translify(false) => “Web+RazrabotkaMimo” “PKHP/Scripts”.bidi_detranslify(false) => “ПХПScripts”

Обработка русской типографики в HTML

Gilenson - порт Typografica от Pixel Apes. Тыпографица - механизм автоматической расстановки подстановок в тексте перед его выводом в HTML, оформляющий неразрывные пробелы, типографские кавычки и тому подобные “украшательства”.

Gilenson расставит в тексте “умные” правильные кавычки (русские - для кириллицы, английские - для латиницы), заменит “хитрые” пунктуационные символы на entities и отформатирует знаки типа ©, (tm), телефоны и адреса.

%q{"И это называется языком?", -- таков был его вопрос}.gilensize => "«И
это называется языком?», — таков был его вопрос"

Более подробная документация по Gilenson доступна в документах к RuTils::Gilenson::Formatter

В комплекте также есть скрипт gilensize, которым можно поточно обрабатывать Unicode-тексты в среде UNIX пользуясь стандартным выводом

$ cat myfile.txt | gilensize > myfile.html

Даты

В класс Date введены следующие константы:

  • RU_MONTHNAMES (Январь Февраль Март…)

  • RU_DAYNAMES (Воскресенье Понедельник…)

  • RU_ABBR_MONTHNAMES (Янв Фев Мар…)

  • RU_ABBR_DAYNAMES (Вск Пн Вт Ср…)

  • RU_INFLECTED_MONTHNAMES (Января Февраля Марта…)

  • RU_DAYNAMES_E (первое второе третье…)

Пример использования:

require 'date' date = Date.new(2005, 11, 9)
puts "#{Date::RU_ABBR_MONTHNAMES[date.mon]}" => Ноя puts
puts "#{Date::RU_MONTHNAMES[date.mon]}" => Ноябрь
puts "#{Date::RU_ABBR_DAYNAMES[date.wday]}" => Ср
puts "#{Date::RU_DAYNAMES[date.wday]}" => Среда

При включенной перезагрузке функций (RuTils::overrides_enabled) осуществляется “покрытие” стандартной функции Time#strftime (“родную” #strftime можно продолжать использовать через alias-метод #strftime_norutils):

Time.local(2005,"dec",31).strftime("%a, %A, %b, %B") => "Сб, Суббота, Дек, Декабрь" 
Time.local(2005,"dec",31).strftime_norutils("%a, %A, %b, %B") => "Sat, Saturday, Dec, December"

Интеграция с Rails, RedCloth и BlueCloth

RuTils в первую очередь задумывался как максимально “прозрачный” механизм обработки русского текста в контексте Rails-приложения. В связи с этим RuTils “вторгается” в работу других Ruby-модулей и изменяет механизм их работы.

Если вы используете RuTils в одном приложении с RedCloth или BlueCloth, RuTils автоматически будет обрабатывать типографику во всех текстах, пропускаемых через них. Имейте в виду, что для корректной работы этой функции RuTils надо загружать *после* модулей RedCloth и BlueCloth.

Помимо этого RuTils заставляет следующие функции Rails говорить по-русски:

  • Меню выбора даты (date_select и datetime_select) будут выводиться с русскими именами месяцев

  • distance_of_time_in_words будет выводить русские описания длительности (“более 2 часов”)

Перегрузку всех функций других модулей можно включать и отключать в любое время с помощью метода RuTils::overrides=. Когда перегрузка выключена, все сторонние библиотеки будут работать в стандартном режиме (например, RedCloth будет расставлять английские типографские кавычки). Это нужно когда вам нужно переключиться на английский (или любой другой язык) без перезапуска приложения.

Если вы хотите использовать rutils как дополнение к Rails в одном конкретном приложении, скопируйте директорию rutils в папку vendor/plugins вашего приложения. Вы можете воспользоваться командой rutilize чтобы сделать это автоматически. После этого вы сможете использовать RuTils без необходимости установки gem на вашем сервере (не забудьте перезапустить приложение чтобы вгрузить в него RuTils).

$ rutilize /Sites/my_app1 /Sites/my_app2 /Sites/my_another_app

Вы можете свободно распространять RuTils со своим Rails-приложением при условии сохранения структуры и файла README.

Требования

  • Ruby 1.8.2, немного прямых рук.

  • Rake,

Rails, RedCloth и BlueCloth для выполнения тестов

Как использовать

Просто включите rutils в свою программу как библиотеку

require 'rutils'

Где получить помощь

На странице проекта на RubyForge

Работает ли это с текстом в кодировке Windows-1251

Нет и никогда не будет.

Как ускорить реализацию новых функций

Воспользуйтесь трекером на RubyForge. Опишите нужный вам функционал и приложите тесты, которым этот функционал должен удовлетворять. Схему организации тестов вы можете скопировать из собственных тестов RuTils.

Если вы пишете исходный код, который войдет в RuTils или в тестовые наборы, пожалуйста следуйте следующим правилам оформления кода:

  • Unix line breaks (LF)

  • Кодировка файлов - строго UTF-8 без BOM (Byte Order Mark)

  • Отступы в 2 пробела, без табуляций.

  • Однострочные блоки с фигурными скобками, многострочные - с do … end

  • Все другие конвенции нормального написания Ruby-кода (www.rubygarden.org/ruby/ruby?RubyStyleGuide)

Если вы хотите участвовать в разработке RuTils пользуйтесь версией из subversion trunk.