coderay
82 lines
| 1.7 KiB
| text/plain
|
TextLexer
|
r2965 | #!/usr/bin/env ruby | ||
# CodeRay Executable | ||||
# | ||||
# Version: 0.1 | ||||
# Author: murphy | ||||
def err msg | ||||
$stderr.puts msg | ||||
end | ||||
begin | ||||
require 'coderay' | ||||
if ARGV.empty? | ||||
puts <<-USAGE | ||||
CodeRay #{CodeRay::VERSION} (http://rd.cYcnus.de/coderay) | ||||
Usage: | ||||
coderay -<lang> [-<format>] < file > output | ||||
coderay file [-<format>] | ||||
Example: | ||||
coderay -ruby -statistic < foo.rb | ||||
coderay codegen.c # generates codegen.c.html | ||||
USAGE | ||||
end | ||||
first, second = ARGV | ||||
if first | ||||
if first[/-(\w+)/] == first | ||||
lang = $1.to_sym | ||||
input = $stdin.read | ||||
tokens = :scan | ||||
elsif first == '-' | ||||
lang = $1.to_sym | ||||
input = $stdin.read | ||||
tokens = :scan | ||||
else | ||||
file = first | ||||
tokens = CodeRay.scan_file file | ||||
output_filename, output_ext = file, /#{Regexp.escape(File.extname(file))}$/ | ||||
end | ||||
else | ||||
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 | ||||
$stderr.puts 'No format given; setting to default (HTML Page)' | ||||
format = :page | ||||
end | ||||
# TODO: allow streaming | ||||
if tokens == :scan | ||||
output = CodeRay::Duo[lang => format].highlight input #, :stream => true | ||||
else | ||||
output = tokens.encode format | ||||
end | ||||
out = $stdout | ||||
if output_filename | ||||
output_filename += '.' + CodeRay::Encoders[format]::FILE_EXTENSION | ||||
if File.exist? output_filename | ||||
err 'File %s already exists.' % output_filename | ||||
exit | ||||
else | ||||
out = File.open output_filename, 'w' | ||||
end | ||||
end | ||||
out.print output | ||||
rescue => boom | ||||
err "Error: #{boom.message}\n" | ||||
err boom.backtrace | ||||
err '-' * 50 | ||||
err ARGV | ||||
exit 1 | ||||
end | ||||