jekyll-polyglot 1.3.3 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -10
- data/lib/jekyll/polyglot/hooks.rb +0 -1
- data/lib/jekyll/polyglot/liquid.rb +2 -1
- data/lib/jekyll/polyglot/liquid/tags/{i18n-headers.rb → i18n_headers.rb} +2 -0
- data/lib/jekyll/polyglot/liquid/tags/static_href.rb +27 -0
- data/lib/jekyll/polyglot/patches/jekyll/site.rb +58 -26
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37bbf459ea94dd1edd9fbef3aeb136db17a68b78b58a1b983d8bbc2cbe24727b
|
4
|
+
data.tar.gz: 5148941f48e63247596579130b8dbd8c407be7e326a2cc59b98725291d9f564d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 303584c6688bf73fb8fc15a8c6bb160b0ae2b055744bdac4a3515455343a20dfbccff2d5713e74f2dca6235f0ed40e0b5d9a7f230a9a57f4b007ae2b0bd5fc8b
|
7
|
+
data.tar.gz: de6caa20d33315f63c8f7f6da8800e83aa2f77548a8d21ed8bf4e8c7529d16ee96813eaef4d46fc9885867c03ae3b48e9681af041fda8c21e645ed8fbf560aaa
|
data/README.md
CHANGED
@@ -94,8 +94,7 @@ becomes
|
|
94
94
|
```
|
95
95
|
Notice the link `<a href="/fr/menu/">...` directs to the french website.
|
96
96
|
|
97
|
-
Even if you are falling back to `default_lang` page, relative links built on the *french* site will
|
98
|
-
still link to *french* pages.
|
97
|
+
Even if you are falling back to `default_lang` page, relative links built on the *french* site will still link to *french* pages.
|
99
98
|
|
100
99
|
#### Relativized Absolute Urls
|
101
100
|
If you defined a site `url` in your `_config.yaml`, polyglot will automatically relativize absolute links pointing to your website directory:
|
@@ -112,7 +111,17 @@ becomes
|
|
112
111
|
```
|
113
112
|
|
114
113
|
#### Disabling Url Relativizing
|
115
|
-
|
114
|
+
_New in 1.4.0_
|
115
|
+
If you dont want a href attribute to be relativized (such as for making [a language switcher](https://github.com/untra/polyglot/blob/master/site/_includes/sidebar.html#L40)), you can use the `{% static_href %}href="..."{% endstatic_href %}` block tag.
|
116
|
+
|
117
|
+
```html
|
118
|
+
<a {% static_href %}href="/about"{% endstatic_href %}>click this static link</a>
|
119
|
+
```
|
120
|
+
|
121
|
+
that will generate `<a href="/about">click this static link</a>` which is what you would normally use to create a url unmangled by invisible language relativization.
|
122
|
+
|
123
|
+
_Previous (no longer) Recommendation:_
|
124
|
+
If you don't want aa url to be relativized, you can add a space explicitly into the href to prevent a url from being relativized by polyglot.
|
116
125
|
|
117
126
|
For example, the following urls will be relativized:
|
118
127
|
|
@@ -128,7 +137,20 @@ href=" http://mywebsite.com/about"
|
|
128
137
|
href=" /about"
|
129
138
|
```
|
130
139
|
|
131
|
-
combine with a [html minifier](https://github.com/digitalsparky/jekyll-minifier) for a polished and production ready website.
|
140
|
+
combine with a [html minifier](https://github.com/digitalsparky/jekyll-minifier) for a polished and production ready website. -->
|
141
|
+
|
142
|
+
#### Exclusive site language generation
|
143
|
+
_New in 1.4.0_
|
144
|
+
|
145
|
+
If you want to control which languages a document can be generated for, you can specify `lang-exclusive: [ ]` frontmatter.
|
146
|
+
If you include this frontmatter in your post, it will only generate for the specified site languages.
|
147
|
+
|
148
|
+
For Example, the following frontmatter will only generate in the `en` and `fr` site language builds:
|
149
|
+
```
|
150
|
+
---
|
151
|
+
lang-exclusive: ['en', 'fr']
|
152
|
+
---
|
153
|
+
```
|
132
154
|
|
133
155
|
#### Localized site.data
|
134
156
|
|
@@ -149,6 +171,7 @@ This plugin stands out from other I18n Jekyll plugins.
|
|
149
171
|
- provides the liquid tag `{{ site.default_lang }}` to get the default_lang I18n string.
|
150
172
|
- provides the liquid tag `{{ site.active_lang }}` to get the I18n language string the website was built for. Alternative names for `active_lang` can be configured via `config.lang_vars`.
|
151
173
|
- provides the liquid tag `{{ I18n_Headers https://yourwebsite.com/ }}` to append SEO bonuses to your website.
|
174
|
+
- provides the liquid tag `{{ Unrelativized_Link href="/hello" }}` to make urls that do not get influenced by url correction regexs.
|
152
175
|
- provides `site.data` localization for efficient rich text replacement.
|
153
176
|
- a creator that will answer all of your questions and issues.
|
154
177
|
|
@@ -157,21 +180,36 @@ Jekyll-polyglot has a few spectacular [Search Engine Optimization techniques](ht
|
|
157
180
|
|
158
181
|
### Other Websites Built with Polyglot
|
159
182
|
let us know if you make a multilingual blog you want to share:
|
160
|
-
* [Polyglot project website](
|
161
|
-
* [LogRhythm Corporate Website](
|
183
|
+
* [Polyglot project website](https://polyglot.untra.io)
|
184
|
+
* [LogRhythm Corporate Website](https://logrhythm.com)
|
162
185
|
* [All Over Earth](https://allover.earth/)
|
163
186
|
* [Hanare Cafe in Toshijima, Japan](https://hanarecafe.com)
|
164
187
|
* [F-Droid](https://f-droid.org)
|
188
|
+
* [Ubuntu MATE](https://ubuntu-mate.org)
|
165
189
|
|
166
190
|
## Compatibility
|
167
|
-
Currently supports Jekyll 3.0 , and Jekyll 4.0
|
191
|
+
Currently supports Jekyll 3.0 , and Jekyll 4.0
|
168
192
|
|
169
|
-
*
|
170
|
-
* In Jekyll 4.0 , SCSS source maps will generate improperly due to how Polyglot operates. The workaround is to disable the CSS sourcemaps. Adding
|
193
|
+
* Windows users will need to disable parallel_localization on their machines by setting `parallel_localization: false` in the `_config.yml`
|
194
|
+
* In Jekyll 4.0 , SCSS source maps will generate improperly due to how Polyglot operates. The workaround is to disable the CSS sourcemaps. Adding the following to your `config.yml` will disable sourcemap generation:
|
171
195
|
```yaml
|
172
196
|
sass:
|
173
197
|
sourcemap: never
|
174
198
|
```
|
175
199
|
|
200
|
+
## Contributions
|
201
|
+
Please! I need all the support I can get! 🙏
|
202
|
+
But for real I would appreciate any contributions and support. This started as an open-source side-project and has gotten bigger than I'd ever imagine!
|
203
|
+
If you have something you'd like to contribute to jekyll-polyglot, please open a PR!
|
204
|
+
|
205
|
+
## Roadmap
|
206
|
+
[ ] - **site language**: portuguese `pt_BR` `pt_PT`
|
207
|
+
[ ] - **site language**: arabic `ar`
|
208
|
+
[ ] - **site language**: japanese `ja`
|
209
|
+
[ ] - **site language**: russian `ru`
|
210
|
+
[ ] - **site language**: korean `ko`
|
211
|
+
[ ] - **site language**: hebrew `he`
|
212
|
+
[ ] - get whitelisted as an official github-pages jekyll plugin
|
213
|
+
|
176
214
|
## Copyright
|
177
|
-
Copyright (c) Samuel Volin
|
215
|
+
Copyright (c) Samuel Volin 2021. License: MIT
|
@@ -18,6 +18,7 @@ module Jekyll
|
|
18
18
|
"href=\" #{site_url}#{permalink}\"/>\n"
|
19
19
|
site.languages.each do |lang|
|
20
20
|
next if lang == site.default_lang
|
21
|
+
|
21
22
|
i18n += "<link rel=\"alternate\" hreflang=\"#{lang}\" "\
|
22
23
|
"href=\"#{site_url}/#{lang}#{permalink}\"/>\n"
|
23
24
|
end
|
@@ -29,3 +30,4 @@ module Jekyll
|
|
29
30
|
end
|
30
31
|
|
31
32
|
Liquid::Template.register_tag('I18n_Headers', Jekyll::Polyglot::Liquid::I18nHeadersTag)
|
33
|
+
Liquid::Template.register_tag('i18n_headers', Jekyll::Polyglot::Liquid::I18nHeadersTag)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module Polyglot
|
3
|
+
module Liquid
|
4
|
+
class StaticHrefTag < :: Liquid::Block
|
5
|
+
def initialize(tag_name, params, tokens)
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
def render(context)
|
10
|
+
text = super
|
11
|
+
href_attrs = text.strip.split '='
|
12
|
+
valid = (href_attrs.length == 2 && href_attrs[0] == 'href') && href_attrs[1].start_with?('"') && href_attrs[1].end_with?('"')
|
13
|
+
unless valid
|
14
|
+
raise Liquid::SyntaxError, "static_href parameters must include match href=\"...\" attribute param, eg. href=\"http://example.com\, href=\"/about\", href=\"/\" , instead got:\n#{text}"
|
15
|
+
end
|
16
|
+
|
17
|
+
href_value = href_attrs[1]
|
18
|
+
# href writes out as ferh="..." explicitly wrong, to be cauaght by seperate processor for nonrelativized links
|
19
|
+
"ferh=#{href_value}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Liquid::Template.register_tag('Static_Href', Jekyll::Polyglot::Liquid::StaticHrefTag)
|
27
|
+
Liquid::Template.register_tag('static_href', Jekyll::Polyglot::Liquid::StaticHrefTag)
|
@@ -10,18 +10,17 @@ module Jekyll
|
|
10
10
|
@parallel_localization = config.fetch('parallel_localization', true)
|
11
11
|
@lang_from_path = config.fetch('lang_from_path', false)
|
12
12
|
@exclude_from_localization = config.fetch('exclude_from_localization', []).map do |e|
|
13
|
-
if File.directory?(e)
|
13
|
+
if File.directory?(e) && e[-1] != '/'
|
14
14
|
e + '/'
|
15
15
|
else
|
16
16
|
e
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
20
19
|
end
|
21
20
|
|
22
21
|
def fetch_languages
|
23
22
|
@default_lang = config.fetch('default_lang', 'en')
|
24
|
-
@languages = config.fetch('languages', ['en'])
|
23
|
+
@languages = config.fetch('languages', ['en']).uniq
|
25
24
|
@keep_files += (@languages - [@default_lang])
|
26
25
|
@active_lang = @default_lang
|
27
26
|
@lang_vars = config.fetch('lang_vars', [])
|
@@ -102,11 +101,11 @@ module Jekyll
|
|
102
101
|
end
|
103
102
|
segments = doc.relative_path.split('/')
|
104
103
|
if doc.relative_path[0] == '_' \
|
105
|
-
|
106
|
-
|
104
|
+
&& segments.length > 2 \
|
105
|
+
&& segments[1] =~ /^[a-z]{2,3}(:?[_-](:?[A-Za-z]{2}){1,2}){0,2}$/
|
107
106
|
return segments[1]
|
108
107
|
elsif segments.length > 1 \
|
109
|
-
|
108
|
+
&& segments[0] =~ /^[a-z]{2,3}(:?[_-](:?[A-Za-z]{2}){1,2}){0,2}$/
|
110
109
|
return segments[0]
|
111
110
|
else
|
112
111
|
return nil
|
@@ -122,10 +121,16 @@ module Jekyll
|
|
122
121
|
approved = {}
|
123
122
|
docs.each do |doc|
|
124
123
|
lang = doc.data['lang'] || derive_lang_from_path(doc) || @default_lang
|
124
|
+
lang_exclusive = doc.data['lang-exclusive'] || []
|
125
125
|
url = doc.url.gsub(regex, '/')
|
126
126
|
doc.data['permalink'] = url
|
127
|
+
# skip this document if it has already been processed
|
127
128
|
next if @file_langs[url] == @active_lang
|
129
|
+
# skip this document if it has a fallback and it isn't assigned to the active language
|
128
130
|
next if @file_langs[url] == @default_lang && lang != @active_lang
|
131
|
+
# skip this document if it has lang-exclusive defined and the active_lang is not included
|
132
|
+
next if !lang_exclusive.empty? && !lang_exclusive.include?(@active_lang)
|
133
|
+
|
129
134
|
approved[url] = doc
|
130
135
|
@file_langs[url] = lang
|
131
136
|
end
|
@@ -134,14 +139,19 @@ module Jekyll
|
|
134
139
|
|
135
140
|
# performs any necesarry operations on the documents before rendering them
|
136
141
|
def process_documents(docs)
|
137
|
-
return if @active_lang == @default_lang
|
142
|
+
# return if @active_lang == @default_lang
|
143
|
+
|
138
144
|
url = config.fetch('url', false)
|
139
|
-
rel_regex = relative_url_regex
|
140
|
-
abs_regex = absolute_url_regex(url)
|
145
|
+
rel_regex = relative_url_regex(false)
|
146
|
+
abs_regex = absolute_url_regex(url, false)
|
147
|
+
non_rel_regex = relative_url_regex(true)
|
148
|
+
non_abs_regex = absolute_url_regex(url, true)
|
141
149
|
docs.each do |doc|
|
142
|
-
relativize_urls(doc, rel_regex)
|
150
|
+
unless @active_lang == @default_lang then relativize_urls(doc, rel_regex) end
|
151
|
+
correct_nonrelativized_urls(doc, non_rel_regex)
|
143
152
|
if url
|
144
|
-
|
153
|
+
unless @active_lang == @default_lang then relativize_absolute_urls(doc, abs_regex, url) end
|
154
|
+
correct_nonrelativized_absolute_urls(doc, non_abs_regex, url)
|
145
155
|
end
|
146
156
|
end
|
147
157
|
end
|
@@ -159,29 +169,39 @@ module Jekyll
|
|
159
169
|
end
|
160
170
|
|
161
171
|
# a regex that matches relative urls in a html document
|
162
|
-
# matches href="baseurl/foo/bar-baz" and others like it
|
172
|
+
# matches href="baseurl/foo/bar-baz" href="/foo/bar-baz" and others like it
|
163
173
|
# avoids matching excluded files. prepare makes sure
|
164
174
|
# that all @exclude dirs have a trailing slash.
|
165
|
-
def relative_url_regex
|
175
|
+
def relative_url_regex(disabled = false)
|
166
176
|
regex = ''
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
177
|
+
unless disabled
|
178
|
+
@exclude.each do |x|
|
179
|
+
regex += "(?!#{x})"
|
180
|
+
end
|
181
|
+
@languages.each do |x|
|
182
|
+
regex += "(?!#{x}\/)"
|
183
|
+
end
|
172
184
|
end
|
173
|
-
|
185
|
+
start = disabled ? 'ferh' : 'href'
|
186
|
+
%r{#{start}=\"?#{@baseurl}\/((?:#{regex}[^,'\"\s\/?\.#]+\.?)*(?:\/[^\]\[\)\(\"\'\s]*)?)\"}
|
174
187
|
end
|
175
188
|
|
176
|
-
|
189
|
+
# a regex that matches absolute urls in a html document
|
190
|
+
# matches href="http://baseurl/foo/bar-baz" and others like it
|
191
|
+
# avoids matching excluded files. prepare makes sure
|
192
|
+
# that all @exclude dirs have a trailing slash.
|
193
|
+
def absolute_url_regex(url, disabled = false)
|
177
194
|
regex = ''
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
195
|
+
unless disabled
|
196
|
+
@exclude.each do |x|
|
197
|
+
regex += "(?!#{x})"
|
198
|
+
end
|
199
|
+
@languages.each do |x|
|
200
|
+
regex += "(?!#{x}\/)"
|
201
|
+
end
|
183
202
|
end
|
184
|
-
|
203
|
+
start = disabled ? 'ferh' : 'href'
|
204
|
+
%r{#{start}=\"?#{url}#{@baseurl}\/((?:#{regex}[^,'\"\s\/?\.#]+\.?)*(?:\/[^\]\[\)\(\"\'\s]*)?)\"}
|
185
205
|
end
|
186
206
|
|
187
207
|
def relativize_urls(doc, regex)
|
@@ -195,5 +215,17 @@ module Jekyll
|
|
195
215
|
|
196
216
|
doc.output.gsub!(regex, "href=\"#{url}#{@baseurl}/#{@active_lang}/" + '\1"')
|
197
217
|
end
|
218
|
+
|
219
|
+
def correct_nonrelativized_absolute_urls(doc, regex, url)
|
220
|
+
return if doc.output.nil?
|
221
|
+
|
222
|
+
doc.output.gsub!(regex, "href=\"#{url}#{@baseurl}/" + '\1"')
|
223
|
+
end
|
224
|
+
|
225
|
+
def correct_nonrelativized_urls(doc, regex)
|
226
|
+
return if doc.output.nil?
|
227
|
+
|
228
|
+
doc.output.gsub!(regex, "href=\"#{@baseurl}/" + '\1"')
|
229
|
+
end
|
198
230
|
end
|
199
231
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-polyglot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Volin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -39,12 +39,13 @@ files:
|
|
39
39
|
- lib/jekyll/polyglot/hooks/coordinate.rb
|
40
40
|
- lib/jekyll/polyglot/hooks/process.rb
|
41
41
|
- lib/jekyll/polyglot/liquid.rb
|
42
|
-
- lib/jekyll/polyglot/liquid/tags/
|
42
|
+
- lib/jekyll/polyglot/liquid/tags/i18n_headers.rb
|
43
|
+
- lib/jekyll/polyglot/liquid/tags/static_href.rb
|
43
44
|
- lib/jekyll/polyglot/patches.rb
|
44
45
|
- lib/jekyll/polyglot/patches/jekyll/site.rb
|
45
46
|
- lib/jekyll/polyglot/patches/jekyll/static_file.rb
|
46
47
|
- lib/jekyll/polyglot/version.rb
|
47
|
-
homepage:
|
48
|
+
homepage: https://polyglot.untra.io/
|
48
49
|
licenses:
|
49
50
|
- MIT
|
50
51
|
metadata: {}
|
@@ -56,14 +57,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
56
57
|
requirements:
|
57
58
|
- - ">="
|
58
59
|
- !ruby/object:Gem::Version
|
59
|
-
version:
|
60
|
+
version: 2.4.0
|
60
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
62
|
requirements:
|
62
63
|
- - ">="
|
63
64
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
65
|
+
version: 2.7.0
|
65
66
|
requirements: []
|
66
|
-
rubygems_version: 3.
|
67
|
+
rubygems_version: 3.2.7
|
67
68
|
signing_key:
|
68
69
|
specification_version: 4
|
69
70
|
summary: I18n plugin for Jekyll Blogs
|