require 'pp'

module Hpricot
  # :stopdoc:
  class Elements
    def pretty_print(q)
      q.object_group(self) { super }
    end
    alias inspect pretty_print_inspect
  end

  class Doc
    def pretty_print(q)
      q.object_group(self) { @children.each {|elt| q.breakable; q.pp elt } }
    end
    alias inspect pretty_print_inspect
  end

  class Elem
    def pretty_print(q)
      if empty?
        q.group(1, '{emptyelem', '}') {
          q.breakable; q.pp @stag
        }
      else
        q.group(1, "{elem", "}") {
          q.breakable; q.pp @stag
          if @children
            @children.each {|elt| q.breakable; q.pp elt }
          end
          if @etag
            q.breakable; q.pp @etag
          end
        }
      end
    end
    alias inspect pretty_print_inspect
  end

  module Leaf
    def pretty_print(q)
      q.group(1, '{', '}') {
        q.text self.class.name.sub(/.*::/,'').downcase
        if rs = @raw_string
          rs.scan(/[^\r\n]*(?:\r\n?|\n|[^\r\n]\z)/) {|line|
            q.breakable
            q.pp line
          }
        elsif self.respond_to? :to_s
          q.breakable
          q.text self.to_s
        end
      }
    end
    alias inspect pretty_print_inspect
  end

  class STag
    def pretty_print(q)
      q.group(1, '<', '>') {
        q.text @name

        if @attributes
          @attributes.each {|n, t|
            q.breakable
            q.text "#{n}=\"#{t}\""
          }
        end
      }
    end
    alias inspect pretty_print_inspect
  end

  class ETag
    def pretty_print(q)
      q.group(1, '</', '>') {
        q.text @name
      }
    end
    alias inspect pretty_print_inspect
  end

  class Text
    def pretty_print(q)
      q.text @content.dump
    end
  end

  class BogusETag
    def pretty_print(q)
      q.group(1, '{', '}') {
        q.text self.class.name.sub(/.*::/,'').downcase
        if rs = @raw_string
          q.breakable
          q.text rs
        else
          q.text "</#{@name}>"
        end
      }
    end
  end
  # :startdoc:
end
