bridgetown-core 0.19.2 → 0.21.0.beta3
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/bridgetown-core.gemspec +1 -2
- data/lib/bridgetown-core.rb +37 -29
- data/lib/bridgetown-core/cleaner.rb +9 -3
- data/lib/bridgetown-core/collection.rb +177 -78
- data/lib/bridgetown-core/commands/base.rb +9 -0
- data/lib/bridgetown-core/commands/build.rb +0 -11
- data/lib/bridgetown-core/commands/concerns/git_helpers.rb +20 -0
- data/lib/bridgetown-core/commands/configure.rb +8 -3
- data/lib/bridgetown-core/commands/console.rb +4 -0
- data/lib/bridgetown-core/commands/doctor.rb +1 -19
- data/lib/bridgetown-core/commands/new.rb +2 -2
- data/lib/bridgetown-core/commands/plugins.rb +14 -13
- data/lib/bridgetown-core/commands/serve.rb +0 -14
- data/lib/bridgetown-core/component.rb +178 -0
- data/lib/bridgetown-core/concerns/data_accessible.rb +1 -0
- data/lib/bridgetown-core/concerns/front_matter_importer.rb +52 -0
- data/lib/bridgetown-core/concerns/site/configurable.rb +10 -10
- data/lib/bridgetown-core/concerns/site/content.rb +56 -15
- data/lib/bridgetown-core/concerns/site/localizable.rb +3 -5
- data/lib/bridgetown-core/concerns/site/processable.rb +6 -4
- data/lib/bridgetown-core/concerns/site/renderable.rb +26 -0
- data/lib/bridgetown-core/concerns/site/writable.rb +12 -2
- data/lib/bridgetown-core/concerns/validatable.rb +2 -5
- data/lib/bridgetown-core/configuration.rb +51 -30
- data/lib/bridgetown-core/configurations/bt-postcss.rb +1 -3
- data/lib/bridgetown-core/configurations/netlify.rb +1 -0
- data/lib/bridgetown-core/configurations/tailwindcss.rb +1 -3
- data/lib/bridgetown-core/converter.rb +23 -0
- data/lib/bridgetown-core/converters/erb_templates.rb +51 -35
- data/lib/bridgetown-core/converters/identity.rb +0 -9
- data/lib/bridgetown-core/converters/liquid_templates.rb +1 -1
- data/lib/bridgetown-core/converters/markdown.rb +14 -4
- data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +5 -38
- data/lib/bridgetown-core/converters/ruby_templates.rb +17 -0
- data/lib/bridgetown-core/converters/smartypants.rb +3 -1
- data/lib/bridgetown-core/core_ext/psych.rb +19 -0
- data/lib/bridgetown-core/current.rb +10 -0
- data/lib/bridgetown-core/document.rb +9 -16
- data/lib/bridgetown-core/drops/collection_drop.rb +1 -1
- data/lib/bridgetown-core/drops/page_drop.rb +4 -0
- data/lib/bridgetown-core/drops/relations_drop.rb +23 -0
- data/lib/bridgetown-core/drops/resource_drop.rb +83 -0
- data/lib/bridgetown-core/drops/site_drop.rb +33 -8
- data/lib/bridgetown-core/drops/unified_payload_drop.rb +5 -0
- data/lib/bridgetown-core/entry_filter.rb +17 -28
- data/lib/bridgetown-core/errors.rb +0 -2
- data/lib/bridgetown-core/filters.rb +3 -26
- data/lib/bridgetown-core/filters/from_liquid.rb +23 -0
- data/lib/bridgetown-core/filters/url_filters.rb +12 -0
- data/lib/bridgetown-core/frontmatter_defaults.rb +1 -1
- data/lib/bridgetown-core/generators/prototype_generator.rb +37 -19
- data/lib/bridgetown-core/helpers.rb +48 -9
- data/lib/bridgetown-core/layout.rb +28 -13
- data/lib/bridgetown-core/liquid_renderer/file.rb +1 -0
- data/lib/bridgetown-core/liquid_renderer/table.rb +1 -0
- data/lib/bridgetown-core/model/base.rb +138 -0
- data/lib/bridgetown-core/model/builder_origin.rb +40 -0
- data/lib/bridgetown-core/model/origin.rb +38 -0
- data/lib/bridgetown-core/model/repo_origin.rb +126 -0
- data/lib/bridgetown-core/page.rb +11 -2
- data/lib/bridgetown-core/plugin_manager.rb +1 -3
- data/lib/bridgetown-core/publisher.rb +8 -2
- data/lib/bridgetown-core/reader.rb +37 -22
- data/lib/bridgetown-core/readers/data_reader.rb +5 -5
- data/lib/bridgetown-core/readers/defaults_reader.rb +1 -1
- data/lib/bridgetown-core/readers/page_reader.rb +1 -0
- data/lib/bridgetown-core/readers/post_reader.rb +5 -4
- data/lib/bridgetown-core/regenerator.rb +9 -2
- data/lib/bridgetown-core/related_posts.rb +9 -6
- data/lib/bridgetown-core/renderer.rb +6 -13
- data/lib/bridgetown-core/resource/base.rb +313 -0
- data/lib/bridgetown-core/resource/destination.rb +49 -0
- data/lib/bridgetown-core/resource/permalink_processor.rb +179 -0
- data/lib/bridgetown-core/resource/relations.rb +132 -0
- data/lib/bridgetown-core/resource/taxonomy_term.rb +34 -0
- data/lib/bridgetown-core/resource/taxonomy_type.rb +56 -0
- data/lib/bridgetown-core/resource/transformer.rb +177 -0
- data/lib/bridgetown-core/ruby_template_view.rb +11 -11
- data/lib/bridgetown-core/site.rb +13 -6
- data/lib/bridgetown-core/static_file.rb +33 -10
- data/lib/bridgetown-core/tags/highlight.rb +2 -15
- data/lib/bridgetown-core/tags/include.rb +1 -1
- data/lib/bridgetown-core/tags/post_url.rb +2 -2
- data/lib/bridgetown-core/url.rb +1 -0
- data/lib/bridgetown-core/utils.rb +49 -43
- data/lib/bridgetown-core/utils/require_gems.rb +60 -0
- data/lib/bridgetown-core/utils/ruby_exec.rb +6 -9
- data/lib/bridgetown-core/utils/ruby_front_matter.rb +39 -0
- data/lib/bridgetown-core/version.rb +2 -2
- data/lib/bridgetown-core/watcher.rb +1 -1
- data/lib/bridgetown-core/yaml_parser.rb +22 -0
- data/lib/site_template/package.json.erb +2 -2
- data/lib/site_template/plugins/site_builder.rb +1 -1
- data/lib/site_template/src/_posts/0000-00-00-welcome-to-bridgetown.md.erb +1 -1
- data/lib/site_template/webpack.config.js.erb +26 -6
- metadata +39 -40
- data/lib/bridgetown-core/external.rb +0 -58
- data/lib/bridgetown-core/page_without_a_file.rb +0 -17
- data/lib/bridgetown-core/path_manager.rb +0 -31
- data/lib/bridgetown-core/readers/collection_reader.rb +0 -23
- data/lib/bridgetown-core/readers/static_file_reader.rb +0 -25
- data/lib/bridgetown-core/utils/exec.rb +0 -26
- data/lib/bridgetown-core/utils/internet.rb +0 -37
- data/lib/bridgetown-core/utils/platforms.rb +0 -80
- data/lib/bridgetown-core/utils/thread_event.rb +0 -31
- data/lib/bridgetown-core/utils/win_tz.rb +0 -75
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bridgetown
|
|
4
|
+
module FrontMatterImporter
|
|
5
|
+
# Requires klass#content and klass#front_matter_line_count accessors
|
|
6
|
+
def self.included(klass)
|
|
7
|
+
klass.include Bridgetown::Utils::RubyFrontMatterDSL
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
YAML_HEADER = %r!\A---\s*\n!.freeze
|
|
11
|
+
YAML_BLOCK = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m.freeze
|
|
12
|
+
RUBY_HEADER = %r!\A[~`#\-]{3,}(?:ruby|<%|{%)\s*\n!.freeze
|
|
13
|
+
RUBY_BLOCK =
|
|
14
|
+
%r!#{RUBY_HEADER.source}(.*?\n?)^((?:%>|%})?[~`#\-]{3,}\s*$\n?)!m.freeze
|
|
15
|
+
|
|
16
|
+
def read_front_matter(file_path) # rubocop:todo Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
|
|
17
|
+
file_contents = File.read(
|
|
18
|
+
file_path, **Bridgetown::Utils.merged_file_read_opts(Bridgetown::Current.site, {})
|
|
19
|
+
)
|
|
20
|
+
yaml_content = file_contents.match(YAML_BLOCK)
|
|
21
|
+
if !yaml_content && Bridgetown::Current.site.config.should_execute_inline_ruby?
|
|
22
|
+
ruby_content = file_contents.match(RUBY_BLOCK)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
if yaml_content
|
|
26
|
+
self.content = yaml_content.post_match
|
|
27
|
+
self.front_matter_line_count = yaml_content[1].lines.size - 1
|
|
28
|
+
YAMLParser.load(yaml_content[1])
|
|
29
|
+
elsif ruby_content
|
|
30
|
+
# rbfm header + content underneath
|
|
31
|
+
self.content = ruby_content.post_match
|
|
32
|
+
self.front_matter_line_count = ruby_content[1].lines.size
|
|
33
|
+
process_ruby_data(ruby_content[1], file_path, 2)
|
|
34
|
+
elsif Bridgetown::Utils.has_rbfm_header?(file_path)
|
|
35
|
+
process_ruby_data(File.read(file_path).lines[1..-1].join("\n"), file_path, 2)
|
|
36
|
+
elsif is_a?(Layout)
|
|
37
|
+
self.content = file_contents
|
|
38
|
+
{}
|
|
39
|
+
else
|
|
40
|
+
yaml_data = YAMLParser.load_file(file_path)
|
|
41
|
+
yaml_data.is_a?(Array) ? { rows: yaml_data } : yaml_data
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def process_ruby_data(rubycode, file_path, starting_line)
|
|
46
|
+
ruby_data = instance_eval(rubycode, file_path.to_s, starting_line)
|
|
47
|
+
ruby_data.is_a?(Array) ? { rows: ruby_data } : ruby_data.to_h
|
|
48
|
+
rescue StandardError => e
|
|
49
|
+
raise "Ruby code isn't returning an array, or object which responds to `to_h' (#{e.message})"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -18,23 +18,22 @@ class Bridgetown::Site
|
|
|
18
18
|
@root_dir = File.expand_path(config["root_dir"]).freeze
|
|
19
19
|
@source = File.expand_path(config["source"]).freeze
|
|
20
20
|
@dest = File.expand_path(config["destination"]).freeze
|
|
21
|
-
@cache_dir = in_root_dir(config["cache_dir"]).freeze
|
|
22
|
-
|
|
23
|
-
%w(lsi highlighter baseurl exclude include future unpublished
|
|
24
|
-
limit_posts keep_files).each do |opt|
|
|
25
|
-
send("#{opt}=", config[opt])
|
|
26
|
-
end
|
|
27
21
|
|
|
28
22
|
configure_cache
|
|
29
23
|
configure_component_paths
|
|
30
24
|
configure_include_paths
|
|
31
25
|
configure_file_read_opts
|
|
32
26
|
|
|
33
|
-
self.
|
|
27
|
+
self.baseurl = config.baseurl
|
|
28
|
+
self.permalink_style = (config["permalink"] || "pretty").to_sym
|
|
34
29
|
|
|
35
30
|
@config
|
|
36
31
|
end
|
|
37
32
|
|
|
33
|
+
def uses_resource?
|
|
34
|
+
config[:content_engine] == "resource"
|
|
35
|
+
end
|
|
36
|
+
|
|
38
37
|
def defaults_reader
|
|
39
38
|
@defaults_reader ||= Bridgetown::DefaultsReader.new(self)
|
|
40
39
|
end
|
|
@@ -78,7 +77,7 @@ class Bridgetown::Site
|
|
|
78
77
|
# @return [Array<String>] Return an array of updated paths if multiple paths given.
|
|
79
78
|
def in_root_dir(*paths)
|
|
80
79
|
paths.reduce(root_dir) do |base, path|
|
|
81
|
-
Bridgetown.sanitized_path(base, path)
|
|
80
|
+
Bridgetown.sanitized_path(base, path.to_s)
|
|
82
81
|
end
|
|
83
82
|
end
|
|
84
83
|
|
|
@@ -91,7 +90,7 @@ class Bridgetown::Site
|
|
|
91
90
|
# @return [Array<String>] Return an array of updated paths if multiple paths given.
|
|
92
91
|
def in_source_dir(*paths)
|
|
93
92
|
paths.reduce(source) do |base, path|
|
|
94
|
-
Bridgetown.sanitized_path(base, path)
|
|
93
|
+
Bridgetown.sanitized_path(base, path.to_s)
|
|
95
94
|
end
|
|
96
95
|
end
|
|
97
96
|
|
|
@@ -149,7 +148,8 @@ class Bridgetown::Site
|
|
|
149
148
|
|
|
150
149
|
# Disable Marshaling cache to disk in Safe Mode
|
|
151
150
|
def configure_cache
|
|
152
|
-
|
|
151
|
+
@cache_dir = in_root_dir(config["cache_dir"]).freeze
|
|
152
|
+
Bridgetown::Cache.cache_dir = File.join(cache_dir, "Bridgetown/Cache")
|
|
153
153
|
Bridgetown::Cache.disable_disk_cache! if config["disable_disk_cache"]
|
|
154
154
|
end
|
|
155
155
|
|
|
@@ -32,6 +32,18 @@ class Bridgetown::Site
|
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
+
def resources_grouped_by_taxonomy(taxonomy)
|
|
36
|
+
@post_attr_hash[taxonomy.label] ||= begin
|
|
37
|
+
taxonomy.terms.transform_values { |terms| terms.map(&:resource).sort.reverse }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def taxonomies
|
|
42
|
+
taxonomy_types.transform_values do |taxonomy|
|
|
43
|
+
resources_grouped_by_taxonomy(taxonomy)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
35
47
|
# Returns a hash of "tags" using {#post_attr_hash} where each tag is a key
|
|
36
48
|
# and each value is a post which contains the key.
|
|
37
49
|
# @example
|
|
@@ -41,7 +53,7 @@ class Bridgetown::Site
|
|
|
41
53
|
# @return [Hash{String, Array<Post>}] Returns a hash of all tags and their corresponding posts
|
|
42
54
|
# @see post_attr_hash
|
|
43
55
|
def tags
|
|
44
|
-
post_attr_hash("tags")
|
|
56
|
+
uses_resource? ? taxonomies.tag : post_attr_hash("tags")
|
|
45
57
|
end
|
|
46
58
|
|
|
47
59
|
# Returns a hash of "categories" using {#post_attr_hash} where each tag is
|
|
@@ -54,7 +66,7 @@ class Bridgetown::Site
|
|
|
54
66
|
# their corresponding posts
|
|
55
67
|
# @see post_attr_hash
|
|
56
68
|
def categories
|
|
57
|
-
post_attr_hash("categories")
|
|
69
|
+
uses_resource? ? taxonomies.category : post_attr_hash("categories")
|
|
58
70
|
end
|
|
59
71
|
|
|
60
72
|
# Returns the value of `data["site_metadata"]` or creates a new instance of
|
|
@@ -121,19 +133,25 @@ class Bridgetown::Site
|
|
|
121
133
|
# An array of collection names.
|
|
122
134
|
# @return [Array<String>] an array of collection names from the configuration,
|
|
123
135
|
# or an empty array if the `config["collections"]` key is not set.
|
|
124
|
-
# @raise ArgumentError Raise an error if `config["collections"]` is not
|
|
125
|
-
# an Array or a Hash
|
|
126
136
|
def collection_names
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
+
Array(config.collections&.keys)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# @return [Array<Bridgetown::Resource::TaxonomyType>]
|
|
141
|
+
def taxonomy_types
|
|
142
|
+
@taxonomy_types ||= config.taxonomies.map do |label, key_or_metadata|
|
|
143
|
+
key = key_or_metadata
|
|
144
|
+
tax_metadata = if key_or_metadata.is_a? Hash
|
|
145
|
+
key = key_or_metadata["key"]
|
|
146
|
+
key_or_metadata.reject { |k| k == "key" }
|
|
147
|
+
else
|
|
148
|
+
HashWithDotAccess::Hash.new
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
[label, Bridgetown::Resource::TaxonomyType.new(
|
|
152
|
+
site: self, label: label, key: key, metadata: tax_metadata
|
|
153
|
+
),]
|
|
154
|
+
end.to_h.with_dot_access
|
|
137
155
|
end
|
|
138
156
|
|
|
139
157
|
# Get all documents.
|
|
@@ -155,11 +173,28 @@ class Bridgetown::Site
|
|
|
155
173
|
documents.select(&:write?)
|
|
156
174
|
end
|
|
157
175
|
|
|
158
|
-
# Get all
|
|
176
|
+
# Get all loaded resources.
|
|
177
|
+
# @return [Array<Bridgetown::Resource::Base>] an array of resources
|
|
178
|
+
def resources
|
|
179
|
+
collections.each_with_object(Set.new) do |(_, collection), set|
|
|
180
|
+
set.merge(collection.resources)
|
|
181
|
+
end.to_a
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def resources_to_write
|
|
185
|
+
resources.select(&:write?)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Get all posts. Deprecated, to be removed in v1.0.
|
|
159
189
|
#
|
|
160
190
|
# @return [Collection] Returns {#collections}`["posts"]`, creating it if need be
|
|
161
191
|
# @see Collection
|
|
162
192
|
def posts
|
|
193
|
+
unless @wrote_deprecation_msg
|
|
194
|
+
Bridgetown::Deprecator.deprecation_message "Call site.collections.posts " \
|
|
195
|
+
"instead of site.posts (Ruby code)"
|
|
196
|
+
end
|
|
197
|
+
@wrote_deprecation_msg ||= true
|
|
163
198
|
collections["posts"] ||= Bridgetown::Collection.new(self, "posts")
|
|
164
199
|
end
|
|
165
200
|
|
|
@@ -177,7 +212,13 @@ class Bridgetown::Site
|
|
|
177
212
|
#
|
|
178
213
|
# @return [Array]
|
|
179
214
|
def contents
|
|
215
|
+
return resources if uses_resource?
|
|
216
|
+
|
|
180
217
|
pages + documents
|
|
181
218
|
end
|
|
219
|
+
|
|
220
|
+
def add_generated_page(generated_page)
|
|
221
|
+
generated_pages << generated_page
|
|
222
|
+
end
|
|
182
223
|
end
|
|
183
224
|
end
|
|
@@ -5,13 +5,11 @@ class Bridgetown::Site
|
|
|
5
5
|
# Returns the current and/or default configured locale
|
|
6
6
|
# @return String
|
|
7
7
|
def locale
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
else
|
|
11
|
-
@locale = ENV.fetch("BRIDGETOWN_LOCALE", config[:default_locale]).to_sym
|
|
8
|
+
@locale ||= begin
|
|
9
|
+
locale = ENV.fetch("BRIDGETOWN_LOCALE", config[:default_locale]).to_sym
|
|
12
10
|
I18n.load_path << Dir[in_source_dir("_locales") + "/*.yml"]
|
|
13
11
|
I18n.available_locales = config[:available_locales]
|
|
14
|
-
I18n.default_locale =
|
|
12
|
+
I18n.default_locale = locale
|
|
15
13
|
end
|
|
16
14
|
end
|
|
17
15
|
|
|
@@ -11,6 +11,7 @@ class Bridgetown::Site
|
|
|
11
11
|
# @see #cleanup
|
|
12
12
|
# @see #write
|
|
13
13
|
def process
|
|
14
|
+
Bridgetown::Current.site = self
|
|
14
15
|
reset
|
|
15
16
|
read
|
|
16
17
|
generate # Extensible
|
|
@@ -41,8 +42,6 @@ class Bridgetown::Site
|
|
|
41
42
|
@liquid_renderer.reset
|
|
42
43
|
frontmatter_defaults.reset
|
|
43
44
|
|
|
44
|
-
raise ArgumentError, "limit_posts must be a non-negative number" if limit_posts.negative?
|
|
45
|
-
|
|
46
45
|
Bridgetown::Cache.clear_if_config_changed config
|
|
47
46
|
Bridgetown::Hooks.trigger :site, :after_reset, self
|
|
48
47
|
end
|
|
@@ -60,8 +59,11 @@ class Bridgetown::Site
|
|
|
60
59
|
|
|
61
60
|
# Limits the current posts; removes the posts which exceed the limit_posts
|
|
62
61
|
def limit_posts!
|
|
63
|
-
if limit_posts.positive?
|
|
64
|
-
|
|
62
|
+
if config.limit_posts.positive?
|
|
63
|
+
Bridgetown::Deprecator.deprecation_message(
|
|
64
|
+
"The limit_posts config option will be removed prior to Bridgetown 1.0"
|
|
65
|
+
)
|
|
66
|
+
limit = posts.docs.length < config.limit_posts ? posts.docs.length : config.limit_posts
|
|
65
67
|
posts.docs = posts.docs[-limit, limit]
|
|
66
68
|
end
|
|
67
69
|
end
|
|
@@ -29,6 +29,26 @@ class Bridgetown::Site
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
def matched_converters_for_convertible(convertible)
|
|
33
|
+
@layout_converters ||= {}
|
|
34
|
+
|
|
35
|
+
if convertible.is_a?(Bridgetown::Layout) && @layout_converters[convertible]
|
|
36
|
+
return @layout_converters[convertible]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
matches = converters.select do |converter|
|
|
40
|
+
if converter.method(:matches).arity == 1
|
|
41
|
+
converter.matches(convertible.extname)
|
|
42
|
+
else
|
|
43
|
+
converter.matches(convertible.extname, convertible)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
@layout_converters[convertible] = matches if convertible.is_a?(Bridgetown::Layout)
|
|
48
|
+
|
|
49
|
+
matches
|
|
50
|
+
end
|
|
51
|
+
|
|
32
52
|
# Renders all documents
|
|
33
53
|
# @return [void]
|
|
34
54
|
def render_docs
|
|
@@ -38,6 +58,12 @@ class Bridgetown::Site
|
|
|
38
58
|
render_regenerated document
|
|
39
59
|
end
|
|
40
60
|
end
|
|
61
|
+
|
|
62
|
+
collection.resources.each do |resource|
|
|
63
|
+
render_with_locale(resource) do
|
|
64
|
+
resource.transform!
|
|
65
|
+
end
|
|
66
|
+
end
|
|
41
67
|
end
|
|
42
68
|
end
|
|
43
69
|
|
|
@@ -21,17 +21,27 @@ class Bridgetown::Site
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
# Yields all content objects while looping through {#pages},
|
|
24
|
-
# {#static_files_to_write},
|
|
24
|
+
# {#static_files_to_write}, {#docs_to_write}, {#resources_to_write}.
|
|
25
25
|
#
|
|
26
26
|
# @yieldparam item [Document, Page, StaticFile]
|
|
27
27
|
#
|
|
28
28
|
# @return [void]
|
|
29
29
|
def each_site_file
|
|
30
|
-
%w(pages static_files_to_write docs_to_write).each do |type|
|
|
30
|
+
%w(pages static_files_to_write docs_to_write resources_to_write).each do |type|
|
|
31
31
|
send(type).each do |item|
|
|
32
32
|
yield item
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
|
+
|
|
37
|
+
def resources_cache_manifest
|
|
38
|
+
resources.each_with_object({}) do |resource, hsh|
|
|
39
|
+
next if resource.relative_url == ""
|
|
40
|
+
|
|
41
|
+
hsh[resource.relative_url] = {
|
|
42
|
+
id: resource.model.id,
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
end
|
|
36
46
|
end
|
|
37
47
|
end
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Bridgetown
|
|
4
|
+
# TODO: to be retired once the Resource engine is made official
|
|
4
5
|
module Validatable
|
|
5
|
-
# FIXME: there should be ONE TRUE METHOD to read the YAML frontmatter
|
|
6
|
-
# in the entire project. Both this and the equivalent Document method
|
|
7
|
-
# should be extracted and generalized.
|
|
8
|
-
#
|
|
9
6
|
# Read the YAML frontmatter.
|
|
10
7
|
#
|
|
11
8
|
# base - The String path to the dir containing the file.
|
|
@@ -22,7 +19,7 @@ module Bridgetown
|
|
|
22
19
|
**Utils.merged_file_read_opts(site, opts))
|
|
23
20
|
if content =~ Document::YAML_FRONT_MATTER_REGEXP
|
|
24
21
|
self.content = $POSTMATCH
|
|
25
|
-
self.data =
|
|
22
|
+
self.data = YAMLParser.load(Regexp.last_match(1))&.with_dot_access
|
|
26
23
|
end
|
|
27
24
|
rescue Psych::SyntaxError => e
|
|
28
25
|
Bridgetown.logger.warn "YAML Exception reading #{filename}: #{e.message}"
|
|
@@ -23,6 +23,9 @@ module Bridgetown
|
|
|
23
23
|
"includes_dir" => "_includes",
|
|
24
24
|
"partials_dir" => "_partials",
|
|
25
25
|
"collections" => {},
|
|
26
|
+
"taxonomies" => {
|
|
27
|
+
category: { key: "categories", title: "Category" }, tag: { key: "tags", title: "Tag" },
|
|
28
|
+
},
|
|
26
29
|
|
|
27
30
|
# Handling Reading
|
|
28
31
|
"include" => [".htaccess", "_redirects", ".well-known"],
|
|
@@ -32,6 +35,7 @@ module Bridgetown
|
|
|
32
35
|
"markdown_ext" => "markdown,mkdown,mkdn,mkd,md",
|
|
33
36
|
"strict_front_matter" => false,
|
|
34
37
|
"slugify_categories" => true,
|
|
38
|
+
"slugify_mode" => "pretty",
|
|
35
39
|
|
|
36
40
|
# Filtering Content
|
|
37
41
|
"limit_posts" => 0,
|
|
@@ -56,7 +60,7 @@ module Bridgetown
|
|
|
56
60
|
# Output Configuration
|
|
57
61
|
"available_locales" => ["en"],
|
|
58
62
|
"default_locale" => "en",
|
|
59
|
-
"permalink" =>
|
|
63
|
+
"permalink" => nil, # default is set according to content engine
|
|
60
64
|
"timezone" => nil, # use the local timezone
|
|
61
65
|
|
|
62
66
|
"quiet" => false,
|
|
@@ -70,15 +74,16 @@ module Bridgetown
|
|
|
70
74
|
},
|
|
71
75
|
|
|
72
76
|
"kramdown" => {
|
|
73
|
-
"auto_ids"
|
|
74
|
-
"toc_levels"
|
|
75
|
-
"entity_output"
|
|
76
|
-
"smart_quotes"
|
|
77
|
-
"input"
|
|
78
|
-
"hard_wrap"
|
|
79
|
-
"guess_lang"
|
|
80
|
-
"footnote_nr"
|
|
81
|
-
"show_warnings"
|
|
77
|
+
"auto_ids" => true,
|
|
78
|
+
"toc_levels" => (1..6).to_a,
|
|
79
|
+
"entity_output" => "as_char",
|
|
80
|
+
"smart_quotes" => "lsquo,rsquo,ldquo,rdquo",
|
|
81
|
+
"input" => "GFM",
|
|
82
|
+
"hard_wrap" => false,
|
|
83
|
+
"guess_lang" => true,
|
|
84
|
+
"footnote_nr" => 1,
|
|
85
|
+
"show_warnings" => false,
|
|
86
|
+
"include_extraction_tags" => false,
|
|
82
87
|
},
|
|
83
88
|
}.each_with_object(Configuration.new) { |(k, v), hsh| hsh[k] = v.freeze }.freeze
|
|
84
89
|
|
|
@@ -95,8 +100,8 @@ module Bridgetown
|
|
|
95
100
|
# user_config - a Hash or Configuration of overrides.
|
|
96
101
|
#
|
|
97
102
|
# Returns a Configuration filled with defaults.
|
|
98
|
-
def from(user_config)
|
|
99
|
-
Utils.deep_merge_hashes(
|
|
103
|
+
def from(user_config, starting_defaults = DEFAULTS)
|
|
104
|
+
Utils.deep_merge_hashes(starting_defaults.deep_dup, Configuration[user_config])
|
|
100
105
|
.merge_environment_specific_options!
|
|
101
106
|
.add_default_collections
|
|
102
107
|
.add_default_excludes
|
|
@@ -139,10 +144,10 @@ module Bridgetown
|
|
|
139
144
|
def safe_load_file(filename)
|
|
140
145
|
case File.extname(filename)
|
|
141
146
|
when %r!\.toml!i
|
|
142
|
-
Bridgetown::
|
|
147
|
+
Bridgetown::Utils::RequireGems.require_with_graceful_fail("tomlrb") unless defined?(Tomlrb)
|
|
143
148
|
Tomlrb.load_file(filename)
|
|
144
149
|
when %r!\.ya?ml!i
|
|
145
|
-
|
|
150
|
+
YAMLParser.load_file(filename) || {}
|
|
146
151
|
else
|
|
147
152
|
raise ArgumentError,
|
|
148
153
|
"No parser for '#{filename}' is available. Use a .y(a)ml or .toml file instead."
|
|
@@ -242,23 +247,38 @@ module Bridgetown
|
|
|
242
247
|
self
|
|
243
248
|
end
|
|
244
249
|
|
|
245
|
-
def add_default_collections
|
|
250
|
+
def add_default_collections # rubocop:todo all
|
|
246
251
|
# It defaults to `{}`, so this is only if someone sets it to null manually.
|
|
247
|
-
return self if self[
|
|
252
|
+
return self if self[:collections].nil?
|
|
248
253
|
|
|
249
254
|
# Ensure we have a hash.
|
|
250
|
-
if self[
|
|
251
|
-
self[
|
|
255
|
+
if self[:collections].is_a?(Array)
|
|
256
|
+
self[:collections] = self[:collections].each_with_object({}) do |collection, hash|
|
|
252
257
|
hash[collection] = {}
|
|
253
258
|
end
|
|
254
259
|
end
|
|
255
260
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
261
|
+
# Setup default collections
|
|
262
|
+
self[:collections][:posts] = {} unless self[:collections][:posts]
|
|
263
|
+
self[:collections][:posts][:output] = true
|
|
264
|
+
self[:collections][:posts][:sort_direction] ||= "descending"
|
|
265
|
+
|
|
266
|
+
if self[:content_engine] == "resource"
|
|
267
|
+
self[:permalink] = "pretty" if self[:permalink].blank?
|
|
268
|
+
self[:collections][:pages] = {} unless self[:collections][:pages]
|
|
269
|
+
self[:collections][:pages][:output] = true
|
|
270
|
+
self[:collections][:pages][:permalink] ||= "/:path/"
|
|
271
|
+
|
|
272
|
+
self[:collections][:data] = {} unless self[:collections][:data]
|
|
273
|
+
self[:collections][:data][:output] = false
|
|
274
|
+
|
|
275
|
+
unless self[:collections][:posts][:permalink]
|
|
276
|
+
self[:collections][:posts][:permalink] = self[:permalink]
|
|
277
|
+
end
|
|
278
|
+
else
|
|
279
|
+
self[:permalink] = "date" if self[:permalink].blank?
|
|
280
|
+
unless self[:collections][:posts][:permalink]
|
|
281
|
+
self[:collections][:posts][:permalink] = style_to_permalink(self[:permalink])
|
|
262
282
|
end
|
|
263
283
|
end
|
|
264
284
|
|
|
@@ -284,9 +304,9 @@ module Bridgetown
|
|
|
284
304
|
self["ruby_in_front_matter"]
|
|
285
305
|
end
|
|
286
306
|
|
|
287
|
-
#
|
|
288
|
-
def style_to_permalink(permalink_style)
|
|
289
|
-
case permalink_style.to_sym
|
|
307
|
+
# Deprecated, to be removed when Bridgetown goes Resource-only
|
|
308
|
+
def style_to_permalink(permalink_style) # rubocop:todo Metrics/CyclomaticComplexity
|
|
309
|
+
case permalink_style.to_s.to_sym
|
|
290
310
|
when :pretty
|
|
291
311
|
"/:categories/:year/:month/:day/:title/"
|
|
292
312
|
when :simple
|
|
@@ -303,7 +323,6 @@ module Bridgetown
|
|
|
303
323
|
permalink_style.to_s
|
|
304
324
|
end
|
|
305
325
|
end
|
|
306
|
-
# rubocop:enable Metrics/CyclomaticComplexity #
|
|
307
326
|
|
|
308
327
|
def check_include_exclude
|
|
309
328
|
%w(include exclude).each do |option|
|
|
@@ -314,8 +333,10 @@ module Bridgetown
|
|
|
314
333
|
"'#{option}' should be set as an array, but was: #{self[option].inspect}."
|
|
315
334
|
end
|
|
316
335
|
|
|
317
|
-
|
|
318
|
-
|
|
336
|
+
unless self[:include].include?("_pages") || self[:content_engine] == "resource"
|
|
337
|
+
# add _pages to includes set
|
|
338
|
+
self[:include] << "_pages"
|
|
339
|
+
end
|
|
319
340
|
|
|
320
341
|
self
|
|
321
342
|
end
|