#!/usr/bin/env ruby
# CodeRay Executable
#
# Version: 0.2
# Author: murphy

require 'coderay'

if ARGV.empty?
  $stderr.puts <<-USAGE
CodeRay #{CodeRay::VERSION} (http://coderay.rubychan.de)

Usage:
  coderay file [-<format>]
  coderay -<lang> [-<format>] [< file] [> output]

Defaults:
  lang:   based on file extension
  format: ANSI colorized output for terminal, HTML page for files

Examples:
  coderay foo.rb                         # colorized output to terminal, based on file extension
  coderay foo.rb -loc                    # print LOC count, based on file extension and format
  coderay foo.rb > foo.html              # HTML page output to file, based on extension
  coderay -ruby < foo.rb                 # colorized output to terminal, based on lang
  coderay -ruby -loc < foo.rb            # print LOC count, based on lang
  coderay -ruby -page foo.rb             # HTML page output to terminal, based on lang and format
  coderay -ruby -page foo.rb > foo.html  # HTML page output to file, based on lang and format
  USAGE
end

first, second = ARGV

def read
  file = ARGV.grep(/^(?!-)/).last
  if file
    if File.exist?(file)
      File.read file
    else
      $stderr.puts "No such file: #{file}"
    end
  else
    $stdin.read
  end
end

if first
  if first[/-(\w+)/] == first
    lang = $1
    input = read
    tokens = :scan
  else
    file = first
    unless File.exist? file
      $stderr.puts "No such file: #{file}"
      exit 2
    end
    tokens = CodeRay.scan_file file
  end
else
  $stderr.puts 'No lang/file given.'
  exit 1
end

if second
  if second[/-(\w+)/] == second
    format = $1.to_sym
  else
    raise 'invalid format (must be -xxx)'
  end
else
  if $stdout.tty?
    format = :term
  else
    $stderr.puts 'No format given; setting to default (HTML Page).'
    format = :page
  end
end

if tokens == :scan
  output = CodeRay::Duo[lang => format].highlight input
else
  output = tokens.encode format
end
out = $stdout
out.puts output
