From 59532a9fd20fa906367310932cf87680cc9ecbea Mon Sep 17 00:00:00 2001 From: murphy Date: Thu, 28 Aug 2008 04:55:59 +0000 Subject: Added CodeRay.for_redcloth with test and documentation. * Tested with RedCloth 4.0.3. * Also added :ee task for the Ruby Enterprise Edition (rubyee). --- Rakefile | 4 ++++ lib/coderay.rb | 1 + lib/coderay/for_redcloth.rb | 54 +++++++++++++++++++++++++++++++++++++++++++++ test/functional/basic.rb | 7 ++++++ 4 files changed, 66 insertions(+) create mode 100644 lib/coderay/for_redcloth.rb diff --git a/Rakefile b/Rakefile index 5482cd9..8894a7d 100644 --- a/Rakefile +++ b/Rakefile @@ -51,6 +51,10 @@ task 'rubinius' do RUBY.replace 'rbx' end +task 'ee' do + RUBY.replace 'rubyee' +end + for task_file in Dir['rake_tasks/*.rake'] load task_file end diff --git a/lib/coderay.rb b/lib/coderay.rb index 1f067db..c1025c7 100644 --- a/lib/coderay.rb +++ b/lib/coderay.rb @@ -141,6 +141,7 @@ module CodeRay require 'coderay/encoder' require 'coderay/duo' require 'coderay/style' + require 'coderay/for_redcloth' class << self diff --git a/lib/coderay/for_redcloth.rb b/lib/coderay/for_redcloth.rb new file mode 100644 index 0000000..4de597e --- /dev/null +++ b/lib/coderay/for_redcloth.rb @@ -0,0 +1,54 @@ +# A little hack to enable CodeRay highlighting in RedCloth. + +module CodeRay + + # A little hack to enable CodeRay highlighting in RedCloth. + # + # Usage: + # require 'coderay' + # CodeRay.for_redcloth + # RedCloth.new('@[ruby]puts "Hello, World!"@').to_html + # + # Make sure you have RedCloth 4.0.3 activated, for example by calling + # require 'rubygems' + # before RedCloth is loaded and before calling CodeRay.for_redcloth. + def self.for_redcloth + gem 'RedCloth', '>= 4.0.3' rescue nil + require 'redcloth' + raise 'CodeRay.for_redcloth needs RedCloth 4.0.3 or later.' unless RedCloth::VERSION.to_s >= '4.0.3' + RedCloth::TextileDoc.send :include, ForRedCloth::TextileDoc + RedCloth::Formatters::HTML.module_eval do + undef_method :code, :bc_open, :bc_close + def code(opts) + opts[:block] = true + if opts[:lang] && !filter_coderay + require 'coderay' + @in_bc ||= nil + format = @in_bc ? :div : :span + highlighted_code = CodeRay.encode opts[:text], opts[:lang], format, :stream => true + highlighted_code.sub(/\A<(span|div)/) { |m| m + pba(@in_bc || opts) } + else + "#{opts[:text]}" + end + end + def bc_open(opts) + opts[:block] = true + @in_bc = opts + opts[:lang] ? '' : "" + end + def bc_close(opts) + @in_bc = nil + opts[:lang] ? '' : "\n" + end + end + end + + module ForRedCloth # :nodoc: + + module TextileDoc # :nodoc: + attr_accessor :filter_coderay + end + + end + +end diff --git a/test/functional/basic.rb b/test/functional/basic.rb index 5e0e759..07818ea 100755 --- a/test/functional/basic.rb +++ b/test/functional/basic.rb @@ -34,6 +34,13 @@ class BasicTest < Test::Unit::TestCase CodeRay::Duo[:plain, :plain].highlight(RUBY_TEST_CODE, :stream => true)) end + def test_for_redcloth + require 'rubygems' + CodeRay.for_redcloth + assert_equal '

puts "Hello, World!"

', + RedCloth.new('@[ruby]puts "Hello, World!"@').to_html + end + ENCODERS_LIST = %w( count debug div html null page span statistic text tokens xml yaml ) -- cgit v1.2.1