# CodeRay dynamic highlighter # # Usage: start this and your browser. # # Go to http://localhost:49374/? # (mnemonic: 49374 = Four-Nine-Three-Seven-Four = For No Token Shall Fall) # and you should get the highlighted version. require 'webrick' require 'pathname' class << File alias dir? directory? end require 'erb' include ERB::Util def url_decode s s.to_s.gsub(/%([0-9a-f]{2})/i) { [$1.hex].pack 'C' } end class String def to_link name = File.basename(self) "#{name}" end end require 'coderay' class CodeRayServlet < WEBrick::HTTPServlet::AbstractServlet STYLE = 'style="font-family: sans-serif; color: navy;"' BANNER = '

HIghlighted by CodeRay

' def do_GET req, res q = req.query_string || '' args = Hash[*q.scan(/(.*?)=(.*?)(?:&|$)/).flatten].each_value { |v| v.replace url_decode(v) } path = args.fetch 'path', '.' backlinks = '

current path: %s
' % html_escape(path) + (Pathname.new(path) + '..').cleanpath.to_s.to_link('up') + ' - ' + '.'.to_link('current') + '

' res.body = if File.dir? path path = Pathname.new(path).cleanpath.to_s dirs, files = Dir[File.join(path, '*')].sort.partition { |p| File.dir? p } page = "" page << backlinks page << '
' page << "
Directories
\n" + dirs.map do |p| "
#{p.to_link}
\n" end.join << "\n" page << "
Files
\n" + files.map do |p| "
#{p.to_link}
\n" end.join << "\n" page << "
\n" page << "#{BANNER}" elsif File.exist? path div = CodeRay.scan_file(path).html :tab_width => 8, :wrap => :div div.replace <<-DIV
#{backlinks} #{div}
#{BANNER} DIV div.page end res['Content-Type'] = 'text/html' end end # this is taken by "qip_msgd" - I don't know that. module CodeRay PORT = 0xC0DE / 20 end server = WEBrick::HTTPServer.new :Port => CodeRay::PORT server.mount '/', CodeRayServlet server.mount_proc '/version' do |req, res| res.body = 'CodeRay::Version = ' + CodeRay::Version res['Content-Type'] = "text/plain" end trap("INT") { server.shutdown } server.start