cloudcannon-jekyll 1.4.3 → 1.5.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/.github/workflows/stale.yml +19 -0
- data/.rubocop.yml +1 -4
- data/HISTORY.md +10 -3
- data/lib/cloudcannon-jekyll.rb +1 -1
- data/lib/cloudcannon-jekyll/_cloudcannon/config-2.x.json +1 -1
- data/lib/cloudcannon-jekyll/_cloudcannon/config-3.0-4.x.json +1 -1
- data/lib/cloudcannon-jekyll/_cloudcannon/config.json +1 -3
- data/lib/cloudcannon-jekyll/_cloudcannon/details-2.x.json +2 -1
- data/lib/cloudcannon-jekyll/_cloudcannon/details-3.0-4.x.json +2 -1
- data/lib/cloudcannon-jekyll/_cloudcannon/details.json +2 -1
- data/lib/cloudcannon-jekyll/configuration.rb +1 -1
- data/lib/cloudcannon-jekyll/generator.rb +93 -6
- data/lib/cloudcannon-jekyll/jsonify-filter.rb +8 -23
- data/lib/cloudcannon-jekyll/reader.rb +44 -0
- data/lib/cloudcannon-jekyll/readers/data-reader.rb +18 -0
- data/lib/cloudcannon-jekyll/readers/old-data-reader.rb +55 -0
- data/lib/cloudcannon-jekyll/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33d4053706ea20c8d2e3985de49e437dcee1c275ecd4ccdf78dc7c7d1a94cf83
|
4
|
+
data.tar.gz: 4fe382c19ba59e3242f6cfa9b5b7e46de152c2091036602a622618fce3f2e8ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3d509ec5cfdedc0dce34b639152efd81a81c2d798f403dbf656ab17cc16af127a45609d4cf482b830e02fbdbe4b77c7c6bc7a8a8a3a584b501273b3f40d4fdb
|
7
|
+
data.tar.gz: f1c56c046ff5dcf46048184cf7de498aff85706804afbf168613cfac4d0e6a448ebecc29e6575114ee58098c7df7e3a83ba19bb07f9d68902aa0cbd60db120e0
|
@@ -0,0 +1,19 @@
|
|
1
|
+
name: Mark stale issues
|
2
|
+
|
3
|
+
on:
|
4
|
+
schedule:
|
5
|
+
- cron: "30 1 * * *"
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
stale:
|
9
|
+
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
|
12
|
+
steps:
|
13
|
+
- uses: actions/stale@v1
|
14
|
+
with:
|
15
|
+
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
16
|
+
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days'
|
17
|
+
stale-issue-label: 'no-issue-activity'
|
18
|
+
days-before-stale: 30
|
19
|
+
days-before-close: 5
|
data/.rubocop.yml
CHANGED
@@ -28,15 +28,12 @@ Naming/MemoizedInstanceVariableName:
|
|
28
28
|
Metrics/CyclomaticComplexity:
|
29
29
|
Exclude:
|
30
30
|
- lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
|
31
|
+
- lib/cloudcannon-jekyll/readers/old-data-reader.rb # TODO remove this and fix warnings
|
31
32
|
|
32
33
|
Metrics/PerceivedComplexity:
|
33
34
|
Exclude:
|
34
35
|
- lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
|
35
36
|
|
36
|
-
Metrics/MethodLength:
|
37
|
-
Exclude:
|
38
|
-
- lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
|
39
|
-
|
40
37
|
Metrics/AbcSize:
|
41
38
|
Exclude:
|
42
39
|
- lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
|
data/HISTORY.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
-
# 1.
|
2
|
-
|
3
|
-
*
|
1
|
+
# 1.5.0
|
2
|
+
|
3
|
+
* Added drafts to collections in details
|
4
|
+
* Added drafts and data to collections in config
|
5
|
+
* Added category folder drafts and posts to collections in config
|
6
|
+
* Added `_path` field to each collection definition in config
|
7
|
+
* Removed some unused fields
|
8
|
+
* Renamed static to static-pages in details and removed `robots.txt` and `sitemap.xml` exceptions
|
9
|
+
* Add `url` to static-pages
|
10
|
+
* Normalise `_path` in static-pages
|
4
11
|
|
5
12
|
# 1.4.2
|
6
13
|
|
data/lib/cloudcannon-jekyll.rb
CHANGED
@@ -10,7 +10,7 @@ require_relative "cloudcannon-jekyll/version"
|
|
10
10
|
|
11
11
|
Liquid::Template.register_filter(CloudCannonJekyll::JsonifyFilter)
|
12
12
|
|
13
|
-
if Jekyll::VERSION.start_with? "2"
|
13
|
+
if Jekyll::VERSION.start_with? "2."
|
14
14
|
module Jekyll
|
15
15
|
# Hooks didn't exist in Jekyll 2 so we monkey patch to get an :after_reset hook
|
16
16
|
class Site
|
@@ -8,7 +8,7 @@
|
|
8
8
|
"include": {{ config.include | cc_jsonify }},
|
9
9
|
"exclude": {{ config.exclude | cc_jsonify }},
|
10
10
|
{% if config.baseurl %}"base-url": {{ config.baseurl | cc_jsonify }},{% endif %}
|
11
|
-
|
11
|
+
"collections": {{ collections | cc_jsonify: 'collections' }},
|
12
12
|
{% if config._comments %}"comments": {{ config._comments | cc_jsonify }},{% endif %}
|
13
13
|
{% if config._options %}"input-options": {{ config._options | cc_jsonify }},{% endif %}
|
14
14
|
{% if config.defaults %}"defaults": {{ config.defaults | cc_jsonify }},{% endif %}
|
@@ -8,7 +8,7 @@
|
|
8
8
|
"include": {{ config.include | cc_jsonify }},
|
9
9
|
"exclude": {{ config.exclude | cc_jsonify }},
|
10
10
|
{% if config.baseurl %}"base-url": {{ config.baseurl | cc_jsonify }},{% endif %}
|
11
|
-
|
11
|
+
"collections": {{ collections | cc_jsonify: 'collections' }},
|
12
12
|
{% if config._comments %}"comments": {{ config._comments | cc_jsonify }},{% endif %}
|
13
13
|
{% if config._options %}"input-options": {{ config._options | cc_jsonify }},{% endif %}
|
14
14
|
{% if config.defaults %}"defaults": {{ config.defaults | cc_jsonify }},{% endif %}
|
@@ -12,9 +12,7 @@
|
|
12
12
|
{% if config.baseurl -%}
|
13
13
|
"base-url": {{ config.baseurl | cc_jsonify }},
|
14
14
|
{%- endif %}
|
15
|
-
{
|
16
|
-
"collections": {{ config.collections | cc_jsonify: 'collections' }},
|
17
|
-
{%- endif %}
|
15
|
+
"collections": {{ collections | cc_jsonify: 'collections' }},
|
18
16
|
{% if config._comments -%}
|
19
17
|
"comments": {{ config._comments | cc_jsonify }},
|
20
18
|
{%- endif %}
|
@@ -18,10 +18,11 @@
|
|
18
18
|
{% for data in site.data %}{% assign key = data[0] %}{% if site.cloudcannon.data[key] %}{% if data_seen %},{% endif %}{{ data[0] | cc_jsonify }}: {{ data[1] | cc_jsonify }}{% assign data_seen = true %}{% endif %}{% endfor %}},
|
19
19
|
{% elsif site.cloudcannon.data %}"data": {{ site.data | cc_jsonify }},{% endif %}
|
20
20
|
"collections": {
|
21
|
+
"drafts": {{ drafts | cc_jsonify }},
|
21
22
|
"posts": {{ site.posts | reverse | cc_jsonify }}{% if site.collections.size > 0 %},{% endif %}
|
22
23
|
{% for collection in site.collections %}"{{ collection[0] | xml_escape }}": {{ collection[1].docs | cc_jsonify }}{% unless forloop.last %},{% endunless %}
|
23
24
|
{% endfor %}
|
24
25
|
},
|
25
26
|
"pages": {{ site.pages | cc_jsonify }},
|
26
|
-
"static": {{ site.static_files | cc_static_files_jsonify }}
|
27
|
+
"static-pages": {{ site.static_files | cc_static_files_jsonify }}
|
27
28
|
}
|
@@ -18,9 +18,10 @@
|
|
18
18
|
{% for data in site.data %}{% assign key = data[0] %}{% if site.cloudcannon.data[key] %}{% if data_seen %},{% endif %}{{ data[0] | cc_jsonify }}: {{ data[1] | cc_jsonify }}{% assign data_seen = true %}{% endif %}{% endfor %}},
|
19
19
|
{% elsif site.cloudcannon.data %}"data": {{ site.data | cc_jsonify }},{% endif %}
|
20
20
|
"collections": {
|
21
|
+
"drafts": {{ drafts | cc_jsonify }}{% if site.collections.size > 0 %},{% endif %}
|
21
22
|
{% for collection in site.collections %}"{{ collection.label | xml_escape }}": {{ collection.docs | cc_jsonify }}{% unless forloop.last %},{% endunless %}
|
22
23
|
{% endfor %}
|
23
24
|
},
|
24
25
|
"pages": {{ site.pages | cc_jsonify }},
|
25
|
-
"static": {{ site.static_files | cc_static_files_jsonify }}
|
26
|
+
"static-pages": {{ site.static_files | cc_static_files_jsonify }}
|
26
27
|
}
|
@@ -30,11 +30,12 @@
|
|
30
30
|
"data": {{ site.data | cc_jsonify }},
|
31
31
|
{%- endif %}
|
32
32
|
"collections": {
|
33
|
+
"drafts": {{ drafts | cc_jsonify }}{% if site.collections.size > 0 %},{% endif %}
|
33
34
|
{%- for collection in site.collections -%}
|
34
35
|
"{{ collection.label | xml_escape }}": {{ collection.docs | cc_jsonify }}
|
35
36
|
{%- unless forloop.last %},{% endunless %}
|
36
37
|
{%- endfor -%}
|
37
38
|
},
|
38
39
|
"pages": {{ site.pages | cc_jsonify }},
|
39
|
-
"static": {{ site.static_files | cc_static_files_jsonify }}
|
40
|
+
"static-pages": {{ site.static_files | cc_static_files_jsonify }}
|
40
41
|
}
|
@@ -17,7 +17,7 @@ module CloudCannonJekyll
|
|
17
17
|
config = config.fix_common_issues if config.respond_to? :fix_common_issues
|
18
18
|
config = config.add_default_excludes if config.respond_to? :add_default_excludes
|
19
19
|
|
20
|
-
key = Jekyll::VERSION.start_with?("2") ? "gems" : "plugins"
|
20
|
+
key = Jekyll::VERSION.start_with?("2.") ? "gems" : "plugins"
|
21
21
|
|
22
22
|
config[key] = Array(config[key])
|
23
23
|
config[key].push("cloudcannon-jekyll") unless config[key].include? "cloudcannon-jekyll"
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "jekyll"
|
4
4
|
require "fileutils"
|
5
|
+
require_relative "reader"
|
5
6
|
|
6
7
|
module CloudCannonJekyll
|
7
8
|
# Generates JSON files containing build config and build output details
|
@@ -10,25 +11,111 @@ module CloudCannonJekyll
|
|
10
11
|
|
11
12
|
def generate(site)
|
12
13
|
@site = site
|
14
|
+
@reader = Reader.new(@site)
|
15
|
+
|
16
|
+
collections_config = @site.config["collections"].dup || {}
|
13
17
|
|
14
18
|
payload = @site.site_payload.merge({
|
15
19
|
"gem_version" => CloudCannonJekyll::VERSION,
|
20
|
+
})
|
21
|
+
|
22
|
+
drafts = add_blogging_config(collections_config)
|
23
|
+
add_collection_paths(collections_config)
|
24
|
+
add_data_config(collections_config)
|
25
|
+
|
26
|
+
generate_file("config", payload.merge({
|
16
27
|
"pwd" => Dir.pwd,
|
17
28
|
"config" => @site.config,
|
18
|
-
|
29
|
+
"collections" => collections_config,
|
30
|
+
}))
|
31
|
+
|
32
|
+
generate_file("details", payload.merge({
|
33
|
+
"drafts" => drafts,
|
34
|
+
}))
|
35
|
+
end
|
19
36
|
|
20
|
-
|
21
|
-
|
37
|
+
def collections_dir
|
38
|
+
return "" if Jekyll::VERSION.start_with? "2."
|
22
39
|
|
23
|
-
@site.
|
24
|
-
|
25
|
-
|
40
|
+
@site.config["collections_dir"] || ""
|
41
|
+
end
|
42
|
+
|
43
|
+
def data_dir
|
44
|
+
@site.config["data_dir"] || "_data"
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_category_folder_config(collections_config, posts_config = {})
|
48
|
+
posts = @site.posts || @site.collections["posts"]
|
49
|
+
seen = {}
|
50
|
+
|
51
|
+
posts.map do |post|
|
52
|
+
parts = post.relative_path.split("/_posts/")
|
53
|
+
path = parts.first
|
54
|
+
|
55
|
+
# Ignore unless it's an unseen category folder post
|
56
|
+
next if parts.length < 2 || path.empty? || seen[path]
|
57
|
+
|
58
|
+
# Could check this to ensure raw files exist since posts can be generated without files
|
59
|
+
# next if @reader.read_posts(parts[0]).empty?
|
60
|
+
|
61
|
+
seen[path] = true
|
62
|
+
folder = path.sub(%r!^\/+!, "")
|
63
|
+
collections_path = "#{collections_dir}/#{folder}".gsub(%r!\/+!, "/").sub(%r!^\/+!, "")
|
64
|
+
|
65
|
+
collections_config["#{folder}/posts"] = posts_config.merge({
|
66
|
+
"_path" => "#{collections_path}/_posts",
|
67
|
+
})
|
68
|
+
|
69
|
+
# Adding the category draft config like this isn't ideal, since you could have drafts
|
70
|
+
# without posts, but it's a decent trade off vs looking for _drafts folders
|
71
|
+
collections_config["#{folder}/drafts"] = posts_config.merge({
|
72
|
+
"_path" => "#{collections_path}/_drafts",
|
73
|
+
})
|
74
|
+
|
75
|
+
path
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Add data to collections config if raw data files exist
|
80
|
+
def add_data_config(collections_config)
|
81
|
+
data_files = @reader.read_data(data_dir)
|
82
|
+
collections_config["data"] = { "_path" => data_dir } if data_files&.keys&.any?
|
83
|
+
end
|
84
|
+
|
85
|
+
# Add posts/drafts to collections config
|
86
|
+
def add_blogging_config(collections_config)
|
87
|
+
collections_config["posts"] = { "output" => true } if Jekyll::VERSION.start_with? "2."
|
88
|
+
drafts = @reader.read_drafts(collections_dir)
|
89
|
+
|
90
|
+
if collections_config.key?("posts")
|
91
|
+
collections_config["drafts"] = collections_config["posts"].dup
|
92
|
+
elsif drafts.any?
|
93
|
+
collections_config["drafts"] = {}
|
94
|
+
end
|
95
|
+
|
96
|
+
folders = add_category_folder_config(collections_config, collections_config["posts"])
|
97
|
+
folders.compact.each do |folder|
|
98
|
+
drafts += @reader.read_drafts(folder)
|
99
|
+
end
|
100
|
+
|
101
|
+
drafts
|
102
|
+
end
|
103
|
+
|
104
|
+
# Add _path to each collection config
|
105
|
+
def add_collection_paths(collections_config)
|
106
|
+
collections_config.each do |key, collection|
|
107
|
+
next if collection.key?("_path")
|
108
|
+
|
109
|
+
collection["_path"] = File.join(collections_dir, "_#{key}").sub(%r!^\/+!, "")
|
110
|
+
end
|
26
111
|
end
|
27
112
|
|
28
113
|
def generate_file(filename, data)
|
29
114
|
dest = destination_path(filename)
|
30
115
|
FileUtils.mkdir_p(File.dirname(dest))
|
31
116
|
File.open(dest, "w") { |file| file.write(file_content(filename, data)) }
|
117
|
+
@site.keep_files ||= []
|
118
|
+
@site.keep_files << path(filename)
|
32
119
|
end
|
33
120
|
|
34
121
|
def version_path_suffix
|
@@ -6,7 +6,6 @@ module CloudCannonJekyll
|
|
6
6
|
# Filter for converting Jekyll objects into JSON
|
7
7
|
module JsonifyFilter
|
8
8
|
STATIC_EXTENSIONS = [".html", ".htm"].freeze
|
9
|
-
STATIC_PATHS = ["/robots.txt", "/sitemap.xml"].freeze
|
10
9
|
|
11
10
|
CC_JSONIFY_KEY_SWAPS = {
|
12
11
|
"collections" => {
|
@@ -46,17 +45,14 @@ module CloudCannonJekyll
|
|
46
45
|
end
|
47
46
|
|
48
47
|
def self.static_file_to_json(input, depth, max_depth)
|
48
|
+
path = input.relative_path.sub(%r!^\/+!, "")
|
49
|
+
url = Jekyll::VERSION.start_with?("2.") ? "/#{path}" : input.url
|
50
|
+
|
49
51
|
out = [
|
50
|
-
"\"
|
51
|
-
"\"
|
52
|
+
"\"path\": #{JsonifyFilter.to_json(path, depth, max_depth)}",
|
53
|
+
"\"url\": #{JsonifyFilter.to_json(url, depth, max_depth)}",
|
52
54
|
]
|
53
55
|
|
54
|
-
# modified_time isn't defined in Jekyll 2.4.0
|
55
|
-
if input.respond_to? :modified_time
|
56
|
-
file_json = JsonifyFilter.to_json(input.modified_time, depth, max_depth)
|
57
|
-
out.push("\"modified_time\": #{file_json}")
|
58
|
-
end
|
59
|
-
|
60
56
|
"{#{out.join(",")}}"
|
61
57
|
end
|
62
58
|
|
@@ -77,7 +73,6 @@ module CloudCannonJekyll
|
|
77
73
|
prevent = %w(dir name path url date id categories tags)
|
78
74
|
|
79
75
|
out = [
|
80
|
-
"\"dir\": #{JsonifyFilter.to_json(input.dir, depth, max_depth)}",
|
81
76
|
"\"name\": #{JsonifyFilter.to_json(input.name, depth, max_depth)}",
|
82
77
|
"\"path\": #{JsonifyFilter.to_json(input.path, depth, max_depth)}",
|
83
78
|
"\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
|
@@ -95,7 +90,6 @@ module CloudCannonJekyll
|
|
95
90
|
prevent = %w(dir name path url)
|
96
91
|
|
97
92
|
out = [
|
98
|
-
"\"dir\": #{JsonifyFilter.to_json(input.dir, depth, max_depth)}",
|
99
93
|
"\"name\": #{JsonifyFilter.to_json(input.name, depth, max_depth)}",
|
100
94
|
"\"path\": #{JsonifyFilter.to_json(input.path, depth, max_depth)}",
|
101
95
|
"\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
|
@@ -114,11 +108,9 @@ module CloudCannonJekyll
|
|
114
108
|
|
115
109
|
def self.document_to_json(input, depth, max_depth)
|
116
110
|
prevent = %w(dir id relative_path url collection)
|
117
|
-
path_json = JsonifyFilter.to_json(input.relative_path, depth, max_depth)
|
118
111
|
|
119
112
|
out = [
|
120
|
-
"\"path\": #{
|
121
|
-
"\"relative_path\": #{path_json}",
|
113
|
+
"\"path\": #{JsonifyFilter.to_json(input.relative_path, depth, max_depth)}",
|
122
114
|
"\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
|
123
115
|
]
|
124
116
|
|
@@ -128,11 +120,6 @@ module CloudCannonJekyll
|
|
128
120
|
out.push("\"collection\": #{collection_json}")
|
129
121
|
end
|
130
122
|
|
131
|
-
# id isn't defined in Jekyll 2.4.0
|
132
|
-
if input.respond_to? :id
|
133
|
-
out.push("\"id\": #{JsonifyFilter.to_json(input.id, depth, max_depth)}")
|
134
|
-
end
|
135
|
-
|
136
123
|
out += JsonifyFilter.document_data_to_a(input.data, prevent, depth, max_depth)
|
137
124
|
"{#{out.join(",")}}"
|
138
125
|
end
|
@@ -180,7 +167,7 @@ module CloudCannonJekyll
|
|
180
167
|
def self.to_json(input, depth, max_depth = 9, key_swaps = {})
|
181
168
|
depth += 1
|
182
169
|
|
183
|
-
if depth > max_depth || (depth >
|
170
|
+
if depth > max_depth || (depth > 2 && JsonifyFilter.document_type?(input))
|
184
171
|
'"MAXIMUM_DEPTH"'
|
185
172
|
elsif JsonifyFilter.simple_type?(input)
|
186
173
|
input.to_json
|
@@ -203,9 +190,7 @@ module CloudCannonJekyll
|
|
203
190
|
|
204
191
|
def cc_static_files_jsonify(input)
|
205
192
|
out = input.map do |page|
|
206
|
-
|
207
|
-
|
208
|
-
JsonifyFilter.to_json(page, 1)
|
193
|
+
JsonifyFilter.to_json(page, 1) if STATIC_EXTENSIONS.include?(page.extname)
|
209
194
|
end
|
210
195
|
|
211
196
|
out.compact!
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "jekyll"
|
4
|
+
|
5
|
+
if !Jekyll::VERSION.start_with? "2."
|
6
|
+
require_relative "readers/data-reader"
|
7
|
+
else
|
8
|
+
require_relative "readers/old-data-reader"
|
9
|
+
end
|
10
|
+
|
11
|
+
module CloudCannonJekyll
|
12
|
+
# Wraps read functions into one class
|
13
|
+
class Reader
|
14
|
+
attr_reader :site
|
15
|
+
|
16
|
+
def initialize(site)
|
17
|
+
@site = site
|
18
|
+
end
|
19
|
+
|
20
|
+
def read_data(dir = "_data")
|
21
|
+
if Jekyll::VERSION.start_with? "2."
|
22
|
+
CloudCannonJekyll::OldDataReader.new(@site).read(dir)
|
23
|
+
else
|
24
|
+
CloudCannonJekyll::DataReader.new(@site).read(dir)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def read_drafts(dir = "")
|
29
|
+
if Jekyll::VERSION.start_with? "2."
|
30
|
+
@site.read_content(dir, "_drafts", Jekyll::Draft)
|
31
|
+
else
|
32
|
+
Jekyll::PostReader.new(@site).read_drafts(dir)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def read_posts(dir = "")
|
37
|
+
if Jekyll::VERSION.start_with? "2."
|
38
|
+
@site.read_content(dir, "_posts", Jekyll::Post)
|
39
|
+
else
|
40
|
+
Jekyll::PostReader.new(@site).read_posts(dir)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "jekyll"
|
4
|
+
|
5
|
+
module CloudCannonJekyll
|
6
|
+
# Reads data files and creates a collections-style hash representation
|
7
|
+
class DataReader < Jekyll::DataReader
|
8
|
+
# Determines how to read a data file.
|
9
|
+
# This is overridden return a hash instead of reading the file.
|
10
|
+
#
|
11
|
+
# Returns a hash with the path to the data file.
|
12
|
+
def read_data_file(path)
|
13
|
+
{
|
14
|
+
"path" => path,
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "jekyll"
|
4
|
+
|
5
|
+
module CloudCannonJekyll
|
6
|
+
# Reads data files and creates a collections-style hash representation
|
7
|
+
# Aims to replicate the data reading logic in Jekyll 2.5
|
8
|
+
class OldDataReader
|
9
|
+
attr_reader :site
|
10
|
+
|
11
|
+
def initialize(site)
|
12
|
+
@site = site
|
13
|
+
@safe = site.safe
|
14
|
+
@content = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def read(dir)
|
18
|
+
base = Jekyll.sanitized_path(@site.source, dir)
|
19
|
+
read_data_to(base, @content)
|
20
|
+
@content
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_data_to(dir, data)
|
24
|
+
return unless File.directory?(dir) && (!@safe || !File.symlink?(dir))
|
25
|
+
|
26
|
+
entries = Dir.chdir(dir) do
|
27
|
+
Dir["*.{yaml,yml,json,csv}"] + Dir["*"].select { |fn| File.directory?(fn) }
|
28
|
+
end
|
29
|
+
|
30
|
+
entries.each do |entry|
|
31
|
+
path = Jekyll.sanitized_path(dir, entry)
|
32
|
+
next if File.symlink?(path) && @safe
|
33
|
+
|
34
|
+
key = sanitize_filename(File.basename(entry, ".*"))
|
35
|
+
if File.directory?(path)
|
36
|
+
read_data_to(path, data[key] = {})
|
37
|
+
else
|
38
|
+
data[key] = read_data_file(path)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def read_data_file(path)
|
44
|
+
{
|
45
|
+
"path" => path,
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def sanitize_filename(name)
|
50
|
+
name.gsub!(%r![^\w\s_-]+!, "")
|
51
|
+
name.gsub!(%r!(^|\b\s)\s+($|\s?\b)!, '\\1\\2')
|
52
|
+
name.gsub(%r!\s+!, "_")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloudcannon-jekyll
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CloudCannon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -107,6 +107,7 @@ executables: []
|
|
107
107
|
extensions: []
|
108
108
|
extra_rdoc_files: []
|
109
109
|
files:
|
110
|
+
- ".github/workflows/stale.yml"
|
110
111
|
- ".gitignore"
|
111
112
|
- ".reek.yml"
|
112
113
|
- ".rspec"
|
@@ -129,6 +130,9 @@ files:
|
|
129
130
|
- lib/cloudcannon-jekyll/generator.rb
|
130
131
|
- lib/cloudcannon-jekyll/jsonify-filter.rb
|
131
132
|
- lib/cloudcannon-jekyll/page-without-a-file.rb
|
133
|
+
- lib/cloudcannon-jekyll/reader.rb
|
134
|
+
- lib/cloudcannon-jekyll/readers/data-reader.rb
|
135
|
+
- lib/cloudcannon-jekyll/readers/old-data-reader.rb
|
132
136
|
- lib/cloudcannon-jekyll/version.rb
|
133
137
|
- script/ci-smoke-test
|
134
138
|
- script/cibuild
|