comparison vendor/gems/coderay-1.0.0/bin/coderay @ 909:cbb26bc654de redmine-1.3

Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author Chris Cannam
date Fri, 24 Feb 2012 19:09:32 +0000
parents
children
comparison
equal deleted inserted replaced
908:c6c2cbd0afee 909:cbb26bc654de
1 #!/usr/bin/env ruby
2 require 'coderay'
3
4 $options, args = ARGV.partition { |arg| arg[/^-[hv]$|--\w+/] }
5 subcommand = args.first if /^\w/ === args.first
6 subcommand = nil if subcommand && File.exist?(subcommand)
7 args.delete subcommand
8
9 def option? *options
10 !($options & options).empty?
11 end
12
13 def tty?
14 $stdout.tty? || option?('--tty')
15 end
16
17 def version
18 puts <<-USAGE
19 CodeRay #{CodeRay::VERSION}
20 USAGE
21 end
22
23 def help
24 puts <<-HELP
25 This is CodeRay #{CodeRay::VERSION}, a syntax highlighting tool for selected languages.
26
27 usage:
28 coderay [-language] [input] [-format] [output]
29
30 defaults:
31 language detect from input file name or shebang; fall back to plain text
32 input STDIN
33 format detect from output file name or use terminal; fall back to HTML
34 output STDOUT
35
36 common:
37 coderay file.rb # highlight file to terminal
38 coderay file.rb > file.html # highlight file to HTML page
39 coderay file.rb -div > file.html # highlight file to HTML snippet
40
41 configure output:
42 coderay file.py output.json # output tokens as JSON
43 coderay file.py -loc # count lines of code in Python file
44
45 configure input:
46 coderay -python file # specify the input language
47 coderay -ruby # take input from STDIN
48
49 more:
50 coderay stylesheet [style] # print CSS stylesheet
51 HELP
52 end
53
54 def commands
55 puts <<-COMMANDS
56 general:
57 highlight code highlighting (default command, optional)
58 stylesheet print the CSS stylesheet with the given name (aliases: style, css)
59
60 about:
61 list [of] list all available plugins (or just the scanners|encoders|styles|filetypes)
62 commands print this list
63 help show some help
64 version print CodeRay version
65 COMMANDS
66 end
67
68 def print_list_of plugin_host
69 plugins = plugin_host.all_plugins.map do |plugin|
70 info = " #{plugin.plugin_id}: #{plugin.title}"
71
72 aliases = (plugin.aliases - [:default]).map { |key| "-#{key}" }.sort_by { |key| key.size }
73 if plugin.respond_to?(:file_extension) || !aliases.empty?
74 additional_info = []
75 additional_info << aliases.join(', ') unless aliases.empty?
76 info << " (#{additional_info.join('; ')})"
77 end
78
79 info << ' <-- default' if plugin.aliases.include? :default
80
81 info
82 end
83 puts plugins.sort
84 end
85
86 if option? '-v', '--version'
87 version
88 end
89
90 if option? '-h', '--help'
91 help
92 end
93
94 case subcommand
95 when 'highlight', nil
96 if ARGV.empty?
97 version
98 help
99 else
100 signature = args.map { |arg| arg[/^-/] ? '-' : 'f' }.join
101 names = args.map { |arg| arg.sub(/^-/, '') }
102 case signature
103 when /^$/
104 exit
105 when /^ff?$/
106 input_file, output_file, = *names
107 when /^f-f?$/
108 input_file, output_format, output_file, = *names
109 when /^-ff?$/
110 input_lang, input_file, output_file, = *names
111 when /^-f-f?$/
112 input_lang, input_file, output_format, output_file, = *names
113 when /^--?f?$/
114 input_lang, output_format, output_file, = *names
115 else
116 $stdout = $stderr
117 help
118 puts
119 puts "Unknown parameter order: #{args.join ' '}, expected: [-language] [input] [-format] [output]"
120 exit 1
121 end
122
123 if input_file
124 input_lang ||= CodeRay::FileType.fetch input_file, :text, true
125 end
126
127 if output_file
128 output_format ||= CodeRay::FileType[output_file]
129 else
130 output_format ||= :terminal
131 end
132
133 output_format = :page if output_format.to_s == 'html'
134
135 if input_file
136 input = File.read input_file
137 else
138 input = $stdin.read
139 end
140
141 begin
142 file =
143 if output_file
144 File.open output_file, 'w'
145 else
146 $stdout.sync = true
147 $stdout
148 end
149 CodeRay.encode(input, input_lang, output_format, :out => file)
150 file.puts
151 rescue CodeRay::PluginHost::PluginNotFound => boom
152 $stdout = $stderr
153 if boom.message[/CodeRay::(\w+)s could not load plugin :?(.*?): /]
154 puts "I don't know the #$1 \"#$2\"."
155 else
156 puts boom.message
157 end
158 # puts "I don't know this plugin: #{boom.message[/Could not load plugin (.*?): /, 1]}."
159 rescue CodeRay::Scanners::Scanner::ScanError # FIXME: rescue Errno::EPIPE
160 # this is sometimes raised by pagers; ignore [TODO: wtf?]
161 ensure
162 file.close if output_file
163 end
164 end
165 when 'li', 'list'
166 arg = args.first && args.first.downcase
167 if [nil, 's', 'sc', 'scanner', 'scanners'].include? arg
168 puts 'input languages (Scanners):'
169 print_list_of CodeRay::Scanners
170 end
171
172 if [nil, 'e', 'en', 'enc', 'encoder', 'encoders'].include? arg
173 puts 'output formats (Encoders):'
174 print_list_of CodeRay::Encoders
175 end
176
177 if [nil, 'st', 'style', 'styles'].include? arg
178 puts 'CSS themes for HTML output (Styles):'
179 print_list_of CodeRay::Styles
180 end
181
182 if [nil, 'f', 'ft', 'file', 'filetype', 'filetypes'].include? arg
183 puts 'recognized file types:'
184
185 filetypes = Hash.new { |h, k| h[k] = [] }
186 CodeRay::FileType::TypeFromExt.inject filetypes do |types, (ext, type)|
187 types[type.to_s] << ".#{ext}"
188 types
189 end
190 CodeRay::FileType::TypeFromName.inject filetypes do |types, (name, type)|
191 types[type.to_s] << name
192 types
193 end
194
195 filetypes.sort.each do |type, exts|
196 puts " #{type}: #{exts.sort_by { |ext| ext.size }.join(', ')}"
197 end
198 end
199 when 'stylesheet', 'style', 'css'
200 puts CodeRay::Encoders[:html]::CSS.new(args.first).stylesheet
201 when 'commands'
202 commands
203 when 'help'
204 help
205 else
206 $stdout = $stderr
207 help
208 puts
209 if subcommand[/\A\w+\z/]
210 puts "Unknown command: #{subcommand}"
211 else
212 puts "File not found: #{subcommand}"
213 end
214 exit 1
215 end