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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/bridgetown-core.gemspec +1 -2
  3. data/lib/bridgetown-core.rb +37 -29
  4. data/lib/bridgetown-core/cleaner.rb +9 -3
  5. data/lib/bridgetown-core/collection.rb +177 -78
  6. data/lib/bridgetown-core/commands/base.rb +9 -0
  7. data/lib/bridgetown-core/commands/build.rb +0 -11
  8. data/lib/bridgetown-core/commands/concerns/git_helpers.rb +20 -0
  9. data/lib/bridgetown-core/commands/configure.rb +8 -3
  10. data/lib/bridgetown-core/commands/console.rb +4 -0
  11. data/lib/bridgetown-core/commands/doctor.rb +1 -19
  12. data/lib/bridgetown-core/commands/new.rb +2 -2
  13. data/lib/bridgetown-core/commands/plugins.rb +14 -13
  14. data/lib/bridgetown-core/commands/serve.rb +0 -14
  15. data/lib/bridgetown-core/component.rb +178 -0
  16. data/lib/bridgetown-core/concerns/data_accessible.rb +1 -0
  17. data/lib/bridgetown-core/concerns/front_matter_importer.rb +52 -0
  18. data/lib/bridgetown-core/concerns/site/configurable.rb +10 -10
  19. data/lib/bridgetown-core/concerns/site/content.rb +56 -15
  20. data/lib/bridgetown-core/concerns/site/localizable.rb +3 -5
  21. data/lib/bridgetown-core/concerns/site/processable.rb +6 -4
  22. data/lib/bridgetown-core/concerns/site/renderable.rb +26 -0
  23. data/lib/bridgetown-core/concerns/site/writable.rb +12 -2
  24. data/lib/bridgetown-core/concerns/validatable.rb +2 -5
  25. data/lib/bridgetown-core/configuration.rb +51 -30
  26. data/lib/bridgetown-core/configurations/bt-postcss.rb +1 -3
  27. data/lib/bridgetown-core/configurations/netlify.rb +1 -0
  28. data/lib/bridgetown-core/configurations/tailwindcss.rb +1 -3
  29. data/lib/bridgetown-core/converter.rb +23 -0
  30. data/lib/bridgetown-core/converters/erb_templates.rb +51 -35
  31. data/lib/bridgetown-core/converters/identity.rb +0 -9
  32. data/lib/bridgetown-core/converters/liquid_templates.rb +1 -1
  33. data/lib/bridgetown-core/converters/markdown.rb +14 -4
  34. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +5 -38
  35. data/lib/bridgetown-core/converters/ruby_templates.rb +17 -0
  36. data/lib/bridgetown-core/converters/smartypants.rb +3 -1
  37. data/lib/bridgetown-core/core_ext/psych.rb +19 -0
  38. data/lib/bridgetown-core/current.rb +10 -0
  39. data/lib/bridgetown-core/document.rb +9 -16
  40. data/lib/bridgetown-core/drops/collection_drop.rb +1 -1
  41. data/lib/bridgetown-core/drops/page_drop.rb +4 -0
  42. data/lib/bridgetown-core/drops/relations_drop.rb +23 -0
  43. data/lib/bridgetown-core/drops/resource_drop.rb +83 -0
  44. data/lib/bridgetown-core/drops/site_drop.rb +33 -8
  45. data/lib/bridgetown-core/drops/unified_payload_drop.rb +5 -0
  46. data/lib/bridgetown-core/entry_filter.rb +17 -28
  47. data/lib/bridgetown-core/errors.rb +0 -2
  48. data/lib/bridgetown-core/filters.rb +3 -26
  49. data/lib/bridgetown-core/filters/from_liquid.rb +23 -0
  50. data/lib/bridgetown-core/filters/url_filters.rb +12 -0
  51. data/lib/bridgetown-core/frontmatter_defaults.rb +1 -1
  52. data/lib/bridgetown-core/generators/prototype_generator.rb +37 -19
  53. data/lib/bridgetown-core/helpers.rb +48 -9
  54. data/lib/bridgetown-core/layout.rb +28 -13
  55. data/lib/bridgetown-core/liquid_renderer/file.rb +1 -0
  56. data/lib/bridgetown-core/liquid_renderer/table.rb +1 -0
  57. data/lib/bridgetown-core/model/base.rb +138 -0
  58. data/lib/bridgetown-core/model/builder_origin.rb +40 -0
  59. data/lib/bridgetown-core/model/origin.rb +38 -0
  60. data/lib/bridgetown-core/model/repo_origin.rb +126 -0
  61. data/lib/bridgetown-core/page.rb +11 -2
  62. data/lib/bridgetown-core/plugin_manager.rb +1 -3
  63. data/lib/bridgetown-core/publisher.rb +8 -2
  64. data/lib/bridgetown-core/reader.rb +37 -22
  65. data/lib/bridgetown-core/readers/data_reader.rb +5 -5
  66. data/lib/bridgetown-core/readers/defaults_reader.rb +1 -1
  67. data/lib/bridgetown-core/readers/page_reader.rb +1 -0
  68. data/lib/bridgetown-core/readers/post_reader.rb +5 -4
  69. data/lib/bridgetown-core/regenerator.rb +9 -2
  70. data/lib/bridgetown-core/related_posts.rb +9 -6
  71. data/lib/bridgetown-core/renderer.rb +6 -13
  72. data/lib/bridgetown-core/resource/base.rb +313 -0
  73. data/lib/bridgetown-core/resource/destination.rb +49 -0
  74. data/lib/bridgetown-core/resource/permalink_processor.rb +179 -0
  75. data/lib/bridgetown-core/resource/relations.rb +132 -0
  76. data/lib/bridgetown-core/resource/taxonomy_term.rb +34 -0
  77. data/lib/bridgetown-core/resource/taxonomy_type.rb +56 -0
  78. data/lib/bridgetown-core/resource/transformer.rb +177 -0
  79. data/lib/bridgetown-core/ruby_template_view.rb +11 -11
  80. data/lib/bridgetown-core/site.rb +13 -6
  81. data/lib/bridgetown-core/static_file.rb +33 -10
  82. data/lib/bridgetown-core/tags/highlight.rb +2 -15
  83. data/lib/bridgetown-core/tags/include.rb +1 -1
  84. data/lib/bridgetown-core/tags/post_url.rb +2 -2
  85. data/lib/bridgetown-core/url.rb +1 -0
  86. data/lib/bridgetown-core/utils.rb +49 -43
  87. data/lib/bridgetown-core/utils/require_gems.rb +60 -0
  88. data/lib/bridgetown-core/utils/ruby_exec.rb +6 -9
  89. data/lib/bridgetown-core/utils/ruby_front_matter.rb +39 -0
  90. data/lib/bridgetown-core/version.rb +2 -2
  91. data/lib/bridgetown-core/watcher.rb +1 -1
  92. data/lib/bridgetown-core/yaml_parser.rb +22 -0
  93. data/lib/site_template/package.json.erb +2 -2
  94. data/lib/site_template/plugins/site_builder.rb +1 -1
  95. data/lib/site_template/src/_posts/0000-00-00-welcome-to-bridgetown.md.erb +1 -1
  96. data/lib/site_template/webpack.config.js.erb +26 -6
  97. metadata +39 -40
  98. data/lib/bridgetown-core/external.rb +0 -58
  99. data/lib/bridgetown-core/page_without_a_file.rb +0 -17
  100. data/lib/bridgetown-core/path_manager.rb +0 -31
  101. data/lib/bridgetown-core/readers/collection_reader.rb +0 -23
  102. data/lib/bridgetown-core/readers/static_file_reader.rb +0 -25
  103. data/lib/bridgetown-core/utils/exec.rb +0 -26
  104. data/lib/bridgetown-core/utils/internet.rb +0 -37
  105. data/lib/bridgetown-core/utils/platforms.rb +0 -80
  106. data/lib/bridgetown-core/utils/thread_event.rb +0 -31
  107. data/lib/bridgetown-core/utils/win_tz.rb +0 -75
@@ -1,6 +1,7 @@
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 DataAccessible
5
6
  # Returns the contents as a String.
6
7
  def to_s
@@ -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.permalink_style = config["permalink"].to_sym
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
- Bridgetown::Cache.cache_dir = in_root_dir(config["cache_dir"], "Bridgetown/Cache")
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
- case config["collections"]
128
- when Hash
129
- config["collections"].keys
130
- when Array
131
- config["collections"]
132
- when nil
133
- []
134
- else
135
- raise ArgumentError, "Your `collections` key must be a hash or an array."
136
- end
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 posts.
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
- if @locale
9
- @locale
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 = @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
- limit = posts.docs.length < limit_posts ? posts.docs.length : limit_posts
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}, and {#docs_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 = SafeYAML.load(Regexp.last_match(1))&.with_dot_access
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" => "date",
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" => true,
74
- "toc_levels" => (1..6).to_a,
75
- "entity_output" => "as_char",
76
- "smart_quotes" => "lsquo,rsquo,ldquo,rdquo",
77
- "input" => "GFM",
78
- "hard_wrap" => false,
79
- "guess_lang" => true,
80
- "footnote_nr" => 1,
81
- "show_warnings" => false,
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(DEFAULTS, Configuration[user_config])
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::External.require_with_graceful_fail("tomlrb") unless defined?(Tomlrb)
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
- SafeYAML.load_file(filename) || {}
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["collections"].nil?
252
+ return self if self[:collections].nil?
248
253
 
249
254
  # Ensure we have a hash.
250
- if self["collections"].is_a?(Array)
251
- self["collections"] = self["collections"].each_with_object({}) do |collection, hash|
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
- self["collections"] = Utils.deep_merge_hashes(
257
- { "posts" => {} }, self["collections"]
258
- ).tap do |collections|
259
- collections["posts"]["output"] = true
260
- if self["permalink"]
261
- collections["posts"]["permalink"] ||= style_to_permalink(self["permalink"])
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
- # rubocop:disable Metrics/CyclomaticComplexity #
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
- # add _pages to includes set
318
- self[:include] << "_pages"
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