diff --git a/lib/better_html/better_erb.rb b/lib/better_html/better_erb.rb
index 9ff935b..5fc8ecb 100644
--- a/lib/better_html/better_erb.rb
+++ b/lib/better_html/better_erb.rb
@@ -52,10 +52,20 @@ def generate(template, source)
klass ||= self.class.erb_implementation
escape = self.class.escape_ignore_list.include?(template.type)
+
+ options = {
+ escape: escape,
+ trim: (self.class.erb_trim_mode == "-"),
+ }
+ if BetterHtml.config.annotate_rendered_view_with_filenames && template.format == :html
+ options[:preamble] = "@output_buffer.safe_append='';"
+ options[:postamble] = "@output_buffer.safe_append='';" \
+ "@output_buffer.to_s"
+ end
+
generator = klass.new(
erb,
- escape: escape,
- trim: (self.class.erb_trim_mode == "-")
+ **options
)
generator.validate! if generator.respond_to?(:validate!)
generator.src
diff --git a/lib/better_html/config.rb b/lib/better_html/config.rb
index 1582536..eb74401 100644
--- a/lib/better_html/config.rb
+++ b/lib/better_html/config.rb
@@ -15,6 +15,7 @@ class Config
property :template_exclusion_filter
property :lodash_safe_javascript_expression, default: -> { [/\AJSON\.stringify\(/] }
property :disable_parser_validation, default: false
+ property :annotate_rendered_view_with_filenames, default: false
def javascript_attribute_name?(name)
javascript_attribute_names.any? { |other| other === name.to_s } # rubocop:disable Style/CaseEquality
diff --git a/lib/better_html/railtie.rb b/lib/better_html/railtie.rb
index ebd583a..328a07a 100644
--- a/lib/better_html/railtie.rb
+++ b/lib/better_html/railtie.rb
@@ -7,5 +7,11 @@ class Railtie < Rails::Railtie
initializer "better_html.better_erb.initialization" do
BetterHtml::BetterErb.prepend!
end
+
+ config.after_initialize do
+ ActiveSupport.on_load(:action_view) do
+ BetterHtml.config.annotate_rendered_view_with_filenames = ActionView::Base.annotate_rendered_view_with_filenames
+ end
+ end
end
end
diff --git a/test/better_html/better_erb/implementation_test.rb b/test/better_html/better_erb/implementation_test.rb
index 8c356b9..2b75bd5 100644
--- a/test/better_html/better_erb/implementation_test.rb
+++ b/test/better_html/better_erb/implementation_test.rb
@@ -366,6 +366,20 @@ class ImplementationTest < ActiveSupport::TestCase
end
end
+ if ActionView.version >= Gem::Version.new("6.1")
+ test "with ActionView 6.1 comments are added to show the filename when annotate_rendered_view_with_filenames=true" do
+ config = build_config(annotate_rendered_view_with_filenames: true)
+ assert_equal "bar",
+ render("bar", config: config, filename: "_better_test.html.erb")
+ end
+ else
+ test "with ActionView 6.0 annotate_rendered_view_with_filenames=true does not change the output" do
+ config = build_config(annotate_rendered_view_with_filenames: true)
+ assert_equal "bar",
+ render("bar", config: config, filename: "_better_test.html.erb")
+ end
+ end
+
test "capture works as intended" do
output = render(<<-HTML)
<%- foo = capture do -%>
@@ -420,13 +434,13 @@ def build_config(**options)
BetterHtml::Config.new(**options)
end
- def render(source, config: build_config, locals: {})
+ def render(source, config: build_config, locals: {}, filename: "test.html.erb")
old_config = BetterHtml.config
BetterHtml.config = config
ActionView::Template.new(
source,
- "test.html.erb",
+ filename,
ActionView::Template::Handlers::ERB.new,
virtual_path: "partial",
format: :html,