summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/coderay.rb1
-rw-r--r--lib/coderay/for_redcloth.rb54
2 files changed, 55 insertions, 0 deletions
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
+ "<code#{pba(opts)}>#{opts[:text]}</code>"
+ end
+ end
+ def bc_open(opts)
+ opts[:block] = true
+ @in_bc = opts
+ opts[:lang] ? '' : "<pre#{pba(opts)}>"
+ end
+ def bc_close(opts)
+ @in_bc = nil
+ opts[:lang] ? '' : "</pre>\n"
+ end
+ end
+ end
+
+ module ForRedCloth # :nodoc:
+
+ module TextileDoc # :nodoc:
+ attr_accessor :filter_coderay
+ end
+
+ end
+
+end