@@ -48,48 +48,51 @@ class TagBuilder # :nodoc:
48
48
include CaptureHelper
49
49
include OutputSafetyHelper
50
50
51
- def self . define_element ( name , code_generator :, method_name : name . to_s . underscore )
52
- code_generator . define_cached_method ( method_name , namespace : :tag_builder ) do |batch |
53
- batch . push ( <<~RUBY ) unless instance_methods . include? ( method_name . to_sym )
54
- def #{ method_name } (content = nil, escape: true, **options, &block)
55
- tag_string("#{ name } ", content, options, escape: escape, &block)
56
- end
57
- RUBY
51
+ def deprecated_void_content ( name )
52
+ ActionView . deprecator . warn <<~TEXT
53
+ Putting content inside a void element (#{ name } ) is invalid
54
+ according to the HTML5 spec, and so it is being deprecated
55
+ without replacement. In Rails 8.0, passing content as a
56
+ positional argument will raise, and using a block will have
57
+ no effect.
58
+ TEXT
59
+ end
60
+
61
+ def self . define_element ( name , code_generator :, method_name : name )
62
+ return if method_defined? ( name )
63
+
64
+ code_generator . class_eval do |batch |
65
+ batch << "\n " <<
66
+ "def #{ method_name } (content = nil, escape: true, **options, &block)" <<
67
+ " tag_string(#{ name . inspect } , content, options, escape: escape, &block)" <<
68
+ "end"
58
69
end
59
70
end
60
71
61
- def self . define_void_element ( name , code_generator :, method_name : name . to_s . underscore )
62
- code_generator . define_cached_method ( method_name , namespace : :tag_builder ) do |batch |
63
- batch . push ( <<~RUBY )
64
- def #{ method_name } (content = nil, escape: true, **options, &block)
65
- if content || block
66
- ActionView.deprecator.warn <<~TEXT
67
- Putting content inside a void element (#{ name } ) is invalid
68
- according to the HTML5 spec, and so it is being deprecated
69
- without replacement. In Rails 8.0, passing content as a
70
- positional argument will raise, and using a block will have
71
- no effect.
72
- TEXT
73
- tag_string("#{ name } ", content, options, escape: escape, &block)
74
- else
75
- self_closing_tag_string("#{ name } ", options, escape, ">")
76
- end
77
- end
78
- RUBY
72
+ def self . define_void_element ( name , code_generator :, method_name : name )
73
+ code_generator . class_eval do |batch |
74
+ batch << "\n " <<
75
+ "def #{ method_name } (content = nil, escape: true, **options, &block)" <<
76
+ " p :called; if content || block" <<
77
+ " deprecated_void_content(#{ name . inspect } )" <<
78
+ " tag_string(#{ name . inspect } , content, options, escape: escape, &block)" <<
79
+ " else" <<
80
+ " self_closing_tag_string(#{ name . inspect } , options, escape, '>')" <<
81
+ " end" <<
82
+ "end"
79
83
end
80
84
end
81
85
82
- def self . define_self_closing_element ( name , code_generator :, method_name : name . to_s . underscore )
83
- code_generator . define_cached_method ( method_name , namespace : :tag_builder ) do |batch |
84
- batch . push ( <<~RUBY )
85
- def #{ method_name } (content = nil, escape: true, **options, &block)
86
- if content || block
87
- tag_string("#{ name } ", content, options, escape: escape, &block)
88
- else
89
- self_closing_tag_string("#{ name } ", options, escape)
90
- end
91
- end
92
- RUBY
86
+ def self . define_self_closing_element ( name , code_generator :, method_name : name )
87
+ code_generator . class_eval do |batch |
88
+ batch << "\n " <<
89
+ "def #{ method_name } (content = nil, escape: true, **options, &block)" <<
90
+ " if content || block" <<
91
+ " tag_string(#{ name . inspect } , content, options, escape: escape, &block)" <<
92
+ " else" <<
93
+ " self_closing_tag_string(#{ name . inspect } , options, escape)" <<
94
+ " end" <<
95
+ "end"
93
96
end
94
97
end
95
98
@@ -110,8 +113,8 @@ def #{method_name}(content = nil, escape: true, **options, &block)
110
113
define_void_element :wbr , code_generator : code_generator
111
114
112
115
define_self_closing_element :animate , code_generator : code_generator
113
- define_self_closing_element :animateMotion , code_generator : code_generator
114
- define_self_closing_element :animateTransform , code_generator : code_generator
116
+ define_self_closing_element :animateMotion , code_generator : code_generator , method_name : :animate_motion
117
+ define_self_closing_element :animateTransform , code_generator : code_generator , method_name : :animate_transform
115
118
define_self_closing_element :circle , code_generator : code_generator
116
119
define_self_closing_element :ellipse , code_generator : code_generator
117
120
define_self_closing_element :line , code_generator : code_generator
0 commit comments