bridgetown-core 0.16.0.beta1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/bridgetown-core.gemspec +3 -1
  4. data/lib/bridgetown-core.rb +45 -29
  5. data/lib/bridgetown-core/collection.rb +5 -1
  6. data/lib/bridgetown-core/commands/apply.rb +2 -2
  7. data/lib/bridgetown-core/commands/concerns/actions.rb +2 -1
  8. data/lib/bridgetown-core/commands/console.rb +4 -4
  9. data/lib/bridgetown-core/commands/new.rb +1 -1
  10. data/lib/bridgetown-core/concerns/layout_placeable.rb +1 -1
  11. data/lib/bridgetown-core/concerns/liquid_renderable.rb +10 -0
  12. data/lib/bridgetown-core/concerns/site/configurable.rb +24 -22
  13. data/lib/bridgetown-core/concerns/site/content.rb +46 -33
  14. data/lib/bridgetown-core/concerns/site/extensible.rb +14 -13
  15. data/lib/bridgetown-core/concerns/site/localizable.rb +24 -0
  16. data/lib/bridgetown-core/concerns/site/processable.rb +12 -11
  17. data/lib/bridgetown-core/concerns/site/renderable.rb +35 -28
  18. data/lib/bridgetown-core/concerns/site/writable.rb +7 -15
  19. data/lib/bridgetown-core/concerns/validatable.rb +2 -2
  20. data/lib/bridgetown-core/configuration.rb +14 -6
  21. data/lib/bridgetown-core/converter.rb +0 -42
  22. data/lib/bridgetown-core/converters/erb_templates.rb +93 -17
  23. data/lib/bridgetown-core/converters/liquid_templates.rb +96 -0
  24. data/lib/bridgetown-core/converters/markdown.rb +0 -3
  25. data/lib/bridgetown-core/document.rb +34 -21
  26. data/lib/bridgetown-core/drops/site_drop.rb +5 -1
  27. data/lib/bridgetown-core/drops/unified_payload_drop.rb +0 -1
  28. data/lib/bridgetown-core/drops/url_drop.rb +19 -3
  29. data/lib/bridgetown-core/excerpt.rb +1 -1
  30. data/lib/bridgetown-core/filters.rb +37 -55
  31. data/lib/bridgetown-core/filters/condition_helpers.rb +56 -0
  32. data/lib/bridgetown-core/frontmatter_defaults.rb +17 -0
  33. data/lib/bridgetown-core/generators/prototype_generator.rb +42 -25
  34. data/lib/bridgetown-core/helpers.rb +84 -0
  35. data/lib/bridgetown-core/liquid_renderer.rb +1 -1
  36. data/lib/bridgetown-core/log_writer.rb +2 -2
  37. data/lib/bridgetown-core/page.rb +8 -2
  38. data/lib/bridgetown-core/plugin_manager.rb +44 -3
  39. data/lib/bridgetown-core/reader.rb +2 -4
  40. data/lib/bridgetown-core/readers/collection_reader.rb +1 -0
  41. data/lib/bridgetown-core/readers/data_reader.rb +4 -3
  42. data/lib/bridgetown-core/readers/defaults_reader.rb +27 -0
  43. data/lib/bridgetown-core/readers/layout_reader.rb +1 -0
  44. data/lib/bridgetown-core/readers/page_reader.rb +1 -0
  45. data/lib/bridgetown-core/readers/post_reader.rb +29 -15
  46. data/lib/bridgetown-core/readers/static_file_reader.rb +1 -0
  47. data/lib/bridgetown-core/renderer.rb +42 -160
  48. data/lib/bridgetown-core/ruby_template_view.rb +26 -8
  49. data/lib/bridgetown-core/site.rb +14 -2
  50. data/lib/bridgetown-core/tags/find.rb +86 -0
  51. data/lib/bridgetown-core/tags/t.rb +14 -0
  52. data/lib/bridgetown-core/tags/webpack_path.rb +6 -41
  53. data/lib/bridgetown-core/utils.rb +69 -2
  54. data/lib/bridgetown-core/utils/ruby_exec.rb +1 -1
  55. data/lib/bridgetown-core/version.rb +2 -2
  56. data/lib/bridgetown-core/watcher.rb +1 -0
  57. data/lib/site_template/src/_layouts/{default.html → default.liquid} +0 -0
  58. data/lib/site_template/src/_layouts/{home.html → home.liquid} +0 -0
  59. data/lib/site_template/src/_layouts/{page.html → page.liquid} +0 -0
  60. data/lib/site_template/src/_layouts/{post.html → post.liquid} +0 -0
  61. data/lib/site_template/src/images/.keep +1 -0
  62. metadata +47 -10
@@ -1,20 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Bridgetown
4
- module Site::Extensible
3
+ class Bridgetown::Site
4
+ module Extensible
5
5
  # Load necessary libraries, plugins, converters, and generators.
6
- # @see Bridgetown::Converter
7
- # @see Bridgetown::Generator
6
+ # @see Converter
7
+ # @see Generator
8
8
  # @see PluginManager
9
9
  # @return [void]
10
10
  def setup
11
11
  plugin_manager.require_plugin_files
12
+ plugin_manager.setup_component_loaders
12
13
  self.converters = instantiate_subclasses(Bridgetown::Converter)
13
14
  self.generators = instantiate_subclasses(Bridgetown::Generator)
14
15
  end
15
16
 
16
17
  # Run all Generators.
17
- # @see Bridgetown::Generator
18
+ # @see Generator
18
19
  # @return [void]
19
20
  def generate
20
21
  generators.each do |generator|
@@ -33,10 +34,10 @@ module Bridgetown
33
34
  end
34
35
  end
35
36
 
36
- # Get the implementation class for the given Converter.
37
- # @param klass [Object] The Class of the Converter to fetch.
38
- # @return [Bridgetown::Converter] Returns the {Bridgetown::Converter}
39
- # instance implementing the given +Converter+.
37
+ # Get the implementation for the given Converter class.
38
+ # @param klass [Class] The Class of the Converter to fetch.
39
+ # @return [Converter] Returns the {Converter}
40
+ # instance implementing the given `Converter` class.
40
41
  def find_converter_instance(klass)
41
42
  @find_converter_instance ||= {}
42
43
  @find_converter_instance[klass] ||= begin
@@ -45,11 +46,11 @@ module Bridgetown
45
46
  end
46
47
  end
47
48
 
48
- # Create an array of instances of the subclasses of the class or module
49
+ # Create an array of instances of the subclasses of the class
49
50
  # passed in as argument.
50
- # @param klass [Class, Module] - class or module containing the subclasses.
51
- # @return [Array<Object>] Returns an array of instances of subclasses of
52
- # +klass+.
51
+ # @param klass [Class] - class which is the parent of the subclasses.
52
+ # @return [Array<Converter, Generator>] Returns an array of instances of
53
+ # subclasses of `klass`.
53
54
  def instantiate_subclasses(klass)
54
55
  klass.descendants.sort.map do |c|
55
56
  c.new(config)
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Bridgetown::Site
4
+ module Localizable
5
+ # Returns the current and/or default configured locale
6
+ # @return String
7
+ def locale
8
+ if @locale
9
+ @locale
10
+ else
11
+ @locale = ENV.fetch("BRIDGETOWN_LOCALE", config[:default_locale]).to_sym
12
+ I18n.load_path << Dir[in_source_dir("_locales") + "/*.yml"]
13
+ I18n.available_locales = config[:available_locales]
14
+ I18n.default_locale = @locale
15
+ end
16
+ end
17
+
18
+ # Sets the current locale for the site
19
+ # @param new_locale [String] for example: "en" for English, "es" for Spanish
20
+ def locale=(new_locale)
21
+ I18n.locale = @locale = new_locale.to_sym
22
+ end
23
+ end
24
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Bridgetown
4
- module Site::Processable
3
+ class Bridgetown::Site
4
+ module Processable
5
5
  # Reset, Read, Generate, Render, Cleanup, Process, and Write this Site to output.
6
6
  # @return [void]
7
7
  # @see #reset
@@ -22,18 +22,19 @@ module Bridgetown
22
22
 
23
23
  # rubocop:disable Metrics/AbcSize
24
24
 
25
- # Reset Site details.
25
+ # Reset all in-memory data and content.
26
26
  # @return [void]
27
27
  def reset
28
- self.time = if config["time"]
29
- Utils.parse_date(config["time"].to_s, "Invalid time in bridgetown.config.yml.")
30
- else
31
- Time.now
32
- end
33
- self.layouts = ActiveSupport::HashWithIndifferentAccess.new
28
+ self.time = Time.now
29
+ if config["time"]
30
+ self.time = Bridgetown::Utils.parse_date(
31
+ config["time"].to_s, "Invalid time in bridgetown.config.yml."
32
+ )
33
+ end
34
+ self.layouts = HashWithDotAccess::Hash.new
34
35
  self.pages = []
35
36
  self.static_files = []
36
- self.data = ActiveSupport::HashWithIndifferentAccess.new
37
+ self.data = HashWithDotAccess::Hash.new
37
38
  @post_attr_hash = {}
38
39
  @collections = nil
39
40
  @documents = nil
@@ -50,7 +51,7 @@ module Bridgetown
50
51
 
51
52
  # rubocop:enable Metrics/AbcSize
52
53
 
53
- # Read Site data from disk and load it into internal data structures.
54
+ # Read data from disk and load it into internal memory.
54
55
  # @return [void]
55
56
  def read
56
57
  Bridgetown::Hooks.trigger :site, :pre_read, self
@@ -1,24 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Bridgetown
4
- module Site::Renderable
5
- # Render the site to the destination.
3
+ class Bridgetown::Site
4
+ module Renderable
5
+ # Render all pages & documents so they're ready to be written out to disk.
6
6
  # @return [void]
7
+ # @see Page
8
+ # @see Document
7
9
  def render
8
- payload = site_payload
9
-
10
- Bridgetown::Hooks.trigger :site, :pre_render, self, payload
11
-
10
+ Bridgetown::Hooks.trigger :site, :pre_render, self
12
11
  execute_inline_ruby_for_layouts!
13
-
14
- render_docs(payload)
15
- render_pages(payload)
16
-
17
- Bridgetown::Hooks.trigger :site, :post_render, self, payload
12
+ render_docs
13
+ render_pages
14
+ Bridgetown::Hooks.trigger :site, :post_render, self
18
15
  end
19
16
 
20
- # Executes inline Ruby frontmatter if
21
- # +ENV+["BRIDGETOWN_RUBY_IN_FRONTMATTER"] equals "true"
17
+ # Executes inline Ruby frontmatter
22
18
  #
23
19
  # @example
24
20
  # calculation: !ruby/string:Rb |
@@ -34,36 +30,47 @@ module Bridgetown
34
30
  end
35
31
 
36
32
  # Renders all documents
37
- # @param payload [Hash] A hash of site data.
38
33
  # @return [void]
39
- # @see Bridgetown::Site::Content#site_payload
40
- def render_docs(payload)
34
+ def render_docs
41
35
  collections.each_value do |collection|
42
36
  collection.docs.each do |document|
43
- render_regenerated(document, payload)
37
+ render_with_locale(document) do
38
+ render_regenerated document
39
+ end
44
40
  end
45
41
  end
46
42
  end
47
43
 
48
44
  # Renders all pages
49
- # @param payload [Hash] A hash of site data.
50
45
  # @return [void]
51
- # @see Bridgetown::Site::Content#site_payload
52
- def render_pages(payload)
46
+ def render_pages
53
47
  pages.each do |page|
54
- render_regenerated(page, payload)
48
+ render_regenerated page
49
+ end
50
+ end
51
+
52
+ # Renders a document while ensuring site locale is set if the data is available.
53
+ # @param document [Document] The document to render
54
+ # @yield Runs the block in between locale setting and resetting
55
+ # @return [void]
56
+ def render_with_locale(document)
57
+ if document.data["locale"]
58
+ previous_locale = locale
59
+ self.locale = document.data["locale"]
60
+ yield
61
+ self.locale = previous_locale
62
+ else
63
+ yield
55
64
  end
56
65
  end
57
66
 
58
- # Regenerates a site using {Bridgetown::Renderer}
59
- # @param document [Post] The document to regenerate.
60
- # @param payload [Hash] A hash of site data.
67
+ # Regenerates a site using {Renderer}
68
+ # @param document [Document] The document to regenerate.
61
69
  # @return [void]
62
- # @see Bridgetown::Renderer
63
- def render_regenerated(document, payload)
70
+ def render_regenerated(document)
64
71
  return unless regenerator.regenerate?(document)
65
72
 
66
- Bridgetown::Renderer.new(self, document, payload).run
73
+ Bridgetown::Renderer.new(self, document).run
67
74
  end
68
75
  end
69
76
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Bridgetown
4
- module Site::Writable
3
+ class Bridgetown::Site
4
+ module Writable
5
5
  # Remove orphaned files and empty directories in destination.
6
6
  #
7
7
  # @return [void]
@@ -9,7 +9,7 @@ module Bridgetown
9
9
  @cleaner.cleanup!
10
10
  end
11
11
 
12
- # Write static files, pages, and posts.
12
+ # Write static files, pages, and documents to the destination folder.
13
13
  #
14
14
  # @return [void]
15
15
  def write
@@ -20,22 +20,14 @@ module Bridgetown
20
20
  Bridgetown::Hooks.trigger :site, :post_write, self
21
21
  end
22
22
 
23
- # Yields the pages from {#pages}, {#static_files}, and {#docs_to_write}.
23
+ # Yields all content objects while looping through {#pages},
24
+ # {#static_files_to_write}, and {#docs_to_write}.
24
25
  #
25
- # @yieldparam item [Document, Page, StaticFile] Yields a
26
- # {#Bridgetown::Page}, {#Bridgetown::StaticFile}, or
27
- # {#Bridgetown::Document} object.
26
+ # @yieldparam item [Document, Page, StaticFile]
28
27
  #
29
28
  # @return [void]
30
- #
31
- # @see #pages
32
- # @see #static_files
33
- # @see #docs_to_write
34
- # @see Page
35
- # @see StaticFile
36
- # @see Document
37
29
  def each_site_file
38
- %w(pages static_files docs_to_write).each do |type|
30
+ %w(pages static_files_to_write docs_to_write).each do |type|
39
31
  send(type).each do |item|
40
32
  yield item
41
33
  end
@@ -22,7 +22,7 @@ module Bridgetown
22
22
  **Utils.merged_file_read_opts(site, opts))
23
23
  if content =~ Document::YAML_FRONT_MATTER_REGEXP
24
24
  self.content = $POSTMATCH
25
- self.data = SafeYAML.load(Regexp.last_match(1))&.with_indifferent_access
25
+ self.data = SafeYAML.load(Regexp.last_match(1))&.with_dot_access
26
26
  end
27
27
  rescue Psych::SyntaxError => e
28
28
  Bridgetown.logger.warn "YAML Exception reading #{filename}: #{e.message}"
@@ -32,7 +32,7 @@ module Bridgetown
32
32
  raise e if site.config["strict_front_matter"]
33
33
  end
34
34
 
35
- self.data ||= ActiveSupport::HashWithIndifferentAccess.new
35
+ self.data ||= HashWithDotAccess::Hash.new
36
36
 
37
37
  validate_data! filename
38
38
  validate_permalink! filename
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bridgetown
4
- # TODO: refactor this whole object! Already had to fix obscure
5
- # bugs just making minor changes, and all the indirection is
6
- # quite hard to decipher. -JW
7
- class Configuration < ActiveSupport::HashWithIndifferentAccess
4
+ # Holds the processed configuration loaded from the YAML config file.
5
+ #
6
+ # @todo refactor this whole object! Already had to fix obscure
7
+ # bugs just making minor changes, and all the indirection is
8
+ # quite hard to decipher. -JW
9
+ class Configuration < HashWithDotAccess::Hash
8
10
  # Default options. Overridden by values in bridgetown.config.yml.
9
11
  # Strings rather than symbols are used for compatibility with YAML.
10
12
  DEFAULTS = {
@@ -35,7 +37,7 @@ module Bridgetown
35
37
  "limit_posts" => 0,
36
38
  "future" => false,
37
39
  "unpublished" => false,
38
- "ruby_in_front_matter" => true, # requires BRIDGETOWN_RUBY_IN_FRONT_MATTER == "true"
40
+ "ruby_in_front_matter" => true,
39
41
 
40
42
  # Conversion
41
43
  "markdown" => "kramdown",
@@ -52,6 +54,8 @@ module Bridgetown
52
54
  "show_dir_listing" => false,
53
55
 
54
56
  # Output Configuration
57
+ "available_locales" => ["en"],
58
+ "default_locale" => "en",
55
59
  "permalink" => "date",
56
60
  "timezone" => nil, # use the local timezone
57
61
 
@@ -276,7 +280,7 @@ module Bridgetown
276
280
  end
277
281
 
278
282
  def should_execute_inline_ruby?
279
- ENV["BRIDGETOWN_RUBY_IN_FRONT_MATTER"] == "true" &&
283
+ ENV["BRIDGETOWN_RUBY_IN_FRONT_MATTER"] != "false" &&
280
284
  self["ruby_in_front_matter"]
281
285
  end
282
286
 
@@ -309,6 +313,10 @@ module Bridgetown
309
313
  raise Bridgetown::Errors::InvalidConfigurationError,
310
314
  "'#{option}' should be set as an array, but was: #{self[option].inspect}."
311
315
  end
316
+
317
+ # add _pages to includes set
318
+ self[:include] << "_pages"
319
+
312
320
  self
313
321
  end
314
322
  end
@@ -16,34 +16,6 @@ module Bridgetown
16
16
  end
17
17
  end
18
18
 
19
- # Public: Get or set the highlighter prefix. When an argument is specified,
20
- # the prefix will be set. If no argument is specified, the current prefix
21
- # will be returned.
22
- #
23
- # highlighter_prefix - The String prefix (default: nil).
24
- #
25
- # Returns the String prefix.
26
- def self.highlighter_prefix(highlighter_prefix = nil)
27
- unless defined?(@highlighter_prefix) && highlighter_prefix.nil?
28
- @highlighter_prefix = highlighter_prefix
29
- end
30
- @highlighter_prefix
31
- end
32
-
33
- # Public: Get or set the highlighter suffix. When an argument is specified,
34
- # the suffix will be set. If no argument is specified, the current suffix
35
- # will be returned.
36
- #
37
- # highlighter_suffix - The String suffix (default: nil).
38
- #
39
- # Returns the String suffix.
40
- def self.highlighter_suffix(highlighter_suffix = nil)
41
- unless defined?(@highlighter_suffix) && highlighter_suffix.nil?
42
- @highlighter_suffix = highlighter_suffix
43
- end
44
- @highlighter_suffix
45
- end
46
-
47
19
  # Initialize the converter.
48
20
  #
49
21
  # Returns an initialized Converter.
@@ -70,19 +42,5 @@ module Bridgetown
70
42
  def output_ext(_ext)
71
43
  ".html"
72
44
  end
73
-
74
- # Get the highlighter prefix.
75
- #
76
- # Returns the String prefix.
77
- def highlighter_prefix
78
- self.class.highlighter_prefix
79
- end
80
-
81
- # Get the highlighter suffix.
82
- #
83
- # Returns the String suffix.
84
- def highlighter_suffix
85
- self.class.highlighter_suffix
86
- end
87
45
  end
88
46
  end
@@ -1,52 +1,114 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "tilt/erb"
4
- require "active_support/core_ext/hash/keys"
3
+ require "tilt/erubi"
5
4
 
6
5
  module Bridgetown
6
+ class ERBBuffer < String
7
+ def concat_to_s(input)
8
+ concat input.to_s
9
+ end
10
+
11
+ alias_method :safe_append=, :concat_to_s
12
+ alias_method :append=, :concat_to_s
13
+ alias_method :safe_expr_append=, :concat_to_s
14
+ end
15
+
16
+ class ERBEngine < Erubi::Engine
17
+ private
18
+
19
+ def add_code(code)
20
+ @src << code
21
+ @src << ";#{@bufvar};" if code.strip.split(".").first == "end"
22
+ @src << ";" unless code[Erubi::RANGE_LAST] == "\n"
23
+ end
24
+
25
+ # pulled from Rails' ActionView
26
+ BLOCK_EXPR = %r!\s*((\s+|\))do|\{)(\s*\|[^|]*\|)?\s*\Z!.freeze
27
+
28
+ def add_expression(indicator, code)
29
+ if BLOCK_EXPR.match?(code)
30
+ src << "#{@bufvar}.append= " << code
31
+ else
32
+ super
33
+ end
34
+ end
35
+
36
+ # Don't allow == to output escaped strings, as that's the opposite of Rails
37
+ def add_expression_result_escaped(code)
38
+ add_expression_result(code)
39
+ end
40
+ end
41
+
7
42
  class ERBView < RubyTemplateView
8
- include ERB::Util
43
+ def h(input)
44
+ Erubi.h(input)
45
+ end
9
46
 
10
47
  def partial(partial_name, options = {})
11
48
  options.merge!(options[:locals]) if options[:locals]
49
+ options[:content] = yield if block_given?
12
50
 
13
51
  partial_segments = partial_name.split("/")
14
52
  partial_segments.last.sub!(%r!^!, "_")
15
53
  partial_name = partial_segments.join("/")
16
54
 
17
- Tilt::ERBTemplate.new(
55
+ Tilt::ErubiTemplate.new(
18
56
  site.in_source_dir(site.config[:partials_dir], "#{partial_name}.erb"),
19
- trim: "<>-",
20
- outvar: "@_erbout"
57
+ outvar: "@_erbout",
58
+ bufval: "Bridgetown::ERBBuffer.new",
59
+ engine_class: ERBEngine
21
60
  ).render(self, options)
22
61
  end
23
62
 
24
- def markdownify
63
+ def markdownify(input = nil, &block)
64
+ content = Bridgetown::Utils.reindent_for_markdown(
65
+ block.nil? ? input.to_s : capture(&block)
66
+ )
67
+ converter = site.find_converter_instance(Bridgetown::Converters::Markdown)
68
+ converter.convert(content).strip
69
+ end
70
+
71
+ def capture(obj = nil, &block)
25
72
  previous_buffer_state = @_erbout
26
- @_erbout = +""
27
- result = yield
73
+ @_erbout = ERBBuffer.new
74
+
75
+ # For compatibility with ActionView, not used by Bridgetown normally
76
+ previous_ob_state = @output_buffer
77
+ @output_buffer = ERBBuffer.new
78
+
79
+ result = instance_exec(obj, &block)
80
+ if @output_buffer != ""
81
+ # use Rails' ActionView buffer if present
82
+ result = @output_buffer
83
+ end
28
84
  @_erbout = previous_buffer_state
85
+ @output_buffer = previous_ob_state
29
86
 
30
- content = Bridgetown::Utils.reindent_for_markdown(result)
31
- converter = site.find_converter_instance(Bridgetown::Converters::Markdown)
32
- md_output = converter.convert(content).strip
33
- @_erbout << md_output
87
+ result.respond_to?(:html_safe) ? result.html_safe : result
34
88
  end
35
89
  end
36
90
 
37
91
  module Converters
38
92
  class ERBTemplates < Converter
93
+ priority :highest
39
94
  input :erb
40
95
 
41
- # Logic to do the content conversion.
96
+ # Logic to do the ERB content conversion.
42
97
  #
43
- # content - String content of file (without front matter).
98
+ # @param content [String] Content of the file (without front matter).
99
+ # @params convertible [Bridgetown::Page, Bridgetown::Document, Bridgetown::Layout]
100
+ # The instantiated object which is processing the file.
44
101
  #
45
- # Returns a String of the converted content.
102
+ # @return [String] The converted content.
46
103
  def convert(content, convertible)
47
104
  erb_view = Bridgetown::ERBView.new(convertible)
48
105
 
49
- erb_renderer = Tilt::ERBTemplate.new(trim: "<>-", outvar: "@_erbout") { content }
106
+ erb_renderer = Tilt::ErubiTemplate.new(
107
+ convertible.relative_path,
108
+ outvar: "@_erbout",
109
+ bufval: "Bridgetown::ERBBuffer.new",
110
+ engine_class: ERBEngine
111
+ ) { content }
50
112
 
51
113
  if convertible.is_a?(Bridgetown::Layout)
52
114
  erb_renderer.render(erb_view) do
@@ -56,6 +118,20 @@ module Bridgetown
56
118
  erb_renderer.render(erb_view)
57
119
  end
58
120
  end
121
+
122
+ def matches(ext, convertible)
123
+ if convertible.data[:template_engine] == "erb" ||
124
+ (convertible.data[:template_engine].nil? &&
125
+ @config[:template_engine] == "erb")
126
+ return true
127
+ end
128
+
129
+ super(ext)
130
+ end
131
+
132
+ def output_ext(ext)
133
+ ext == ".erb" ? ".html" : ext
134
+ end
59
135
  end
60
136
  end
61
137
  end