jekyll-microtypo 1.1.0 → 1.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 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