From b6e45b7c39195be2b3e4311641b8c04b89b3bc2c Mon Sep 17 00:00:00 2001 From: ydah Date: Tue, 6 Oct 2026 08:49:51 +0900 Subject: [PATCH] Respect ERB tag boundaries when detecting magic comments --- lib/erb/compiler.rb | 2 +- test/erb/test_erb.rb | 7 +++++++ test/erb/test_erb_m17n.rb | 7 +++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/erb/compiler.rb b/lib/erb/compiler.rb index b6185cd..fa249ca 100644 --- a/lib/erb/compiler.rb +++ b/lib/erb/compiler.rb @@ -452,7 +452,7 @@ def initialize(trim_mode) attr_accessor :content def detect_magic_comment(s, enc = nil) - re = @percent ? /\G(?:<%#(.*)%>|%#(.*)\n)/ : /\G<%#(.*)%>/ + re = @percent ? /\G(?:<%#(.*?)%>|%#(.*)\n)/ : /\G<%#(.*?)%>/ frozen = nil s.scan(re) do comment = $+ diff --git a/test/erb/test_erb.rb b/test/erb/test_erb.rb index b96c0cb..29f28d9 100644 --- a/test/erb/test_erb.rb +++ b/test/erb/test_erb.rb @@ -595,6 +595,13 @@ def test_frozen_string_literal end end + def test_frozen_string_literal_after_encoding_comment + [nil, '%'].each do |trim_mode| + erb = @erb.new("<%# coding: utf-8 %><%# frozen_string_literal: true %><%= ''.frozen? %>", trim_mode: trim_mode) + assert_equal("true", erb.result) + end + end + def test_result_with_hash erb = @erb.new("<%= foo %>") assert_equal("1", erb.result_with_hash(foo: "1")) diff --git a/test/erb/test_erb_m17n.rb b/test/erb/test_erb_m17n.rb index 2fd9e70..3cf1b8b 100644 --- a/test/erb/test_erb_m17n.rb +++ b/test/erb/test_erb_m17n.rb @@ -92,6 +92,13 @@ def test_recognize_magic_comment assert_equal Encoding::EUC_KR, erb.result.encoding end + def test_ignore_magic_comment_after_code + [nil, '%'].each do |trim_mode| + erb = ERB.new("<%# hello %><%= 1 %><%# coding: euc-jp %>", trim_mode: trim_mode) + assert_equal Encoding::UTF_8, erb.encoding + end + end + module M; end def test_method_with_encoding obj = Object.new