Skip to content

Commit a072e84

Browse files
committed
Merge branch 'main' of github.com:untra/polyglot
2 parents 86de095 + 56adabf commit a072e84

File tree

2 files changed

+114
-8
lines changed

2 files changed

+114
-8
lines changed

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

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -178,22 +178,42 @@ def coordinate_documents(docs)
178178
end
179179

180180
def assignPageRedirects(doc, docs)
181+
# Preserve and normalize user-defined redirect_from
182+
user_redirects = doc.data['redirect_from'] || []
183+
user_redirects = [user_redirects] unless user_redirects.is_a?(Array)
184+
185+
# Determine document language
186+
doc_lang = doc.data['lang'] || derive_lang_from_path(doc) || @default_lang
187+
188+
# Scope user-defined redirects to document's language if non-default
189+
if doc_lang != @default_lang && !user_redirects.empty?
190+
user_redirects = user_redirects.map do |redirect_path|
191+
# Normalize path to start with /
192+
redirect_path = "/#{redirect_path}" unless redirect_path.start_with?('/')
193+
# Only prefix if not already prefixed with this language
194+
if redirect_path.start_with?("/#{doc_lang}/")
195+
redirect_path
196+
else
197+
"/#{doc_lang}#{redirect_path}"
198+
end
199+
end
200+
end
201+
202+
# Compute page_id based redirects (cross-language)
203+
computed_redirects = []
181204
pageId = doc.data['page_id']
182205
if !pageId.nil? && !pageId.empty?
183-
redirects = []
184-
185206
docs_with_same_id = docs.select { |dd| dd.data['page_id'] == pageId }
186-
187-
# For each document with the same page_id
188207
docs_with_same_id.each do |dd|
189-
# Add redirect if it's a different permalink
190208
if dd.data['permalink'] != doc.data['permalink']
191-
redirects << dd.data['permalink']
209+
computed_redirects << dd.data['permalink']
192210
end
193211
end
194-
195-
doc.data['redirect_from'] = redirects
196212
end
213+
214+
# Merge user-defined and computed redirects, removing duplicates
215+
all_redirects = (user_redirects + computed_redirects).uniq
216+
doc.data['redirect_from'] = all_redirects unless all_redirects.empty?
197217
end
198218

199219
def assignPageLanguagePermalinks(doc, docs)

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

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,92 @@
456456
@site.assignPageRedirects(docs[1], docs)
457457
expect(docs[1].data['redirect_from']).to include('/a-really-long/permalink/')
458458
end
459+
460+
# Tests for user-defined redirect_from handling
461+
it 'preserves user-defined redirect_from when page_id is not set' do
462+
doc = Jekyll::Document.new('test.md', site: @site, collection: @collection).tap do |d|
463+
d.data['lang'] = 'en'
464+
d.data['permalink'] = '/new-url/'
465+
d.data['redirect_from'] = ['/old-url/']
466+
end
467+
468+
@site.assignPageRedirects(doc, [doc])
469+
470+
expect(doc.data['redirect_from']).to eq(['/old-url/'])
471+
end
472+
473+
it 'handles string redirect_from value' do
474+
doc = Jekyll::Document.new('test.md', site: @site, collection: @collection).tap do |d|
475+
d.data['lang'] = 'de'
476+
d.data['permalink'] = '/de/new-url/'
477+
d.data['redirect_from'] = '/old-url/' # String, not array
478+
end
479+
480+
@site.assignPageRedirects(doc, [doc])
481+
482+
expect(doc.data['redirect_from']).to be_a(Array)
483+
end
484+
485+
it 'should preserve user-defined redirect_from when page_id is set' do
486+
doc = Jekyll::Document.new('test.md', site: @site, collection: @collection).tap do |d|
487+
d.data['lang'] = 'en'
488+
d.data['page_id'] = 'test-page'
489+
d.data['permalink'] = '/new-url/'
490+
d.data['redirect_from'] = ['/old-url/', '/legacy/']
491+
end
492+
493+
other_doc = Jekyll::Document.new('test.de.md', site: @site, collection: @collection).tap do |d|
494+
d.data['lang'] = 'de'
495+
d.data['page_id'] = 'test-page'
496+
d.data['permalink'] = '/de/neue-url/'
497+
end
498+
499+
@site.assignPageRedirects(doc, [doc, other_doc])
500+
501+
expect(doc.data['redirect_from']).to include('/old-url/')
502+
expect(doc.data['redirect_from']).to include('/legacy/')
503+
expect(doc.data['redirect_from']).to include('/de/neue-url/')
504+
end
505+
506+
it 'should scope user-defined redirect_from to document language for non-default languages' do
507+
doc = Jekyll::Document.new('test.de.md', site: @site, collection: @collection).tap do |d|
508+
d.data['lang'] = 'de'
509+
d.data['permalink'] = '/de/neue-url/'
510+
d.data['redirect_from'] = ['/alte-url/', '/legacy/']
511+
end
512+
513+
@site.assignPageRedirects(doc, [doc])
514+
515+
expect(doc.data['redirect_from']).to include('/de/alte-url/')
516+
expect(doc.data['redirect_from']).to include('/de/legacy/')
517+
expect(doc.data['redirect_from']).not_to include('/alte-url/')
518+
end
519+
520+
it 'should not prefix redirect_from for default language' do
521+
doc = Jekyll::Document.new('test.md', site: @site, collection: @collection).tap do |d|
522+
d.data['lang'] = 'en'
523+
d.data['permalink'] = '/new-url/'
524+
d.data['redirect_from'] = ['/old-url/']
525+
end
526+
527+
@site.assignPageRedirects(doc, [doc])
528+
529+
expect(doc.data['redirect_from']).to eq(['/old-url/'])
530+
end
531+
532+
it 'should not double-prefix redirects that already have language prefix' do
533+
doc = Jekyll::Document.new('test.de.md', site: @site, collection: @collection).tap do |d|
534+
d.data['lang'] = 'de'
535+
d.data['permalink'] = '/de/neue-url/'
536+
d.data['redirect_from'] = ['/de/alte-url/', '/legacy/']
537+
end
538+
539+
@site.assignPageRedirects(doc, [doc])
540+
541+
expect(doc.data['redirect_from']).to include('/de/alte-url/')
542+
expect(doc.data['redirect_from']).to include('/de/legacy/')
543+
expect(doc.data['redirect_from']).not_to include('/de/de/alte-url/')
544+
end
459545
end
460546

461547
it 'parses static_href block and outputs correct HTML' do

0 commit comments

Comments
 (0)