typefactory 0.0.12 → 0.0.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -16
- data/lib/generators/typefactory/templates/initializer.rb +29 -5
- data/lib/typefactory.rb +87 -7
- data/lib/typefactory/core_ext.rb +2 -4
- data/lib/typefactory/processor.rb +118 -44
- data/lib/typefactory/version.rb +1 -1
- data/spec/typefactory_spec.rb +68 -41
- data/typefactory.gemspec +0 -1
- metadata +2 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bbbc519a8a1162821d6ee306243f79ad558cdcd
|
4
|
+
data.tar.gz: 061fbe8213e937c9cfa5f563ee776a360bc9646b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3bf1298abf0f8959a104d8f600ea21cae28ffdf14617a28f565195de68ddd2d4b3ad4653a23434f1156cd005763f17fe62808921d0c5676c855a36d57f66d5bf
|
7
|
+
data.tar.gz: 102865abd53e6586222dbfceadfa8c30617ca20d0dc40077f5cbca0650e9cf910bbe7d5546ee3db6d872dd135188023456126c6f63b2a221464dd7e112500b79
|
data/README.md
CHANGED
@@ -1,40 +1,44 @@
|
|
1
|
-
#
|
1
|
+
# Тайпфектори
|
2
2
|
|
3
|
-
|
3
|
+
Этот небольшой плагин поможет вам подготовить тексты к публикации в вебе. Тайпфектор разрабатывался для русского языка, но может быть легко адаптирован для других языков (к примеру, для англо-германской группы).
|
4
4
|
|
5
|
-
|
5
|
+
_Тайпфектори — мой первый гем и я буду благодарен за любую критику_
|
6
6
|
|
7
|
-
##
|
7
|
+
## Возможности
|
8
8
|
|
9
|
-
|
9
|
+
Текущая версия расставляет:
|
10
|
+
* правильные многоуровневые кавычки;
|
11
|
+
* неразрывные проблелы после коротких слов;
|
12
|
+
* длинные тире.
|
10
13
|
|
11
|
-
## Install
|
12
14
|
|
13
|
-
|
15
|
+
## Установка
|
14
16
|
|
15
|
-
|
17
|
+
### Ruby on rails
|
18
|
+
|
19
|
+
$ gem "typefactory", "~> 0.0.20"
|
16
20
|
$ bundle install
|
17
21
|
|
18
22
|
|
19
|
-
###
|
23
|
+
### Метод в классе String
|
20
24
|
|
21
|
-
|
25
|
+
Тайпфектори добавляет метод `prepare` в стандартный класс `String`, который вы также можете использовать:
|
22
26
|
|
23
|
-
'
|
27
|
+
'Правильно "оформленный" в вебе текст'.prepare
|
24
28
|
<%= @description.prepare %>
|
25
29
|
|
26
30
|
|
27
|
-
##
|
31
|
+
## Настройка
|
28
32
|
|
29
|
-
|
33
|
+
Сгенерируйте шаблон файла настроек:
|
30
34
|
|
31
35
|
$ rails generate typefactory config
|
32
36
|
|
33
|
-
|
37
|
+
Отредактируте параметры в файле `config/initializers/typefactory.rb` по своему усмотрению
|
34
38
|
|
35
|
-
##
|
39
|
+
## Помогите улучшить
|
36
40
|
|
37
|
-
|
41
|
+
Если вы нашли ошибку в работе алгоритма, пришлите исходный текст по электронной почте: eboyko@eboyko.ru
|
38
42
|
|
39
43
|
## Contribute
|
40
44
|
|
@@ -1,9 +1,33 @@
|
|
1
1
|
Typefactory.setup do |config|
|
2
2
|
|
3
|
-
config.
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
]
|
3
|
+
config.mode = :entity
|
4
|
+
|
5
|
+
config.locale = :ru
|
6
|
+
|
7
|
+
config.settings = [:clean, :quotes, :dashes, :glue_widows]
|
8
|
+
|
9
|
+
config.glyphs = {
|
10
|
+
nbsp: { mark: ' ', symbol: ' ', entity: ' ', decimal: ' ' },
|
11
|
+
quot: { mark: '"', symbol: '"', entity: '"', decimal: '"' },
|
12
|
+
mdash: { mark: '-', symbol: '—', entity: '—', decimal: '—' },
|
13
|
+
copy: { mark: '(c)', symbol: '©', entity: '©', decimal: '©' }
|
14
|
+
}
|
15
|
+
|
16
|
+
config.quotes = {
|
17
|
+
ru: [
|
18
|
+
{
|
19
|
+
left: { mark: '"', symbol: '«', entity: '«', decimal: '«' },
|
20
|
+
right: { mark: '"', symbol: '»', entity: '»', decimal: '»' }
|
21
|
+
},
|
22
|
+
{
|
23
|
+
left: { mark: '"', symbol: '„', entity: '„', decimal: '„' },
|
24
|
+
right: { mark: '"', symbol: '“', entity: '“', decimal: '“' }
|
25
|
+
},
|
26
|
+
{
|
27
|
+
left: { mark: '"', symbol: '‘', entity: '‘', decimal: '‘' },
|
28
|
+
right: { mark: '"', symbol: '’', entity: '’', decimal: '’' }
|
29
|
+
}
|
30
|
+
]
|
31
|
+
}
|
8
32
|
|
9
33
|
end
|
data/lib/typefactory.rb
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
require 'typefactory/core_ext'
|
2
|
-
require 'active_support/dependencies'
|
3
2
|
|
4
3
|
module Typefactory
|
5
4
|
|
6
5
|
autoload :Processor, 'typefactory/processor'
|
7
6
|
|
8
|
-
|
7
|
+
@mode = :symbol
|
9
8
|
|
10
|
-
|
9
|
+
@locale = :ru
|
11
10
|
|
12
|
-
|
11
|
+
@settings = [
|
12
|
+
:clean,
|
13
|
+
:quotes,
|
14
|
+
:dashes,
|
15
|
+
:glue_widows
|
16
|
+
]
|
17
|
+
|
18
|
+
@quotes = {
|
13
19
|
ru: [
|
14
20
|
{
|
15
21
|
left: { mark: '"', symbol: '«', entity: '«', decimal: '«' },
|
@@ -36,15 +42,89 @@ module Typefactory
|
|
36
42
|
]
|
37
43
|
}
|
38
44
|
|
39
|
-
|
45
|
+
@glyphs = {
|
40
46
|
nbsp: { mark: ' ', symbol: ' ', entity: ' ', decimal: ' ' },
|
41
47
|
quot: { mark: '"', symbol: '"', entity: '"', decimal: '"' },
|
42
48
|
mdash: { mark: '-', symbol: '—', entity: '—', decimal: '—' },
|
43
49
|
copy: { mark: '(c)', symbol: '©', entity: '©', decimal: '©' }
|
44
50
|
}
|
45
51
|
|
46
|
-
|
47
|
-
|
52
|
+
|
53
|
+
# @param mode [Symbol] возможные значения `:symbol`, `:entity` или `:decimal`
|
54
|
+
def self.mode=(mode)
|
55
|
+
@mode = mode
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [Symbol]
|
59
|
+
def self.mode
|
60
|
+
@mode
|
61
|
+
end
|
62
|
+
|
63
|
+
# @param locale [Symbol]
|
64
|
+
def self.locale=(locale)
|
65
|
+
@locale = locale
|
66
|
+
end
|
67
|
+
|
68
|
+
# Локаль, определяющая используемые глифы; по умолчанию `:ru`
|
69
|
+
# @return [Symbol]
|
70
|
+
def self.locale
|
71
|
+
@locale
|
72
|
+
end
|
73
|
+
|
74
|
+
# @param settings [Array<Symbol>]
|
75
|
+
def self.settings=(settings)
|
76
|
+
@settings = settings
|
77
|
+
end
|
78
|
+
|
79
|
+
# @return [Array<Symbol>]
|
80
|
+
def self.settings
|
81
|
+
@settings
|
82
|
+
end
|
83
|
+
|
84
|
+
# @param glyphs [Hash{Symbol => Hash}]
|
85
|
+
def self.glyphs=(glyphs)
|
86
|
+
@glyphs = glyphs
|
87
|
+
end
|
88
|
+
|
89
|
+
# @todo по-человечески описать формат возвращаемых данных
|
90
|
+
# @return [Hash{Symbol => Hash}]
|
91
|
+
def self.glyphs
|
92
|
+
@glyphs
|
93
|
+
end
|
94
|
+
|
95
|
+
# @param quotes [Hash]
|
96
|
+
def self.quotes=(quotes)
|
97
|
+
@quotes = quotes
|
98
|
+
end
|
99
|
+
|
100
|
+
# @todo по-человечески описать формат возвращаемых данных
|
101
|
+
# @return [Hash]
|
102
|
+
def self.quotes
|
103
|
+
@quotes
|
104
|
+
end
|
105
|
+
|
106
|
+
# Возвращает знак кавычки для выбранных уровня глубины и стороны
|
107
|
+
# @param depth [Integer]
|
108
|
+
# @param side [Symbol] `:left` or `:right`
|
109
|
+
def self.quote(depth = 0, side = :left)
|
110
|
+
depth = 0 if depth < 0
|
111
|
+
count = @quotes[@locale].length - 1
|
112
|
+
depth = count if depth > count
|
113
|
+
@quotes[@locale][depth][side][@mode]
|
114
|
+
end
|
115
|
+
|
116
|
+
# Метод настройки модуля с помощью файла инициализации (по аналогии с Devise)
|
117
|
+
# @yield [Typefactory]
|
118
|
+
def self.setup
|
119
|
+
yield self
|
120
|
+
end
|
121
|
+
|
122
|
+
# Обрабатывает текст с учетом заданных параметров
|
123
|
+
# @param text [String]
|
124
|
+
# @param [Array<Symbol>] settings
|
125
|
+
# @return [String]
|
126
|
+
def self.prepare(text, *settings)
|
127
|
+
Processor.new(text).prepare(settings)
|
48
128
|
end
|
49
129
|
|
50
130
|
end
|
data/lib/typefactory/core_ext.rb
CHANGED
@@ -2,122 +2,196 @@ module Typefactory
|
|
2
2
|
|
3
3
|
class Processor
|
4
4
|
|
5
|
-
@
|
6
|
-
|
5
|
+
# @param original [String]
|
7
6
|
def initialize(original)
|
8
7
|
@buffer = original
|
9
8
|
end
|
10
9
|
|
11
|
-
|
12
|
-
|
10
|
+
# @param settings [Array]
|
11
|
+
# @return [String]
|
12
|
+
def prepare(settings = nil)
|
13
|
+
|
14
|
+
@settings = settings.nil? ? Typefactory::settings : Typefactory::settings | settings
|
15
|
+
|
16
|
+
cleanup if @settings.include?(:clean) and !@settings.include?(:no_clean)
|
17
|
+
|
13
18
|
preserve_html
|
14
|
-
|
19
|
+
|
20
|
+
process_quotes if @settings.include?(:quotes) and !@settings.include?(:no_quotes)
|
21
|
+
|
15
22
|
revive_html
|
16
|
-
|
17
|
-
|
23
|
+
|
24
|
+
process_dashes if @settings.include?(:dashes) and !@settings.include?(:no_dashes)
|
25
|
+
|
26
|
+
process_widows if @settings.include?(:glue_widows) and !@settings.include?(:no_glue_widows)
|
18
27
|
|
19
28
|
@buffer
|
29
|
+
|
20
30
|
end
|
21
31
|
|
22
32
|
private
|
23
33
|
|
34
|
+
# Очищает текст от уже расставленных глифов
|
24
35
|
def cleanup
|
25
|
-
|
36
|
+
Typefactory::glyphs.each do |key, glyph|
|
26
37
|
@buffer.gsub!(/#{glyph[:entity]}|#{glyph[:decimal]}|#{glyph[:symbol]}/) do
|
27
38
|
glyph[:mark]
|
28
39
|
end
|
29
40
|
end
|
30
41
|
|
31
42
|
expression = ''
|
32
|
-
|
43
|
+
Typefactory::quotes.each_pair do |locale, quotes|
|
33
44
|
quotes.each do |level|
|
34
45
|
level.each do |side, glyph|
|
35
46
|
expression += "#{glyph[:symbol]}|#{glyph[:entity]}|#{glyph[:decimal]}|"
|
36
47
|
end
|
37
48
|
end
|
38
49
|
end
|
39
|
-
@buffer.gsub!(/#{expression[0..-2]}/,
|
50
|
+
@buffer.gsub!(/#{expression[0..-2]}/, Typefactory::glyphs[:quot][:mark])
|
40
51
|
end
|
41
52
|
|
53
|
+
# Экранирует параметры тегов HTML
|
42
54
|
def preserve_html
|
43
55
|
@buffer.gsub!(/<([^\/].*?)>/) do |tag|
|
44
56
|
tag.gsub(/"/, '\'')
|
45
57
|
end
|
46
58
|
end
|
47
59
|
|
60
|
+
# Снимает экранирование с тегов HTML
|
48
61
|
def revive_html
|
49
62
|
@buffer.gsub!(/<([^\/].*?)>/) do |tag|
|
50
63
|
tag.gsub(/'/, '"')
|
51
64
|
end
|
52
65
|
end
|
53
66
|
|
67
|
+
# Расставляет правильные многоуровневые кавычки
|
54
68
|
def process_quotes
|
55
|
-
result =
|
56
|
-
|
57
|
-
@buffer.split('').each_with_index do |
|
58
|
-
if
|
59
|
-
side = quote_mark_side
|
69
|
+
result = ''
|
70
|
+
depth = -1
|
71
|
+
@buffer.split('').each_with_index do |char, index|
|
72
|
+
if char == '"'
|
73
|
+
side = quote_mark_side index
|
60
74
|
if side == :left
|
61
|
-
|
62
|
-
|
63
|
-
result += QUOTES[LOCALE][level][side][MODE]
|
75
|
+
depth += 1
|
76
|
+
result += Typefactory::quote(depth, side)
|
64
77
|
else
|
65
|
-
result +=
|
66
|
-
|
67
|
-
level = -1 if level < -1
|
78
|
+
result += Typefactory::quote(depth, side)
|
79
|
+
depth -= 1
|
68
80
|
end
|
69
81
|
else
|
70
|
-
result +=
|
82
|
+
result += char
|
71
83
|
end
|
72
84
|
end
|
85
|
+
|
73
86
|
@buffer.replace result
|
74
87
|
end
|
75
88
|
|
89
|
+
# Определяет сторону кавычки на указаной позиции
|
90
|
+
# @param index [Integer] позиция кавычки в строке
|
76
91
|
def quote_mark_side(index)
|
77
|
-
before = space_before_position
|
78
|
-
after = space_after_position
|
92
|
+
before = space_before_position index
|
93
|
+
after = space_after_position index
|
94
|
+
|
79
95
|
if !before.nil? and !after.nil?
|
80
|
-
|
96
|
+
if before == after
|
97
|
+
|
98
|
+
if index == 0
|
99
|
+
:left
|
100
|
+
elsif index == @buffer.length-1
|
101
|
+
:right
|
102
|
+
else
|
103
|
+
|
104
|
+
if @buffer[index+1..index+1].scan(/[A-Za-zА-Яа-я0-9]/).any?
|
105
|
+
:left
|
106
|
+
else
|
107
|
+
:right
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
elsif before < after
|
113
|
+
:left
|
114
|
+
else
|
115
|
+
:right
|
116
|
+
end
|
81
117
|
elsif !before.nil? and after.nil?
|
82
118
|
:left
|
83
|
-
elsif
|
84
|
-
:right
|
85
|
-
else
|
119
|
+
elsif !after.nil? and before.nil?
|
86
120
|
:right
|
87
121
|
end
|
88
122
|
end
|
89
123
|
|
124
|
+
# @param index [Integer] контрольная позиция селектора
|
125
|
+
# @param length [Integer] количество возвращаемых символов перед контрольной позицией
|
126
|
+
# @return [String]
|
127
|
+
def characters_before(index, length)
|
128
|
+
start_position = (index-length > 0) ? index-length : 0
|
129
|
+
end_position = (index-1 > 0) ? index-1 : 0
|
130
|
+
@buffer[start_position..end_position]
|
131
|
+
end
|
132
|
+
|
133
|
+
# @param index [Integer] контрольная позиция селектора
|
134
|
+
# @param length [Integer] количество возвращаемых символов после контрольной позиции
|
135
|
+
# @return [String]
|
136
|
+
def characters_after(index, length)
|
137
|
+
start_position = index+1 < @buffer.length ? index+1 : @buffer.length-1
|
138
|
+
end_position = index+length < @buffer.length ? index+length : @buffer.length-1
|
139
|
+
@buffer[start_position..end_position]
|
140
|
+
end
|
141
|
+
|
142
|
+
# Расстояние до ближайшего пробельного символа слева от текущей позиции
|
143
|
+
# @param index [Integer]
|
144
|
+
# @param length [Integer]
|
145
|
+
# @return [Integer, Nil]
|
90
146
|
def space_before_position(index, length = 4)
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
147
|
+
expression = /\s|\-|>|\(/
|
148
|
+
space_at = characters_before(index, length).rindex(expression)
|
149
|
+
if space_at.nil?
|
150
|
+
if index < length
|
151
|
+
0
|
152
|
+
else
|
153
|
+
nil
|
154
|
+
end
|
96
155
|
else
|
97
|
-
|
156
|
+
if index < length
|
157
|
+
space_at + 1
|
158
|
+
else
|
159
|
+
length - space_at
|
160
|
+
end
|
98
161
|
end
|
162
|
+
|
99
163
|
end
|
100
164
|
|
165
|
+
# Расстояние до ближайшего пробельного символа справа от текущей позиции
|
166
|
+
# @param index [Integer]
|
167
|
+
# @param length [Integer]
|
168
|
+
# @return [Integer, Nil]
|
101
169
|
def space_after_position(index, length = 4)
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
170
|
+
expression = /\s|\-|<|\.|,|!|\?|:|;|\)/
|
171
|
+
space_at = characters_after(index, length).index(expression)
|
172
|
+
if space_at.nil?
|
173
|
+
if index > @buffer.length-length-1
|
174
|
+
0
|
175
|
+
else
|
176
|
+
nil
|
177
|
+
end
|
107
178
|
else
|
108
|
-
|
179
|
+
space_at + 1
|
109
180
|
end
|
181
|
+
|
110
182
|
end
|
111
183
|
|
112
|
-
|
184
|
+
# Расставляет неразрывные пробелы после слов длиной до трех символов
|
185
|
+
def process_widows
|
113
186
|
@buffer.gsub!(/(\s)([a-z,A-Z,а-я,А-Я]{1,2})\s(\S)/) do
|
114
|
-
"#{$1}#{$2}#{
|
187
|
+
"#{$1}#{$2}#{Typefactory::glyphs[:nbsp][Typefactory::mode]}#{$3}"
|
115
188
|
end
|
116
189
|
end
|
117
190
|
|
118
|
-
|
191
|
+
# Расставляет длинные тире
|
192
|
+
def process_dashes
|
119
193
|
@buffer.gsub!(/\s\-\s/) do
|
120
|
-
"#{
|
194
|
+
"#{Typefactory::glyphs[:nbsp][Typefactory::mode]}#{Typefactory::glyphs[:mdash][Typefactory::mode]} "
|
121
195
|
end
|
122
196
|
end
|
123
197
|
|
data/lib/typefactory/version.rb
CHANGED
data/spec/typefactory_spec.rb
CHANGED
@@ -1,47 +1,80 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
RSpec.describe '
|
3
|
+
RSpec.describe 'Тайпфектори' do
|
4
4
|
|
5
|
-
describe '
|
6
|
-
it '
|
5
|
+
describe 'В принципе' do
|
6
|
+
it 'Нормально конфигурируется' do
|
7
7
|
Typefactory.setup do |config|
|
8
|
-
config.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
config.mode = :symbol
|
9
|
+
config.locale = :ru
|
10
|
+
config.settings = [:clean, :quotes, :dashes, :glue_widows]
|
11
|
+
config.glyphs = {
|
12
|
+
nbsp: { mark: ' ', symbol: ' ', entity: ' ', decimal: ' ' },
|
13
|
+
quot: { mark: '"', symbol: '"', entity: '"', decimal: '"' },
|
14
|
+
mdash: { mark: '-', symbol: '—', entity: '—', decimal: '—' },
|
15
|
+
copy: { mark: '(c)', symbol: '©', entity: '©', decimal: '©' }
|
16
|
+
}
|
17
|
+
config.quotes = {
|
18
|
+
ru: [
|
19
|
+
{
|
20
|
+
left: { mark: '"', symbol: '«', entity: '«', decimal: '«' },
|
21
|
+
right: { mark: '"', symbol: '»', entity: '»', decimal: '»' }
|
22
|
+
},
|
23
|
+
{
|
24
|
+
left: { mark: '"', symbol: '„', entity: '„', decimal: '„' },
|
25
|
+
right: { mark: '"', symbol: '“', entity: '“', decimal: '“' }
|
26
|
+
},
|
27
|
+
{
|
28
|
+
left: { mark: '"', symbol: '‘', entity: '‘', decimal: '‘' },
|
29
|
+
right: { mark: '"', symbol: '’', entity: '’', decimal: '’' }
|
30
|
+
}
|
31
|
+
],
|
32
|
+
en: [
|
33
|
+
{
|
34
|
+
left: { mark: '"', symbol: '“', entity: '“', decimal: '“' },
|
35
|
+
right: { mark: '"', symbol: '”', entity: '”', decimal: '”' }
|
36
|
+
},
|
37
|
+
{
|
38
|
+
left: { mark: '"', symbol: '‘', entity: '‘', decimal: '‘' },
|
39
|
+
right: { mark: '"', symbol: '’', entity: '’', decimal: '’' }
|
40
|
+
}
|
41
|
+
]
|
42
|
+
}
|
43
|
+
expect(config.locale).to eq(:ru)
|
44
|
+
expect(config.mode).to eq(:symbol)
|
45
|
+
expect(config.settings.class).to eq(Array)
|
46
|
+
expect(config.glyphs.class).to eq(Hash)
|
47
|
+
expect(config.quotes[config.locale].class).to eq(Array)
|
16
48
|
end
|
17
49
|
end
|
50
|
+
it 'Не ломает HTML' do
|
51
|
+
example = '<p>Некоторые а используют на типограф <a href="http://artlebedev.ru" class="external" target="_blank">Лебедева</a></p>'
|
52
|
+
expect(example.prepare(:no_glue_widows)).to eq('<p>Некоторые а используют на типограф <a href="http://artlebedev.ru" class="external" target="_blank">Лебедева</a></p>')
|
53
|
+
end
|
18
54
|
end
|
19
55
|
|
20
|
-
describe '
|
21
|
-
it '
|
22
|
-
|
23
|
-
expect(
|
56
|
+
describe 'Кавычки' do
|
57
|
+
it 'Одноуровневые без содержимого' do
|
58
|
+
expect('""'.prepare).to eq('«»')
|
59
|
+
expect(' "" '.prepare).to eq(' «» ')
|
24
60
|
end
|
25
61
|
|
26
|
-
it '
|
27
|
-
example = '
|
28
|
-
expect(example.prepare).to eq('
|
62
|
+
it 'Одноуровневые в стандартном предложении' do
|
63
|
+
example = 'Типовой "текст" в кавычках'
|
64
|
+
expect(example.prepare(:no_glue_widows)).to eq('Типовой «текст» в кавычках')
|
29
65
|
end
|
30
66
|
|
31
|
-
it '
|
32
|
-
example = '"
|
33
|
-
expect(example.prepare).to eq('
|
67
|
+
it 'Двухуровневые в стандартном предложении' do
|
68
|
+
example = '"Различные "ученые" от пикап-индустрии"'
|
69
|
+
expect(example.prepare(:no_glue_widows)).to eq('«Различные „ученые“ от пикап-индустрии»')
|
34
70
|
end
|
35
|
-
end
|
36
|
-
|
37
71
|
|
38
|
-
|
39
|
-
|
40
|
-
example
|
41
|
-
expect(example.prepare).to eq('«„‘Никакой’ другой“ типограф»')
|
72
|
+
it 'Трехуровневые в стандартном предложении' do
|
73
|
+
example = '"Быть может, когда-нибудь "все мы будем жить в "лучшем" мире""'
|
74
|
+
expect(example.prepare(:no_glue_widows)).to eq('«Быть может, когда-нибудь „все мы будем жить в ‘лучшем’ мире“»')
|
42
75
|
end
|
43
76
|
|
44
|
-
it '
|
77
|
+
it 'Одноуровневые в дефисных словосочетаниях' do
|
45
78
|
example = 'Кавычки-"елочки"'
|
46
79
|
expect(example.prepare).to eq('Кавычки-«елочки»')
|
47
80
|
|
@@ -49,24 +82,18 @@ RSpec.describe 'Typefactory' do
|
|
49
82
|
expect(example.prepare).to eq('«Елочки»-сосны')
|
50
83
|
end
|
51
84
|
|
52
|
-
|
85
|
+
end
|
86
|
+
|
87
|
+
describe 'Глифы' do
|
88
|
+
it 'Неразрывные пробелы после коротких слов' do
|
53
89
|
example = 'Едет Санта на оленях'
|
54
90
|
expect(example.prepare).to eq('Едет Санта на оленях')
|
55
91
|
end
|
56
|
-
|
57
|
-
it 'Processing demo paragraph' do
|
58
|
-
example = <<eot
|
59
|
-
<p>«Можем "Демо" однозначно констатировать, что, по данным Системы контроля космического пространства Российской Федерации, в период с 10:00 до 13:00 мск (09:00 до 12:00 укр) 12, 16, 17, и 18 июля украинские спутники „Сич-1“ и „Сич-2“ над указанными территориями не пролетали. В обозначенное на снимках время над зоной катастрофы находился американский спутник оптико-электронной разведки типа „Кихоул“ (KeyHole). Таким образом, источник получения фотоосновы для дальнейшей обработки СБУ не должен вызывать ни у кого сомнений», — замечает Минобороны.</p>
|
60
|
-
eot
|
61
|
-
puts example.prepare
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe 'Glyphs' do
|
66
|
-
it 'Process long dashes' do
|
92
|
+
it 'Длинные тире' do
|
67
93
|
example = 'Писец - не только ценный мех'
|
68
|
-
expect(example.prepare).to eq('Писец — не
|
94
|
+
expect(example.prepare(:no_glue_widows)).to eq('Писец — не только ценный мех')
|
69
95
|
end
|
70
96
|
end
|
71
97
|
|
98
|
+
|
72
99
|
end
|
data/typefactory.gemspec
CHANGED
@@ -18,7 +18,6 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_runtime_dependency 'rails', '~> 4.1', '>= 4.1.0'
|
22
21
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
23
22
|
spec.add_development_dependency 'rake', '~> 10.1', '>= 10.1.0'
|
24
23
|
spec.add_development_dependency 'rspec', '~> 3.0', '>= 3.0.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typefactory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evgeny Boyko
|
@@ -9,28 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: rails
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '4.1'
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 4.1.0
|
24
|
-
type: :runtime
|
25
|
-
prerelease: false
|
26
|
-
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
requirements:
|
28
|
-
- - "~>"
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '4.1'
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 4.1.0
|
34
14
|
- !ruby/object:Gem::Dependency
|
35
15
|
name: bundler
|
36
16
|
requirement: !ruby/object:Gem::Requirement
|