#!/usr/bin/env ruby

require 'optparse'

class RDInfo
  def initialize(input)
    @descs = input.grep(/\A---\s+/).map{|line|
      if /\A\s*---\s+((\w|:)*)(#|\.)((\w|\[|\]|=|\?|\!)+)\s*((\(.*\))?)/ =~ line
        Description.new($1+$3+$4, $4, $6)
      end
    }.compact
  end
  
  def display_info(reverse)
    if reverse
      @descs.
        inject(Hash.new{|h,k| h[k]=[]}){|h, desc| h[desc.method] << desc.spec; h}.
        sort_by{|method, *| method}.
        each{|method, specs| puts "#{method}\t#{specs.join("\t")}"}
    else
      @descs.sort_by{|desc| desc.spec}.each{|desc| puts desc.show }
    end
  end

  class Description
    attr_reader :spec, :method, :descs
    def initialize(spec, method, descs)
      @spec = spec
      @method = method
      @descs = descs
    end
    
    def show
      "#{@spec}\t#{@descs}"
    end
  end
end

opt = OptionParser.new
reverse = false
opt.on('-r', 'Print reverse data'){ reverse = true }
opt.parse!(ARGV)



begin
  RDInfo.new(ARGF).display_info(reverse)
rescue RuntimeError
  raise
rescue StandardError => err
  raise if $DEBUG
  $stderr.puts err.message
  exit 1
end


