Permalink
Browse files

Add albino.rb, a wrapper for pygments written by Chris Wanstrath.

  • Loading branch information...
1 parent e5eedce commit 466f0aa3c8b62ce7e44805adfe0c1467ed5f1c49 @tobie committed Sep 6, 2009
Showing with 122 additions and 0 deletions.
  1. +122 −0 vendor/albino.rb
View
122 vendor/albino.rb
@@ -0,0 +1,122 @@
+##
+# Wrapper for the Pygments command line tool, pygmentize.
+#
+# Pygments: http://pygments.org/
+#
+# Assumes pygmentize is in the path. If not, set its location
+# with Albino.bin = '/path/to/pygmentize'
+#
+# Use like so:
+#
+# @syntaxer = Albino.new('/some/file.rb', :ruby)
+# puts @syntaxer.colorize
+#
+# This'll print out an HTMLized, Ruby-highlighted version
+# of '/some/file.rb'.
+#
+# To use another formatter, pass it as the third argument:
+#
+# @syntaxer = Albino.new('/some/file.rb', :ruby, :bbcode)
+# puts @syntaxer.colorize
+#
+# You can also use the #colorize class method:
+#
+# puts Albino.colorize('/some/file.rb', :ruby)
+#
+# Another also: you get a #to_s, for somewhat nicer use in Rails views.
+#
+# ... helper file ...
+# def highlight(text)
+# Albino.new(text, :ruby)
+# end
+#
+# ... view file ...
+# <%= highlight text %>
+#
+# The default lexer is 'text'. You need to specify a lexer yourself;
+# because we are using STDIN there is no auto-detect.
+#
+# To see all lexers and formatters available, run `pygmentize -L`.
+#
+# Chris Wanstrath // chris@ozmm.org
+# GitHub // http://github.com
+#
+require 'open4'
+
+class Albino
+ @@bin = Rails.development? ? 'pygmentize' : '/usr/bin/pygmentize' rescue 'pygmentize'
+
+ def self.bin=(path)
+ @@bin = path
+ end
+
+ def self.colorize(*args)
+ new(*args).colorize
+ end
+
+ def initialize(target, lexer = :text, format = :html)
+ @target = File.exists?(target) ? File.read(target) : target rescue target
+ @options = { :l => lexer, :f => format, :O => 'encoding=utf-8' }
+ end
+
+ def execute(command)
+ output = ''
+ Open4.popen4(command) do |pid, stdin, stdout, stderr|
+ stdin.puts @target
+ stdin.close
+ output = stdout.read.strip
+ [stdout, stderr].each { |io| io.close }
+ end
+ output
+ end
+
+ def colorize(options = {})
+ html = execute(@@bin + convert_options(options))
+ # Work around an RDiscount bug: http://gist.github.com/97682
+ html.to_s.sub(%r{</pre></div>\Z}, "</pre>\n</div>")
+ end
+ alias_method :to_s, :colorize
+
+ def convert_options(options = {})
+ @options.merge(options).inject('') do |string, (flag, value)|
+ string + " -#{flag} #{value}"
+ end
+ end
+end
+
+if $0 == __FILE__
+ require 'rubygems'
+ require 'test/spec'
+ require 'mocha'
+ begin require 'redgreen'; rescue LoadError; end
+
+ context "Albino" do
+ setup do
+ @syntaxer = Albino.new(__FILE__, :ruby)
+ end
+
+ specify "defaults to text" do
+ syntaxer = Albino.new(__FILE__)
+ syntaxer.expects(:execute).with('pygmentize -f html -l text').returns(true)
+ syntaxer.colorize
+ end
+
+ specify "accepts options" do
+ @syntaxer.expects(:execute).with('pygmentize -f html -l ruby').returns(true)
+ @syntaxer.colorize
+ end
+
+ specify "works with strings" do
+ syntaxer = Albino.new('class New; end', :ruby)
+ assert_match %r(highlight), syntaxer.colorize
+ end
+
+ specify "aliases to_s" do
+ assert_equal @syntaxer.colorize, @syntaxer.to_s
+ end
+
+ specify "class method colorize" do
+ assert_equal @syntaxer.colorize, Albino.colorize(__FILE__, :ruby)
+ end
+ end
+end

0 comments on commit 466f0aa

Please sign in to comment.