我有下面的代码,可以解析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/

10-13 01:18