Module: Typographica

Extended by:
Typographica
Included in:
String, Typographica
Defined in:
lib/typographica.rb,
lib/typographica/version.rb,
lib/typographica/typographica.rb

Overview

Typographica v0.1.0

Класс для типографической коррекции русского текста в HTML согласно правилам русского языка. Полная поддержка UTF-8.

©opyLeft & ©odeRight Alexey Kolosov aka mr.huNTer <[email protected]>

“Typographica” released without warranty under the terms of the Artistic License 2.0 www.opensource.org/licenses/artistic-license-2.0

Defined Under Namespace

Modules: VERSION

Instance Method Summary collapse

Instance Method Details

#typography(strToCorrect = "", shy = false) ⇒ Object

strToCorrect - строка для корректировки shy - расстановка “мягких” переносов по правилам русского языка



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/typographica/typographica.rb', line 20

def typography(strToCorrect = "", shy = false)

  if strToCorrect.empty?
    out = self
  else
    out = strToCorrect.dup
  end

  symbols = { "¤" => "&#164;",
              "°" => "&deg;",
              "%" => "&#37;",
              "£" => "&#163;",
              "" => "&#8356;",
              "" => "&euro;",
              "¥" => "&yen;"
  }

  # "мягкие" переносы для русского текста
  shys = {
            %r[([ёа-я][ьъй])([ёа-я]{2})]sui => "\\1&shy;\\2",
            %r[([ёа-я][аеёиоуыэюя])([аеёиоуыэюя][ёа-я])]sui => "\\1&shy;\\2",
            %r[([аеёиоуыэюя][бвгджзклмнпрстфхцчшщ])([бвгджзклмнпрстфхцчшщ][аеёиоуыэюя])]sui => "\\1&shy;\\2",
            %r[([бвгджзклмнпрстфхцчшщ][аеёиоуыэюя])([бвгджзклмнпрстфхцчшщ][аеёиоуыэюя])]sui => "\\1&shy;\\2",
            %r[([аеёиоуыэюя][бвгджзклмнпрстфхцчшщ])([бвгджзклмнпрстфхцчшщ][бвгджзклмнпрстфхцчшщ][аеёиоуыэюя])]sui => "\\1&shy;\\2",
            %r[([аеёиоуыэюя][бвгджзклмнпрстфхцчшщ][бвгджзклмнпрстфхцчшщ])([бвгджзклмнпрстфхцчшщ][бвгджзклмнпрстфхцчшщ][аеёиоуыэюя])]sui => "\\1&shy;\\2"
  }

  # маски и паттерны для преобразования в формате { маска => паттерн, маска => паттерн, маска => паттерн, ... }
  masks = {
            # амперсанд
            %r[([a-zёа-я]+)\s*\&\s*([a-zёа-я]+)]sui => "<nobr>\\1&nbsp;&amp;&nbsp;\\2</nobr>", #
            %r[([a-zёа-я]+)\s+\&\s+]sui => "\\1&nbsp;&amp; ", #

            # тире, дефисы, апострофы
            %r[(^|>|\s)([a-zёа-я]+[\-\'\/][a-zёа-я]+)([\s\.\,\!\?\;]+)]sui => "\\1<nobr>\\2\\3</nobr>", #
            %r[([a-zёа-я]+)\s+\-\s+]sui => "\\1&nbsp;&mdash; ", #
            %r[(^|>|\s)\-\s+]sui => "\\1&mdash;&nbsp;", #

            # знаки препинания
            %r[(\s*)([,\?\!\.]*)]sui => "\\2\\1", #
            %r[(.*?)([\,\;])([^\-\&]+?)(.*?)]sui => "\\1\\2 \\3\\4", #
            %r[([^\(ЁА-ЯA-Z][\.\?\!])([ЁА-ЯA-Z])]su => "\\1 \\2", #
            %r[(\s*)([\.\?\!]*)(\s*[ЁА-ЯA-Z])]su => "\\2\\1\\3", #
            %r[([a-zёа-я]+)\.{3,}]sui => "<nobr>\\1&#133;</nobr>", #
            %r[\.{3,}]sui => "&#133;", #

            # кавычки
            %r[(^|\s|>|\)|\()\"(.*?)\"]sui => "\\1&laquo;\\2&raquo;", #
            %r[(^|\s|>|\)|\()“(.*?)”]sui => "\\1&laquo;\\2&raquo;", #
            %r[(^|\s|>|\)|\()„(.*?)”]sui => "\\1&laquo;\\2&raquo;", #
            %r[]sui => "&#132;", #
            %r[]sui => "&#147;", #
            %r[]sui => "&#148;", #

            # спецсимволы
            %r[\(c\)]i => "&#169;", #
            %r[\(r\)]i => "&#174;", #
            %r[\(p\)]i => "&#8471;", #
            %r[\(tm\)]i => "&#153;", #
            %r[\(sm\)]i => "&#8480;", #

            # номер
            %r[(^|\s)no\.?\s?(\d+)]sui => "\\1\u2116\\2", # no. 123 -> №123

            # даты, телефонные номера, проценты
            %r[([0-9]{4})([\-\/\.])([0-9]{2})[\-\/\.]([0-9]{2})]su =>
              "<nobr>\\4\\2\\3\\2\\1</nobr>", # 1990-12-31 -> 31-12-1990, 1990/12/31 -> 31/12/1990, 1990.12.31 -> 31.12.1990
            %r[(\([0-9\+\-]+\))\s?([0-9]{3})\-?([0-9]{2})\-?([0-9]{2})]su =>
              "<nobr>\\1&nbsp;\\2&ndash;\\3&ndash;\\4</nobr>", # (904)4749303 -> (904) 474-93-03
            %r[(\([0-9\+\-]+\))\s?([0-9]{2})\-?([0-9]{2})\-?([0-9]{2})]su =>
              "<nobr>\\1&nbsp;\\2&ndash;\\3&ndash;\\4</nobr>", # (9044)749303 -> (9044) 74-93-03
            %r[(\([0-9\+\-]+\))\s?([0-9]{1})\-?([0-9]{2})\-?([0-9]{2})]su =>
              "<nobr>\\1&nbsp;\\2&ndash;\\3&ndash;\\4</nobr>", # (90447)49303 -> (90447) 4-93-03
            %r[(\-?[0-9]{1,})\s*([\%\°\£\₤\€])]su => "<nobr>\\1\\2</nobr>", # 80 % - 80%, 80 ° - 80°
            %r[(\-?[0-9]{1,})\s*([\$\¥])]su => "<nobr>\\2\\1</nobr>", # 80 $ - $80, 80 ¥ - ¥80

            # наводим красоту
            %r[\&nbsp\;\s+]sui => "&nbsp;", #
            %r[([\,\.\;\!\?])\ {2,}]sui => "\\1 ", #
            %r[(\&lt)\s+?]sui => "\\1", #
            %r[(\&gt)\s+?]sui => "\\1", #
            %r[(\"|\&quot)\s+(\"|\&quot)]sui => "", #

  }

  # начали приседания ...
  masks.each do |key, value|
    out.gsub!(key, value)
  end
  # ... продолжаем ...
  symbols.each do |key, value|
    out.gsub!(key, value)
  end
  # ... не останавливаемся ...
  if shy
    shys.each do |key, value|
      out.gsub!(key, value)
    end
  end
  # ... и закончили упражнение

  return out
end

#typography!(shy = false) ⇒ Object

shy - расстановка “мягких” переносов по правилам русского языка



125
126
127
# File 'lib/typographica/typographica.rb', line 125

def typography!(shy = false)
  typography(self, shy)
end