view vendor/gems/coderay-1.0.0/lib/coderay/for_redcloth.rb @ 1082:997f6d7738f7 bug_531

In repo controller entry action, show the page for the file even if it's binary (so user still has access to history etc links). This makes it possible to use the entry action as the default when a file is clicked on
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 22 Nov 2012 18:04:17 +0000
parents cbb26bc654de
children
line wrap: on
line source
module CodeRay
  
  # A little hack to enable CodeRay highlighting in RedCloth.
  # 
  # Usage:
  #  require 'coderay'
  #  require '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.
  module ForRedCloth
    
    def self.install
      gem 'RedCloth', '>= 4.0.3' if defined? gem
      require 'redcloth'
      unless RedCloth::VERSION.to_s >= '4.0.3'
        if defined? gem
          raise 'CodeRay.for_redcloth needs RedCloth version 4.0.3 or later. ' +
            "You have #{RedCloth::VERSION}. Please gem install RedCloth."
        else
          $".delete 'redcloth.rb'  # sorry, but it works
          require 'rubygems'
          return install  # retry
        end
      end
      unless RedCloth::VERSION.to_s >= '4.2.2'
        warn 'CodeRay.for_redcloth works best with RedCloth version 4.2.2 or later.'
      end
      RedCloth::TextileDoc.send :include, ForRedCloth::TextileDoc
      RedCloth::Formatters::HTML.module_eval do
        def unescape(html)  # :nodoc:
          replacements = {
            '&amp;' => '&',
            '&quot;' => '"',
            '&gt;' => '>',
            '&lt;' => '<',
          }
          html.gsub(/&(?:amp|quot|[gl]t);/) { |entity| replacements[entity] }
        end
        undef code, bc_open, bc_close, escape_pre
        def code(opts)  # :nodoc:
          opts[:block] = true
          if !opts[:lang] && RedCloth::VERSION.to_s >= '4.2.0'
            # simulating pre-4.2 behavior
            if opts[:text].sub!(/\A\[(\w+)\]/, '')
              if CodeRay::Scanners[$1].lang == :text
                opts[:text] = $& + opts[:text]
              else
                opts[:lang] = $1
              end
            end
          end
          if opts[:lang] && !filter_coderay
            require 'coderay'
            @in_bc ||= nil
            format = @in_bc ? :div : :span
            opts[:text] = unescape(opts[:text]) unless @in_bc
            highlighted_code = CodeRay.encode opts[:text], opts[:lang], format
            highlighted_code.sub!(/\A<(span|div)/) { |m| m + pba(@in_bc || opts) }
            highlighted_code
          else
            "<code#{pba(opts)}>#{opts[:text]}</code>"
          end
        end
        def bc_open(opts)  # :nodoc:
          opts[:block] = true
          @in_bc = opts
          opts[:lang] ? '' : "<pre#{pba(opts)}>"
        end
        def bc_close(opts)  # :nodoc:
          opts = @in_bc
          @in_bc = nil
          opts[:lang] ? '' : "</pre>\n"
        end
        def escape_pre(text)  # :nodoc:
          if @in_bc ||= nil
            text
          else
            html_esc(text, :html_escape_preformatted)
          end
        end
      end
    end

    module TextileDoc  # :nodoc:
      attr_accessor :filter_coderay
    end
    
  end
  
end

CodeRay::ForRedCloth.install