mirror of
https://github.com/redmine/redmine.git
synced 2025-11-09 06:46:01 +01:00
Added syntax highlightment for repository files (using CodeRay).
Supported languages: c, ruby, rhtml, yaml, html, xml. git-svn-id: http://redmine.rubyforge.org/svn/trunk@644 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
87
vendor/plugins/coderay-0.7.6.227/lib/coderay/duo.rb
vendored
Normal file
87
vendor/plugins/coderay-0.7.6.227/lib/coderay/duo.rb
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
module CodeRay
|
||||
|
||||
# = Duo
|
||||
#
|
||||
# $Id: scanner.rb 123 2006-03-21 14:46:34Z murphy $
|
||||
#
|
||||
# A Duo is a convenient way to use CodeRay. You just create a Duo,
|
||||
# giving it a lang (language of the input code) and a format (desired
|
||||
# output format), and call Duo#highlight with the code.
|
||||
#
|
||||
# Duo makes it easy to re-use both scanner and encoder for a repetitive
|
||||
# task. It also provides a very easy interface syntax:
|
||||
#
|
||||
# require 'coderay'
|
||||
# CodeRay::Duo[:python, :div].highlight 'import this'
|
||||
#
|
||||
# Until you want to do uncommon things with CodeRay, I recommend to use
|
||||
# this method, since it takes care of everything.
|
||||
class Duo
|
||||
|
||||
attr_accessor :lang, :format, :options
|
||||
|
||||
# Create a new Duo, holding a lang and a format to highlight code.
|
||||
#
|
||||
# simple:
|
||||
# CodeRay::Duo[:ruby, :page].highlight 'bla 42'
|
||||
#
|
||||
# streaming:
|
||||
# CodeRay::Duo[:ruby, :page].highlight 'bar 23', :stream => true
|
||||
#
|
||||
# with options:
|
||||
# CodeRay::Duo[:ruby, :html, :hint => :debug].highlight '????::??'
|
||||
#
|
||||
# alternative syntax without options:
|
||||
# CodeRay::Duo[:ruby => :statistic].encode 'class << self; end'
|
||||
#
|
||||
# alternative syntax with options:
|
||||
# CodeRay::Duo[{ :ruby => :statistic }, :do => :something].encode 'abc'
|
||||
#
|
||||
# The options are forwarded to scanner and encoder
|
||||
# (see CodeRay.get_scanner_options).
|
||||
def initialize lang = nil, format = nil, options = {}
|
||||
if format == nil and lang.is_a? Hash and lang.size == 1
|
||||
@lang = lang.keys.first
|
||||
@format = lang[@lang]
|
||||
else
|
||||
@lang = lang
|
||||
@format = format
|
||||
end
|
||||
@options = options
|
||||
end
|
||||
|
||||
class << self
|
||||
# To allow calls like Duo[:ruby, :html].highlight.
|
||||
alias [] new
|
||||
end
|
||||
|
||||
# The scanner of the duo. Only created once.
|
||||
def scanner
|
||||
@scanner ||= CodeRay.scanner @lang, CodeRay.get_scanner_options(@options)
|
||||
end
|
||||
|
||||
# The encoder of the duo. Only created once.
|
||||
def encoder
|
||||
@encoder ||= CodeRay.encoder @format, @options
|
||||
end
|
||||
|
||||
# Tokenize and highlight the code using +scanner+ and +encoder+.
|
||||
#
|
||||
# If the :stream option is set, the Duo will go into streaming mode,
|
||||
# saving memory for the cost of time.
|
||||
def encode code, options = { :stream => false }
|
||||
stream = options.delete :stream
|
||||
options = @options.merge options
|
||||
if stream
|
||||
encoder.encode_stream(code, @lang, options)
|
||||
else
|
||||
scanner.code = code
|
||||
encoder.encode_tokens(scanner.tokenize, options)
|
||||
end
|
||||
end
|
||||
alias highlight encode
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user