File tree 2 files changed +42
-0
lines changed
2 files changed +42
-0
lines changed Original file line number Diff line number Diff line change @@ -197,5 +197,33 @@ def scrub(node)
197
197
end
198
198
end
199
199
end
200
+
201
+ # === Rails::HTML::SpaceBlockElementScrubber
202
+ #
203
+ # +Rails::HTML::SpaceBlockElementScrubber+ removes all undisplayable tags and contents.
204
+ #
205
+ # It preserves text contents and inserts a space around block level elements.
206
+ class SpaceBlockElementScrubber < Loofah ::Scrubber # :nodoc:
207
+ def initialize
208
+ @direction = :bottom_up
209
+ end
210
+
211
+ def scrub ( node )
212
+ if Loofah ::Elements ::LINEBREAKERS . include? ( node . name )
213
+ replacement = if Loofah ::Elements ::INLINE_LINE_BREAK . include? ( node . name )
214
+ " "
215
+ else
216
+ " #{ node . content } "
217
+ end
218
+ node . add_next_sibling ( Nokogiri ::XML ::Text . new ( replacement , node . document ) )
219
+ node . remove
220
+ elsif node . text?
221
+ return CONTINUE
222
+ else
223
+ node . before node . children
224
+ node . remove
225
+ end
226
+ end
227
+ end
200
228
end
201
229
end
Original file line number Diff line number Diff line change @@ -200,6 +200,20 @@ def test_skips_text_nodes
200
200
end
201
201
end
202
202
203
+ class SpaceBlockElementScrubberTest < ScrubberTest
204
+ def setup
205
+ @scrubber = Rails ::HTML ::SpaceBlockElementScrubber . new
206
+ end
207
+
208
+ def test_removes_all_tags_and_keeps_the_text_content_and_adds_spaces
209
+ assert_scrubbed %(<div><h1>A list!</h1><ul><li>An element!</li></ul><script>alert("hi!")</script></div>) , " A list! An element! "
210
+ end
211
+
212
+ def test_skips_text_nodes
213
+ assert_node_skipped ( "some text" )
214
+ end
215
+ end
216
+
203
217
class ReturningStopFromScrubNodeTest < ScrubberTest
204
218
class ScrubStopper < Rails ::HTML ::PermitScrubber
205
219
def scrub_node ( node )
You can’t perform that action at this time.
0 commit comments