| Class | RuTils::Gilenson::Formatter |
| In: |
lib/gilenson/gilenson.rb
(CVS)
|
| Parent: | Object |
Обработчик типографских символов в HTML согласно общепринятым правилам. Посвящается П.Г.Гиленсону, благодаря которому русские правила тех. редактуры еще как минимум 20 лет таки останутся бессмысленно старомодными.
Gilenson расставит в тексте "умные" правильные кавычки (русские - для кириллицы, английские - для латиницы), заменит "хитрые" пунктуационные символы на entities и отформатирует знаки типа (c), (tm), телефоны и адреса.
Gilenson базируется на коде Typografica от PixelApes, который был приведен к положенному в Ruby стандарту. Основные отличия Gilenson от Typografica на PHP:
* работа только и полностью в UTF-8 (включая entities, применимые в XML) * поддержка "raw"-вывода (символов вместо entities) - текст выводимый Gilenson можно верстать на бумаге
Если вам нужно получать идентичный Typografica вывод, пользуйтесь RuTils::Gilenson::Obsolete вместо RuTils::Gilenson::Formatter.
Быстрее всего - через метод +gilensize+ для любой строковой переменной
%{ И вот они таки "приехали"}.gilensize => 'И вот они таки «приехали»'
Все дополнительные настройки в таком случае передаются форматтеру
%{ И вот они таки "приехали"}.gilensize(:laquo=>false) => 'И вот они таки "приехали"'
Если форматтер надо настроить более тонко, можно использовать его и так:
typ = RuTils::Gilenson.new('Эти "так называемые" великие деятели')
typ.to_html => 'Эти «так называемые» великие деятели'
или как фильтр
formatter = RuTils::Gilenson.new
formatter.configure(:dash=>true)
for string in strings
puts formatter.process(string)
end
Настройки регулируются через методы
formatter.dashglue = true
или ассоциированным хешем
formatter.configure!(:dash=>true, :quotes=>false)
Хеш также можно передавать как последний аргумент методам process и to_html, в таком случае настройки будут применены только при этом вызове
beautified = formatter.process(my_text, :dash=>true)
В параметры можно подставить также ключ :all чтобы временно включить или выключить все фильтры
beautified = formatter.process(my_text, :all=>true)
Помимо этого можно пользоваться каждым фильтром по отдельности используя метод apply
Можно менять глифы, которые форматтер использует для подстановок. К примеру,
formatter.glyph[:nbsp] = ' '
заставит форматтер расставлять "традиционные" неразрывные пробелы. Именно это - большая глупость, но другие глифы заменить может быть нужно.
"inches" - преобразовывать дюймы в знак дюйма;
"laquo" - кавычки-ёлочки
"quotes" - кавычки-английские лапки
"dash" - проставлять короткое тире (150)
"emdash" - длинное тире двумя минусами (151)
"initials" - проставлять тонкие шпации в инициалах
"copypaste" - замена непечатных и "специальных" юникодных символов на entities
"(c)" - обрабатывать знак копирайта
"(r)", "(tm)", "(p)", "+-" - спецсимволы, какие - понятно
"acronyms" - сворачивание пояснений к аббревиатурам (пояснение - в скобках после аббревиатуры
без пробела). В текстовой версии пояснение будет "приклеено" к аббревиатуре
полукруглой шпацией
"degrees" - знак градуса
"dashglue", "wordglue" - приклеивание предлогов и дефисов
"spacing" - запятые и пробелы, перестановка
"phones" - обработка телефонов
"html" - при false - запрет использования тагов html
"de_nobr" - при true все <nobr/> заменяются на <span class="nobr"/>
"raw_output" - (по умолчанию false) - при true вместо entities выводятся UTF-символы
"skip_attr" - (по умолчанию false) - при true не отрабатывать типографику в атрибутах тегов (title, alt)
"skip_code" - (по умолчанию true) - при true не отрабатывать типографику внутри <code/>, <tt/>, CDATA
| GLYPHS | = | { :quot => """, # quotation mark :amp => "&", # ampersand :apos => "'", # apos :gt => ">", # greater-than sign :lt => "<", # less-than sign :nbsp => " ", # non-breaking space :sect => "§", # section sign :copy => "©", # copyright sign :laquo => "«", # left-pointing double angle quotation mark = left pointing guillemet :reg => "®", # registered sign = registered trade mark sign :deg => "°", # degree sign :plusmn => "±", # plus-minus sign = plus-or-minus sign :para => "¶", # pilcrow sign = paragraph sign :middot => "·", # middle dot = Georgian comma = Greek middle dot :raquo => "»", # right-pointing double angle quotation mark = right pointing guillemet :ndash => "–", # en dash :mdash => "—", # em dash :lsquo => "‘", # left single quotation mark :rsquo => "’", # right single quotation mark :ldquo => "“", # left double quotation mark :rdquo => "”", # right double quotation mark :bdquo => "„", # double low-9 quotation mark :bull => "•", # bullet = black small circle :hellip => "…", # horizontal ellipsis = three dot leader :numero => "№", # numero :trade => "™", # trade mark sign :minus => "−", # minus sign :inch => "″", # inch/second sign (u0x2033) (не путать с кавычками!) :thinsp => " ", # полукруглая шпация (тонкий пробел) :nob_open => '<span class="nobr">', # открывающий блок без переноса слов :nob_close => '</span>', # закрывающий блок без переноса слов } | Глифы, использующиеся в подстановках по-умолчанию | |
| VERBATIM_GLYPHS | = | { ' ' => :nbsp,# alt+0160 (NBSP here) '«' => :laquo, '»' => :raquo, '§' => :sect, '©' => :copy, '®' => :reg, '°' => :deg, '±' => :plusmn, '¶' => :para, '·' => :middot, '–' => :ndash, '—' => :mdash, '‘' => :lsquo, '’' => :rsquo, '“' => :ldquo, '”' => :rdquo, '„' => :bdquo, '•' => :bull, '…' => :hellip, '№' => :numero, '™' => :trade, '−' => :minus, ' ' => :thinsp, '″' => :inch, } | Нормальные "типографские" символы в UTF-виде. Браузерами обрабатываются плохонько, поэтому лучше заменять их на entities. | |
| REPLACEMENT_MARKER | = | RuTils::SUBSTITUTION_MARKER.freeze #:nodoc: | Для маркера мы применяем UTF-BOM чтобы его НЕЛЬЗЯ было перепутать с частью любого другого мультибайтного глифа. Thanks to huNter. | |
| FORBIDDEN_NUMERIC_ENTITIES | = | { '132' => :bdquo, '133' => :hellip, '146' => :apos, '147' => :ldquo, '148' => :rdquo, '149' => :bull, '150' => :ndash, '151' => :mdash, '153' => :trade, } | Кто придумал &147;? Не учите людей плохому… Привет А.Лебедеву www.artlebedev.ru/kovodstvo/62/ Используем символы, потом берем по символам из glyphs форматтера. Молодец mash! |
| glyph | [RW] | |
| settings | [RW] |
Применяет отдельный фильтр к text и возвращает результат. Например:
formatter.apply(:wordglue, "Вот так") => "Вот так"
Удобно применять когда вам нужно задействовать отдельный фильтр Гиленсона, но не нужна остальная механика Последний аргумент определяет, нужно ли при применении фильтра сохранить в неприкосновенности таги и другие игнорируемые фрагменты текста (по умолчанию они сохраняются).