Skip to content

Commit 4847af4

Browse files
authored
Update derive_lang_from_path to derive from any part of path _with tests_ (#227)
* update derive_lang_from_path to better infer a language from given options, adds tests * Update spec/jekyll/polyglot/patches/jekyll/site_spec.rb
1 parent 838a69d commit 4847af4

File tree

2 files changed

+77
-11
lines changed

2 files changed

+77
-11
lines changed

lib/jekyll/polyglot/patches/jekyll/site.rb

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
include Process
44
module Jekyll
55
class Site
6-
attr_reader :default_lang, :languages, :exclude_from_localization, :lang_vars
6+
attr_reader :default_lang, :languages, :exclude_from_localization, :lang_vars, :lang_from_path
77
attr_accessor :file_langs, :active_lang
88

99
def prepare
@@ -108,12 +108,24 @@ def process_active_language
108108
@exclude = old_exclude
109109
end
110110

111+
def split_on_multiple_delimiters(string)
112+
delimiters = ['.', '/']
113+
regex = Regexp.union(delimiters)
114+
string.split(regex)
115+
end
116+
111117
def derive_lang_from_path(doc)
112118
unless @lang_from_path
113119
return nil
114120
end
115121

116-
segments = doc.relative_path.split('/')
122+
segments = split_on_multiple_delimiters(doc.path)
123+
# loop through all segments and check if they match the language regex
124+
segments.each do |segment|
125+
if @languages.include?(segment)
126+
return segment
127+
end
128+
end
117129

118130
# loop through all segments and check if they match the language regex
119131
segments.each do |segment|
@@ -151,8 +163,8 @@ def coordinate_documents(docs)
151163
approved[page_id] = doc
152164
@file_langs[page_id] = lang
153165
end
154-
approved.values.each {|doc| assignPageRedirects(doc, docs) }
155-
approved.values.each {|doc| assignPageLanguagePermalinks(doc, docs) }
166+
approved.values.each { |doc| assignPageRedirects(doc, docs) }
167+
approved.values.each { |doc| assignPageLanguagePermalinks(doc, docs) }
156168
approved.values
157169
end
158170

spec/jekyll/polyglot/patches/jekyll/site_spec.rb

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
@config['default_lang'] = @default_lang
1414
@config['exclude_from_localization'] = @exclude_from_localization
1515
@parallel_localization = @config['parallel_localization'] || true
16-
16+
1717
@site = Site.new(
1818
Jekyll.configuration(
1919
'languages' => @langs,
@@ -46,9 +46,9 @@
4646
expect(@document_url_regex).to_not match 'properties/beachside/foo'
4747
end
4848
it 'expect relativized_urls should handle different output' do
49-
expected = "expected"
50-
collection = Jekyll::Collection.new(@site, "test")
51-
document = Jekyll::Document.new("about.en.md", :site => @site, :collection => collection)
49+
expected = 'expected'
50+
collection_test = Jekyll::Collection.new(@site, 'test')
51+
document = Jekyll::Document.new('about.en.md', site: @site, collection: collection_test)
5252
document.output = expected
5353
@site.relativize_urls(document, @relative_url_regex)
5454
expect(document.output).to eq(expected)
@@ -163,6 +163,54 @@
163163
end
164164
end
165165

166+
describe @derive_lang_from_path do
167+
before(:each) do
168+
config = Jekyll.configuration(
169+
'site' => @site,
170+
'languages' => ['en', 'es', 'pt-br'], # fr not included
171+
'default_lang' => @default_lang,
172+
'exclude_from_localization' => @exclude_from_localization,
173+
'source' => File.expand_path('fixtures', __dir__),
174+
'lang_from_path' => true
175+
)
176+
@site = Site.new(config)
177+
@site.prepare
178+
end
179+
it 'should derive lang from any part of the path' do
180+
collection_en = Jekyll::Collection.new(@site, 'en')
181+
collection_es = Jekyll::Collection.new(@site, 'es')
182+
collection_pt_br = Jekyll::Collection.new(@site, 'pt-br')
183+
collection_wrong = Jekyll::Collection.new(@site, 'wrong')
184+
specs = {
185+
'en' => [
186+
Jekyll::Document.new('about.en.md', site: @site, collection: collection_en),
187+
Jekyll::Document.new('fr/about.en.md', site: @site, collection: collection_en)
188+
],
189+
'es' => [
190+
Jekyll::Document.new('pages/es/acercade.es.md', site: @site, collection: collection_es),
191+
Jekyll::Document.new('french-touch/restaurant/fr/es/acerade.md', site: @site, collection: collection_es)
192+
],
193+
'pt-br' => [
194+
Jekyll::Document.new('about.pt-br.md', site: @site, collection: collection_pt_br),
195+
Jekyll::Document.new('international/restaurant/pt-br/sobre.md', site: @site, collection: collection_pt_br)
196+
],
197+
nil => [
198+
Jekyll::Document.new('apropos.fr.md', site: @site, collection: collection_wrong), # not included in languages
199+
Jekyll::Document.new('missing/pt-BR/sobre.md', site: @site, collection: collection_wrong), # wrong capitalization,
200+
Jekyll::Document.new('taken/blues/newspaper.md', site: @site, collection: collection_wrong), # no matches
201+
Jekyll::Document.new('es-en-pt-br/wordswordswords.html', site: @site, collection: collection_wrong) # wont split
202+
]
203+
}
204+
specs.each do |lang, docs|
205+
docs.each do |document|
206+
expect(@site.lang_from_path).to eq(true)
207+
derived = @site.derive_lang_from_path document
208+
expect(derived).to match lang
209+
end
210+
end
211+
end
212+
end
213+
166214
describe @absolute_url_regex do
167215
it 'must match absolute url' do
168216
@urls.each do |url|
@@ -246,7 +294,7 @@
246294

247295
describe 'site prepare' do
248296
it 'should copy active_lang to additional variables' do
249-
@site.config['lang_vars'] = [ 'locale', 'язык' ]
297+
@site.config['lang_vars'] = ['locale', 'язык']
250298
@site.prepare
251299
@langs.each do |lang|
252300
@site.active_lang = lang
@@ -260,8 +308,14 @@
260308
it 'should spawn no more than Etc.nprocessors processes' do
261309
forks = 0
262310
allow(Etc).to receive(:nprocessors).and_return(2)
263-
allow(@site).to receive(:fork) { forks += 1; fork { sleep 2 } }
264-
thr = Thread.new { sleep 1; forks }
311+
allow(@site).to receive(:fork) {
312+
forks += 1
313+
fork { sleep 2 }
314+
}
315+
thr = Thread.new {
316+
sleep 1
317+
forks
318+
}
265319
@site.process
266320
expect(thr.value).to eq(Etc.nprocessors)
267321
expect(forks).to eq((@langs + [@default_lang]).uniq.length)

0 commit comments

Comments
 (0)