Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
require 'cgi'
module Jekyll
module PermalinkBuilder
extend self
def get_adjusted_permalink(resource, layout)
layout_path = CGI.escape(layout)
url = resource.url
ext = File.extname(url)
if url.include?(':layout')
return url.gsub(/:layout/, layout_path)
end
if ext.empty?
"#{url}/#{layout_path}/"
else
url.gsub(/\/$|#{ext}$/) { |url_end| "/#{layout_path}#{url_end}" }
end
end
end
class PageLayoutsGenerator
def generate(site)
pages = site.pages.map! do |page|
if page.data["layout"].is_a?(Array)
create_layout_views(page)
else
page
end
end
pages.flatten!
end
private
def create_layout_views(page)
page.data["layout"].map do |layout|
dir = File.dirname(page.relative_path)
Page.new(page.site, page.site.source, dir, page.name).tap do |new_page|
new_page.data["layout"] = layout
new_page.data["permalink"] = PermalinkBuilder.get_adjusted_permalink(page, layout)
end
end
end
end
class CollectionLayoutsGenerator
def generate(site)
site.collections.each do |_, collection|
docs = collection.docs.map! do |doc|
if doc.data["layout"].is_a?(Array)
create_layout_views(site, collection, doc)
else
doc
end
end
docs.flatten!
end
end
private
def create_layout_views(site, collection, doc)
doc.data["layout"].map do |layout|
Document.new(doc.path, :site => site, :collection => collection).tap do |new_doc|
new_doc.read
new_doc.data["layout"] = layout
new_doc.data["permalink"] = PermalinkBuilder.get_adjusted_permalink(doc, layout)
end
end
end
end
class MultiPostGenerator < Generator
safe true
def generate(site)
PageLayoutsGenerator.new.generate(site)
CollectionLayoutsGenerator.new.generate(site)
end
end
end