cloudcannon-jekyll 1.4.1 → 1.5.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27fc78b980c8ee16f5bb1f9576d7536a16912d5fb41f4074e6768e88488ccf97
4
- data.tar.gz: fd725b0483c287da1d952f910d1c8b9e451bd221fe58a8dd190cff4d95531d49
3
+ metadata.gz: 1622ca2b9f7eef0279882f94f4364c67ffdd9c403dbfc345bc882268ecd0f998
4
+ data.tar.gz: e3dab9c9f8fb8090c16c4c3c963566143bfe9a7d4fc18f674c1b33691c377575
5
5
  SHA512:
6
- metadata.gz: 67cee5772f33736f2ec69a99a1c3dd9fef9dd0eeacff28c3fe7ebb9dafc4fe2ddf9d26ffc34f82445bd42f4a659fd49e1cad4d6057a28aa24bb000a79822bb4d
7
- data.tar.gz: b062438425381b74c995c0566f31ef964788ab310a03f74db7918e7bbab22bd73dfba3249ef33e0243c7d48134ad626b029cebb61a01a07fec223c0a4aeab75e
6
+ metadata.gz: 748183e00870b67a650ce2cd0386519faffc651750504804bd66d0dd133576a714221d64405d7afc9729558ec6eb8719e3105ee349b4155c53c87af3fffc3351
7
+ data.tar.gz: e3d770a079ae5a349b7ceec3c1dc4db930bd294a3856c991520bdfe8624a901d00749f37b4fb825dbdfa1e56f67934179c8b0f0ac585968ec9cc30483e50d96b
@@ -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
@@ -0,0 +1,6 @@
1
+ detectors:
2
+ LongParameterList:
3
+ max_params: 4 # Matches the Rubocop setting
4
+
5
+ exclude_paths:
6
+ - spec
@@ -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,35 @@
1
+ # 1.5.3
2
+
3
+ * Rework fallback for older versions of Jekyll when reading data, posts and drafts
4
+ * Fix deprecation warning for `posts.map`
5
+
6
+ # 1.5.2
7
+
8
+ * Fix for empty collection configurations
9
+
10
+ # 1.5.1
11
+
12
+ * Add empty paths.pages
13
+
14
+ # 1.5.0
15
+
16
+ * Added drafts to collections in details
17
+ * Added drafts and data to collections in config
18
+ * Added category folder drafts and posts to collections in config
19
+ * Added `_path` field to each collection definition in config
20
+ * Removed some unused fields
21
+ * Renamed static to static-pages in details and removed `robots.txt` and `sitemap.xml` exceptions
22
+ * Add `url` to static-pages
23
+ * Normalise `_path` in static-pages
24
+
25
+ # 1.4.3
26
+
27
+ * Fix off-by-one depth for nested documents from last change
28
+
29
+ # 1.4.2
30
+
31
+ * Added max depth parameter for jsonify filter and increase it for array structures in config output
32
+
1
33
  # 1.4.1
2
34
 
3
35
  * Added JSON handling for integers in hash keys
@@ -10,9 +10,9 @@ require_relative "cloudcannon-jekyll/version"
10
10
 
11
11
  Liquid::Template.register_filter(CloudCannonJekyll::JsonifyFilter)
12
12
 
13
- # Hooks didn't exist in Jekyll 2 so we monkey patch to get an :after_reset hook
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
 
@@ -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
- {% if config.collections %}"collections": {{ config.collections | cc_jsonify: 'collections' }},{% endif %}
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
  }
@@ -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
- {% if config.collections %}"collections": {{ config.collections | cc_jsonify: 'collections' }},{% endif %}
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
  }
@@ -12,9 +12,7 @@
12
12
  {% if config.baseurl -%}
13
13
  "base-url": {{ config.baseurl | cc_jsonify }},
14
14
  {%- endif %}
15
- {% if config.collections -%}
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 -%}
@@ -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
  }
@@ -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,128 @@
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 || {}
17
+
18
+ # Workaround for empty collection configurations
19
+ collections_config.each_key do |key|
20
+ collections_config[key] ||= { "output" => false }
21
+ end
12
22
 
13
23
  payload = @site.site_payload.merge({
14
24
  "gem_version" => CloudCannonJekyll::VERSION,
25
+ })
26
+
27
+ drafts = add_blogging_config(collections_config)
28
+ add_collection_paths(collections_config)
29
+ add_data_config(collections_config)
30
+
31
+ generate_file("config", payload.merge({
15
32
  "pwd" => Dir.pwd,
16
33
  "config" => @site.config,
17
- })
34
+ "collections" => collections_config,
35
+ }))
18
36
 
19
- generate_file("details", payload)
20
- generate_file("config", payload)
37
+ generate_file("details", payload.merge({
38
+ "drafts" => drafts,
39
+ }))
40
+ end
21
41
 
22
- @site.keep_files ||= []
23
- @site.keep_files << path("details")
24
- @site.keep_files << path("config")
42
+ def collections_dir
43
+ return "" if Jekyll::VERSION.start_with? "2."
44
+
45
+ @site.config["collections_dir"] || ""
46
+ end
47
+
48
+ def data_dir
49
+ @site.config["data_dir"] || "_data"
50
+ end
51
+
52
+ # rubocop:disable Metrics/AbcSize
53
+ def add_category_folder_config(collections_config, posts_config = {})
54
+ posts = @site.posts || @site.collections["posts"]
55
+ docs = posts.class.method_defined?(:docs) ? posts.docs : posts
56
+ seen = {}
57
+
58
+ docs.map do |post|
59
+ parts = post.relative_path.split("/_posts/")
60
+ path = parts.first
61
+
62
+ # Ignore unless it's an unseen category folder post
63
+ next if parts.length < 2 || path.empty? || seen[path]
64
+
65
+ # Could check this to ensure raw files exist since posts can be generated without files
66
+ # next if @reader.read_posts(parts[0]).empty?
67
+
68
+ seen[path] = true
69
+ folder = path.sub(%r!^\/+!, "")
70
+ collections_path = "#{collections_dir}/#{folder}".gsub(%r!\/+!, "/").sub(%r!^\/+!, "")
71
+
72
+ collections_config["#{folder}/posts"] = posts_config.merge({
73
+ "_path" => "#{collections_path}/_posts",
74
+ })
75
+
76
+ # Adding the category draft config like this isn't ideal, since you could have drafts
77
+ # without posts, but it's a decent trade off vs looking for _drafts folders
78
+ collections_config["#{folder}/drafts"] = posts_config.merge({
79
+ "_path" => "#{collections_path}/_drafts",
80
+ })
81
+
82
+ path
83
+ end
84
+ end
85
+ # rubocop:enable Metrics/AbcSize
86
+
87
+ # Add data to collections config if raw data files exist
88
+ def add_data_config(collections_config)
89
+ data_files = @reader.read_data(data_dir)
90
+ collections_config["data"] = { "_path" => data_dir } if data_files&.keys&.any?
91
+ end
92
+
93
+ # Add posts/drafts to collections config
94
+ def add_blogging_config(collections_config)
95
+ collections_config["posts"] = { "output" => true } if Jekyll::VERSION.start_with? "2."
96
+ drafts = @reader.read_drafts(collections_dir)
97
+
98
+ if collections_config.key?("posts")
99
+ collections_config["drafts"] = collections_config["posts"].dup
100
+ elsif drafts.any?
101
+ collections_config["drafts"] = {}
102
+ end
103
+
104
+ folders = add_category_folder_config(collections_config, collections_config["posts"])
105
+ folders.compact.each do |folder|
106
+ drafts += @reader.read_drafts(folder)
107
+ end
108
+
109
+ drafts
110
+ end
111
+
112
+ # Add _path to each collection config
113
+ def add_collection_paths(collections_config)
114
+ collections_config.each do |key, collection|
115
+ next if collection.key?("_path")
116
+
117
+ collection["_path"] = File.join(collections_dir, "_#{key}").sub(%r!^\/+!, "")
118
+ end
25
119
  end
26
120
 
27
121
  def generate_file(filename, data)
28
122
  dest = destination_path(filename)
29
123
  FileUtils.mkdir_p(File.dirname(dest))
30
- File.open(dest, "w") { |f| f.write(file_content(filename, data)) }
124
+ File.open(dest, "w") { |file| file.write(file_content(filename, data)) }
125
+ @site.keep_files ||= []
126
+ @site.keep_files << path(filename)
31
127
  end
32
128
 
33
129
  def version_path_suffix
@@ -50,13 +146,13 @@ module CloudCannonJekyll
50
146
  end
51
147
 
52
148
  def file_content(filename, data)
53
- json = PageWithoutAFile.new(@site, File.dirname(__FILE__), "", path(filename))
54
- json.content = File.read(source_path(filename))
55
- json.data["layout"] = nil
56
- json.data["sitemap"] = false
57
- json.data["permalink"] = "/#{path(filename)}"
58
- json.render({}, data)
59
- json.output
149
+ page = PageWithoutAFile.new(@site, File.dirname(__FILE__), "", path(filename))
150
+ page.content = File.read(source_path(filename))
151
+ page.data["layout"] = nil
152
+ page.data["sitemap"] = false
153
+ page.data["permalink"] = "/#{path(filename)}"
154
+ page.render({}, data)
155
+ page.output
60
156
  end
61
157
  end
62
158
  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",
@@ -41,103 +44,101 @@ module CloudCannonJekyll
41
44
  @simple_types.include?(input.class) || [true, false].include?(input)
42
45
  end
43
46
 
44
- def self.static_file_to_json(input, depth)
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
+
45
51
  out = [
46
- "\"extname\": #{JsonifyFilter.to_json(input.extname, depth + 1)}",
47
- "\"path\": #{JsonifyFilter.to_json(input.relative_path, depth + 1)}",
52
+ "\"path\": #{JsonifyFilter.to_json(path, depth, max_depth)}",
53
+ "\"url\": #{JsonifyFilter.to_json(url, depth, max_depth)}",
48
54
  ]
49
55
 
50
- # modified_time isn't defined in Jekyll 2.4.0
51
- if input.respond_to? :modified_time
52
- out.push("\"modified_time\": #{JsonifyFilter.to_json(input.modified_time, depth + 1)}")
53
- end
54
-
55
56
  "{#{out.join(",")}}"
56
57
  end
57
58
 
58
- def self.document_data_to_json(data, out, prevent, depth)
59
+ def self.document_data_to_a(data, prevent, depth, max_depth)
59
60
  prevent += %w(content output next previous excerpt)
60
61
 
61
- data.each do |key, value|
62
+ out = data.map do |key, value|
62
63
  next if prevent.include? key
63
64
 
64
65
  prevent.push key
65
- out.push("#{key.to_json}: #{JsonifyFilter.to_json(value, depth + 1)}")
66
+ "#{key.to_json}: #{JsonifyFilter.to_json(value, depth, max_depth)}"
66
67
  end
67
68
 
68
- "{#{out.join(",")}}"
69
+ out.compact
69
70
  end
70
71
 
71
- def self.legacy_post_to_json(input, depth)
72
+ def self.legacy_post_to_json(input, depth, max_depth)
72
73
  prevent = %w(dir name path url date id categories tags)
73
74
 
74
75
  out = [
75
- "\"dir\": #{JsonifyFilter.to_json(input.dir, depth + 1)}",
76
- "\"name\": #{JsonifyFilter.to_json(input.name, depth + 1)}",
77
- "\"path\": #{JsonifyFilter.to_json(input.path, depth + 1)}",
78
- "\"url\": #{JsonifyFilter.to_json(input.url, depth + 1)}",
79
- "\"date\": #{JsonifyFilter.to_json(input.date, depth + 1)}",
80
- "\"id\": #{JsonifyFilter.to_json(input.id, depth + 1)}",
81
- "\"categories\": #{JsonifyFilter.to_json(input.categories, depth + 1)}",
82
- "\"tags\": #{JsonifyFilter.to_json(input.tags, depth + 1)}",
76
+ "\"name\": #{JsonifyFilter.to_json(input.name, depth, max_depth)}",
77
+ "\"path\": #{JsonifyFilter.to_json(input.path, depth, max_depth)}",
78
+ "\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
79
+ "\"date\": #{JsonifyFilter.to_json(input.date, depth, max_depth)}",
80
+ "\"id\": #{JsonifyFilter.to_json(input.id, depth, max_depth)}",
81
+ "\"categories\": #{JsonifyFilter.to_json(input.categories, depth, max_depth)}",
82
+ "\"tags\": #{JsonifyFilter.to_json(input.tags, depth, max_depth)}",
83
83
  ]
84
84
 
85
- JsonifyFilter.document_data_to_json(input.data, out, prevent, depth)
85
+ out += JsonifyFilter.document_data_to_a(input.data, prevent, depth, max_depth)
86
+ "{#{out.join(",")}}"
86
87
  end
87
88
 
88
- def self.page_to_json(input, depth)
89
+ def self.page_to_json(input, depth, max_depth)
89
90
  prevent = %w(dir name path url)
90
91
 
91
92
  out = [
92
- "\"dir\": #{JsonifyFilter.to_json(input.dir, depth + 1)}",
93
- "\"name\": #{JsonifyFilter.to_json(input.name, depth + 1)}",
94
- "\"path\": #{JsonifyFilter.to_json(input.path, depth + 1)}",
95
- "\"url\": #{JsonifyFilter.to_json(input.url, depth + 1)}",
93
+ "\"name\": #{JsonifyFilter.to_json(input.name, depth, max_depth)}",
94
+ "\"path\": #{JsonifyFilter.to_json(input.path, depth, max_depth)}",
95
+ "\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
96
96
  ]
97
97
 
98
98
  # Merge Jekyll Defaults into data for pages (missing at v3.8.5)
99
- defaults = input.site.frontmatter_defaults.all(input.relative_path, :pages).tap do |h|
100
- h.delete("date")
99
+ defaults = input.site.frontmatter_defaults.all(input.relative_path, :pages).tap do |default|
100
+ default.delete("date")
101
101
  end
102
102
 
103
103
  data = Jekyll::Utils.deep_merge_hashes(defaults, input.data)
104
- JsonifyFilter.document_data_to_json(data, out, prevent, depth)
104
+
105
+ out += JsonifyFilter.document_data_to_a(data, prevent, depth, max_depth)
106
+ "{#{out.join(",")}}"
105
107
  end
106
108
 
107
- def self.document_to_json(input, depth)
109
+ def self.document_to_json(input, depth, max_depth)
108
110
  prevent = %w(dir id relative_path url collection)
109
111
 
110
112
  out = [
111
- "\"path\": #{JsonifyFilter.to_json(input.relative_path, depth + 1)}",
112
- "\"relative_path\": #{JsonifyFilter.to_json(input.relative_path, depth + 1)}",
113
- "\"url\": #{JsonifyFilter.to_json(input.url, depth + 1)}",
113
+ "\"path\": #{JsonifyFilter.to_json(input.relative_path, depth, max_depth)}",
114
+ "\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
114
115
  ]
115
116
 
116
- unless input.collection.nil?
117
- out.push("\"collection\": #{JsonifyFilter.to_json(input.collection.label, depth + 1)}")
117
+ collection = input.collection
118
+ unless collection.nil?
119
+ collection_json = JsonifyFilter.to_json(collection.label, depth, max_depth)
120
+ out.push("\"collection\": #{collection_json}")
118
121
  end
119
122
 
120
- # id isn't defined in Jekyll 2.4.0
121
- out.push("\"id\": #{JsonifyFilter.to_json(input.id, depth + 1)}") if input.respond_to? :id
122
-
123
- JsonifyFilter.document_data_to_json(input.data, out, prevent, depth)
123
+ out += JsonifyFilter.document_data_to_a(input.data, prevent, depth, max_depth)
124
+ "{#{out.join(",")}}"
124
125
  end
125
126
 
126
- def self.array_to_json(input, depth, key_swaps = {})
127
+ def self.array_to_json(input, depth, max_depth, key_swaps = {})
127
128
  array = input.map do |value|
128
- JsonifyFilter.to_json(value, depth + 1, key_swaps)
129
+ JsonifyFilter.to_json(value, depth, max_depth, key_swaps)
129
130
  end
130
131
 
131
132
  "[#{array.join(",")}]"
132
133
  end
133
134
 
134
- def self.hash_to_json(input, depth, key_swaps = {})
135
- hash = input.map do |key, value|
135
+ def self.hash_to_json(input, depth, max_depth, key_swaps = {})
136
+ out = input.map do |key, value|
136
137
  string_key = (key_swaps[key] || key).to_s.to_json
137
- "#{string_key}: #{JsonifyFilter.to_json(value, depth + 1, key_swaps)}"
138
+ "#{string_key}: #{JsonifyFilter.to_json(value, depth, max_depth, key_swaps)}"
138
139
  end
139
140
 
140
- "{#{hash.join(",")}}"
141
+ "{#{out.join(",")}}"
141
142
  end
142
143
 
143
144
  def self.config_to_select_data_json(input, depth)
@@ -155,7 +156,7 @@ module CloudCannonJekyll
155
156
  next if prevent.include? key
156
157
 
157
158
  prevent.push key
158
- "#{key.to_s.to_json}: #{JsonifyFilter.to_json(value, depth + 1)}"
159
+ "#{key.to_s.to_json}: #{JsonifyFilter.to_json(value, depth)}"
159
160
  end
160
161
 
161
162
  out.compact!
@@ -163,39 +164,37 @@ module CloudCannonJekyll
163
164
  "{#{out.join(",")}}" if out.any?
164
165
  end
165
166
 
166
- def self.to_json(input, depth, key_swaps = {})
167
- if depth > 8 || (depth > 2 && JsonifyFilter.document_type?(input))
167
+ def self.to_json(input, depth, max_depth = 9, key_swaps = {})
168
+ depth += 1
169
+
170
+ if depth > max_depth || (depth > 3 && JsonifyFilter.document_type?(input))
168
171
  '"MAXIMUM_DEPTH"'
169
172
  elsif JsonifyFilter.simple_type?(input)
170
173
  input.to_json
171
174
  elsif input.is_a?(Jekyll::StaticFile)
172
- JsonifyFilter.static_file_to_json(input, depth)
175
+ JsonifyFilter.static_file_to_json(input, depth, max_depth)
173
176
  elsif input.is_a?(Jekyll::Page)
174
- JsonifyFilter.page_to_json(input, depth)
177
+ JsonifyFilter.page_to_json(input, depth, max_depth)
175
178
  elsif Jekyll::VERSION.start_with?("2.") && input.is_a?(Jekyll::Post)
176
- JsonifyFilter.legacy_post_to_json(input, depth)
179
+ JsonifyFilter.legacy_post_to_json(input, depth, max_depth)
177
180
  elsif input.is_a?(Jekyll::Document)
178
- JsonifyFilter.document_to_json(input, depth)
181
+ JsonifyFilter.document_to_json(input, depth, max_depth)
179
182
  elsif input.is_a?(Array)
180
- JsonifyFilter.array_to_json(input, depth, key_swaps)
183
+ JsonifyFilter.array_to_json(input, depth, max_depth, key_swaps)
181
184
  elsif input.is_a?(Hash)
182
- JsonifyFilter.hash_to_json(input, depth, key_swaps)
185
+ JsonifyFilter.hash_to_json(input, depth, max_depth, key_swaps)
183
186
  else
184
187
  input.class.to_s.prepend("UNSUPPORTED:").to_json
185
188
  end
186
189
  end
187
190
 
188
191
  def cc_static_files_jsonify(input)
189
- out = []
190
- input.each do |page|
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))
192
+ out = input.map do |page|
193
+ JsonifyFilter.to_json(page, 1) if STATIC_EXTENSIONS.include?(page.extname)
197
194
  end
198
195
 
196
+ out.compact!
197
+
199
198
  "[#{out.join(",")}]"
200
199
  end
201
200
 
@@ -207,11 +206,11 @@ module CloudCannonJekyll
207
206
  end
208
207
  end
209
208
 
210
- def cc_jsonify(input, key_swaps_key = nil)
209
+ def cc_jsonify(input, key_swaps_key = nil, max_depth = 8)
211
210
  if CC_JSONIFY_KEY_SWAPS.key? key_swaps_key
212
- JsonifyFilter.to_json(input, 0, CC_JSONIFY_KEY_SWAPS[key_swaps_key])
211
+ JsonifyFilter.to_json(input, 0, max_depth, CC_JSONIFY_KEY_SWAPS[key_swaps_key])
213
212
  else
214
- JsonifyFilter.to_json(input, 0)
213
+ JsonifyFilter.to_json(input, 0, max_depth)
215
214
  end
216
215
  end
217
216
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CloudCannonJekyll
4
+ # Utility class to help generate files with no source file
4
5
  class PageWithoutAFile < Jekyll::Page
5
6
  def read_yaml(*)
6
7
  @data ||= {}
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
4
+
5
+ begin
6
+ require_relative "readers/data-reader"
7
+ rescue NameError
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
+ CloudCannonJekyll::DataReader.new(@site).read(dir)
22
+ rescue NameError # DataReader doesn't exist in old versions of Jekyll
23
+ CloudCannonJekyll::OldDataReader.new(@site).read(dir)
24
+ end
25
+
26
+ def read_drafts(dir = "")
27
+ Jekyll::PostReader.new(@site).read_drafts(dir)
28
+ rescue NameError # PostReader doesn't exist in old versions of Jekyll
29
+ @site.read_content(dir, "_drafts", Jekyll::Draft)
30
+ end
31
+
32
+ def read_posts(dir = "")
33
+ Jekyll::PostReader.new(@site).read_posts(dir)
34
+ rescue NameError # PostReader doesn't exist in old versions of Jekyll
35
+ @site.read_content(dir, "_posts", Jekyll::Post)
36
+ end
37
+ end
38
+ 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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CloudCannonJekyll
4
- VERSION = "1.4.1"
4
+ VERSION = "1.5.3"
5
5
  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.1
4
+ version: 1.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - CloudCannon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-22 00:00:00.000000000 Z
11
+ date: 2020-12-07 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