cloudcannon-jekyll 0.5.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc22c88ec15a9239eac56578dd09204ddd1a27708cb41049ee4a8159d1edd6f2
4
- data.tar.gz: af972170086e38401c6196e29525ee61cd1d2aea2a0bb2de244635619fadfdb4
3
+ metadata.gz: acbff58768a2a1c6d143ed8c0fe84cc1e3a6dc147e449fa91b69d24ea85655b8
4
+ data.tar.gz: 778145a334b54d304ff601c3547c397a6955b9edf7fa73e393565aa7a0a1d46b
5
5
  SHA512:
6
- metadata.gz: 93b5a09207c6295d0f72282449a1e78d62d2ecc014c9af3d44c524fb1d1d8a715de918e93271a740b85eb688fd817f980e6483b854e9664c73d001579a0c4053
7
- data.tar.gz: 5825c1c3fd9762691cf2c30042084cae6d476615225bd254cf07cd0d9e130bb464a972b9dbb4145389ae8668825e8e83ddf9059596590204bd9b4759b583c0d3
6
+ metadata.gz: dfd7cd98ba79c5b49e312f75f3ade2a844565f78e8a45d75e52d1776bbbf1c34b13aa9bac5de6a2b20314d2538fe80a261e2154dab4eeaf27187f639984e7700
7
+ data.tar.gz: cf9f07c980a416af440a2ba1b7f6ae20a420b8fe758752d736ad88878bf516bd8adb3bf7141725abfd100ff2c08cfc030db2f3d2753e3fff5416f9a8c7b95cd0
data/.gitignore CHANGED
@@ -1,7 +1,6 @@
1
1
  Gemfile.lock
2
2
  spec/dest/
3
- spec/fixtures/**/.jekyll-cache/
4
- spec/fixtures/**/.jekyll-metadata
3
+ spec/fixtures/.jekyll-cache/
5
4
  spec/fixtures/_site/
6
5
  gemfiles/.bundle/
7
6
  gemfiles/*.gemfile.lock
data/.rubocop.yml CHANGED
@@ -4,7 +4,7 @@ inherit_gem:
4
4
  rubocop-jekyll: .rubocop.yml
5
5
 
6
6
  AllCops:
7
- TargetRubyVersion: 2.4
7
+ TargetRubyVersion: 2.6
8
8
  Include:
9
9
  - lib/**/*.rb
10
10
 
@@ -20,30 +20,8 @@ AllCops:
20
20
  - script/**/*
21
21
  - vendor/**/*
22
22
  - gemfiles/**/*
23
+ - lib/cloudcannon-jekyll/safe-jsonify-filter.rb # TODO remove this and fix warnings
23
24
 
24
25
  Naming/MemoizedInstanceVariableName:
25
26
  Exclude:
26
27
  - lib/cloudcannon-jekyll/page-without-a-file.rb
27
-
28
- Metrics/CyclomaticComplexity:
29
- Exclude:
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
32
-
33
- Metrics/PerceivedComplexity:
34
- Exclude:
35
- - lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
36
-
37
- Metrics/AbcSize:
38
- Exclude:
39
- - lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
40
-
41
- # This is excluded since the ruby target is 2.3.8 which doesn't support String.match?(Regexp)
42
- Performance/RegexpMatch:
43
- Exclude:
44
- - lib/cloudcannon-jekyll/generator.rb
45
-
46
- # This is excluded since Jekyll used this and we need to check for it
47
- Lint/UnifiedInteger:
48
- Exclude:
49
- - lib/cloudcannon-jekyll/jsonify-filter.rb
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
  rvm:
4
- - 2.3.8
4
+ - 2.6
5
5
 
6
6
  before_install:
7
7
  - gem update --system
@@ -15,4 +15,5 @@ env:
15
15
  matrix:
16
16
  - JEKYLL_VERSION="2.4.0"
17
17
  - JEKYLL_VERSION="3.0.0"
18
- - JEKYLL_VERSION="3.2.1"
18
+ - JEKYLL_VERSION="3.8.5"
19
+ - JEKYLL_VERSION="4.0.0"
data/Gemfile CHANGED
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  source "https://rubygems.org"
4
2
 
5
3
  gemspec
data/HISTORY.md CHANGED
@@ -1,87 +1,7 @@
1
- # 0.5.0
1
+ # 1.0.0
2
2
 
3
- * Rename a number of top level configuration keys to match source keys
4
- * Combine `details.json` and `config.json` into `info.json`
5
- * Increase max depth for array structures defined outside of global
6
-
7
- # 0.4.0
8
-
9
- * Add `collections_dir` to details collection item paths
10
- * Fix pages collection clash with built-in pages
11
- * Fixed posts collection config data overwriting drafts data
12
- * Force generator to run after other lowest priority plugins
13
-
14
- # 0.3.4
15
-
16
- * Re-add id field for documents
17
- * Fix for potential nil reference
18
-
19
- # 0.3.3
20
-
21
- * Rework fallback for older versions of Jekyll when reading data, posts and drafts again
22
-
23
- # 0.3.2
24
-
25
- * Rework fallback for older versions of Jekyll when reading data, posts and drafts
26
- * Fix deprecation warning for `posts.map`
27
-
28
- # 0.3.1
29
-
30
- * Fix for empty collection configurations
31
- * Added max depth parameter for jsonify filter and increase it for array structures in config output
32
-
33
- # 0.3.0
34
-
35
- * Add empty paths.pages
36
- * Added drafts to collections in details
37
- * Added drafts and data to collections in config
38
- * Added category folder drafts and posts to collections in config
39
- * Added `_path` field to each collection definition in config
40
- * Removed some unused fields
41
- * Renamed static to static-pages in details and removed `robots.txt` and `sitemap.xml` exceptions
42
- * Add `url` to static-pages
43
- * Normalise `_path` in static-pages
44
-
45
- # 0.2.2
46
-
47
- * Added JSON handling for integers in hash keys
48
- * Fix typo for collections key in older Jekyll versions
49
- * Change date format to ISO8601
50
- * Validate against new version of config schema
51
-
52
- # 0.2.1
53
-
54
- * Add gem information and time to output config file
55
- * Fix missing in-place compact
56
- * Fix source being output as full path on disk
57
- * Read content for output config file directly from site config
58
-
59
- # 0.2.0
60
-
61
- * Add defaults and input-options keys to config output
62
- * Add more ignore keys for legacy select data filter
63
- * Reduce methods added from other plugins clashing
64
- * Fix invalid output when unsupported class found
65
-
66
- # 0.1.0
67
-
68
- * Add output config file
69
- * Add support for including only specified `data` keys
70
- * Fix invalid JSON issue for sites built with Jekyll 2 and no collections
71
- * Change module load style for easier dropping into _plugins
72
-
73
- # 0.0.8
74
-
75
- * Removed unsupported Jekyll test targets
76
-
77
- # 0.0.7
78
-
79
- * Fix invalid JSON issue for sites built with Jekyll 2 and no collections
80
-
81
- # 0.0.6
82
-
83
- * Fixed unsupported Fixnum for Ruby 2.3
84
- * Fixed reference to unsupported String::match? for Ruby 2.3
3
+ * Initial release
4
+ * Dropped support for ruby 2.3
85
5
 
86
6
  # 0.0.5
87
7
 
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A Jekyll plugin to create CloudCannon editor details.
4
4
 
5
- [![Build Status](https://travis-ci.com/CloudCannon/cloudcannon-jekyll.svg?branch=main)](https://travis-ci.com/CloudCannon/cloudcannon-jekyll) [![Gem Version](https://badge.fury.io/rb/cloudcannon-jekyll.svg)](https://badge.fury.io/rb/cloudcannon-jekyll)
5
+ [![Build Status](https://travis-ci.com/CloudCannon/cloudcannon-jekyll.svg?branch=master)](https://travis-ci.com/CloudCannon/cloudcannon-jekyll) [![Gem Version](https://badge.fury.io/rb/cloudcannon-jekyll.svg)](https://badge.fury.io/rb/cloudcannon-jekyll)
6
6
 
7
7
  ## Usage
8
8
 
@@ -1,6 +1,6 @@
1
- # frozen_string_literal: true
1
+ # coding: utf-8
2
2
 
3
- lib = File.expand_path("lib", __dir__)
3
+ lib = File.expand_path("../lib", __FILE__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  require "cloudcannon-jekyll/version"
@@ -19,11 +19,10 @@ Gem::Specification.new do |spec|
19
19
  all_files = `git ls-files -z`.split("\x0")
20
20
  spec.files = all_files.reject { |f| f.match(%r!^(test|spec|features)/!) }
21
21
 
22
- spec.add_dependency "jekyll", ">= 2.4.0", "< 4"
22
+ spec.add_dependency "jekyll", ">= 2.4.0", "< 5"
23
23
 
24
- spec.add_development_dependency "json_schemer", "~> 0.2.4"
25
24
  spec.add_development_dependency "rake", "~> 13.0"
26
25
  spec.add_development_dependency "rspec", "~> 3.9"
27
- spec.add_development_dependency "rubocop", "~> 0.80"
28
- spec.add_development_dependency "rubocop-jekyll", "~> 0.11"
26
+ spec.add_development_dependency "rubocop", "~> 0.71"
27
+ spec.add_development_dependency "rubocop-jekyll", "~> 0.10"
29
28
  end
@@ -0,0 +1,25 @@
1
+ {
2
+ "time": {{ site.time | jsonify }},
3
+ "cloudcannon": {
4
+ "name": "cloudcannon-jekyll",
5
+ "version": {{ gem_version | jsonify }}
6
+ },
7
+ "generator": {
8
+ "name": "jekyll",
9
+ "version": {{ jekyll.version | jsonify }},
10
+ "environment": {{ jekyll.env | jsonify }},
11
+ "metadata": {
12
+ "markdown": {{ site.markdown | cc_safe_jsonify }},
13
+ "kramdown": {{ site.kramdown | cc_safe_jsonify }},
14
+ "commonmark": {{ site.commonmark | cc_safe_jsonify }}
15
+ }
16
+ },{% if site.cloudcannon.data %}
17
+ "data": {{ site.data | cc_safe_jsonify }},{% endif %}
18
+ "collections": {
19
+ "posts": {{ site.posts | reverse | cc_safe_jsonify }},
20
+ {% for collection in site.collections %}"{{ collection[0] | xml_escape }}": {{ collection[1].docs | cc_safe_jsonify }}{% unless forloop.last %},{% endunless %}
21
+ {% endfor %}
22
+ },
23
+ "pages": {{ site.pages | cc_safe_jsonify }},
24
+ "static": {{ site.static_files | cc_static_files_jsonify }}
25
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "time": {{ site.time | jsonify }},
3
+ "cloudcannon": {
4
+ "name": "cloudcannon-jekyll",
5
+ "version": {{ gem_version | jsonify }}
6
+ },
7
+ "generator": {
8
+ "name": "jekyll",
9
+ "version": {{ jekyll.version | jsonify }},
10
+ "environment": {{ jekyll.env | jsonify }},
11
+ "metadata": {
12
+ "markdown": {{ site.markdown | cc_safe_jsonify }},
13
+ "kramdown": {{ site.kramdown | cc_safe_jsonify }},
14
+ "commonmark": {{ site.commonmark | cc_safe_jsonify }}
15
+ }
16
+ },{% if site.cloudcannon.data %}
17
+ "data": {{ site.data | cc_safe_jsonify }},{% endif %}
18
+ "collections": {
19
+ {% for collection in site.collections %}"{{ collection.label | xml_escape }}": {{ collection.docs | cc_safe_jsonify }}{% unless forloop.last %},{% endunless %}
20
+ {% endfor %}
21
+ },
22
+ "pages": {{ site.pages | cc_safe_jsonify }},
23
+ "static": {{ site.static_files | cc_static_files_jsonify }}
24
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "time": {{ site.time | jsonify }},
3
+ "cloudcannon": {
4
+ "name": "cloudcannon-jekyll",
5
+ "version": {{ gem_version | jsonify }}
6
+ },
7
+ "generator": {
8
+ "name": "jekyll",
9
+ "version": {{ jekyll.version | jsonify }},
10
+ "environment": {{ jekyll.env | jsonify }},
11
+ "metadata": {
12
+ "markdown": {{ site.markdown | cc_safe_jsonify }},
13
+ "kramdown": {{ site.kramdown | cc_safe_jsonify }},
14
+ "commonmark": {{ site.commonmark | cc_safe_jsonify }}
15
+ }
16
+ },
17
+ {%- if site.cloudcannon.data %}
18
+ "data": {{ site.data | cc_safe_jsonify }},
19
+ {% endif %}
20
+ "collections": {
21
+ {% for collection in site.collections -%}
22
+ "{{ collection.label | xml_escape }}": {{ collection.docs | cc_safe_jsonify }}
23
+ {%- unless forloop.last %},{% endunless %}
24
+ {%- endfor %}
25
+ },
26
+ "pages": {{ site.pages | cc_safe_jsonify }},
27
+ "static": {{ site.static_files | cc_static_files_jsonify }}
28
+ }
@@ -1,7 +1,6 @@
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
5
4
  class Configuration
6
5
  def self.processed?(site)
7
6
  site.instance_variable_get(:@_cloudcannon_jekyll_processed) == true
@@ -17,7 +16,7 @@ module CloudCannonJekyll
17
16
  config = config.fix_common_issues if config.respond_to? :fix_common_issues
18
17
  config = config.add_default_excludes if config.respond_to? :add_default_excludes
19
18
 
20
- key = Jekyll::VERSION.start_with?("2.") ? "gems" : "plugins"
19
+ key = Jekyll::VERSION.start_with?("2") ? "gems" : "plugins"
21
20
 
22
21
  config[key] = Array(config[key])
23
22
  config[key].push("cloudcannon-jekyll") unless config[key].include? "cloudcannon-jekyll"
@@ -2,170 +2,41 @@
2
2
 
3
3
  require "jekyll"
4
4
  require "fileutils"
5
- require_relative "reader"
6
5
 
7
6
  module CloudCannonJekyll
8
- # Generates JSON files containing build config and build output details
9
7
  class Generator < Jekyll::Generator
10
- # Override the Jekyll::Plugin spaceship to push our plugin to the very end
11
8
  priority :lowest
12
- def self.<=>(*)
13
- 1
14
- end
15
9
 
16
10
  def generate(site)
17
11
  @site = site
18
- @reader = Reader.new(@site)
19
-
20
- collections_config = process_collections_config
21
-
22
- payload = @site.site_payload.merge({
23
- "gem_version" => CloudCannonJekyll::VERSION,
24
- })
25
-
26
- drafts = add_blogging_config(collections_config)
27
- add_collection_paths(collections_config)
28
- add_data_config(collections_config)
29
- add_legacy_explore_groups
30
-
31
- generate_file("info", payload.merge({
32
- "pwd" => Dir.pwd,
33
- "config" => @site.config,
34
- "collections_config" => collections_config,
35
- "drafts" => drafts,
36
- }))
37
- end
38
-
39
- def process_collections_config
40
- collections = @site.config["collections"]&.dup || {}
41
- cc_collections = @site.config.dig("cloudcannon", "collections")&.dup || {}
42
-
43
- collections.each_key do |key|
44
- # Workaround for empty collection configurations
45
- defaults = collections[key] || { "output" => false }
46
- cc_collections[key] = (cc_collections[key] || {}).merge(defaults)
47
- end
48
-
49
- cc_collections
50
- end
51
-
52
- def collections_dir
53
- return "" if Jekyll::VERSION.start_with? "2."
54
-
55
- @site.config["collections_dir"] || ""
56
- end
57
-
58
- def data_dir
59
- @site.config["data_dir"] || "_data"
60
- end
61
-
62
- # rubocop:disable Metrics/AbcSize
63
- def add_category_folder_config(collections_config, posts_config = {})
64
- posts = @site.posts || @site.collections["posts"]
65
- docs = posts.class.method_defined?(:docs) ? posts.docs : posts
66
- seen = {}
67
-
68
- docs.map do |post|
69
- parts = post.relative_path.split("/_posts/")
70
- path = parts.first
71
-
72
- # Ignore unless it's an unseen category folder post
73
- next if parts.length < 2 || path.empty? || seen[path]
74
-
75
- # Could check this to ensure raw files exist since posts can be generated without files
76
- # next if @reader.read_posts(parts[0]).empty?
77
-
78
- seen[path] = true
79
- folder = path.sub(%r!^\/+!, "")
80
- collections_path = "#{collections_dir}/#{folder}".gsub(%r!\/+!, "/").sub(%r!^\/+!, "")
81
-
82
- collections_config["#{folder}/posts"] = posts_config.merge({
83
- "path" => "#{collections_path}/_posts",
84
- })
85
-
86
- # Adding the category draft config like this isn't ideal, since you could have drafts
87
- # without posts, but it's a decent trade off vs looking for _drafts folders
88
- collections_config["#{folder}/drafts"] = posts_config.merge({
89
- "path" => "#{collections_path}/_drafts",
90
- })
91
-
92
- path
93
- end
94
- end
95
- # rubocop:enable Metrics/AbcSize
96
-
97
- # Support for the deprecated _explore configuration
98
- def add_legacy_explore_groups
99
- unless @site.config.key?("_collection_groups")
100
- @site.config["_collection_groups"] = @site.config.dig("_explore", "groups")&.dup
101
- end
102
- end
103
-
104
- # Add data to collections config if raw data files exist
105
- def add_data_config(collections_config)
106
- data_files = @reader.read_data(data_dir)
107
- collections_config["data"] = { "path" => data_dir } if data_files&.keys&.any?
108
- end
109
-
110
- # Add posts/drafts to collections config
111
- def add_blogging_config(collections_config)
112
- collections_config["posts"] = { "output" => true } if Jekyll::VERSION.start_with? "2."
113
- drafts = @reader.read_drafts(collections_dir)
114
-
115
- if drafts.any? || (collections_config.key?("posts") && !collections_config.key?("drafts"))
116
- collections_config["drafts"] = {}
117
- end
118
-
119
- folders = add_category_folder_config(collections_config, collections_config["posts"])
120
- folders.compact.each do |folder|
121
- drafts += @reader.read_drafts(folder)
122
- end
123
-
124
- drafts
125
- end
126
-
127
- # Add path to each collection config
128
- def add_collection_paths(collections_config)
129
- collections_config.each do |key, collection|
130
- collection["path"] ||= File.join(collections_dir, "_#{key}").sub(%r!^\/+!, "")
131
- end
132
- end
133
-
134
- def generate_file(filename, data)
135
- dest = destination_path(filename)
136
- FileUtils.mkdir_p(File.dirname(dest))
137
- File.open(dest, "w") { |file| file.write(file_content(filename, data)) }
12
+ FileUtils.mkdir_p(File.dirname(destination_path))
13
+ File.open(destination_path, "w") { |f| f.write(file_content) }
138
14
  @site.keep_files ||= []
139
- @site.keep_files << path(filename)
15
+ @site.keep_files << "_cloudcannon/details.json"
140
16
  end
141
17
 
142
- def version_path_suffix
143
- return "-2.x" if Jekyll::VERSION.start_with? "2."
144
- return "-3.0-4.x" if %r!3\.[0-4]\.! =~ Jekyll::VERSION
18
+ def source_path
19
+ path = "_cloudcannon/details.json"
20
+ path = "_cloudcannon/details-2.x.json" if Jekyll::VERSION.start_with? "2."
21
+ path = "_cloudcannon/details-3.0.x.json" if Jekyll::VERSION.match? %r!3\.[0-4]\.!
145
22
 
146
- ""
23
+ File.expand_path(path, File.dirname(__FILE__))
147
24
  end
148
25
 
149
- def path(filename, suffix = "")
150
- "_cloudcannon/#{filename}#{suffix}.json"
26
+ def destination_path
27
+ Jekyll.sanitized_path(@site.dest, "_cloudcannon/details.json")
151
28
  end
152
29
 
153
- def source_path(filename)
154
- File.expand_path(path(filename, version_path_suffix), File.dirname(__FILE__))
155
- end
30
+ def file_content
31
+ json = PageWithoutAFile.new(@site, File.dirname(__FILE__), "", "_cloudcannon/details.json")
32
+ json.content = File.read(source_path)
156
33
 
157
- def destination_path(filename)
158
- Jekyll.sanitized_path(@site.dest, path(filename))
159
- end
34
+ json.data["layout"] = nil
35
+ json.data["sitemap"] = false
36
+ json.data["permalink"] = "/_cloudcannon/details.json"
160
37
 
161
- def file_content(filename, data)
162
- page = PageWithoutAFile.new(@site, File.dirname(__FILE__), "", path(filename))
163
- page.content = File.read(source_path(filename))
164
- page.data["layout"] = nil
165
- page.data["sitemap"] = false
166
- page.data["permalink"] = "/#{path(filename)}"
167
- page.render({}, data)
168
- page.output
38
+ json.render({}, @site.site_payload.merge("gem_version" => CloudCannonJekyll::VERSION))
39
+ json.output
169
40
  end
170
41
  end
171
42
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CloudCannonJekyll
4
- # Utility class to help generate files with no source file
5
4
  class PageWithoutAFile < Jekyll::Page
6
5
  def read_yaml(*)
7
6
  @data ||= {}
@@ -0,0 +1,169 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
4
+
5
+ module CloudCannonJekyll
6
+ module SafeJsonifyFilter
7
+ @simple_types = [
8
+ String,
9
+ Numeric,
10
+ Integer,
11
+ Float,
12
+ Date,
13
+ Time,
14
+ NilClass,
15
+ ].freeze
16
+
17
+ @document_types = [
18
+ Jekyll::Document,
19
+ Jekyll::Page,
20
+ Jekyll::VERSION.start_with?("2.") ? Jekyll::Post : nil,
21
+ ].compact.freeze
22
+
23
+ def self.document_type?(input)
24
+ @document_types.include?(input.class)
25
+ end
26
+
27
+ def self.simple_type?(input)
28
+ @simple_types.include?(input.class) || [true, false].include?(input)
29
+ end
30
+
31
+ def self.static_file_to_json(input, depth)
32
+ out = [
33
+ "\"extname\": #{SafeJsonifyFilter.to_json(input.extname, depth + 1)}",
34
+ "\"path\": #{SafeJsonifyFilter.to_json(input.relative_path, depth + 1)}",
35
+ ]
36
+
37
+ # modified_time isn't defined in Jekyll 2.4.0
38
+ if input.respond_to? :modified_time
39
+ out.push("\"modified_time\": #{SafeJsonifyFilter.to_json(input.modified_time, depth + 1)}")
40
+ end
41
+
42
+ "{#{out.join(",")}}"
43
+ end
44
+
45
+ def self.document_data_to_json(data, out, prevent, depth)
46
+ prevent += %w(content output next previous excerpt)
47
+
48
+ data.map do |key, value|
49
+ unless prevent.include? key
50
+ out.push("\"#{key}\": #{SafeJsonifyFilter.to_json(value, depth + 1)}")
51
+ prevent.push(key)
52
+ end
53
+ end
54
+
55
+ "{#{out.join(",")}}"
56
+ end
57
+
58
+ def self.legacy_post_to_json(input, depth)
59
+ prevent = %w(dir name path url date id categories tags)
60
+
61
+ out = [
62
+ "\"dir\": #{SafeJsonifyFilter.to_json(input.dir, depth + 1)}",
63
+ "\"name\": #{SafeJsonifyFilter.to_json(input.name, depth + 1)}",
64
+ "\"path\": #{SafeJsonifyFilter.to_json(input.path, depth + 1)}",
65
+ "\"url\": #{SafeJsonifyFilter.to_json(input.url, depth + 1)}",
66
+ "\"date\": #{SafeJsonifyFilter.to_json(input.date, depth + 1)}",
67
+ "\"id\": #{SafeJsonifyFilter.to_json(input.id, depth + 1)}",
68
+ "\"categories\": #{SafeJsonifyFilter.to_json(input.categories, depth + 1)}",
69
+ "\"tags\": #{SafeJsonifyFilter.to_json(input.tags, depth + 1)}",
70
+ ]
71
+
72
+ SafeJsonifyFilter.document_data_to_json(input.data, out, prevent, depth)
73
+ end
74
+
75
+ def self.page_to_json(input, depth)
76
+ prevent = %w(dir name path url)
77
+
78
+ out = [
79
+ "\"dir\": #{SafeJsonifyFilter.to_json(input.dir, depth + 1)}",
80
+ "\"name\": #{SafeJsonifyFilter.to_json(input.name, depth + 1)}",
81
+ "\"path\": #{SafeJsonifyFilter.to_json(input.path, depth + 1)}",
82
+ "\"url\": #{SafeJsonifyFilter.to_json(input.url, depth + 1)}",
83
+ ]
84
+
85
+ # Merge Jekyll Defaults into data for pages (missing at v3.8.5)
86
+ defaults = input.site.frontmatter_defaults.all(input.relative_path, :pages).tap do |h|
87
+ h.delete("date")
88
+ end
89
+
90
+ data = Jekyll::Utils.deep_merge_hashes(defaults, input.data)
91
+ SafeJsonifyFilter.document_data_to_json(data, out, prevent, depth)
92
+ end
93
+
94
+ def self.document_to_json(input, depth)
95
+ prevent = %w(dir id relative_path url collection)
96
+
97
+ out = [
98
+ "\"path\": #{SafeJsonifyFilter.to_json(input.relative_path, depth + 1)}",
99
+ "\"relative_path\": #{SafeJsonifyFilter.to_json(input.relative_path, depth + 1)}",
100
+ "\"url\": #{SafeJsonifyFilter.to_json(input.url, depth + 1)}",
101
+ ]
102
+
103
+ unless input.collection.nil?
104
+ out.push("\"collection\": #{SafeJsonifyFilter.to_json(input.collection.label, depth + 1)}")
105
+ end
106
+
107
+ # id isn't defined in Jekyll 2.4.0
108
+ out.push("\"id\": #{SafeJsonifyFilter.to_json(input.id, depth + 1)}") if input.respond_to? :id
109
+
110
+ SafeJsonifyFilter.document_data_to_json(input.data, out, prevent, depth)
111
+ end
112
+
113
+ def self.array_to_json(input, depth)
114
+ array = input.map do |value|
115
+ SafeJsonifyFilter.to_json(value, depth + 1)
116
+ end
117
+
118
+ "[#{array.join(",")}]"
119
+ end
120
+
121
+ def self.hash_to_json(input, depth)
122
+ hash = input.map do |key, value|
123
+ "\"#{key}\": #{SafeJsonifyFilter.to_json(value, depth + 1)}"
124
+ end
125
+
126
+ "{#{hash.join(",")}}"
127
+ end
128
+
129
+ def self.to_json(input, depth)
130
+ if depth > 8 || (depth > 2 && SafeJsonifyFilter.document_type?(input))
131
+ '"MAXIMUM_DEPTH"'
132
+ elsif SafeJsonifyFilter.simple_type?(input)
133
+ input.to_json
134
+ elsif input.is_a?(Jekyll::StaticFile)
135
+ SafeJsonifyFilter.static_file_to_json(input, depth)
136
+ elsif input.is_a?(Jekyll::Page)
137
+ SafeJsonifyFilter.page_to_json(input, depth)
138
+ elsif Jekyll::VERSION.start_with?("2.") && input.is_a?(Jekyll::Post)
139
+ SafeJsonifyFilter.legacy_post_to_json(input, depth)
140
+ elsif input.is_a?(Jekyll::Document)
141
+ SafeJsonifyFilter.document_to_json(input, depth)
142
+ elsif input.is_a?(Array)
143
+ SafeJsonifyFilter.array_to_json(input, depth)
144
+ elsif input.is_a?(Hash)
145
+ SafeJsonifyFilter.hash_to_json(input, depth)
146
+ else
147
+ "\"UNSUPPORTED:#{input.class}\""
148
+ end
149
+ end
150
+
151
+ def cc_static_files_jsonify(input)
152
+ out = []
153
+ input.each do |page|
154
+ next if page.extname != ".html" &&
155
+ page.extname != ".htm" &&
156
+ page.path != "/robots.txt" &&
157
+ page.path != "/sitemap.xml"
158
+
159
+ out.push(SafeJsonifyFilter.to_json(page, 1))
160
+ end
161
+
162
+ "[#{out.join(",")}]"
163
+ end
164
+
165
+ def cc_safe_jsonify(input)
166
+ SafeJsonifyFilter.to_json(input, 0)
167
+ end
168
+ end
169
+ end