Class RuTils::Gilenson::Formatter
In: lib/gilenson/gilenson.rb  (CVS)
Parent: Object

Что такое Gilenson

Обработчик типографских символов в HTML согласно общепринятым правилам. Посвящается П.Г.Гиленсону, благодаря которому русские правила тех. редактуры еще как минимум 20 лет таки останутся бессмысленно старомодными.

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

Gilenson базируется на коде Typografica от PixelApes, который был приведен к положенному в Ruby стандарту. Основные отличия Gilenson от Typografica на PHP:

  * работа только и полностью в UTF-8 (включая entities, применимые в XML)
  * поддержка "raw"-вывода (символов вместо entities) - текст выводимый Gilenson можно верстать на бумаге

Использование

Быстрее всего - через метод +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

Methods

apply   configure   configure!   new   process   to_html  

Constants

GLYPHS = { :quot => "&#34;", # quotation mark :amp => "&#38;", # ampersand :apos => "&#39;", # apos :gt => "&#62;", # greater-than sign :lt => "&#60;", # less-than sign :nbsp => "&#160;", # non-breaking space :sect => "&#167;", # section sign :copy => "&#169;", # copyright sign :laquo => "&#171;", # left-pointing double angle quotation mark = left pointing guillemet :reg => "&#174;", # registered sign = registered trade mark sign :deg => "&#176;", # degree sign :plusmn => "&#177;", # plus-minus sign = plus-or-minus sign :para => "&#182;", # pilcrow sign = paragraph sign :middot => "&#183;", # middle dot = Georgian comma = Greek middle dot :raquo => "&#187;", # right-pointing double angle quotation mark = right pointing guillemet :ndash => "&#8211;", # en dash :mdash => "&#8212;", # em dash :lsquo => "&#8216;", # left single quotation mark :rsquo => "&#8217;", # right single quotation mark :ldquo => "&#8220;", # left double quotation mark :rdquo => "&#8221;", # right double quotation mark :bdquo => "&#8222;", # double low-9 quotation mark :bull => "&#8226;", # bullet = black small circle :hellip => "&#8230;", # horizontal ellipsis = three dot leader :numero => "&#8470;", # numero :trade => "&#8482;", # trade mark sign :minus => "&#8722;", # minus sign :inch => "&#8243;", # inch/second sign (u0x2033) (не путать с кавычками!) :thinsp => "&#8201;", # полукруглая шпация (тонкий пробел) :nob_open => '<span class="nobr">', # открывающий блок без переноса слов :nob_close => '</span>', # закрывающий блок без переноса слов }.freeze   Глифы, использующиеся в подстановках по-умолчанию
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, }.freeze   Нормальные "типографские" символы в UTF-виде. Браузерами обрабатываются плохонько, поэтому лучше заменять их на entities.
REPLACEMENT_MARKER = RuTils::SUBSTITUTION_MARKER #:nodoc:   Метка на которую подменяются вынутые теги
FORBIDDEN_NUMERIC_ENTITIES = { '132' => :bdquo, '133' => :hellip, '146' => :apos, '147' => :ldquo, '148' => :rdquo, '149' => :bull, '150' => :ndash, '151' => :mdash, '153' => :trade, }.freeze   Кто придумал &147;? Не учите людей плохому… Привет А.Лебедеву www.artlebedev.ru/kovodstvo/62/ Используем символы, потом берем по символам из glyphs форматтера. Молодец mash!
UNICODE_WHITESPACE = [ (0x0009..0x000D).to_a, # White_Space # Cc [5] <control-0009>..<control-000D> 0x0020, # White_Space # Zs SPACE 0x0085, # White_Space # Cc <control-0085> 0x00A0, # White_Space # Zs NO-BREAK SPACE 0x1680, # White_Space # Zs OGHAM SPACE MARK 0x180E, # White_Space # Zs MONGOLIAN VOWEL SEPARATOR (0x2000..0x200A).to_a, # White_Space # Zs [11] EN QUAD..HAIR SPACE 0x2028, # White_Space # Zl LINE SEPARATOR 0x2029, # White_Space # Zp PARAGRAPH SEPARATOR 0x202F, # White_Space # Zs NARROW NO-BREAK SPACE 0x205F, # White_Space # Zs MEDIUM MATHEMATICAL SPACE 0x3000, # White_Space # Zs IDEOGRAPHIC SPACE ].flatten.pack("U*").freeze   All the unicode whitespace

Attributes

glyph  [RW] 
settings  [RW] 

Public Class methods

Public Instance methods

Применяет отдельный фильтр к text и возвращает результат. Например:

 formatter.apply(:wordglue, "Вот так") => "Вот&#160;так"

Удобно применять когда вам нужно задействовать отдельный фильтр Гиленсона, но не нужна остальная механика Последний аргумент определяет, нужно ли при применении фильтра сохранить в неприкосновенности таги и другие игнорируемые фрагменты текста (по умолчанию они сохраняются).

configure(*config)

Alias for configure!

Настраивает форматтер ассоциированным хешем

 formatter.configure!(:dash=>true, :wordglue=>false)

Обрабатывает text_to_process с сохранением настроек, присвоенных обьекту-форматтеру Дополнительные аргументы передаются как параметры форматтера и не сохраняются после прогона.

Обрабатывает текст, присвоенный форматтеру при создании и возвращает результат обработки

[Validate]