class RDoc::Parser::PerlPOD

def filter(comment)

proper parser to cope with C<<...>> etc
filtering. Only basic for now. Will probably need a
Filter the perl markup that does the same as the rdoc
def filter(comment)
  return '' if comment =~ /^=pod\s*$/
  comment.gsub!(/^=pod/, '==')
  comment.gsub!(/^=head(\d+)/) do
    "=" * $1.to_i
  end
  comment.gsub!(/=item/, '');
  comment.gsub!(/C<(.*?)>/, '<tt>\1</tt>');
  comment.gsub!(/I<(.*?)>/, '<i>\1</i>');
  comment.gsub!(/B<(.*?)>/, '<b>\1</b>');
  comment
end

def initialize(top_level, file_name, content, options, stats)

def initialize(top_level, file_name, content, options, stats)
  super
  preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include
  preprocess.handle @content do |directive, param|
    warn "Unrecognized directive '#{directive}' in #{@file_name}"
  end
end

def scan

def scan
  @top_level.comment ||= ""
  state=:code_blank
  line_number = 0
  line = nil
  # This started out as a really long nested case statement,
  # which also led to repetitive code.  I'd like to avoid that
  # so I'm using a "table" instead.
  # Firstly we need some procs to do the transition and processing
  # work.  Because these are procs they are closures, and they can
  # use variables in the local scope.
  #
  # First, the "nothing to see here" stuff.
  code_noop = lambda do
    if line =~ /^\s+$/
tate = :code_blank
    end
  end
  pod_noop = lambda do
    if line =~ /^\s+$/
tate = :pod_blank
    end
    @top_level.comment += filter(line)
  end
  begin_noop = lambda do
    if line =~ /^\s+$/
tate = :begin_blank
    end
    @top_level.comment += filter(line)
  end
  # Now for the blocks that process code and comments...
  transit_to_pod = lambda do
    case line
    when /^=(?:pod|head\d+)/
tate = :pod_no_blank
top_level.comment += filter(line)
    when /^=over/
tate = :over_no_blank
top_level.comment += filter(line)
    when /^=(?:begin|for)/
tate = :begin_no_blank
    end
  end
  process_pod = lambda do
    case line
    when  /^\s*$/
tate = :pod_blank
top_level.comment += filter(line)
    when /^=cut/
tate = :code_no_blank
    when /^=end/
stderr.puts "'=end' unexpected at #{line_number} in #{@file_name}"
    else
top_level.comment += filter(line)
    end
  end
  process_begin = lambda do
    case line
    when  /^\s*$/
tate = :begin_blank
top_level.comment += filter(line)
    when /^=end/
tate = :code_no_blank
    when /^=cut/
stderr.puts "'=cut' unexpected at #{line_number} in #{@file_name}"
    else
top_level.comment += filter(line)
    end
  end
  transitions = { :code_no_blank => code_noop,
                  :code_blank => transit_to_pod,
    :pod_no_blank => pod_noop,
    :pod_blank => process_pod,
    :begin_no_blank => begin_noop,
    :begin_blank => process_begin}
  @content.each_line do |l|
    line = l
    line_number += 1
    transitions[state].call
  end # each line
  @top_level
end