    # File lib/rbot/core/utils/extends.rb, line 171
      def ircify_html(opts={})
        txt = self.dup

        # remove scripts
        txt.gsub!(/<script(?:\s+[^>]*)?>.*?<\/script>/im, "")

        # remove styles
        txt.gsub!(/<style(?:\s+[^>]*)?>.*?<\/style>/im, "")

        # bold and strong -> bold
        txt.gsub!(/<\/?(?:b|strong)(?:\s+[^>]*)?>/im, "#{Bold}")

        # italic, emphasis and underline -> underline
        txt.gsub!(/<\/?(?:i|em|u)(?:\s+[^>]*)?>/im, "#{Underline}")

        ## This would be a nice addition, but the results are horrible
        ## Maybe make it configurable?
        # txt.gsub!(/<\/?a( [^>]*)?>/, "#{Reverse}")
        case val = opts[:a_href]
        when Reverse, Bold, Underline
          txt.gsub!(/<(?:\/a\s*|a (?:[^>]*\s+)?href\s*=\s*(?:[^>]*\s*)?)>/, val)
        when :link_out
          # Not good for nested links, but the best we can do without something like hpricot
          txt.gsub!(/<a (?:[^>]*\s+)?href\s*=\s*(?:([^"'>][^\s>]*)\s+|"((?:[^"]|\\")*)"|'((?:[^']|\\')*)')(?:[^>]*\s+)?>(.*?)<\/a>/) { |match|
            debug match
            debug [$1, $2, $3, $4].inspect
            link = $1 || $2 || $3
            str = $4
            str + ": " + link
          }
        else
          warning "unknown :a_href option #{val} passed to ircify_html" if val
        end

        # Paragraph and br tags are converted to whitespace
        txt.gsub!(/<\/?(p|br)(?:\s+[^>]*)?\s*\/?\s*>/i, ' ')
        txt.gsub!("\n", ' ')
        txt.gsub!("\r", ' ')

        # Superscripts and subscripts are turned into ^{...} and _{...}
        # where the {} are omitted for single characters
        txt.gsub!(/<sup>(.*?)<\/sup>/, '^{\1}')
        txt.gsub!(/<sub>(.*?)<\/sub>/, '_{\1}')
        txt.gsub!(/(^|_)\{(.)\}/, '\1\2')

        # List items are converted to *). We don't have special support for
        # nested or ordered lists.
        txt.gsub!(/<li>/, ' *) ')

        # All other tags are just removed
        txt.gsub!(/<[^>]+>/, '')

        # Convert HTML entities. We do it now to be able to handle stuff
        # such as &nbsp;
        txt = Utils.decode_html_entities(txt)

        # Keep unbreakable spaces or conver them to plain spaces?
        case val = opts[:nbsp]
        when :space, ' '
          txt.gsub!([160].pack('U'), ' ')
        else
          warning "unknown :nbsp option #{val} passed to ircify_html" if val
        end

        # Remove double formatting options, since they only waste bytes
        txt.gsub!(/#{Bold}(\s*)#{Bold}/, '\1')
        txt.gsub!(/#{Underline}(\s*)#{Underline}/, '\1')

        # Simplify whitespace that appears on both sides of a formatting option
        txt.gsub!(/\s+(#{Bold}|#{Underline})\s+/, ' \1')
        txt.sub!(/\s+(#{Bold}|#{Underline})\z/, '\1')
        txt.sub!(/\A(#{Bold}|#{Underline})\s+/, '\1')

        # And finally whitespace is squeezed
        txt.gsub!(/\s+/, ' ')
        txt.strip!

        if opts[:limit] && txt.size > opts[:limit]
          txt = txt.slice(0, opts[:limit]) + "#{Reverse}...#{Reverse}"
        end

        # Decode entities and strip whitespace
        return txt
      end