Rails HTML sanitizer (Loofah) 在元素之间添加不需要的换行符

Rails HTML sanitizer (Loofah) adds unwanted line breaks between elements

Rails 的内置 HTML 消毒器(使用 gem Loofah)在 <ul><li> 之间添加换行符标签。我想用 white-space: pre-wrap; 显示经过清理的内容,因为它来自 WYSIWYG 编辑器,但额外的换行符使输出看起来不对。所需在顶部,实际在底部,背景颜色添加到 ul 以强调:

以下是我在 rails 控制台中通过 sanitize 运行 一些代码时发生的情况:

2.2.2 :033 > input = "<ul><li>a</li><li>b</li></ul>"
 => "<ul><li>a</li><li>b</li></ul>"
2.2.2 :034 > WhiteListSanitizer.new.sanitize(input)
 => "<ul>\n<li>a</li>\n<li>b</li>\n</ul>"

如果我创建一个 Loofah 对象并将其转换为 html 而无需擦除,它仍然会添加换行符。

2.2.2 :035 > Loofah.fragment(input).to_html
 => "<ul>\n<li>a</li>\n<li>b</li>\n</ul>"

如何让它单独保留空格?

如果绝对必要,我可以用正则表达式删除换行符,但没有禁用此行为的选项似乎很奇怪。

看起来 Loofah 实际上在幕后使用 Nokogiri,它默认显示 formatted/indented html -- 因此换行符。我发现 another (similar) question 关于 Nokogiri 的这种行为,下面是我认为适用于您的情况的代码:

Loofah.fragment(input).to_html(:save_with => 
Nokogiri::XML::Node::SaveOptions::AS_XML | 
Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip

您需要排除 FORMAT option from DEFAULT_HTML 选项(均属于 Nokogiri):

input = "<ul><li>a</li><li>b</li></ul>"
disable_formatting = Nokogiri::XML::Node::SaveOptions::DEFAULT_HTML ^ Nokogiri::XML::Node::SaveOptions::FORMAT
Loofah.fragment(input).to_html(save_with: disable_formatting)
# => "<ul><li>a</li><li>b</li></ul>"

而不是 Rails 的内置 HTML 消毒剂

ActionController::Base.helpers.sanitize('<script/><ul><li>111</li><li>222</li></ul>', tags: %w(p br ul ol li a), attributes: %w(href))
#=> "<ul>\n" + "<li>111</li>\n" + "<li>222</li>\n" + "</ul>"

丝瓜络可直接使用

loofah_fragment = Loofah.fragment('<script/><ul><li>111</li><li>222</li></ul>')
scrubber = Rails::Html::PermitScrubber.new
scrubber.tags = %w(p br ul ol li a)
scrubber.attributes = %w(href)
unformatted_html = Nokogiri::XML::Node::SaveOptions.class_eval { |m| m::DEFAULT_HTML ^ m::FORMAT }
loofah_fragment.scrub!(scrubber).to_html(save_with: unformatted_html)
#=> "<ul><li>111</li><li>222</li></ul>"