typefactory 0.0.12 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|