kontent-jekyll 0.11.1 → 0.11.2
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/.gitignore +53 -53
- data/.rspec +1 -1
- data/.travis.yml +20 -0
- data/Gemfile +4 -4
- data/Gemfile.lock +143 -133
- data/LICENSE +21 -21
- data/README.md +41 -41
- data/Rakefile +6 -6
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/kontent-jekyll.gemspec +72 -72
- data/lib/kontent-jekyll.rb +14 -14
- data/lib/kontent-jekyll/constants/item_element_type.rb +17 -17
- data/lib/kontent-jekyll/constants/kentico_config_keys.rb +10 -10
- data/lib/kontent-jekyll/constants/page_type.rb +14 -14
- data/lib/kontent-jekyll/gem_name.rb +5 -5
- data/lib/kontent-jekyll/generator.rb +105 -105
- data/lib/kontent-jekyll/resolvers/content_link_resolver.rb +14 -14
- data/lib/kontent-jekyll/resolvers/content_resolver.rb +47 -47
- data/lib/kontent-jekyll/resolvers/data_resolver.rb +46 -46
- data/lib/kontent-jekyll/resolvers/filename_resolver.rb +52 -52
- data/lib/kontent-jekyll/resolvers/front_matter_resolver.rb +163 -163
- data/lib/kontent-jekyll/resolvers/inline_content_item_resolver.rb +15 -15
- data/lib/kontent-jekyll/site_processing/custom_site_processor.rb +12 -12
- data/lib/kontent-jekyll/site_processing/kentico_kontent_importer.rb +88 -88
- data/lib/kontent-jekyll/site_processing/site_processor.rb +248 -248
- data/lib/kontent-jekyll/utils/normalize_object.rb +87 -87
- data/lib/kontent-jekyll/version.rb +5 -5
- metadata +3 -2
@@ -1,15 +1,15 @@
|
|
1
|
-
module Kentico
|
2
|
-
module Kontent
|
3
|
-
module Resolvers
|
4
|
-
##
|
5
|
-
# This class instantiate the resolver based on the name from configuration.
|
6
|
-
|
7
|
-
class InlineContentItemResolver
|
8
|
-
def self.for(config)
|
9
|
-
class_name = config.inline_content_item_resolver
|
10
|
-
class_name && Module.const_get(class_name).new
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
1
|
+
module Kentico
|
2
|
+
module Kontent
|
3
|
+
module Resolvers
|
4
|
+
##
|
5
|
+
# This class instantiate the resolver based on the name from configuration.
|
6
|
+
|
7
|
+
class InlineContentItemResolver
|
8
|
+
def self.for(config)
|
9
|
+
class_name = config.inline_content_item_resolver
|
10
|
+
class_name && Module.const_get(class_name).new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
|
-
module Kentico
|
2
|
-
module Kontent
|
3
|
-
module SiteProcessing
|
4
|
-
class CustomSiteProcessor
|
5
|
-
def self.for(config)
|
6
|
-
class_name = config.custom_site_processor
|
7
|
-
class_name && Module.const_get(class_name).new
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
1
|
+
module Kentico
|
2
|
+
module Kontent
|
3
|
+
module SiteProcessing
|
4
|
+
class CustomSiteProcessor
|
5
|
+
def self.for(config)
|
6
|
+
class_name = config.custom_site_processor
|
7
|
+
class_name && Module.const_get(class_name).new
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,88 +1,88 @@
|
|
1
|
-
require 'kontent-delivery-sdk-ruby'
|
2
|
-
|
3
|
-
require 'kontent-jekyll/resolvers/content_link_resolver'
|
4
|
-
require 'kontent-jekyll/resolvers/inline_content_item_resolver'
|
5
|
-
|
6
|
-
require 'kontent-jekyll/constants/kentico_config_keys'
|
7
|
-
|
8
|
-
require 'kontent-jekyll/version'
|
9
|
-
require 'kontent-jekyll/gem_name'
|
10
|
-
|
11
|
-
module Kentico
|
12
|
-
module Kontent
|
13
|
-
module SiteProcessing
|
14
|
-
include Constants
|
15
|
-
include Resolvers
|
16
|
-
|
17
|
-
class KenticoKontentImporter
|
18
|
-
def initialize(config)
|
19
|
-
@config = config
|
20
|
-
@items = []
|
21
|
-
@taxonomy_groups = []
|
22
|
-
end
|
23
|
-
|
24
|
-
def items_by_type(language)
|
25
|
-
retrieve_items(language)
|
26
|
-
.group_by { |item| item.system.type }
|
27
|
-
end
|
28
|
-
|
29
|
-
def taxonomies
|
30
|
-
@taxonomy_groups = retrieve_taxonomies
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def inline_content_item_resolver
|
36
|
-
@inline_content_item_resolver ||= Resolvers::InlineContentItemResolver.for(@config)
|
37
|
-
end
|
38
|
-
|
39
|
-
def content_link_url_resolver
|
40
|
-
@content_link_url_resolver ||= Resolvers::ContentLinkResolver.for(@config)
|
41
|
-
end
|
42
|
-
|
43
|
-
def delivery_client
|
44
|
-
project_id = value_for(@config, Constants::KenticoConfigKeys::PROJECT_ID)
|
45
|
-
secure_key = value_for(@config, Constants::KenticoConfigKeys::SECURE_KEY)
|
46
|
-
|
47
|
-
Kentico::Kontent::Delivery::DeliveryClient.new(
|
48
|
-
project_id: project_id,
|
49
|
-
secure_key: secure_key,
|
50
|
-
content_link_url_resolver: content_link_url_resolver,
|
51
|
-
inline_content_item_resolver: inline_content_item_resolver
|
52
|
-
)
|
53
|
-
end
|
54
|
-
|
55
|
-
def retrieve_taxonomies
|
56
|
-
delivery_client
|
57
|
-
.taxonomies
|
58
|
-
.custom_headers(custom_headers)
|
59
|
-
.request_latest_content
|
60
|
-
.execute { |response| return response.taxonomies }
|
61
|
-
end
|
62
|
-
|
63
|
-
def retrieve_items(language)
|
64
|
-
client = delivery_client.items
|
65
|
-
client = client.language(language) if language
|
66
|
-
client
|
67
|
-
.custom_headers(custom_headers)
|
68
|
-
.request_latest_content
|
69
|
-
.depth(@config.max_linked_items_depth || 1)
|
70
|
-
.execute { |response| return response.items }
|
71
|
-
end
|
72
|
-
|
73
|
-
def value_for(config, key)
|
74
|
-
potential_value = config[key]
|
75
|
-
return ENV[potential_value.gsub('ENV_', '')] if !potential_value.nil? && potential_value.start_with?('ENV_')
|
76
|
-
potential_value
|
77
|
-
end
|
78
|
-
|
79
|
-
# Add extra headers like tracking
|
80
|
-
def custom_headers
|
81
|
-
{
|
82
|
-
'X-KC-SOURCE' => "#{GEM_NAME};#{VERSION}",
|
83
|
-
}
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
1
|
+
require 'kontent-delivery-sdk-ruby'
|
2
|
+
|
3
|
+
require 'kontent-jekyll/resolvers/content_link_resolver'
|
4
|
+
require 'kontent-jekyll/resolvers/inline_content_item_resolver'
|
5
|
+
|
6
|
+
require 'kontent-jekyll/constants/kentico_config_keys'
|
7
|
+
|
8
|
+
require 'kontent-jekyll/version'
|
9
|
+
require 'kontent-jekyll/gem_name'
|
10
|
+
|
11
|
+
module Kentico
|
12
|
+
module Kontent
|
13
|
+
module SiteProcessing
|
14
|
+
include Constants
|
15
|
+
include Resolvers
|
16
|
+
|
17
|
+
class KenticoKontentImporter
|
18
|
+
def initialize(config)
|
19
|
+
@config = config
|
20
|
+
@items = []
|
21
|
+
@taxonomy_groups = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def items_by_type(language)
|
25
|
+
retrieve_items(language)
|
26
|
+
.group_by { |item| item.system.type }
|
27
|
+
end
|
28
|
+
|
29
|
+
def taxonomies
|
30
|
+
@taxonomy_groups = retrieve_taxonomies
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def inline_content_item_resolver
|
36
|
+
@inline_content_item_resolver ||= Resolvers::InlineContentItemResolver.for(@config)
|
37
|
+
end
|
38
|
+
|
39
|
+
def content_link_url_resolver
|
40
|
+
@content_link_url_resolver ||= Resolvers::ContentLinkResolver.for(@config)
|
41
|
+
end
|
42
|
+
|
43
|
+
def delivery_client
|
44
|
+
project_id = value_for(@config, Constants::KenticoConfigKeys::PROJECT_ID)
|
45
|
+
secure_key = value_for(@config, Constants::KenticoConfigKeys::SECURE_KEY)
|
46
|
+
|
47
|
+
Kentico::Kontent::Delivery::DeliveryClient.new(
|
48
|
+
project_id: project_id,
|
49
|
+
secure_key: secure_key,
|
50
|
+
content_link_url_resolver: content_link_url_resolver,
|
51
|
+
inline_content_item_resolver: inline_content_item_resolver
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def retrieve_taxonomies
|
56
|
+
delivery_client
|
57
|
+
.taxonomies
|
58
|
+
.custom_headers(custom_headers)
|
59
|
+
.request_latest_content
|
60
|
+
.execute { |response| return response.taxonomies }
|
61
|
+
end
|
62
|
+
|
63
|
+
def retrieve_items(language)
|
64
|
+
client = delivery_client.items
|
65
|
+
client = client.language(language) if language
|
66
|
+
client
|
67
|
+
.custom_headers(custom_headers)
|
68
|
+
.request_latest_content
|
69
|
+
.depth(@config.max_linked_items_depth || 1)
|
70
|
+
.execute { |response| return response.items }
|
71
|
+
end
|
72
|
+
|
73
|
+
def value_for(config, key)
|
74
|
+
potential_value = config[key]
|
75
|
+
return ENV[potential_value.gsub('ENV_', '')] if !potential_value.nil? && potential_value.start_with?('ENV_')
|
76
|
+
potential_value
|
77
|
+
end
|
78
|
+
|
79
|
+
# Add extra headers like tracking
|
80
|
+
def custom_headers
|
81
|
+
{
|
82
|
+
'X-KC-SOURCE' => "#{GEM_NAME};#{VERSION}",
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -1,249 +1,249 @@
|
|
1
|
-
require 'date'
|
2
|
-
|
3
|
-
require 'kontent-jekyll/constants/page_type'
|
4
|
-
|
5
|
-
require 'kontent-jekyll/resolvers/front_matter_resolver'
|
6
|
-
require 'kontent-jekyll/resolvers/content_resolver'
|
7
|
-
require 'kontent-jekyll/resolvers/data_resolver'
|
8
|
-
require 'kontent-jekyll/resolvers/filename_resolver'
|
9
|
-
|
10
|
-
require 'kontent-jekyll/utils/normalize_object'
|
11
|
-
|
12
|
-
module Kentico
|
13
|
-
module Kontent
|
14
|
-
module SiteProcessing
|
15
|
-
##
|
16
|
-
# This class processes the the imported content and populate Jekyll structures.
|
17
|
-
|
18
|
-
class SiteProcessor
|
19
|
-
include Constants
|
20
|
-
include Resolvers
|
21
|
-
include Utils
|
22
|
-
|
23
|
-
##
|
24
|
-
# These collections have specific purposes in the original Jekyll generation will be omitted.
|
25
|
-
|
26
|
-
RESERVED_COLLECTIONS = %w(posts data)
|
27
|
-
|
28
|
-
def initialize(site, config)
|
29
|
-
@site = site
|
30
|
-
@config = config
|
31
|
-
end
|
32
|
-
|
33
|
-
##
|
34
|
-
# Populates standard Jekyll pages and collections
|
35
|
-
|
36
|
-
def process_pages(items_by_type)
|
37
|
-
pages_config = @config.pages
|
38
|
-
return unless pages_config
|
39
|
-
|
40
|
-
pages_config.each_pair do |type, page_config|
|
41
|
-
pages = items_by_type[type.to_s]
|
42
|
-
next unless pages
|
43
|
-
|
44
|
-
collection_name = page_config&.collection
|
45
|
-
|
46
|
-
pages_data = []
|
47
|
-
pages.each do |page_item|
|
48
|
-
content = content_resolver.execute(page_item, page_config)
|
49
|
-
front_matter = front_matter_resolver.execute(page_item, PageType::PAGE)
|
50
|
-
front_matter = normalize_object(front_matter)
|
51
|
-
|
52
|
-
mapped_name = filename_resolver.execute(page_item)
|
53
|
-
filename = "#{mapped_name}.html"
|
54
|
-
|
55
|
-
page_data = OpenStruct.new(content: content, collection: collection_name, front_matter: front_matter, filename: filename)
|
56
|
-
pages_data << page_data
|
57
|
-
end
|
58
|
-
|
59
|
-
are_pages_from_collection = collection_name && !collection_name.empty? && !RESERVED_COLLECTIONS.include?(collection_name)
|
60
|
-
|
61
|
-
unless are_pages_from_collection
|
62
|
-
@site.pages += pages_data.map { |page_data| create_kentico_page(@site, page_data) }
|
63
|
-
next
|
64
|
-
end
|
65
|
-
|
66
|
-
collection_config = @site.config['collections'][collection_name]
|
67
|
-
if collection_config
|
68
|
-
collection_config['output'] = true unless defined?(collection_config['output'])
|
69
|
-
else
|
70
|
-
@site.config['collections'][collection_name] = { 'output' => true }
|
71
|
-
end
|
72
|
-
|
73
|
-
collection = @site.collections[collection_name] ||= Jekyll::Collection.new(@site, collection_name)
|
74
|
-
|
75
|
-
pages_data.each do |page_data|
|
76
|
-
path = File.join(@site.source, "_#{collection_name}", page_data.filename)
|
77
|
-
|
78
|
-
page = create_document(path, @site, collection, page_data)
|
79
|
-
|
80
|
-
page.instance_eval 'merge_defaults'
|
81
|
-
page.instance_eval 'read_post_data'
|
82
|
-
|
83
|
-
collection.docs << page
|
84
|
-
end
|
85
|
-
|
86
|
-
collection.docs = collection.docs.reverse.uniq(&:path).reverse
|
87
|
-
collection.docs.sort!
|
88
|
-
end
|
89
|
-
|
90
|
-
@site.pages = @site.pages.reverse.uniq(&:path).reverse
|
91
|
-
@site.pages.sort_by!(&:name)
|
92
|
-
end
|
93
|
-
|
94
|
-
##
|
95
|
-
# Populates posts part of the Jekyll site
|
96
|
-
|
97
|
-
def process_posts(items_by_type)
|
98
|
-
posts_config = @config.posts
|
99
|
-
return unless posts_config
|
100
|
-
|
101
|
-
type = posts_config&.type
|
102
|
-
|
103
|
-
posts = items_by_type[type.to_s]
|
104
|
-
return unless posts
|
105
|
-
|
106
|
-
posts.each do |post_item|
|
107
|
-
content = content_resolver.execute(post_item, posts_config)
|
108
|
-
front_matter = front_matter_resolver.execute(post_item, PageType::POST)
|
109
|
-
front_matter = normalize_object(front_matter)
|
110
|
-
|
111
|
-
date = post_item.elements[posts_config.date || 'date'].value
|
112
|
-
date_string = DateTime.parse(date).strftime('%Y-%m-%d')
|
113
|
-
|
114
|
-
mapped_name = filename_resolver.execute(post_item)
|
115
|
-
filename = "#{date_string}-#{mapped_name}.html"
|
116
|
-
|
117
|
-
post_data = OpenStruct.new(content: content, front_matter: front_matter, filename: filename)
|
118
|
-
|
119
|
-
path = File.join(@site.source, '_posts', filename)
|
120
|
-
post = create_document(path, @site, @site.posts, post_data)
|
121
|
-
|
122
|
-
##
|
123
|
-
# We need to invoke these private methods as they correctly populate certain data automatically.
|
124
|
-
|
125
|
-
post.instance_eval 'merge_defaults'
|
126
|
-
post.instance_eval 'read_post_data'
|
127
|
-
|
128
|
-
@site.posts.docs << post
|
129
|
-
end
|
130
|
-
|
131
|
-
@site.posts.docs = @site.posts.docs.reverse.uniq(&:path).reverse
|
132
|
-
@site.posts.docs.sort!
|
133
|
-
end
|
134
|
-
|
135
|
-
##
|
136
|
-
# Populates data part of the Jekyll site.
|
137
|
-
|
138
|
-
def process_data(items_by_type)
|
139
|
-
config = @config.data
|
140
|
-
|
141
|
-
data_items = {}
|
142
|
-
config && config.each_pair do |item_type, name|
|
143
|
-
items = items_by_type[item_type.to_s]
|
144
|
-
next unless items
|
145
|
-
|
146
|
-
name ||= item_type.to_s
|
147
|
-
processed_items = items.map do |item|
|
148
|
-
data = data_resolver.execute(item)
|
149
|
-
normalize_object(data)
|
150
|
-
end
|
151
|
-
|
152
|
-
data_items[name] = (data_items[name] || []) + processed_items
|
153
|
-
end
|
154
|
-
|
155
|
-
@site.data.merge!({ 'items' => data_items })
|
156
|
-
end
|
157
|
-
|
158
|
-
##
|
159
|
-
# Populates data part of the Jekyll site with taxonomies.
|
160
|
-
|
161
|
-
def process_taxonomies(taxonomies)
|
162
|
-
codenames = @config.taxonomies
|
163
|
-
return unless codenames && taxonomies
|
164
|
-
|
165
|
-
filtered_taxonomies = taxonomies.select { |taxonomy| codenames.include? taxonomy.system.codename }
|
166
|
-
|
167
|
-
processed_taxonomies = {}
|
168
|
-
filtered_taxonomies.each do |taxonomy|
|
169
|
-
taxonomy_data = normalize_object({
|
170
|
-
system: taxonomy.system,
|
171
|
-
terms: taxonomy.terms,
|
172
|
-
})
|
173
|
-
|
174
|
-
processed_taxonomies[taxonomy.system.codename] = taxonomy_data
|
175
|
-
end
|
176
|
-
|
177
|
-
@site.data['taxonomies'] = processed_taxonomies
|
178
|
-
end
|
179
|
-
|
180
|
-
private
|
181
|
-
|
182
|
-
##
|
183
|
-
# Creates a Jekyll::Page.
|
184
|
-
|
185
|
-
def create_kentico_page(site, page_info)
|
186
|
-
page = Jekyll::Page.allocate
|
187
|
-
|
188
|
-
## A hack to create a Jekyll::Page with custom constructor without overriding the class
|
189
|
-
# because jekyll-redirect-from can work only with Jekyll::Page instances.
|
190
|
-
# Once this PR https://github.com/jekyll/jekyll-redirect-from/pull/204 is merged and released
|
191
|
-
# we can create a subclass of the Page and simplify the code.
|
192
|
-
|
193
|
-
page.define_singleton_method(:initialize) do
|
194
|
-
@site = site
|
195
|
-
@base = site.source
|
196
|
-
@dir = ''
|
197
|
-
@name = page_info.filename
|
198
|
-
@path = if site.in_theme_dir(@base) == @base
|
199
|
-
site.in_theme_dir(@base, @dir, @name)
|
200
|
-
else
|
201
|
-
site.in_source_dir(@base, @dir, @name)
|
202
|
-
end
|
203
|
-
|
204
|
-
self.process(@name)
|
205
|
-
|
206
|
-
self.data = page_info.front_matter
|
207
|
-
self.content = page_info.content
|
208
|
-
|
209
|
-
data.default_proc = proc do |_, key|
|
210
|
-
site.frontmatter_defaults.find(File.join(@dir, @name), type, key)
|
211
|
-
end
|
212
|
-
|
213
|
-
Jekyll::Hooks.trigger :pages, :post_init, self
|
214
|
-
|
215
|
-
self
|
216
|
-
end
|
217
|
-
|
218
|
-
page.initialize
|
219
|
-
end
|
220
|
-
|
221
|
-
##
|
222
|
-
# Creates a Jekyll::Document. Used for collections.
|
223
|
-
|
224
|
-
def create_document(path, site, collection, source)
|
225
|
-
doc = Jekyll::Document.new(path, site: site, collection: collection)
|
226
|
-
doc.content = source.content
|
227
|
-
doc.data.merge!(source.front_matter)
|
228
|
-
doc
|
229
|
-
end
|
230
|
-
|
231
|
-
def content_resolver
|
232
|
-
@content_resolver ||= Resolvers::ContentResolver.new(@config)
|
233
|
-
end
|
234
|
-
|
235
|
-
def filename_resolver
|
236
|
-
@filename_resolver ||= Resolvers::FilenameResolver.new(@config)
|
237
|
-
end
|
238
|
-
|
239
|
-
def front_matter_resolver
|
240
|
-
@front_matter_resolver ||= Resolvers::FrontMatterResolver.new(@config)
|
241
|
-
end
|
242
|
-
|
243
|
-
def data_resolver
|
244
|
-
@data_resolver ||= Resolvers::DataResolver.new(@config)
|
245
|
-
end
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
require 'kontent-jekyll/constants/page_type'
|
4
|
+
|
5
|
+
require 'kontent-jekyll/resolvers/front_matter_resolver'
|
6
|
+
require 'kontent-jekyll/resolvers/content_resolver'
|
7
|
+
require 'kontent-jekyll/resolvers/data_resolver'
|
8
|
+
require 'kontent-jekyll/resolvers/filename_resolver'
|
9
|
+
|
10
|
+
require 'kontent-jekyll/utils/normalize_object'
|
11
|
+
|
12
|
+
module Kentico
|
13
|
+
module Kontent
|
14
|
+
module SiteProcessing
|
15
|
+
##
|
16
|
+
# This class processes the the imported content and populate Jekyll structures.
|
17
|
+
|
18
|
+
class SiteProcessor
|
19
|
+
include Constants
|
20
|
+
include Resolvers
|
21
|
+
include Utils
|
22
|
+
|
23
|
+
##
|
24
|
+
# These collections have specific purposes in the original Jekyll generation will be omitted.
|
25
|
+
|
26
|
+
RESERVED_COLLECTIONS = %w(posts data)
|
27
|
+
|
28
|
+
def initialize(site, config)
|
29
|
+
@site = site
|
30
|
+
@config = config
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# Populates standard Jekyll pages and collections
|
35
|
+
|
36
|
+
def process_pages(items_by_type)
|
37
|
+
pages_config = @config.pages
|
38
|
+
return unless pages_config
|
39
|
+
|
40
|
+
pages_config.each_pair do |type, page_config|
|
41
|
+
pages = items_by_type[type.to_s]
|
42
|
+
next unless pages
|
43
|
+
|
44
|
+
collection_name = page_config&.collection
|
45
|
+
|
46
|
+
pages_data = []
|
47
|
+
pages.each do |page_item|
|
48
|
+
content = content_resolver.execute(page_item, page_config)
|
49
|
+
front_matter = front_matter_resolver.execute(page_item, PageType::PAGE)
|
50
|
+
front_matter = normalize_object(front_matter)
|
51
|
+
|
52
|
+
mapped_name = filename_resolver.execute(page_item)
|
53
|
+
filename = "#{mapped_name}.html"
|
54
|
+
|
55
|
+
page_data = OpenStruct.new(content: content, collection: collection_name, front_matter: front_matter, filename: filename)
|
56
|
+
pages_data << page_data
|
57
|
+
end
|
58
|
+
|
59
|
+
are_pages_from_collection = collection_name && !collection_name.empty? && !RESERVED_COLLECTIONS.include?(collection_name)
|
60
|
+
|
61
|
+
unless are_pages_from_collection
|
62
|
+
@site.pages += pages_data.map { |page_data| create_kentico_page(@site, page_data) }
|
63
|
+
next
|
64
|
+
end
|
65
|
+
|
66
|
+
collection_config = @site.config['collections'][collection_name]
|
67
|
+
if collection_config
|
68
|
+
collection_config['output'] = true unless defined?(collection_config['output'])
|
69
|
+
else
|
70
|
+
@site.config['collections'][collection_name] = { 'output' => true }
|
71
|
+
end
|
72
|
+
|
73
|
+
collection = @site.collections[collection_name] ||= Jekyll::Collection.new(@site, collection_name)
|
74
|
+
|
75
|
+
pages_data.each do |page_data|
|
76
|
+
path = File.join(@site.source, "_#{collection_name}", page_data.filename)
|
77
|
+
|
78
|
+
page = create_document(path, @site, collection, page_data)
|
79
|
+
|
80
|
+
page.instance_eval 'merge_defaults'
|
81
|
+
page.instance_eval 'read_post_data'
|
82
|
+
|
83
|
+
collection.docs << page
|
84
|
+
end
|
85
|
+
|
86
|
+
collection.docs = collection.docs.reverse.uniq(&:path).reverse
|
87
|
+
collection.docs.sort!
|
88
|
+
end
|
89
|
+
|
90
|
+
@site.pages = @site.pages.reverse.uniq(&:path).reverse
|
91
|
+
@site.pages.sort_by!(&:name)
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Populates posts part of the Jekyll site
|
96
|
+
|
97
|
+
def process_posts(items_by_type)
|
98
|
+
posts_config = @config.posts
|
99
|
+
return unless posts_config
|
100
|
+
|
101
|
+
type = posts_config&.type
|
102
|
+
|
103
|
+
posts = items_by_type[type.to_s]
|
104
|
+
return unless posts
|
105
|
+
|
106
|
+
posts.each do |post_item|
|
107
|
+
content = content_resolver.execute(post_item, posts_config)
|
108
|
+
front_matter = front_matter_resolver.execute(post_item, PageType::POST)
|
109
|
+
front_matter = normalize_object(front_matter)
|
110
|
+
|
111
|
+
date = post_item.elements[posts_config.date || 'date'].value
|
112
|
+
date_string = DateTime.parse(date).strftime('%Y-%m-%d')
|
113
|
+
|
114
|
+
mapped_name = filename_resolver.execute(post_item)
|
115
|
+
filename = "#{date_string}-#{mapped_name}.html"
|
116
|
+
|
117
|
+
post_data = OpenStruct.new(content: content, front_matter: front_matter, filename: filename)
|
118
|
+
|
119
|
+
path = File.join(@site.source, '_posts', filename)
|
120
|
+
post = create_document(path, @site, @site.posts, post_data)
|
121
|
+
|
122
|
+
##
|
123
|
+
# We need to invoke these private methods as they correctly populate certain data automatically.
|
124
|
+
|
125
|
+
post.instance_eval 'merge_defaults'
|
126
|
+
post.instance_eval 'read_post_data'
|
127
|
+
|
128
|
+
@site.posts.docs << post
|
129
|
+
end
|
130
|
+
|
131
|
+
@site.posts.docs = @site.posts.docs.reverse.uniq(&:path).reverse
|
132
|
+
@site.posts.docs.sort!
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# Populates data part of the Jekyll site.
|
137
|
+
|
138
|
+
def process_data(items_by_type)
|
139
|
+
config = @config.data
|
140
|
+
|
141
|
+
data_items = {}
|
142
|
+
config && config.each_pair do |item_type, name|
|
143
|
+
items = items_by_type[item_type.to_s]
|
144
|
+
next unless items
|
145
|
+
|
146
|
+
name ||= item_type.to_s
|
147
|
+
processed_items = items.map do |item|
|
148
|
+
data = data_resolver.execute(item)
|
149
|
+
normalize_object(data)
|
150
|
+
end
|
151
|
+
|
152
|
+
data_items[name] = (data_items[name] || []) + processed_items
|
153
|
+
end
|
154
|
+
|
155
|
+
@site.data.merge!({ 'items' => data_items })
|
156
|
+
end
|
157
|
+
|
158
|
+
##
|
159
|
+
# Populates data part of the Jekyll site with taxonomies.
|
160
|
+
|
161
|
+
def process_taxonomies(taxonomies)
|
162
|
+
codenames = @config.taxonomies
|
163
|
+
return unless codenames && taxonomies
|
164
|
+
|
165
|
+
filtered_taxonomies = taxonomies.select { |taxonomy| codenames.include? taxonomy.system.codename }
|
166
|
+
|
167
|
+
processed_taxonomies = {}
|
168
|
+
filtered_taxonomies.each do |taxonomy|
|
169
|
+
taxonomy_data = normalize_object({
|
170
|
+
system: taxonomy.system,
|
171
|
+
terms: taxonomy.terms,
|
172
|
+
})
|
173
|
+
|
174
|
+
processed_taxonomies[taxonomy.system.codename] = taxonomy_data
|
175
|
+
end
|
176
|
+
|
177
|
+
@site.data['taxonomies'] = processed_taxonomies
|
178
|
+
end
|
179
|
+
|
180
|
+
private
|
181
|
+
|
182
|
+
##
|
183
|
+
# Creates a Jekyll::Page.
|
184
|
+
|
185
|
+
def create_kentico_page(site, page_info)
|
186
|
+
page = Jekyll::Page.allocate
|
187
|
+
|
188
|
+
## A hack to create a Jekyll::Page with custom constructor without overriding the class
|
189
|
+
# because jekyll-redirect-from can work only with Jekyll::Page instances.
|
190
|
+
# Once this PR https://github.com/jekyll/jekyll-redirect-from/pull/204 is merged and released
|
191
|
+
# we can create a subclass of the Page and simplify the code.
|
192
|
+
|
193
|
+
page.define_singleton_method(:initialize) do
|
194
|
+
@site = site
|
195
|
+
@base = site.source
|
196
|
+
@dir = ''
|
197
|
+
@name = page_info.filename
|
198
|
+
@path = if site.in_theme_dir(@base) == @base
|
199
|
+
site.in_theme_dir(@base, @dir, @name)
|
200
|
+
else
|
201
|
+
site.in_source_dir(@base, @dir, @name)
|
202
|
+
end
|
203
|
+
|
204
|
+
self.process(@name)
|
205
|
+
|
206
|
+
self.data = page_info.front_matter
|
207
|
+
self.content = page_info.content
|
208
|
+
|
209
|
+
data.default_proc = proc do |_, key|
|
210
|
+
site.frontmatter_defaults.find(File.join(@dir, @name), type, key)
|
211
|
+
end
|
212
|
+
|
213
|
+
Jekyll::Hooks.trigger :pages, :post_init, self
|
214
|
+
|
215
|
+
self
|
216
|
+
end
|
217
|
+
|
218
|
+
page.initialize
|
219
|
+
end
|
220
|
+
|
221
|
+
##
|
222
|
+
# Creates a Jekyll::Document. Used for collections.
|
223
|
+
|
224
|
+
def create_document(path, site, collection, source)
|
225
|
+
doc = Jekyll::Document.new(path, site: site, collection: collection)
|
226
|
+
doc.content = source.content
|
227
|
+
doc.data.merge!(source.front_matter)
|
228
|
+
doc
|
229
|
+
end
|
230
|
+
|
231
|
+
def content_resolver
|
232
|
+
@content_resolver ||= Resolvers::ContentResolver.new(@config)
|
233
|
+
end
|
234
|
+
|
235
|
+
def filename_resolver
|
236
|
+
@filename_resolver ||= Resolvers::FilenameResolver.new(@config)
|
237
|
+
end
|
238
|
+
|
239
|
+
def front_matter_resolver
|
240
|
+
@front_matter_resolver ||= Resolvers::FrontMatterResolver.new(@config)
|
241
|
+
end
|
242
|
+
|
243
|
+
def data_resolver
|
244
|
+
@data_resolver ||= Resolvers::DataResolver.new(@config)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
249
|
end
|