Class Loofah::Scrubber
In: lib/loofah/scrubber.rb
Parent: Object
RuntimeError ScrubberNotFound Nokogiri::XML::DocumentFragment DocumentFragment Document Document Nokogiri::XML::Document DocumentFragment Nokogiri::HTML::DocumentFragment Nokogiri::HTML::Document Scrubber NoFollow Escape Strip Whitewash NewlineBlockElements Prune Scrubber WhiteListSanitizer FullSanitizer XML Scrub WhiteList HTML5 HTML DocumentDecorator MetaHelpers Elements NodeSet Node ScrubBehavior ClassMethods ActionView Helpers TextBehavior Scrubbers Loofah dot/f_0.png

A Scrubber wraps up a block (or method) that is run on an HTML node (element):

  # change all <span> tags to <div> tags
  span2div = Loofah::Scrubber.new do |node|
    node.name = "div" if node.name == "span"
  end

Alternatively, this scrubber could have been implemented as:

  class Span2Div < Loofah::Scrubber
    def scrub(node)
      node.name = "div" if node.name == "span"
    end
  end
  span2div = Span2Div.new

This can then be run on a document:

  Loofah.fragment("<span>foo</span><p>bar</p>").scrub!(span2div).to_s
  # => "<div>foo</div><p>bar</p>"

Scrubbers can be run on a document in either a top-down traversal (the default) or bottom-up. Top-down scrubbers can optionally return Scrubber::STOP to terminate the traversal of a subtree.

Methods

new   scrub   traverse  

Constants

CONTINUE = Object.new.freeze   Top-down Scrubbers may return CONTINUE to indicate that the subtree should be traversed.
STOP = Object.new.freeze   Top-down Scrubbers may return STOP to indicate that the subtree should not be traversed.

Attributes

block  [R]  When a scrubber is initialized, the optional block is saved as :block. Note that, if no block is passed, then the scrub method is assumed to have been implemented.
direction  [R]  When a scrubber is initialized, the :direction may be specified as :top_down (the default) or :bottom_up.

Public Class methods

Options may include

  :direction => :top_down (the default)

or

  :direction => :bottom_up

For top_down traversals, if the block returns Loofah::Scrubber::STOP, then the traversal will be terminated for the current node‘s subtree.

Alternatively, a Scrubber may inherit from Loofah::Scrubber, and implement scrub, which is slightly faster than using a block.

[Source]

# File lib/loofah/scrubber.rb, line 64
    def initialize(options = {}, &block)
      direction = options[:direction] || :top_down
      unless [:top_down, :bottom_up].include?(direction)
        raise ArgumentError, "direction #{direction} must be one of :top_down or :bottom_up" 
      end
      @direction, @block = direction, block
    end

Public Instance methods

When new is not passed a block, the class may implement scrub, which will be called for each document node.

[Source]

# File lib/loofah/scrubber.rb, line 85
    def scrub(node)
      raise ScrubberNotFound, "No scrub method has been defined on #{self.class.to_s}"
    end

Calling traverse will cause the document to be traversed by either the lambda passed to the initializer or the scrub method, in the direction specified at new time.

[Source]

# File lib/loofah/scrubber.rb, line 77
    def traverse(node)
      direction == :bottom_up ? traverse_conditionally_bottom_up(node) : traverse_conditionally_top_down(node)
    end

[Validate]