jekyll-microtypo 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0733bfc59f0407baf0ee6d906665534f4f728f801cdd44066c142f04b9826401
4
- data.tar.gz: 1a86bc66d21a156d8e6e14fd0cbac689a1f29365370196921cf36c7816e06b0e
3
+ metadata.gz: a78335b3908581612768fec1c82a5b51c91b49bef33396acc7ad0e84f76abdb0
4
+ data.tar.gz: 4fd09552f71508d0a33226ba8e83352a84c421b96d56e3752a17785ea9e00030
5
5
  SHA512:
6
- metadata.gz: b8b08333813e62fa5a3588c4ac3c1082dc996390fe923c9e63677ac5905c0a367e41ffc7f46bf9406dfeae61f3e21c3378e576434764f4be91c19ca753a7c3c1
7
- data.tar.gz: 698fc177f7a207f7314710fd01713c6854a8ca74c82587d44dc2449e3b2fe9c04c65aea00a7d01710dc4c98d00f09dd0258e1a3da49a40dd60e5234360364a5d
6
+ metadata.gz: ce26fd4d64015b4aebfb5df45f46951711eddaa3aa43a542c3d4db0035a7619a7528c7f4fe54cab32576e5eecfcfaa278ea832f83379a5c27b8b9ae95c75f4d0
7
+ data.tar.gz: 48bf3ae8c6494b944ffab3ebc627fd499fb590bbf61b549820f5e615e35bb112fb9248715e8861b03ffa5317de94ac4e97ac89075684131450d0c6fd2cc6ffbf
data/Gemfile CHANGED
@@ -3,3 +3,5 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
+
7
+ gem "rubocop"
@@ -1,161 +1,145 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jekyll
2
4
  module Microtypo
3
- @@settings = []
4
-
5
- def get_settings
6
- if @@settings.none?
7
- @@settings = Jekyll.configuration({})['microtypo'] || {}
8
- end
9
- @@settings
5
+ QUEUE = [
6
+ ["<!-- nomicrotypo -->", "<!-- endnomicrotypo -->", false],
7
+ ["<pre", "</pre>", true],
8
+ ["<style", "</style>", true],
9
+ ["<script", "</script>", true],
10
+ ["<code", "</code>", true],
11
+ ].freeze
12
+ private_constant :QUEUE
13
+
14
+ def self.settings(config)
15
+ @settings ||= {}
16
+ @settings[config.hash] ||= config["microtypo"] || {}
10
17
  end
11
18
 
12
19
  # Example:
13
20
  # {{ content | microtypo: "fr_FR" }}
14
- def microtypo(input, locale = nil, settings = {})
15
- if settings.none?
16
- settings = get_settings
21
+ def microtypo(input, locale = "en_US")
22
+ bucket = []
23
+
24
+ recursive_parser(input, locale, bucket, QUEUE.length)
25
+
26
+ # Clean empty lines
27
+ bucket.join.tap do |result|
28
+ result.gsub!(%r!\A\s*\n$!, "")
17
29
  end
18
- settings['median'] ||= false
30
+ end
19
31
 
20
- locale ||= 'en_US'.freeze
32
+ private
21
33
 
22
- array_response = []
34
+ def recursive_parser(input, locale, bucket, index)
35
+ input = input.to_s
36
+ return fix_microtypo(+input, locale, bucket) if index.zero?
23
37
 
24
- # <pre></pre> management
25
- # Replace \n in <pre> by <br />\n in order to keep line break visualy
26
- pre_array = input.to_s.split('<pre'.freeze)
27
- pre_array.each do |input_pre|
28
- end_pre_array = input_pre.to_s.split('</pre>'.freeze)
29
- if end_pre_array.size == 2
30
- array_response.push('<pre'.freeze)
31
- array_response.push(end_pre_array.first)
32
- array_response.push('</pre>'.freeze)
33
- end
34
- input_pre = end_pre_array.last
35
-
36
- # <!-- nomicrotypo --><!-- endnomicrotypo --> management
37
- no_fix_comment_array = input_pre.to_s.split('<!-- nomicrotypo -->'.freeze)
38
- no_fix_comment_array.each do |input_fix|
39
- endno_fix_comment_array = input_fix.to_s.split('<!-- endnomicrotypo -->'.freeze)
40
- if endno_fix_comment_array.size == 2
41
- array_response.push(endno_fix_comment_array.first)
42
- end
43
- input_fix = endno_fix_comment_array.last
44
-
45
- # <code></code> management
46
- style_array = input_fix.to_s.split('<style'.freeze)
47
- style_array.each do |input_style|
48
- end_style_array = input_style.to_s.split('</style>'.freeze)
49
- if end_style_array.size == 2
50
- array_response.push('<style'.freeze)
51
- array_response.push(end_style_array.first)
52
- array_response.push('</style>'.freeze)
53
- end
54
- input_style = end_style_array.last
55
-
56
- # <code></code> management
57
- code_array = input_style.to_s.split('<code'.freeze)
58
- code_array.each do |input_code|
59
- end_code_array = input_code.to_s.split('</code>'.freeze)
60
- if end_code_array.size == 2
61
- array_response.push('<code'.freeze)
62
- array_response.push(end_code_array.first)
63
- array_response.push('</code>'.freeze)
64
- end
65
- input_code = end_code_array.last
66
-
67
- # <script></script> management
68
- script_array = input_code.to_s.split('<script'.freeze)
69
- script_array.each do |input|
70
- end_script_array = input.to_s.split('</script>'.freeze)
71
- if end_script_array.size == 2
72
- array_response.push('<script'.freeze)
73
- array_response.push(end_script_array.first)
74
- array_response.push('</script>'.freeze)
75
- end
76
- input = end_script_array.last
77
-
78
- if locale == 'fr_FR'
79
-
80
- # Ordinals
81
- input.gsub!(/(\s)(\d)+(e|è)(r|me)?([\s.,])/, '\1\2<sup>\3\4</sup>\5'.freeze)
82
-
83
- # Num
84
- input.gsub!(/n°\s*(\d)/, 'n<sup>o</sup>&#8239;\1'.freeze)
85
-
86
- # French Guillemets
87
- input.gsub!(/(&rdquo;|”|»)<a /, '«&#8239;<a '.freeze)
88
- input.gsub!(/(&ldquo;|“|«)(?!&#8239;)(\s|&nbsp;| )*/, '«&#8239;'.freeze)
89
- input.gsub!(/(\s|&nbsp;| )*(?!&#8239;)(&rdquo;|”|»)/, '&#8239;»'.freeze)
90
-
91
- # Point median
92
-
93
- if settings['median'] == true
94
- input.gsub!(/(\p{L}+)(·\p{L}+)((·)(\p{L}+))?/, '\1<span aria-hidden="true">\2\4</span>\5'.freeze)
95
- end
96
-
97
- # Special punctuation
98
- input.gsub!(/(\s)+\?\!([^\w]|$)/, '&#8239;&#8264;\2'.freeze)
99
- input.gsub!(/(\s)+\!\?([^\w]|$)/, '&#8239;&#8265;\2'.freeze)
100
- input.gsub!(/(\s)+\!\!\!([^\w]|$)/, '&#8239;&#8252;\2'.freeze)
101
- input.gsub!(/(\s)+\!\!([^\w]|$)/, '&#8239;&#8252;\2'.freeze)
102
-
103
- # Times
104
- input.gsub!(/(\s)+(\d+)(\s)*x(\s)*(?=\d)/, '\1\2&nbsp;&times;&nbsp;\5'.freeze)
105
-
106
- # Non-breaking space before '%' and units (< 4 letters)…
107
- input.gsub!(/(\s)+(\d+)(\s)+([[:alpha:]]|%)/, '\1\2&nbsp;\4\5'.freeze)
108
-
109
- # Thin non-breaking space before ;', '!', '?'
110
- input.gsub!(/ (;|\!|\?)([^\w!]|$)/, '&#8239;\1\2'.freeze)
111
-
112
- # non-breaking space
113
- input.gsub!(' :'.freeze, '&nbsp;:'.freeze)
114
-
115
- # Currencies
116
- input.gsub!(/(\d+)\s*($|€)/, '\1&nbsp;\2'.freeze)
117
-
118
- # nbsp after middle dash (dialogs)
119
- input.gsub!(/(—|&mdash;)(\s)/, '\1&nbsp;'.freeze)
120
-
121
- elsif locale == 'en_US'
122
-
123
- # Remove useless spaces
124
- input.gsub!(/ (:|%|;|\!|\?)([^\w!]|$)/, '\1\2'.freeze)
125
-
126
- # Currencies
127
- input.gsub!(/($|€)\s*(\d+)/, '\1\2'.freeze)
128
-
129
- end
130
-
131
- # single quotes
132
- input.gsub!(/(\s)'([[:alpha:]])/, '\1‘\2'.freeze)
133
- input.gsub!(/([[:alpha:]])'(\s)/, '\1’\2'.freeze)
134
- input.gsub!(/(\d)''/, '\1’’'.freeze)
135
- input.gsub!(/(\d)'/, '\1’'.freeze)
136
-
137
- # Apostrophe
138
- input.gsub!(/([[:alpha:]])'([[:alpha:]])/, '\1’\2'.freeze)
139
-
140
- # Elipsis
141
- input.gsub!('...', '&#8230;'.freeze)
142
-
143
- # Special characters
144
- input.gsub!(/\([c|C]\)/, '©'.freeze)
145
- input.gsub!(/\([p|P]\)/, '℗'.freeze)
146
- input.gsub!(/\([r|R]\)/, '®'.freeze)
147
- input.gsub!(/\((tm|TM)\)/, '™'.freeze)
148
- input.gsub!(/\+-/, '±'.freeze)
149
-
150
- array_response.push input
151
- end
152
- end
38
+ index -= 1
39
+ head, tail, flag = QUEUE[index]
40
+
41
+ unless input.include?(head) && input.include?(tail)
42
+ return recursive_parser(input, locale, bucket, index)
43
+ end
44
+
45
+ input.split(head).each do |item|
46
+ item = item.to_s
47
+
48
+ if item.include?(tail)
49
+ end_items = item.split(tail)
50
+
51
+ if flag
52
+ bucket << head << end_items[0] << tail
53
+ else
54
+ bucket << end_items[0]
153
55
  end
56
+
57
+ item = end_items.last
154
58
  end
59
+
60
+ recursive_parser(item, locale, bucket, index)
155
61
  end
62
+ end
156
63
 
157
- # Clean empty lines
158
- array_response.join.gsub(/\A\s*\n$/, ''.freeze)
64
+ def fix_microtypo_fr(input)
65
+ # Ordinals
66
+ input.gsub!(%r!(\s)(\d)+(e|è)(r|me)?([\s.,])!, '\1\2<sup>\3\4</sup>\5')
67
+
68
+ # Num
69
+ input.gsub!(%r!n°\s*(\d)!, 'n<sup>o</sup>&#8239;\1')
70
+
71
+ # French Guillemets
72
+ input.gsub!(%r!(&rdquo;|”|»)<a !, "«&#8239;<a ")
73
+ input.gsub!(%r/(&ldquo;|“|«)(?!&#8239;)(\s|&nbsp;| )*/, "«&#8239;")
74
+ input.gsub!(%r/(\s|&nbsp;| )*(?!&#8239;)(&rdquo;|”|»)/, "&#8239;»")
75
+
76
+ settings = Microtypo.settings(@context.registers[:site].config)
77
+
78
+ # Point median
79
+ if settings["median"]
80
+ input.gsub!(%r!(\p{L}+)(·\p{L}+)((·)(\p{L}+))?!, '\1<span aria-hidden="true">\2\4</span>\5')
81
+ end
82
+
83
+ # Special punctuation
84
+ input.gsub!(%r!(\s)+\?\!([^\w]|$)!, '&#8239;&#8264;\2')
85
+ input.gsub!(%r!(\s)+\!\?([^\w]|$)!, '&#8239;&#8265;\2')
86
+ input.gsub!(%r!(\s)+\!\!\!([^\w]|$)!, '&#8239;&#8252;\2')
87
+ input.gsub!(%r!(\s)+\!\!([^\w]|$)!, '&#8239;&#8252;\2')
88
+
89
+ # Times
90
+ input.gsub!(%r!(\s)+(\d+)(\s)*x(\s)*(?=\d)!, '\1\2&nbsp;&times;&nbsp;\5')
91
+
92
+ # Non-breaking space before '%' and units (< 4 letters)
93
+ input.gsub!(%r!(\s)+(\d+)(\s)+([[:alpha:]]|%)!, '\1\2&nbsp;\4\5')
94
+
95
+ # Thin non-breaking space before ;', '!', '?'
96
+ input.gsub!(%r/ (;|\!|\?)([^\w!]|$)/, '&#8239;\1\2')
97
+
98
+ # non-breaking space
99
+ input.gsub!(" :", "&nbsp;:")
100
+
101
+ # Currencies
102
+ input.gsub!(%r!(\d+)\s*($|€)!, '\1&nbsp;\2')
103
+
104
+ # nbsp after middle dash (dialogs)
105
+ input.gsub!(%r!(—|&mdash;)(\s)!, '\1&nbsp;')
106
+ end
107
+
108
+ def fix_microtypo_us(input)
109
+ # Remove useless spaces
110
+ input.gsub!(%r/ (:|%|;|\!|\?)([^\w!]|$)/, '\1\2')
111
+
112
+ # Currencies
113
+ input.gsub!(%r!($|€)\s*(\d+)!, '\1\2')
114
+ end
115
+
116
+ def fix_microtypo(input, locale, bucket)
117
+ if locale == "fr_FR"
118
+ fix_microtypo_fr(input)
119
+ elsif locale == "en_US"
120
+ fix_microtypo_us(input)
121
+ end
122
+
123
+ # single quotes
124
+ input.gsub!(%r!(\s)'([[:alpha:]])!, '\1‘\2')
125
+ input.gsub!(%r!([[:alpha:]])'(\s)!, '\1’\2')
126
+ input.gsub!(%r!(\d)''!, '\1’’')
127
+ input.gsub!(%r!(\d)'!, '\1’')
128
+
129
+ # Apostrophe
130
+ input.gsub!(%r!([[:alpha:]])'([[:alpha:]])!, '\1’\2')
131
+
132
+ # Elipsis
133
+ input.gsub!("...", "&#8230;")
134
+
135
+ # Special characters
136
+ input.gsub!(%r!\([cC]\)!, "©")
137
+ input.gsub!(%r!\([pP]\)!, "℗")
138
+ input.gsub!(%r!\([rR]\)!, "®")
139
+ input.gsub!(%r!\((tm|TM)\)!, "™")
140
+ input.gsub!(%r!\+-!, "±")
141
+
142
+ bucket << input
159
143
  end
160
144
  end
161
145
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Microtypo
5
- VERSION = "1.1.0".freeze
5
+ VERSION = "1.2.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-microtypo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boris Schapira
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-19 00:00:00.000000000 Z
11
+ date: 2019-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -118,14 +118,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
118
  requirements:
119
119
  - - ">="
120
120
  - !ruby/object:Gem::Version
121
- version: 2.1.0
121
+ version: 2.4.0
122
122
  required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  requirements:
124
124
  - - ">="
125
125
  - !ruby/object:Gem::Version
126
126
  version: '0'
127
127
  requirements: []
128
- rubygems_version: 3.0.3
128
+ rubygems_version: 3.0.2
129
129
  signing_key:
130
130
  specification_version: 4
131
131
  summary: Jekyll plugin that improves microtypography