cloudcannon-jekyll 0.2.1 → 0.3.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/.reek.yml +6 -0
- data/.rubocop.yml +1 -4
- data/HISTORY.md +19 -0
- data/lib/cloudcannon-jekyll.rb +2 -2
- data/lib/cloudcannon-jekyll/_cloudcannon/config-2.x.json +4 -3
- data/lib/cloudcannon-jekyll/_cloudcannon/config-3.0-4.x.json +4 -3
- data/lib/cloudcannon-jekyll/_cloudcannon/config.json +4 -5
- data/lib/cloudcannon-jekyll/_cloudcannon/details-2.x.json +3 -2
- data/lib/cloudcannon-jekyll/_cloudcannon/details-3.0-4.x.json +3 -2
- data/lib/cloudcannon-jekyll/_cloudcannon/details.json +3 -2
- data/lib/cloudcannon-jekyll/configuration.rb +2 -1
- data/lib/cloudcannon-jekyll/generator.rb +102 -14
- data/lib/cloudcannon-jekyll/jsonify-filter.rb +66 -66
- data/lib/cloudcannon-jekyll/page-without-a-file.rb +1 -0
- 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 +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4dd4e81ac500818217dfbceb63a6a8ed6ecef91583c1e84d08c43fcbeac9294
|
4
|
+
data.tar.gz: c6da0f3528124a84695ea6410f9199dcd3617a9711a4a0859be83f43107ef11b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f76962928b6592d53881f14e407a1cd492790e9b170e515307a6d2b9c001953b5866a89481ab9f1a1b1642ecad3cbb4ae02919c1f8e412fc00a2af060bf7cc91
|
7
|
+
data.tar.gz: 666d55022ea8f7255448db6a97e083e7332d06ec25dae0a07cef221322e4b2745a45f5c77979a636e5d0e4c0fff778f52eb22982662917fba8a2c68bec46a905
|
@@ -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/.reek.yml
ADDED
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,3 +1,22 @@
|
|
1
|
+
# 0.3.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
|
11
|
+
* Added max depth parameter for jsonify filter and increase it for array structures in config output
|
12
|
+
|
13
|
+
# 0.2.2
|
14
|
+
|
15
|
+
* Added JSON handling for integers in hash keys
|
16
|
+
* Fix typo for collections key in older Jekyll versions
|
17
|
+
* Change date format to ISO8601
|
18
|
+
* Validate against new version of config schema
|
19
|
+
|
1
20
|
# 0.2.1
|
2
21
|
|
3
22
|
* Add gem information and time to output config file
|
data/lib/cloudcannon-jekyll.rb
CHANGED
@@ -10,9 +10,9 @@ require_relative "cloudcannon-jekyll/version"
|
|
10
10
|
|
11
11
|
Liquid::Template.register_filter(CloudCannonJekyll::JsonifyFilter)
|
12
12
|
|
13
|
-
|
14
|
-
if Jekyll::VERSION.start_with? "2"
|
13
|
+
if Jekyll::VERSION.start_with? "2."
|
15
14
|
module Jekyll
|
15
|
+
# Hooks didn't exist in Jekyll 2 so we monkey patch to get an :after_reset hook
|
16
16
|
class Site
|
17
17
|
alias_method :jekyll_reset, :reset
|
18
18
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"time": {{ site.time | cc_jsonify }},
|
2
|
+
"time": {{ site.time | date_to_xmlschema | cc_jsonify }},
|
3
3
|
"cloudcannon": {
|
4
4
|
"name": "cloudcannon-jekyll",
|
5
5
|
"version": {{ gem_version | cc_jsonify }}
|
@@ -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 %}
|
@@ -25,11 +25,12 @@
|
|
25
25
|
"uploads": {{ config.uploads_dir | cc_jsonify }},
|
26
26
|
"plugins": {{ config.plugins_dir | cc_jsonify }},
|
27
27
|
"data": {{ config.data_dir | cc_jsonify }},
|
28
|
+
"pages": "",
|
28
29
|
"collections": {{ config.collections_dir | cc_jsonify }},
|
29
30
|
"includes": {{ config.includes_dir | cc_jsonify }},
|
30
31
|
"layouts": {{ config.layouts_dir | cc_jsonify }}
|
31
32
|
},
|
32
|
-
{% if config._array_structures %}"array-structures": {{ config._array_structures | cc_jsonify }},{% endif %}
|
33
|
+
{% if config._array_structures %}"array-structures": {{ config._array_structures | cc_jsonify: nil, 20 }},{% endif %}
|
33
34
|
{% assign select_data = config | cc_select_data_jsonify %}{% if select_data %}"select-data": {{ select_data }},{% endif %}
|
34
35
|
"source": {{ config.source | replace: pwd, "" | cc_jsonify }}
|
35
36
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"time": {{ site.time | cc_jsonify }},
|
2
|
+
"time": {{ site.time | date_to_xmlschema | cc_jsonify }},
|
3
3
|
"cloudcannon": {
|
4
4
|
"name": "cloudcannon-jekyll",
|
5
5
|
"version": {{ gem_version | cc_jsonify }}
|
@@ -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 %}
|
@@ -25,11 +25,12 @@
|
|
25
25
|
"uploads": {{ config.uploads_dir | cc_jsonify }},
|
26
26
|
"plugins": {{ config.plugins_dir | cc_jsonify }},
|
27
27
|
"data": {{ config.data_dir | cc_jsonify }},
|
28
|
+
"pages": "",
|
28
29
|
"collections": {{ config.collections_dir | cc_jsonify }},
|
29
30
|
"includes": {{ config.includes_dir | cc_jsonify }},
|
30
31
|
"layouts": {{ config.layouts_dir | cc_jsonify }}
|
31
32
|
},
|
32
|
-
{% if config._array_structures %}"array-structures": {{ config._array_structures | cc_jsonify }},{% endif %}
|
33
|
+
{% if config._array_structures %}"array-structures": {{ config._array_structures | cc_jsonify: nil, 20 }},{% endif %}
|
33
34
|
{% assign select_data = config | cc_select_data_jsonify %}{% if select_data %}"select-data": {{ select_data }},{% endif %}
|
34
35
|
"source": {{ config.source | replace: pwd, "" | cc_jsonify }}
|
35
36
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"time": {{ site.time | cc_jsonify }},
|
2
|
+
"time": {{ site.time | date_to_xmlschema | cc_jsonify }},
|
3
3
|
"cloudcannon": {
|
4
4
|
"name": "cloudcannon-jekyll",
|
5
5
|
"version": {{ gem_version | cc_jsonify }}
|
@@ -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 %}
|
@@ -43,12 +41,13 @@
|
|
43
41
|
"uploads": {{ config.uploads_dir | cc_jsonify }},
|
44
42
|
"plugins": {{ config.plugins_dir | cc_jsonify }},
|
45
43
|
"data": {{ config.data_dir | cc_jsonify }},
|
44
|
+
"pages": "",
|
46
45
|
"collections": {{ config.collections_dir | cc_jsonify }},
|
47
46
|
"includes": {{ config.includes_dir | cc_jsonify }},
|
48
47
|
"layouts": {{ config.layouts_dir | cc_jsonify }}
|
49
48
|
},
|
50
49
|
{% if config._array_structures -%}
|
51
|
-
"array-structures": {{ config._array_structures | cc_jsonify }},
|
50
|
+
"array-structures": {{ config._array_structures | cc_jsonify: nil, 20 }},
|
52
51
|
{%- endif %}
|
53
52
|
{% assign select_data = config | cc_select_data_jsonify -%}
|
54
53
|
{% if select_data -%}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"time": {{ site.time | cc_jsonify }},
|
2
|
+
"time": {{ site.time | date_to_xmlschema | cc_jsonify }},
|
3
3
|
"cloudcannon": {
|
4
4
|
"name": "cloudcannon-jekyll",
|
5
5
|
"version": {{ gem_version | cc_jsonify }}
|
@@ -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
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"time": {{ site.time | cc_jsonify }},
|
2
|
+
"time": {{ site.time | date_to_xmlschema | cc_jsonify }},
|
3
3
|
"cloudcannon": {
|
4
4
|
"name": "cloudcannon-jekyll",
|
5
5
|
"version": {{ gem_version | cc_jsonify }}
|
@@ -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
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"time": {{ site.time | cc_jsonify }},
|
2
|
+
"time": {{ site.time | date_to_xmlschema | cc_jsonify }},
|
3
3
|
"cloudcannon": {
|
4
4
|
"name": "cloudcannon-jekyll",
|
5
5
|
"version": {{ gem_version | cc_jsonify }}
|
@@ -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
|
}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module CloudCannonJekyll
|
4
|
+
# Processes Jekyll configuration to enable the plugin is run and fix common issues
|
4
5
|
class Configuration
|
5
6
|
def self.processed?(site)
|
6
7
|
site.instance_variable_get(:@_cloudcannon_jekyll_processed) == true
|
@@ -16,7 +17,7 @@ module CloudCannonJekyll
|
|
16
17
|
config = config.fix_common_issues if config.respond_to? :fix_common_issues
|
17
18
|
config = config.add_default_excludes if config.respond_to? :add_default_excludes
|
18
19
|
|
19
|
-
key = Jekyll::VERSION.start_with?("2") ? "gems" : "plugins"
|
20
|
+
key = Jekyll::VERSION.start_with?("2.") ? "gems" : "plugins"
|
20
21
|
|
21
22
|
config[key] = Array(config[key])
|
22
23
|
config[key].push("cloudcannon-jekyll") unless config[key].include? "cloudcannon-jekyll"
|
@@ -2,32 +2,120 @@
|
|
2
2
|
|
3
3
|
require "jekyll"
|
4
4
|
require "fileutils"
|
5
|
+
require_relative "reader"
|
5
6
|
|
6
7
|
module CloudCannonJekyll
|
8
|
+
# Generates JSON files containing build config and build output details
|
7
9
|
class Generator < Jekyll::Generator
|
8
10
|
priority :lowest
|
9
11
|
|
10
12
|
def generate(site)
|
11
13
|
@site = site
|
14
|
+
@reader = Reader.new(@site)
|
15
|
+
|
16
|
+
collections_config = @site.config["collections"].dup || {}
|
12
17
|
|
13
18
|
payload = @site.site_payload.merge({
|
14
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({
|
15
27
|
"pwd" => Dir.pwd,
|
16
28
|
"config" => @site.config,
|
17
|
-
|
29
|
+
"collections" => collections_config,
|
30
|
+
}))
|
31
|
+
|
32
|
+
generate_file("details", payload.merge({
|
33
|
+
"drafts" => drafts,
|
34
|
+
}))
|
35
|
+
end
|
18
36
|
|
19
|
-
|
20
|
-
|
37
|
+
def collections_dir
|
38
|
+
return "" if Jekyll::VERSION.start_with? "2."
|
21
39
|
|
22
|
-
@site.
|
23
|
-
|
24
|
-
|
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
|
25
111
|
end
|
26
112
|
|
27
113
|
def generate_file(filename, data)
|
28
114
|
dest = destination_path(filename)
|
29
115
|
FileUtils.mkdir_p(File.dirname(dest))
|
30
|
-
File.open(dest, "w") { |
|
116
|
+
File.open(dest, "w") { |file| file.write(file_content(filename, data)) }
|
117
|
+
@site.keep_files ||= []
|
118
|
+
@site.keep_files << path(filename)
|
31
119
|
end
|
32
120
|
|
33
121
|
def version_path_suffix
|
@@ -50,13 +138,13 @@ module CloudCannonJekyll
|
|
50
138
|
end
|
51
139
|
|
52
140
|
def file_content(filename, data)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
141
|
+
page = PageWithoutAFile.new(@site, File.dirname(__FILE__), "", path(filename))
|
142
|
+
page.content = File.read(source_path(filename))
|
143
|
+
page.data["layout"] = nil
|
144
|
+
page.data["sitemap"] = false
|
145
|
+
page.data["permalink"] = "/#{path(filename)}"
|
146
|
+
page.render({}, data)
|
147
|
+
page.output
|
60
148
|
end
|
61
149
|
end
|
62
150
|
end
|
@@ -3,7 +3,10 @@
|
|
3
3
|
require "jekyll"
|
4
4
|
|
5
5
|
module CloudCannonJekyll
|
6
|
+
# Filter for converting Jekyll objects into JSON
|
6
7
|
module JsonifyFilter
|
8
|
+
STATIC_EXTENSIONS = [".html", ".htm"].freeze
|
9
|
+
|
7
10
|
CC_JSONIFY_KEY_SWAPS = {
|
8
11
|
"collections" => {
|
9
12
|
"_sort_key" => "_sort-key",
|
@@ -42,102 +45,101 @@ module CloudCannonJekyll
|
|
42
45
|
@simple_types.include?(input.class) || [true, false].include?(input)
|
43
46
|
end
|
44
47
|
|
45
|
-
def self.static_file_to_json(input, depth)
|
48
|
+
def self.static_file_to_json(input, depth, max_depth)
|
49
|
+
path = input.relative_path.sub(%r!^\/+!, "")
|
50
|
+
url = Jekyll::VERSION.start_with?("2.") ? "/#{path}" : input.url
|
51
|
+
|
46
52
|
out = [
|
47
|
-
"\"
|
48
|
-
"\"
|
53
|
+
"\"path\": #{JsonifyFilter.to_json(path, depth, max_depth)}",
|
54
|
+
"\"url\": #{JsonifyFilter.to_json(url, depth, max_depth)}",
|
49
55
|
]
|
50
56
|
|
51
|
-
# modified_time isn't defined in Jekyll 2.4.0
|
52
|
-
if input.respond_to? :modified_time
|
53
|
-
out.push("\"modified_time\": #{JsonifyFilter.to_json(input.modified_time, depth + 1)}")
|
54
|
-
end
|
55
|
-
|
56
57
|
"{#{out.join(",")}}"
|
57
58
|
end
|
58
59
|
|
59
|
-
def self.
|
60
|
+
def self.document_data_to_a(data, prevent, depth, max_depth)
|
60
61
|
prevent += %w(content output next previous excerpt)
|
61
62
|
|
62
|
-
data.
|
63
|
+
out = data.map do |key, value|
|
63
64
|
next if prevent.include? key
|
64
65
|
|
65
66
|
prevent.push key
|
66
|
-
|
67
|
+
"#{key.to_json}: #{JsonifyFilter.to_json(value, depth, max_depth)}"
|
67
68
|
end
|
68
69
|
|
69
|
-
|
70
|
+
out.compact
|
70
71
|
end
|
71
72
|
|
72
|
-
def self.legacy_post_to_json(input, depth)
|
73
|
+
def self.legacy_post_to_json(input, depth, max_depth)
|
73
74
|
prevent = %w(dir name path url date id categories tags)
|
74
75
|
|
75
76
|
out = [
|
76
|
-
"\"
|
77
|
-
"\"
|
78
|
-
"\"
|
79
|
-
"\"
|
80
|
-
"\"
|
81
|
-
"\"
|
82
|
-
"\"
|
83
|
-
"\"tags\": #{JsonifyFilter.to_json(input.tags, depth + 1)}",
|
77
|
+
"\"name\": #{JsonifyFilter.to_json(input.name, depth, max_depth)}",
|
78
|
+
"\"path\": #{JsonifyFilter.to_json(input.path, depth, max_depth)}",
|
79
|
+
"\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
|
80
|
+
"\"date\": #{JsonifyFilter.to_json(input.date, depth, max_depth)}",
|
81
|
+
"\"id\": #{JsonifyFilter.to_json(input.id, depth, max_depth)}",
|
82
|
+
"\"categories\": #{JsonifyFilter.to_json(input.categories, depth, max_depth)}",
|
83
|
+
"\"tags\": #{JsonifyFilter.to_json(input.tags, depth, max_depth)}",
|
84
84
|
]
|
85
85
|
|
86
|
-
JsonifyFilter.
|
86
|
+
out += JsonifyFilter.document_data_to_a(input.data, prevent, depth, max_depth)
|
87
|
+
"{#{out.join(",")}}"
|
87
88
|
end
|
88
89
|
|
89
|
-
def self.page_to_json(input, depth)
|
90
|
+
def self.page_to_json(input, depth, max_depth)
|
90
91
|
prevent = %w(dir name path url)
|
91
92
|
|
92
93
|
out = [
|
93
|
-
"\"
|
94
|
-
"\"
|
95
|
-
"\"
|
96
|
-
"\"url\": #{JsonifyFilter.to_json(input.url, depth + 1)}",
|
94
|
+
"\"name\": #{JsonifyFilter.to_json(input.name, depth, max_depth)}",
|
95
|
+
"\"path\": #{JsonifyFilter.to_json(input.path, depth, max_depth)}",
|
96
|
+
"\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
|
97
97
|
]
|
98
98
|
|
99
99
|
# Merge Jekyll Defaults into data for pages (missing at v3.8.5)
|
100
|
-
defaults = input.site.frontmatter_defaults.all(input.relative_path, :pages).tap do |
|
101
|
-
|
100
|
+
defaults = input.site.frontmatter_defaults.all(input.relative_path, :pages).tap do |default|
|
101
|
+
default.delete("date")
|
102
102
|
end
|
103
103
|
|
104
104
|
data = Jekyll::Utils.deep_merge_hashes(defaults, input.data)
|
105
|
-
|
105
|
+
|
106
|
+
out += JsonifyFilter.document_data_to_a(data, prevent, depth, max_depth)
|
107
|
+
"{#{out.join(",")}}"
|
106
108
|
end
|
107
109
|
|
108
|
-
def self.document_to_json(input, depth)
|
110
|
+
def self.document_to_json(input, depth, max_depth)
|
109
111
|
prevent = %w(dir id relative_path url collection)
|
110
112
|
|
111
113
|
out = [
|
112
|
-
"\"path\": #{JsonifyFilter.to_json(input.relative_path, depth
|
113
|
-
"\"
|
114
|
-
"\"url\": #{JsonifyFilter.to_json(input.url, depth + 1)}",
|
114
|
+
"\"path\": #{JsonifyFilter.to_json(input.relative_path, depth, max_depth)}",
|
115
|
+
"\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
|
115
116
|
]
|
116
117
|
|
117
|
-
|
118
|
-
|
118
|
+
collection = input.collection
|
119
|
+
unless collection.nil?
|
120
|
+
collection_json = JsonifyFilter.to_json(collection.label, depth, max_depth)
|
121
|
+
out.push("\"collection\": #{collection_json}")
|
119
122
|
end
|
120
123
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
JsonifyFilter.document_data_to_json(input.data, out, prevent, depth)
|
124
|
+
out += JsonifyFilter.document_data_to_a(input.data, prevent, depth, max_depth)
|
125
|
+
"{#{out.join(",")}}"
|
125
126
|
end
|
126
127
|
|
127
|
-
def self.array_to_json(input, depth, key_swaps = {})
|
128
|
+
def self.array_to_json(input, depth, max_depth, key_swaps = {})
|
128
129
|
array = input.map do |value|
|
129
|
-
JsonifyFilter.to_json(value, depth
|
130
|
+
JsonifyFilter.to_json(value, depth, max_depth, key_swaps)
|
130
131
|
end
|
131
132
|
|
132
133
|
"[#{array.join(",")}]"
|
133
134
|
end
|
134
135
|
|
135
|
-
def self.hash_to_json(input, depth, key_swaps = {})
|
136
|
-
|
137
|
-
|
136
|
+
def self.hash_to_json(input, depth, max_depth, key_swaps = {})
|
137
|
+
out = input.map do |key, value|
|
138
|
+
string_key = (key_swaps[key] || key).to_s.to_json
|
139
|
+
"#{string_key}: #{JsonifyFilter.to_json(value, depth, max_depth, key_swaps)}"
|
138
140
|
end
|
139
141
|
|
140
|
-
"{#{
|
142
|
+
"{#{out.join(",")}}"
|
141
143
|
end
|
142
144
|
|
143
145
|
def self.config_to_select_data_json(input, depth)
|
@@ -155,7 +157,7 @@ module CloudCannonJekyll
|
|
155
157
|
next if prevent.include? key
|
156
158
|
|
157
159
|
prevent.push key
|
158
|
-
"#{key.to_json}: #{JsonifyFilter.to_json(value, depth
|
160
|
+
"#{key.to_s.to_json}: #{JsonifyFilter.to_json(value, depth)}"
|
159
161
|
end
|
160
162
|
|
161
163
|
out.compact!
|
@@ -163,39 +165,37 @@ module CloudCannonJekyll
|
|
163
165
|
"{#{out.join(",")}}" if out.any?
|
164
166
|
end
|
165
167
|
|
166
|
-
def self.to_json(input, depth, key_swaps = {})
|
167
|
-
|
168
|
+
def self.to_json(input, depth, max_depth = 9, key_swaps = {})
|
169
|
+
depth += 1
|
170
|
+
|
171
|
+
if depth > max_depth || (depth > 2 && JsonifyFilter.document_type?(input))
|
168
172
|
'"MAXIMUM_DEPTH"'
|
169
173
|
elsif JsonifyFilter.simple_type?(input)
|
170
174
|
input.to_json
|
171
175
|
elsif input.is_a?(Jekyll::StaticFile)
|
172
|
-
JsonifyFilter.static_file_to_json(input, depth)
|
176
|
+
JsonifyFilter.static_file_to_json(input, depth, max_depth)
|
173
177
|
elsif input.is_a?(Jekyll::Page)
|
174
|
-
JsonifyFilter.page_to_json(input, depth)
|
178
|
+
JsonifyFilter.page_to_json(input, depth, max_depth)
|
175
179
|
elsif Jekyll::VERSION.start_with?("2.") && input.is_a?(Jekyll::Post)
|
176
|
-
JsonifyFilter.legacy_post_to_json(input, depth)
|
180
|
+
JsonifyFilter.legacy_post_to_json(input, depth, max_depth)
|
177
181
|
elsif input.is_a?(Jekyll::Document)
|
178
|
-
JsonifyFilter.document_to_json(input, depth)
|
182
|
+
JsonifyFilter.document_to_json(input, depth, max_depth)
|
179
183
|
elsif input.is_a?(Array)
|
180
|
-
JsonifyFilter.array_to_json(input, depth, key_swaps)
|
184
|
+
JsonifyFilter.array_to_json(input, depth, max_depth, key_swaps)
|
181
185
|
elsif input.is_a?(Hash)
|
182
|
-
JsonifyFilter.hash_to_json(input, depth, key_swaps)
|
186
|
+
JsonifyFilter.hash_to_json(input, depth, max_depth, key_swaps)
|
183
187
|
else
|
184
188
|
input.class.to_s.prepend("UNSUPPORTED:").to_json
|
185
189
|
end
|
186
190
|
end
|
187
191
|
|
188
192
|
def cc_static_files_jsonify(input)
|
189
|
-
out =
|
190
|
-
|
191
|
-
next if page.extname != ".html" &&
|
192
|
-
page.extname != ".htm" &&
|
193
|
-
page.path != "/robots.txt" &&
|
194
|
-
page.path != "/sitemap.xml"
|
195
|
-
|
196
|
-
out.push(JsonifyFilter.to_json(page, 1))
|
193
|
+
out = input.map do |page|
|
194
|
+
JsonifyFilter.to_json(page, 1) if STATIC_EXTENSIONS.include?(page.extname)
|
197
195
|
end
|
198
196
|
|
197
|
+
out.compact!
|
198
|
+
|
199
199
|
"[#{out.join(",")}]"
|
200
200
|
end
|
201
201
|
|
@@ -207,11 +207,11 @@ module CloudCannonJekyll
|
|
207
207
|
end
|
208
208
|
end
|
209
209
|
|
210
|
-
def cc_jsonify(input, key_swaps_key = nil)
|
210
|
+
def cc_jsonify(input, key_swaps_key = nil, max_depth = 8)
|
211
211
|
if CC_JSONIFY_KEY_SWAPS.key? key_swaps_key
|
212
|
-
JsonifyFilter.to_json(input, 0, CC_JSONIFY_KEY_SWAPS[key_swaps_key])
|
212
|
+
JsonifyFilter.to_json(input, 0, max_depth, CC_JSONIFY_KEY_SWAPS[key_swaps_key])
|
213
213
|
else
|
214
|
-
JsonifyFilter.to_json(input, 0)
|
214
|
+
JsonifyFilter.to_json(input, 0, max_depth)
|
215
215
|
end
|
216
216
|
end
|
217
217
|
end
|
@@ -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: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CloudCannon
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -107,7 +107,9 @@ executables: []
|
|
107
107
|
extensions: []
|
108
108
|
extra_rdoc_files: []
|
109
109
|
files:
|
110
|
+
- ".github/workflows/stale.yml"
|
110
111
|
- ".gitignore"
|
112
|
+
- ".reek.yml"
|
111
113
|
- ".rspec"
|
112
114
|
- ".rubocop.yml"
|
113
115
|
- ".travis.yml"
|
@@ -128,6 +130,9 @@ files:
|
|
128
130
|
- lib/cloudcannon-jekyll/generator.rb
|
129
131
|
- lib/cloudcannon-jekyll/jsonify-filter.rb
|
130
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
|
131
136
|
- lib/cloudcannon-jekyll/version.rb
|
132
137
|
- script/ci-smoke-test
|
133
138
|
- script/cibuild
|
@@ -137,7 +142,7 @@ homepage: https://github.com/cloudcannon/cloudcannon-jekyll
|
|
137
142
|
licenses:
|
138
143
|
- MIT
|
139
144
|
metadata: {}
|
140
|
-
post_install_message:
|
145
|
+
post_install_message:
|
141
146
|
rdoc_options: []
|
142
147
|
require_paths:
|
143
148
|
- lib
|
@@ -153,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
158
|
version: '0'
|
154
159
|
requirements: []
|
155
160
|
rubygems_version: 3.0.3
|
156
|
-
signing_key:
|
161
|
+
signing_key:
|
157
162
|
specification_version: 4
|
158
163
|
summary: CloudCannon Jekyll integration
|
159
164
|
test_files: []
|