class RDoc::Markup::Formatter

def add_tag(name, start, stop)

def add_tag(name, start, stop)
  attr = RDoc::Markup::Attribute.bitmap_for name
  @attr_tags << InlineTag.new(attr, start, stop)
end

def annotate(tag)

def annotate(tag)
  tag
end

def convert(content)

def convert(content)
  @markup.convert content, self
end

def convert_flow(flow)

def convert_flow(flow)
  res = []
  flow.each do |item|
    case item
    when String then
      res << convert_string(item)
    when RDoc::Markup::AttrChanger then
      off_tags res, item
      on_tags res, item
    when RDoc::Markup::Special then
      res << convert_special(item)
    else
      raise "Unknown flow element: #{item.inspect}"
    end
  end
  res.join
end

def convert_special(special)

def convert_special(special)
  handled = false
  RDoc::Markup::Attribute.each_name_of special.type do |name|
    method_name = "handle_special_#{name}"
    if respond_to? method_name then
      special.text = send method_name, special
      handled = true
    end
  end
  raise "Unhandled special: #{special}" unless handled
  special.text
end

def convert_string string

def convert_string string
  string
end

def in_tt?

def in_tt?
  @in_tt > 0
end

def initialize

def initialize
  @markup = RDoc::Markup.new
  @am = @markup.attribute_manager
  @attr_tags = []
  @in_tt = 0
  @tt_bit = RDoc::Markup::Attribute.bitmap_for :TT
end

def off_tags res, item

def off_tags res, item
  attr_mask = item.turn_off
  return if attr_mask.zero?
  @attr_tags.reverse_each do |tag|
    if attr_mask & tag.bit != 0 then
      @in_tt -= 1 if tt? tag
      res << annotate(tag.off)
    end
  end
end

def on_tags res, item

def on_tags res, item
  attr_mask = item.turn_on
  return if attr_mask.zero?
  @attr_tags.each do |tag|
    if attr_mask & tag.bit != 0 then
      res << annotate(tag.on)
      @in_tt += 1 if tt? tag
    end
  end
end

def tt? tag

def tt? tag
  tag.bit == @tt_bit
end