evil-front 0.1.0 → 0.2.0
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/ChangeLog.md +7 -0
- data/evil-front.gemspec +1 -0
- data/lib/assets/javascripts/evil-front/links.js +1 -1
- data/lib/evil-front/english.rb +31 -0
- data/lib/evil-front/helpers/english_typograph.rb +21 -0
- data/lib/evil-front/helpers/russian_typograph.rb +4 -4
- data/lib/evil-front/helpers/typograph_by_locale.rb +16 -0
- data/lib/evil-front/russian.rb +20 -50
- data/lib/evil-front/typograph.rb +53 -0
- data/lib/evil-front/version.rb +1 -1
- data/lib/evil-front.rb +3 -1
- data/spec/english_spec.rb +27 -0
- data/spec/helpers_spec.rb +34 -1
- metadata +21 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c642832df3cebbd5ff200d7c90df281731b9db7
|
4
|
+
data.tar.gz: 27841ed12430bba30e6aee3ffe3f15491ab29bab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e1ce451ab3e68f39af7dcfbc072791d25c0970122b7804f702da59e659d7668e174c7cd0789cb9703cb78eb8ea956ed79e864b6287b6b7d2eb14e593a37b92e
|
7
|
+
data.tar.gz: 8f0ed46f7385518a09bc468e58770f704ae1df55c1eeb249537292c5f50a010b739d69c7a42ac3f35f886aabf05deaa37a535ba4aba5c56351462274c5b79d1a
|
data/ChangeLog.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 0.2 “Ptolemaeus Crater”
|
2
|
+
|
3
|
+
* Add `english_typograph` helper.
|
4
|
+
* Add `typograph_by_locale` helper to use typographer for current I18n locale.
|
5
|
+
* Increase `english_typograph` speed.
|
6
|
+
* Increase `evil-front/links.js` speed.
|
7
|
+
|
1
8
|
## 0.1 “Hellespontus Montes”
|
2
9
|
|
3
10
|
* Initial release.
|
data/evil-front.gemspec
CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.add_dependency 'nokogiri', '>= 1'
|
23
23
|
s.add_dependency 'sprockets', '>= 1'
|
24
24
|
s.add_dependency 'unicode_utils', '>= 1.4'
|
25
|
+
s.add_dependency 'rubypants-unicode', '>= 0'
|
25
26
|
s.add_dependency 'rails-sass-images', '>= 0.3'
|
26
27
|
s.add_dependency 'standalone_typograf', '>= 3.0.1'
|
27
28
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubypants-unicode'
|
4
|
+
|
5
|
+
module EvilFront
|
6
|
+
# Helpers to work with English text.
|
7
|
+
module English
|
8
|
+
extend Typograph
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# Replace symbols to right ones, like m-dash, quotes, etc.
|
13
|
+
def self.use_right_symbols(text)
|
14
|
+
RubyPants.new(text).to_html
|
15
|
+
end
|
16
|
+
|
17
|
+
# Small words to insert non-break space before them
|
18
|
+
def self.tiny_words
|
19
|
+
@tiny_words ||= begin
|
20
|
+
tiny = %w(to is be the a an no if at on of in or and)
|
21
|
+
tiny += tiny.map(&:capitalize)
|
22
|
+
tiny.map { |i| Regexp.new("( | )(#{Regexp.quote i}) ") }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Apply all typograph methods to text
|
27
|
+
def self.typograph_all(text)
|
28
|
+
typograph(text)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module EvilFront::Helpers
|
2
|
+
# Insert non-break spaces and mark quotes to have nice text.
|
3
|
+
# Work only with English language.
|
4
|
+
#
|
5
|
+
# = english_typograph user.description
|
6
|
+
#
|
7
|
+
# You can send block:
|
8
|
+
#
|
9
|
+
# = english_typograph do
|
10
|
+
# = user.name
|
11
|
+
# = user.profession
|
12
|
+
def english_typograph(text = nil, &block)
|
13
|
+
text = if block_given?
|
14
|
+
capture(&block)
|
15
|
+
else
|
16
|
+
EvilFront.escape(text)
|
17
|
+
end
|
18
|
+
text = EvilFront::English.typograph_html(text)
|
19
|
+
EvilFront.html_safe(text)
|
20
|
+
end
|
21
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module EvilFront::Helpers
|
2
|
-
# Insert non-break spaces and mark quotes to have nice text.
|
3
|
-
# Russian language.
|
2
|
+
# Insert non-break spaces and mark quotes to have nice text.
|
3
|
+
# Work only with Russian language.
|
4
4
|
#
|
5
|
-
# =
|
5
|
+
# = russian_typograph user.description
|
6
6
|
#
|
7
7
|
# You can send block:
|
8
8
|
#
|
9
|
-
# =
|
9
|
+
# = russian_typograph do
|
10
10
|
# = user.name
|
11
11
|
# = user.profession
|
12
12
|
def russian_typograph(text = nil, &block)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module EvilFront::Helpers
|
2
|
+
# Add typograph rules to text by language in current locale.
|
3
|
+
#
|
4
|
+
# typograph_by_locale(post.body)
|
5
|
+
def typograph_by_locale(text = nil, &block)
|
6
|
+
text = capture(&block) if block_given?
|
7
|
+
|
8
|
+
if I18n.locale == :ru
|
9
|
+
russian_typograph(text)
|
10
|
+
elsif I18n.locale == :en
|
11
|
+
english_typograph(text)
|
12
|
+
else
|
13
|
+
text
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/evil-front/russian.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'unicode_utils'
|
4
|
-
require 'nokogiri'
|
5
4
|
require 'standalone_typograf'
|
6
5
|
|
7
6
|
module EvilFront
|
8
7
|
# Helpers to work with Russian text.
|
9
8
|
module Russian
|
9
|
+
extend Typograph
|
10
|
+
|
10
11
|
# Capitalize only first letter (like titles in Russian).
|
11
12
|
#
|
12
13
|
# = EvilFront::Russian.capitalize_first(title)
|
@@ -14,44 +15,6 @@ module EvilFront
|
|
14
15
|
UnicodeUtils.upcase(text[0]) + text[1..-1]
|
15
16
|
end
|
16
17
|
|
17
|
-
# Insert non-break spaces and mark quotes to have nice text. Work only with
|
18
|
-
# Russian language.
|
19
|
-
#
|
20
|
-
# EvilFront::Russian.typograph(article)
|
21
|
-
def self.typograph(text)
|
22
|
-
return text if text.nil? or text.empty?
|
23
|
-
|
24
|
-
text = StandaloneTypograf::Typograf.new(text).prepare
|
25
|
-
|
26
|
-
tiny = %w(ни не и но а или да как из-за про по за для
|
27
|
-
на до при меж о у в во с со от ото из без
|
28
|
-
безо к ко об обо под подо над перед передо)
|
29
|
-
tiny += tiny.map { |i| capitalize_first(i) }
|
30
|
-
tiny.each do |word|
|
31
|
-
regexp = Regexp.new(" #{Regexp.quote word} ") # fix JRuby issue
|
32
|
-
text.gsub! regexp, " #{word} " # non-break space
|
33
|
-
end
|
34
|
-
|
35
|
-
text.gsub!(/([^\s" ]+)-([^\s" ]+)/, '\1‑\2')
|
36
|
-
|
37
|
-
text
|
38
|
-
end
|
39
|
-
|
40
|
-
# Like `typograph`, but process only text nodes in HTML.
|
41
|
-
#
|
42
|
-
# EvilFront::Russian.typograph_html(article.html)
|
43
|
-
def self.typograph_html(html)
|
44
|
-
return html if html.nil? or html.empty?
|
45
|
-
|
46
|
-
if html.include? '<'
|
47
|
-
nodes = Nokogiri::HTML::DocumentFragment.parse(html)
|
48
|
-
typograph_node! nodes
|
49
|
-
nodes.to_html
|
50
|
-
else
|
51
|
-
auto_flying_quotes(typograph(html))
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
18
|
# Find quotes in text and make them flying
|
56
19
|
def self.auto_flying_quotes(text)
|
57
20
|
text.gsub(/\s«[^»]+»/) { |i| flying_quotes i[2..-2], space: i[0] }.
|
@@ -67,18 +30,25 @@ module EvilFront
|
|
67
30
|
|
68
31
|
private
|
69
32
|
|
70
|
-
#
|
71
|
-
def self.
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
else
|
79
|
-
typograph_node! child
|
80
|
-
end
|
33
|
+
# Small words to insert non-break space before them
|
34
|
+
def self.tiny_words
|
35
|
+
@tiny_words ||= begin
|
36
|
+
tiny = %w(ни не и но а или да как из-за про по за для
|
37
|
+
на до при меж о у в во с со от ото из без
|
38
|
+
безо к ко об обо под подо над перед передо)
|
39
|
+
tiny += tiny.map { |i| capitalize_first(i) }
|
40
|
+
tiny.map { |i| Regexp.new("( | )(#{Regexp.quote i}) ") }
|
81
41
|
end
|
82
42
|
end
|
43
|
+
|
44
|
+
# Replace symbols to right ones, like m-dash, quotes, etc.
|
45
|
+
def self.use_right_symbols(text)
|
46
|
+
StandaloneTypograf::Typograf.new(text).prepare
|
47
|
+
end
|
48
|
+
|
49
|
+
# Apply all typograph methods to text
|
50
|
+
def self.typograph_all(text)
|
51
|
+
auto_flying_quotes(typograph(text))
|
52
|
+
end
|
83
53
|
end
|
84
54
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
module EvilFront
|
6
|
+
# Abstract module to be used in `Russian` and `English` typographs.
|
7
|
+
module Typograph
|
8
|
+
# Like `typograph`, but process only text nodes in HTML.
|
9
|
+
#
|
10
|
+
# EvilFront::Russian.typograph_html(article.html)
|
11
|
+
def typograph_html(html)
|
12
|
+
return html if html.nil? or html.empty?
|
13
|
+
|
14
|
+
if html.include? '<'
|
15
|
+
nodes = Nokogiri::HTML::DocumentFragment.parse(html)
|
16
|
+
typograph_node! nodes
|
17
|
+
nodes.to_html
|
18
|
+
else
|
19
|
+
typograph_all(html)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Insert non-break spaces and mark quotes to have nice text.
|
24
|
+
#
|
25
|
+
# EvilFront::Russian.typograph(article)
|
26
|
+
def typograph(text)
|
27
|
+
return text if text.nil? or text.empty?
|
28
|
+
|
29
|
+
text.gsub! '"', '"'
|
30
|
+
text = use_right_symbols(text)
|
31
|
+
text.gsub!(/([^\s" ]+)-([^\s" ]+)/, '\1‑\2')
|
32
|
+
tiny_words.each { |regexp| text.gsub! regexp, "\\1\\2 " }
|
33
|
+
|
34
|
+
text
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# Recursively apply typography to Nokogiri nodes
|
40
|
+
def typograph_node!(node)
|
41
|
+
return if %w(pre code kbd script style math).include? node.name
|
42
|
+
|
43
|
+
node.children.each do |child|
|
44
|
+
if child.is_a? Nokogiri::XML::Text
|
45
|
+
text = EvilFront.escape(child.content)
|
46
|
+
child.replace( typograph_all(text) )
|
47
|
+
else
|
48
|
+
typograph_node! child
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/evil-front/version.rb
CHANGED
data/lib/evil-front.rb
CHANGED
@@ -6,7 +6,9 @@ require 'sprockets'
|
|
6
6
|
require 'rails-sass-images'
|
7
7
|
|
8
8
|
module EvilFront
|
9
|
-
autoload :
|
9
|
+
autoload :Typograph, 'evil-front/typograph'
|
10
|
+
autoload :Russian, 'evil-front/russian'
|
11
|
+
autoload :English, 'evil-front/english'
|
10
12
|
|
11
13
|
if defined?(::Rails)
|
12
14
|
# Enable `lib/assets/` and `vendor/assets/` in Rails app.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'spec_helper'
|
4
|
+
|
5
|
+
describe EvilFront::English do
|
6
|
+
|
7
|
+
describe 'typograph' do
|
8
|
+
|
9
|
+
it 'changes quotes' do
|
10
|
+
EvilFront::English.typograph('"a".').should == '“a”.'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'changes dashes' do
|
14
|
+
EvilFront::English.typograph('a - b').should == 'a - b'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'changes ellipsis' do
|
18
|
+
EvilFront::English.typograph('a...').should == 'a…'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'inserts non-break spaces' do
|
22
|
+
EvilFront::English.typograph('he is a hero').should == 'he is a hero'
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/spec/helpers_spec.rb
CHANGED
@@ -47,7 +47,7 @@ describe EvilFront::Helpers do
|
|
47
47
|
|
48
48
|
describe 'russian_typograph' do
|
49
49
|
|
50
|
-
it '
|
50
|
+
it 'typographs text inside tags' do
|
51
51
|
tag = '<a title="а - б">а - б</a>'.html_safe
|
52
52
|
russian_typograph(tag).should == '<a title="а - б">а — б</a>'
|
53
53
|
end
|
@@ -58,6 +58,39 @@ describe EvilFront::Helpers do
|
|
58
58
|
|
59
59
|
end
|
60
60
|
|
61
|
+
describe 'english_typograph' do
|
62
|
+
|
63
|
+
it 'typographs text inside tags' do
|
64
|
+
tag = '<a title="a...">a...</a>'.html_safe
|
65
|
+
english_typograph(tag).should == '<a title="a...">a…</a>'
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'escapes HTML' do
|
69
|
+
english_typograph('<a>').should == '<a>'
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
describe 'typograph_by_locale' do
|
75
|
+
after do
|
76
|
+
I18n.locale = :en
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'typographs by current locale' do
|
80
|
+
I18n.locale = :en
|
81
|
+
typograph_by_locale('"a"').should == '“a”'
|
82
|
+
|
83
|
+
I18n.locale = :ru
|
84
|
+
typograph_by_locale('"a"').should == '<span class="quotes">«a»</span>'
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'returns origin text on unknown locale' do
|
88
|
+
I18n.locale = :fr
|
89
|
+
typograph_by_locale('"a"').should == '"a"'
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
61
94
|
describe 'title' do
|
62
95
|
after do
|
63
96
|
I18n.locale = :en
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evil-front
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey Sitnik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1.4'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubypants-unicode
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rails-sass-images
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,9 +178,11 @@ files:
|
|
164
178
|
- lib/assets/stylesheets/evil-front/styled-taps.sass
|
165
179
|
- lib/assets/stylesheets/evil-front/to-px.sass
|
166
180
|
- lib/evil-front.rb
|
181
|
+
- lib/evil-front/english.rb
|
167
182
|
- lib/evil-front/helpers.rb
|
168
183
|
- lib/evil-front/helpers/capitalize_first.rb
|
169
184
|
- lib/evil-front/helpers/disable_mobile_zoom.rb
|
185
|
+
- lib/evil-front/helpers/english_typograph.rb
|
170
186
|
- lib/evil-front/helpers/flying_quote.rb
|
171
187
|
- lib/evil-front/helpers/head_content.rb
|
172
188
|
- lib/evil-front/helpers/head_tag.rb
|
@@ -176,9 +192,12 @@ files:
|
|
176
192
|
- lib/evil-front/helpers/tel.rb
|
177
193
|
- lib/evil-front/helpers/title.rb
|
178
194
|
- lib/evil-front/helpers/title_tag.rb
|
195
|
+
- lib/evil-front/helpers/typograph_by_locale.rb
|
179
196
|
- lib/evil-front/russian.rb
|
180
197
|
- lib/evil-front/slim.rb
|
198
|
+
- lib/evil-front/typograph.rb
|
181
199
|
- lib/evil-front/version.rb
|
200
|
+
- spec/english_spec.rb
|
182
201
|
- spec/helpers_spec.rb
|
183
202
|
- spec/russian_spec.rb
|
184
203
|
- spec/sass/empty.txt
|