def call(env)
name = env[:node_name]
node = env[:node]
return if env[:is_whitelisted] || !node.element?
unless @allowed_elements.include?(name)
if @whitespace_elements.include?(name)
node.add_previous_sibling(Nokogiri::XML::Text.new(' ', node.document))
unless node.children.empty?
node.add_next_sibling(Nokogiri::XML::Text.new(' ', node.document))
end
end
unless @remove_all_contents || @remove_element_contents.include?(name)
node.children.each {|n| node.add_previous_sibling(n) }
end
node.unlink
return
end
attr_whitelist = Set.new((@attributes[name] || []) +
(@attributes[:all] || []))
if attr_whitelist.empty?
node.attribute_nodes.each {|attr| attr.unlink }
else
node.attribute_nodes.each do |attr|
attr.unlink unless attr_whitelist.include?(attr.name.downcase)
end
if @protocols.has_key?(name)
protocol = @protocols[name]
node.attribute_nodes.each do |attr|
attr_name = attr.name.downcase
next false unless protocol.has_key?(attr_name)
del = if attr.value.to_s.downcase =~ REGEX_PROTOCOL
!protocol[attr_name].include?($1.downcase)
else
!protocol[attr_name].include?(:relative)
end
attr.unlink if del
end
end
end
if @add_attributes.has_key?(name)
@add_attributes[name].each {|key, val| node[key] = val }
end
end