module Loofah
  #
  # Loofah can scrub ActiveRecord attributes in a before_validation callback:
  #
  #  # config/initializers/loofah.rb
  #  require 'loofah-activerecord'
  #
  #  # db/schema.rb
  #  create_table "posts" do |t|
  #    t.string  "title"
  #    t.string  "body"
  #  end
  #
  #  # app/model/post.rb
  #  class Post < ActiveRecord::Base
  #    html_fragment :body, :scrub => :prune  # scrubs 'body' in a before_validation
  #  end
  #
  module ActiveRecordExtension
    #
    # @overload html_fragment(attribute, scrub: scrubber_specification)
    #   @param attribute [Symbol] An ActiveRecord attribute
    #   @param scrubber_specification [Loofah::Scrubber] 
    #   @return void
    #
    # Scrub an ActiveRecord attribute +attribute+ as an HTML *fragment*
    # using the method specified by +scrubber_specification+.
    #
    # +scrubber_specification+ must be an argument acceptable to +Loofah::ScrubBehavior.scrub!+, namely:
    #
    # * a symbol for one of the built-in scrubbers (see +Loofah::Scrubbers+ for a full list)
    # * or a +Scrubber+ instance. (see +Loofah::Scrubber+ for help on implementing a custom scrubber)
    #
    def html_fragment(attr, options={})
      raise ArgumentError, "html_fragment requires :scrub option" unless method = options[:scrub]
      before_validation do |record|
        record[attr] = Loofah.scrub_fragment(record[attr], method).to_s
      end
    end

    #
    # @overload html_document(attribute, scrub: scrubber_specification)
    #   @param attribute [Symbol] An ActiveRecord attribute
    #   @param scrubber_specification [Loofah::Scrubber] 
    #   @return void
    #
    # Scrub an ActiveRecord attribute +attribute+ as an HTML *document*
    # using the method specified by +scrubber_specification+.
    #
    # +scrubber_specification+ must be an argument acceptable to +Loofah::ScrubBehavior.scrub!+, namely:
    #
    # * a symbol for one of the built-in scrubbers (see +Loofah::Scrubbers+ for a full list)
    # * or a +Scrubber+ instance. (see +Loofah::Scrubber+ for help on implementing a custom scrubber)
    #
    def html_document(attr, options={})
      raise ArgumentError, "html_document requires :scrub option" unless method = options[:scrub]
      before_validation do |record|
        record[attr] = Loofah.scrub_document(record[attr], method).to_s
      end
    end
  end
end

ActiveRecord::Base.extend(Loofah::ActiveRecordExtension)
