Class | RuTils::Gilenson::Formatter |
In: |
lib/gilenson/gilenson.rb
|
Parent: | Object |
Обработчик типографских символов в HTML согласно общепринятым правилам. Посвящается П.Г.Гиленсону[www.rudtp.ru/lib.php?book=172], благодаря которому русские правила тех. редактуры еще как минимум 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, "Вот так") => "Вот так"
Удобно применять когда вам нужно задействовать отдельный фильтр Гиленсона, но не нужна остальная механика Последний аргумент определяет, нужно ли при применении фильтра сохранить в неприкосновенности таги и другие игнорируемые фрагменты текста (по умолчанию они сохраняются).