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 +4 -4
- data/Gemfile +2 -0
- data/lib/jekyll/microtypo.rb +128 -144
- data/lib/jekyll/microtypo/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a78335b3908581612768fec1c82a5b51c91b49bef33396acc7ad0e84f76abdb0
|
4
|
+
data.tar.gz: 4fd09552f71508d0a33226ba8e83352a84c421b96d56e3752a17785ea9e00030
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce26fd4d64015b4aebfb5df45f46951711eddaa3aa43a542c3d4db0035a7619a7528c7f4fe54cab32576e5eecfcfaa278ea832f83379a5c27b8b9ae95c75f4d0
|
7
|
+
data.tar.gz: 48bf3ae8c6494b944ffab3ebc627fd499fb590bbf61b549820f5e615e35bb112fb9248715e8861b03ffa5317de94ac4e97ac89075684131450d0c6fd2cc6ffbf
|
data/Gemfile
CHANGED
data/lib/jekyll/microtypo.rb
CHANGED
@@ -1,161 +1,145 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jekyll
|
2
4
|
module Microtypo
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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 =
|
15
|
-
|
16
|
-
|
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
|
-
|
30
|
+
end
|
19
31
|
|
20
|
-
|
32
|
+
private
|
21
33
|
|
22
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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> \1'.freeze)
|
85
|
-
|
86
|
-
# French Guillemets
|
87
|
-
input.gsub!(/(”|”|»)<a /, '« <a '.freeze)
|
88
|
-
input.gsub!(/(“|“|«)(?! )(\s| | )*/, '« '.freeze)
|
89
|
-
input.gsub!(/(\s| | )*(?! )(”|”|»)/, ' »'.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]|$)/, ' ⁈\2'.freeze)
|
99
|
-
input.gsub!(/(\s)+\!\?([^\w]|$)/, ' ⁉\2'.freeze)
|
100
|
-
input.gsub!(/(\s)+\!\!\!([^\w]|$)/, ' ‼\2'.freeze)
|
101
|
-
input.gsub!(/(\s)+\!\!([^\w]|$)/, ' ‼\2'.freeze)
|
102
|
-
|
103
|
-
# Times
|
104
|
-
input.gsub!(/(\s)+(\d+)(\s)*x(\s)*(?=\d)/, '\1\2 × \5'.freeze)
|
105
|
-
|
106
|
-
# Non-breaking space before '%' and units (< 4 letters)…
|
107
|
-
input.gsub!(/(\s)+(\d+)(\s)+([[:alpha:]]|%)/, '\1\2 \4\5'.freeze)
|
108
|
-
|
109
|
-
# Thin non-breaking space before ;', '!', '?'
|
110
|
-
input.gsub!(/ (;|\!|\?)([^\w!]|$)/, ' \1\2'.freeze)
|
111
|
-
|
112
|
-
# non-breaking space
|
113
|
-
input.gsub!(' :'.freeze, ' :'.freeze)
|
114
|
-
|
115
|
-
# Currencies
|
116
|
-
input.gsub!(/(\d+)\s*($|€)/, '\1 \2'.freeze)
|
117
|
-
|
118
|
-
# nbsp after middle dash (dialogs)
|
119
|
-
input.gsub!(/(—|—)(\s)/, '\1 '.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!('...', '…'.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
|
-
|
158
|
-
|
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> \1')
|
70
|
+
|
71
|
+
# French Guillemets
|
72
|
+
input.gsub!(%r!(”|”|»)<a !, "« <a ")
|
73
|
+
input.gsub!(%r/(“|“|«)(?! )(\s| | )*/, "« ")
|
74
|
+
input.gsub!(%r/(\s| | )*(?! )(”|”|»)/, " »")
|
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]|$)!, ' ⁈\2')
|
85
|
+
input.gsub!(%r!(\s)+\!\?([^\w]|$)!, ' ⁉\2')
|
86
|
+
input.gsub!(%r!(\s)+\!\!\!([^\w]|$)!, ' ‼\2')
|
87
|
+
input.gsub!(%r!(\s)+\!\!([^\w]|$)!, ' ‼\2')
|
88
|
+
|
89
|
+
# Times
|
90
|
+
input.gsub!(%r!(\s)+(\d+)(\s)*x(\s)*(?=\d)!, '\1\2 × \5')
|
91
|
+
|
92
|
+
# Non-breaking space before '%' and units (< 4 letters)
|
93
|
+
input.gsub!(%r!(\s)+(\d+)(\s)+([[:alpha:]]|%)!, '\1\2 \4\5')
|
94
|
+
|
95
|
+
# Thin non-breaking space before ;', '!', '?'
|
96
|
+
input.gsub!(%r/ (;|\!|\?)([^\w!]|$)/, ' \1\2')
|
97
|
+
|
98
|
+
# non-breaking space
|
99
|
+
input.gsub!(" :", " :")
|
100
|
+
|
101
|
+
# Currencies
|
102
|
+
input.gsub!(%r!(\d+)\s*($|€)!, '\1 \2')
|
103
|
+
|
104
|
+
# nbsp after middle dash (dialogs)
|
105
|
+
input.gsub!(%r!(—|—)(\s)!, '\1 ')
|
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!("...", "…")
|
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
|
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.
|
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-
|
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.
|
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.
|
128
|
+
rubygems_version: 3.0.2
|
129
129
|
signing_key:
|
130
130
|
specification_version: 4
|
131
131
|
summary: Jekyll plugin that improves microtypography
|