jekyll-polyglot 1.6.0 → 1.7.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/README.md +31 -0
- data/lib/jekyll/polyglot/patches/jekyll/site.rb +43 -17
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab5c70c038d85dbe9936e2a3bd021d75f860a01c272c2650eb6f77e8b386d141
|
4
|
+
data.tar.gz: 8d4e4656cbd532277bf708f71fabc3c2b63ee042110862c3aea64ea570434b78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 508f349097b516f5d4d7f5e794e1e367ba1a64035191793b184314da8f3b35708047df73bc469a740a6042571b97d91802149f259e81581d741ff88a44bcd389
|
7
|
+
data.tar.gz: e88b634466df95b6b11c7cc04c8a3b5e1b157bfa1740094e1f2bfae14f1797c1e6d1d40cf80d787a5c8070874f6bf929aa3b86c0607a10811cc09017cd424908
|
data/README.md
CHANGED
@@ -68,6 +68,37 @@ In short:
|
|
68
68
|
* Don't overthink it, :wink:
|
69
69
|
|
70
70
|
|
71
|
+
#### Using different permalinks per language
|
72
|
+
_New in 1.7.0_
|
73
|
+
|
74
|
+
Optionally, for those who may want different URLs on different languages, translations may be identified by specifying a `page_id` in the frontmatter.
|
75
|
+
|
76
|
+
If available, polyglot will use `page_id` to identify the page, and will default to the `permalink` otherwise.
|
77
|
+
|
78
|
+
As an example, you may have an about page located in `/about/` while being in `/acerca-de/` in Spanish just by changing the permalink and specifying a `page_id` that will link the files as translations:
|
79
|
+
```md
|
80
|
+
---
|
81
|
+
title: About
|
82
|
+
permalink: /about
|
83
|
+
lang: en
|
84
|
+
page_id: about
|
85
|
+
---
|
86
|
+
This is us!
|
87
|
+
```
|
88
|
+
|
89
|
+
```md
|
90
|
+
---
|
91
|
+
title: Acerca de
|
92
|
+
permalink: /acerca-de
|
93
|
+
lang: es
|
94
|
+
page_id: about
|
95
|
+
---
|
96
|
+
Estos somos nosotros!
|
97
|
+
```
|
98
|
+
|
99
|
+
Additionally, if you are also using the `jekyll-redirect-from` plugin, pages coordinated this way will automatically have redirects created between pages.
|
100
|
+
So `/es/about` will automatically redirect to `/es/acerca-de` and `/acerca-de` can redirect to `/about`. If you use this approach, be sure to also employ a customized [redirect.html](https://github.com/untra/polyglot/blob/master/site/_layouts/redirect.html).
|
101
|
+
|
71
102
|
#### Fallback Language Support
|
72
103
|
Lets say you are building your website. You have an `/about/` page written in *english*, *german* and
|
73
104
|
*swedish*. You are also supporting a *french* website, but you never designed a *french* version of your `/about/` page!
|
@@ -13,7 +13,7 @@ module Jekyll
|
|
13
13
|
@lang_from_path = config.fetch('lang_from_path', false)
|
14
14
|
@exclude_from_localization = config.fetch('exclude_from_localization', []).map do |e|
|
15
15
|
if File.directory?(e) && e[-1] != '/'
|
16
|
-
e
|
16
|
+
"#{e}/"
|
17
17
|
else
|
18
18
|
e
|
19
19
|
end
|
@@ -28,7 +28,7 @@ module Jekyll
|
|
28
28
|
@lang_vars = config.fetch('lang_vars', [])
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
alias process_orig process
|
32
32
|
def process
|
33
33
|
prepare
|
34
34
|
all_langs = (@languages + [@default_lang]).uniq
|
@@ -50,6 +50,7 @@ module Jekyll
|
|
50
50
|
rescue Interrupt
|
51
51
|
all_langs.each do |lang|
|
52
52
|
next unless pids.key? lang
|
53
|
+
|
53
54
|
puts "Killing #{pids[lang]} : #{lang}"
|
54
55
|
kill('INT', pids[lang])
|
55
56
|
end
|
@@ -61,7 +62,7 @@ module Jekyll
|
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
64
|
-
|
65
|
+
alias site_payload_orig site_payload
|
65
66
|
def site_payload
|
66
67
|
payload = site_payload_orig
|
67
68
|
payload['site']['default_lang'] = default_lang
|
@@ -81,7 +82,8 @@ module Jekyll
|
|
81
82
|
end
|
82
83
|
if @active_lang == @default_lang
|
83
84
|
then process_default_language
|
84
|
-
else
|
85
|
+
else
|
86
|
+
process_active_language
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
@@ -95,7 +97,7 @@ module Jekyll
|
|
95
97
|
old_dest = @dest
|
96
98
|
old_exclude = @exclude
|
97
99
|
@file_langs = {}
|
98
|
-
@dest = @dest
|
100
|
+
@dest = "#{@dest}/#{@active_lang}"
|
99
101
|
@exclude += @exclude_from_localization
|
100
102
|
process_orig
|
101
103
|
@dest = old_dest
|
@@ -103,9 +105,10 @@ module Jekyll
|
|
103
105
|
end
|
104
106
|
|
105
107
|
def derive_lang_from_path(doc)
|
106
|
-
|
108
|
+
unless @lang_from_path
|
107
109
|
return nil
|
108
110
|
end
|
111
|
+
|
109
112
|
segments = doc.relative_path.split('/')
|
110
113
|
if doc.relative_path[0] == '_' \
|
111
114
|
&& segments.length > 2 \
|
@@ -114,9 +117,9 @@ module Jekyll
|
|
114
117
|
elsif segments.length > 1 \
|
115
118
|
&& segments[0] =~ /^[a-z]{2,3}(:?[_-](:?[A-Za-z]{2}){1,2}){0,2}$/
|
116
119
|
return segments[0]
|
117
|
-
else
|
118
|
-
return nil
|
119
120
|
end
|
121
|
+
|
122
|
+
nil
|
120
123
|
end
|
121
124
|
|
122
125
|
# assigns natural permalinks to documents and prioritizes documents with
|
@@ -130,20 +133,39 @@ module Jekyll
|
|
130
133
|
lang = doc.data['lang'] || derive_lang_from_path(doc) || @default_lang
|
131
134
|
lang_exclusive = doc.data['lang-exclusive'] || []
|
132
135
|
url = doc.url.gsub(regex, '/')
|
133
|
-
doc.data['
|
136
|
+
page_id = doc.data['page_id'] || url
|
137
|
+
doc.data['permalink'] = url unless defined?(doc.data['permalink'])
|
138
|
+
|
139
|
+
# skip entirely if nothing to check
|
140
|
+
next if @file_langs.nil?
|
134
141
|
# skip this document if it has already been processed
|
135
|
-
next if @file_langs[
|
142
|
+
next if @file_langs[page_id] == @active_lang
|
136
143
|
# skip this document if it has a fallback and it isn't assigned to the active language
|
137
|
-
next if @file_langs[
|
144
|
+
next if @file_langs[page_id] == @default_lang && lang != @active_lang
|
138
145
|
# skip this document if it has lang-exclusive defined and the active_lang is not included
|
139
146
|
next if !lang_exclusive.empty? && !lang_exclusive.include?(@active_lang)
|
140
147
|
|
141
|
-
approved[
|
142
|
-
@file_langs[
|
148
|
+
approved[page_id] = doc
|
149
|
+
@file_langs[page_id] = lang
|
143
150
|
end
|
151
|
+
approved.values.each {|doc| assignPageRedirects(doc, docs) }
|
144
152
|
approved.values
|
145
153
|
end
|
146
154
|
|
155
|
+
def assignPageRedirects(doc, docs)
|
156
|
+
pageId = doc.data['page_id']
|
157
|
+
if !pageId.nil? && !pageId.empty?
|
158
|
+
lang = doc.data['lang'] || derive_lang_from_path(doc) || @default_lang
|
159
|
+
langPrefix = lang === @default_lang ? '' : "#{lang}/"
|
160
|
+
redirectDocs = docs.select do |dd|
|
161
|
+
doclang = dd.data['lang'] || derive_lang_from_path(dd) || @default_lang
|
162
|
+
dd.data['page_id'] == pageId && doclang != lang && dd.data['permalink'] != doc.data['permalink']
|
163
|
+
end
|
164
|
+
redirects = redirectDocs.map { |dd| dd.data['permalink'] }
|
165
|
+
doc.data['redirect_from'] = redirects
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
147
169
|
# performs any necesarry operations on the documents before rendering them
|
148
170
|
def process_documents(docs)
|
149
171
|
# return if @active_lang == @default_lang
|
@@ -168,11 +190,11 @@ module Jekyll
|
|
168
190
|
# made by jekyll when parsing documents without explicitly set permalinks
|
169
191
|
def document_url_regex
|
170
192
|
regex = ''
|
171
|
-
@languages.each do |lang|
|
193
|
+
(@languages || []).each do |lang|
|
172
194
|
regex += "([\/\.]#{lang}[\/\.])|"
|
173
195
|
end
|
174
196
|
regex.chomp! '|'
|
175
|
-
|
197
|
+
/#{regex}/
|
176
198
|
end
|
177
199
|
|
178
200
|
# a regex that matches relative urls in a html document
|
@@ -190,7 +212,7 @@ module Jekyll
|
|
190
212
|
end
|
191
213
|
end
|
192
214
|
start = disabled ? 'ferh' : 'href'
|
193
|
-
%r{#{start}
|
215
|
+
%r{#{start}="?#{@baseurl}/((?:#{regex}[^,'"\s/?.]+\.?)*(?:/[^\]\[)("'\s]*)?)"}
|
194
216
|
end
|
195
217
|
|
196
218
|
# a regex that matches absolute urls in a html document
|
@@ -208,11 +230,12 @@ module Jekyll
|
|
208
230
|
end
|
209
231
|
end
|
210
232
|
start = disabled ? 'ferh' : 'href'
|
211
|
-
%r{(?<!hreflang="#{@default_lang}" )#{start}
|
233
|
+
%r{(?<!hreflang="#{@default_lang}" )#{start}="?#{url}#{@baseurl}/((?:#{regex}[^,'"\s/?.]+\.?)*(?:/[^\]\[)("'\s]*)?)"}
|
212
234
|
end
|
213
235
|
|
214
236
|
def relativize_urls(doc, regex)
|
215
237
|
return if doc.output.nil?
|
238
|
+
|
216
239
|
modified_output = doc.output.dup
|
217
240
|
modified_output.gsub!(regex, "href=\"#{@baseurl}/#{@active_lang}/" + '\1"')
|
218
241
|
doc.output = modified_output
|
@@ -220,6 +243,7 @@ module Jekyll
|
|
220
243
|
|
221
244
|
def relativize_absolute_urls(doc, regex, url)
|
222
245
|
return if doc.output.nil?
|
246
|
+
|
223
247
|
modified_output = doc.output.dup
|
224
248
|
modified_output.gsub!(regex, "href=\"#{url}#{@baseurl}/#{@active_lang}/" + '\1"')
|
225
249
|
doc.output = modified_output
|
@@ -227,6 +251,7 @@ module Jekyll
|
|
227
251
|
|
228
252
|
def correct_nonrelativized_absolute_urls(doc, regex, url)
|
229
253
|
return if doc.output.nil?
|
254
|
+
|
230
255
|
modified_output = doc.output.dup
|
231
256
|
modified_output.gsub!(regex, "href=\"#{url}#{@baseurl}/" + '\1"')
|
232
257
|
doc.output = modified_output
|
@@ -234,6 +259,7 @@ module Jekyll
|
|
234
259
|
|
235
260
|
def correct_nonrelativized_urls(doc, regex)
|
236
261
|
return if doc.output.nil?
|
262
|
+
|
237
263
|
modified_output = doc.output.dup
|
238
264
|
modified_output.gsub!(regex, "href=\"#{@baseurl}/" + '\1"')
|
239
265
|
doc.output = modified_output
|
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.7.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: 2023-
|
11
|
+
date: 2023-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|