class Sanitize

def traverse(node, &block)

itself, then traversing each child (if any) in order.
Performs top-down traversal of the given node, operating first on the node
def traverse(node, &block)
  yield node
  child = node.child
  while child
    prev = child.previous_sibling
    traverse(child, &block)
    child = if child.parent == node
      child.next_sibling
    else
      # The child was unlinked or reparented, so traverse the previous node's
      # next sibling, or the parent's first child if there is no previous
      # node.
      prev ? prev.next_sibling : node.child
    end
  end
end