我有下面的代码,可以解析HTML文本并修剪(或删除)空的段落它类似于字符串对象上的.strip
。
doc = Nokogiri::HTML::DocumentFragment.parse(html)
# repetition that I want to collapse
doc.css('p').each do |p|
if all_children_are_blank?(p)
p.remove
else
break
end
end
# repetition that I want to collapse
doc.css('p').reverse_each do |p|
if all_children_are_blank?(p)
p.remove
else
break
end
end
doc.to_s.strip
有没有更优雅的方法来防止我用注释标记的代码被复制,并遵循代码重用的原则?
以下是我的想法,但我还不满意,想看看是否有更好的办法:
doc = Nokogiri::HTML::DocumentFragment.parse(html)
doc.css('p').each do |p|
if stop(p) then break end
end
doc.css('p').reverse_each do |p|
if stop(p) then break end
end
doc.to_s.strip
def self.stop(p)
if all_children_are_blank?(p)
p.remove
false
else
true
end
end
最佳答案
如果我理解您要查找的内容,您需要一种更简单的方法来遍历您要查找的元素,以便删除空白的p
元素。
这里有一个简单的方法来折叠你所写的内容,而不做完全不同的事情:
doc.tap do |d|
[:each, :reverse_each].each do |sym|
d.css("p").public_send(sym) do |p|
if blank_children?(p)
p.remove
else
break
end
end
end
end.to_s.strip
我还没有测试过,所以你可能需要稍微调整一下如果这是生产代码,我可能会将其分解为一个或多个方法调用,以保持清晰。
关于ruby - 优雅的循环升序和降序方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13753382/