mirror of
https://github.com/redmine/redmine.git
synced 2025-11-08 22:36:02 +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:
65
vendor/plugins/coderay-0.7.6.227/lib/coderay/encoders/html/css.rb
vendored
Normal file
65
vendor/plugins/coderay-0.7.6.227/lib/coderay/encoders/html/css.rb
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
module CodeRay
|
||||
module Encoders
|
||||
|
||||
class HTML
|
||||
class CSS
|
||||
|
||||
attr :stylesheet
|
||||
|
||||
def CSS.load_stylesheet style = nil
|
||||
CodeRay::Styles[style]
|
||||
end
|
||||
|
||||
def initialize style = :default
|
||||
@classes = Hash.new
|
||||
style = CSS.load_stylesheet style
|
||||
@stylesheet = [
|
||||
style::CSS_MAIN_STYLES,
|
||||
style::TOKEN_COLORS.gsub(/^(?!$)/, '.CodeRay ')
|
||||
].join("\n")
|
||||
parse style::TOKEN_COLORS
|
||||
end
|
||||
|
||||
def [] *styles
|
||||
cl = @classes[styles.first]
|
||||
return '' unless cl
|
||||
style = ''
|
||||
1.upto(styles.size) do |offset|
|
||||
break if style = cl[styles[offset .. -1]]
|
||||
end
|
||||
raise 'Style not found: %p' % [styles] if $DEBUG and style.empty?
|
||||
return style
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
CSS_CLASS_PATTERN = /
|
||||
( (?: # $1 = classes
|
||||
\s* \. [-\w]+
|
||||
)+ )
|
||||
\s* \{ \s*
|
||||
( [^\}]+ )? # $2 = style
|
||||
\s* \} \s*
|
||||
|
|
||||
( . ) # $3 = error
|
||||
/mx
|
||||
def parse stylesheet
|
||||
stylesheet.scan CSS_CLASS_PATTERN do |classes, style, error|
|
||||
raise "CSS parse error: '#{error.inspect}' not recognized" if error
|
||||
styles = classes.scan(/[-\w]+/)
|
||||
cl = styles.pop
|
||||
@classes[cl] ||= Hash.new
|
||||
@classes[cl][styles] = style.to_s.strip
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
if $0 == __FILE__
|
||||
require 'pp'
|
||||
pp CodeRay::Encoders::HTML::CSS.new
|
||||
end
|
||||
122
vendor/plugins/coderay-0.7.6.227/lib/coderay/encoders/html/numerization.rb
vendored
Normal file
122
vendor/plugins/coderay-0.7.6.227/lib/coderay/encoders/html/numerization.rb
vendored
Normal file
@@ -0,0 +1,122 @@
|
||||
module CodeRay
|
||||
module Encoders
|
||||
|
||||
class HTML
|
||||
|
||||
module Output
|
||||
|
||||
def numerize *args
|
||||
clone.numerize!(*args)
|
||||
end
|
||||
|
||||
=begin NUMERIZABLE_WRAPPINGS = {
|
||||
:table => [:div, :page, nil],
|
||||
:inline => :all,
|
||||
:list => [:div, :page, nil]
|
||||
}
|
||||
NUMERIZABLE_WRAPPINGS.default = :all
|
||||
=end
|
||||
def numerize! mode = :table, options = {}
|
||||
return self unless mode
|
||||
|
||||
options = DEFAULT_OPTIONS.merge options
|
||||
|
||||
start = options[:line_number_start]
|
||||
unless start.is_a? Integer
|
||||
raise ArgumentError, "Invalid value %p for :line_number_start; Integer expected." % start
|
||||
end
|
||||
|
||||
#allowed_wrappings = NUMERIZABLE_WRAPPINGS[mode]
|
||||
#unless allowed_wrappings == :all or allowed_wrappings.include? options[:wrap]
|
||||
# raise ArgumentError, "Can't numerize, :wrap must be in %p, but is %p" % [NUMERIZABLE_WRAPPINGS, options[:wrap]]
|
||||
#end
|
||||
|
||||
bold_every = options[:bold_every]
|
||||
bolding =
|
||||
if bold_every == false
|
||||
proc { |line| line.to_s }
|
||||
elsif bold_every.is_a? Integer
|
||||
raise ArgumentError, ":bolding can't be 0." if bold_every == 0
|
||||
proc do |line|
|
||||
if line % bold_every == 0
|
||||
"<strong>#{line}</strong>" # every bold_every-th number in bold
|
||||
else
|
||||
line.to_s
|
||||
end
|
||||
end
|
||||
else
|
||||
raise ArgumentError, 'Invalid value %p for :bolding; false or Integer expected.' % bold_every
|
||||
end
|
||||
|
||||
case mode
|
||||
when :inline
|
||||
max_width = (start + line_count).to_s.size
|
||||
line = start
|
||||
gsub!(/^/) do
|
||||
line_number = bolding.call line
|
||||
indent = ' ' * (max_width - line.to_s.size)
|
||||
res = "<span class=\"no\">#{indent}#{line_number}</span> "
|
||||
line += 1
|
||||
res
|
||||
end
|
||||
|
||||
when :table
|
||||
# This is really ugly.
|
||||
# Because even monospace fonts seem to have different heights when bold,
|
||||
# I make the newline bold, both in the code and the line numbers.
|
||||
# FIXME Still not working perfect for Mr. Internet Exploder
|
||||
# FIXME Firefox struggles with very long codes (> 200 lines)
|
||||
line_numbers = (start ... start + line_count).to_a.map(&bolding).join("\n")
|
||||
line_numbers << "\n" # also for Mr. MS Internet Exploder :-/
|
||||
line_numbers.gsub!(/\n/) { "<tt>\n</tt>" }
|
||||
|
||||
line_numbers_table_tpl = TABLE.apply('LINE_NUMBERS', line_numbers)
|
||||
gsub!(/\n/) { "<tt>\n</tt>" }
|
||||
wrap_in! line_numbers_table_tpl
|
||||
@wrapped_in = :div
|
||||
|
||||
when :list
|
||||
opened_tags = []
|
||||
gsub!(/^.*$\n?/) do |line|
|
||||
line.chomp!
|
||||
|
||||
open = opened_tags.join
|
||||
line.scan(%r!<(/)?span[^>]*>?!) do |close,|
|
||||
if close
|
||||
opened_tags.pop
|
||||
else
|
||||
opened_tags << $&
|
||||
end
|
||||
end
|
||||
close = '</span>' * opened_tags.size
|
||||
|
||||
"<li>#{open}#{line}#{close}</li>"
|
||||
end
|
||||
wrap_in! LIST
|
||||
@wrapped_in = :div
|
||||
|
||||
else
|
||||
raise ArgumentError, 'Unknown value %p for mode: expected one of %p' %
|
||||
[mode, [:table, :list, :inline]]
|
||||
end
|
||||
|
||||
self
|
||||
end
|
||||
|
||||
def line_count
|
||||
line_count = count("\n")
|
||||
position_of_last_newline = rindex(?\n)
|
||||
if position_of_last_newline
|
||||
after_last_newline = self[position_of_last_newline + 1 .. -1]
|
||||
ends_with_newline = after_last_newline[/\A(?:<\/span>)*\z/]
|
||||
line_count += 1 if not ends_with_newline
|
||||
end
|
||||
line_count
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
195
vendor/plugins/coderay-0.7.6.227/lib/coderay/encoders/html/output.rb
vendored
Normal file
195
vendor/plugins/coderay-0.7.6.227/lib/coderay/encoders/html/output.rb
vendored
Normal file
@@ -0,0 +1,195 @@
|
||||
module CodeRay
|
||||
module Encoders
|
||||
|
||||
class HTML
|
||||
|
||||
# This module is included in the output String from thew HTML Encoder.
|
||||
#
|
||||
# It provides methods like wrap, div, page etc.
|
||||
#
|
||||
# Remember to use #clone instead of #dup to keep the modules the object was
|
||||
# extended with.
|
||||
#
|
||||
# TODO: more doc.
|
||||
module Output
|
||||
|
||||
require 'coderay/encoders/html/numerization.rb'
|
||||
|
||||
attr_accessor :css
|
||||
|
||||
class << self
|
||||
|
||||
# This makes Output look like a class.
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# a = Output.new '<span class="co">Code</span>'
|
||||
# a.wrap! :page
|
||||
def new string, css = CSS.new, element = nil
|
||||
output = string.clone.extend self
|
||||
output.wrapped_in = element
|
||||
output.css = css
|
||||
output
|
||||
end
|
||||
|
||||
# Raises an exception if an object that doesn't respond to to_str is extended by Output,
|
||||
# to prevent users from misuse. Use Module#remove_method to disable.
|
||||
def extended o
|
||||
warn "The Output module is intended to extend instances of String, not #{o.class}." unless o.respond_to? :to_str
|
||||
end
|
||||
|
||||
def make_stylesheet css, in_tag = false
|
||||
sheet = css.stylesheet
|
||||
sheet = <<-CSS if in_tag
|
||||
<style type="text/css">
|
||||
#{sheet}
|
||||
</style>
|
||||
CSS
|
||||
sheet
|
||||
end
|
||||
|
||||
def page_template_for_css css
|
||||
sheet = make_stylesheet css
|
||||
PAGE.apply 'CSS', sheet
|
||||
end
|
||||
|
||||
# Define a new wrapper. This is meta programming.
|
||||
def wrapper *wrappers
|
||||
wrappers.each do |wrapper|
|
||||
define_method wrapper do |*args|
|
||||
wrap wrapper, *args
|
||||
end
|
||||
define_method "#{wrapper}!".to_sym do |*args|
|
||||
wrap! wrapper, *args
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
wrapper :div, :span, :page
|
||||
|
||||
def wrapped_in? element
|
||||
wrapped_in == element
|
||||
end
|
||||
|
||||
def wrapped_in
|
||||
@wrapped_in ||= nil
|
||||
end
|
||||
attr_writer :wrapped_in
|
||||
|
||||
def wrap_in template
|
||||
clone.wrap_in! template
|
||||
end
|
||||
|
||||
def wrap_in! template
|
||||
Template.wrap! self, template, 'CONTENT'
|
||||
self
|
||||
end
|
||||
|
||||
def wrap! element, *args
|
||||
return self if not element or element == wrapped_in
|
||||
case element
|
||||
when :div
|
||||
raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? nil
|
||||
wrap_in! DIV
|
||||
when :span
|
||||
raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? nil
|
||||
wrap_in! SPAN
|
||||
when :page
|
||||
wrap! :div if wrapped_in? nil
|
||||
raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? :div
|
||||
wrap_in! Output.page_template_for_css(@css)
|
||||
when nil
|
||||
return self
|
||||
else
|
||||
raise "Unknown value %p for :wrap" % element
|
||||
end
|
||||
@wrapped_in = element
|
||||
self
|
||||
end
|
||||
|
||||
def wrap *args
|
||||
clone.wrap!(*args)
|
||||
end
|
||||
|
||||
def stylesheet in_tag = false
|
||||
Output.make_stylesheet @css, in_tag
|
||||
end
|
||||
|
||||
class Template < String
|
||||
|
||||
def self.wrap! str, template, target
|
||||
target = Regexp.new(Regexp.escape("<%#{target}%>"))
|
||||
if template =~ target
|
||||
str[0,0] = $`
|
||||
str << $'
|
||||
else
|
||||
raise "Template target <%%%p%%> not found" % target
|
||||
end
|
||||
end
|
||||
|
||||
def apply target, replacement
|
||||
target = Regexp.new(Regexp.escape("<%#{target}%>"))
|
||||
if self =~ target
|
||||
Template.new($` + replacement + $')
|
||||
else
|
||||
raise "Template target <%%%p%%> not found" % target
|
||||
end
|
||||
end
|
||||
|
||||
module Simple
|
||||
def ` str #` <-- for stupid editors
|
||||
Template.new str
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
extend Template::Simple
|
||||
|
||||
#-- don't include the templates in docu
|
||||
|
||||
SPAN = `<span class="CodeRay"><%CONTENT%></span>`
|
||||
|
||||
DIV = <<-`DIV`
|
||||
<div class="CodeRay">
|
||||
<div class="code"><pre><%CONTENT%></pre></div>
|
||||
</div>
|
||||
DIV
|
||||
|
||||
TABLE = <<-`TABLE`
|
||||
<table class="CodeRay"><tr>
|
||||
<td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><%LINE_NUMBERS%></pre></td>
|
||||
<td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><%CONTENT%></pre></td>
|
||||
</tr></table>
|
||||
TABLE
|
||||
# title="double click to expand"
|
||||
|
||||
LIST = <<-`LIST`
|
||||
<ol class="CodeRay"><%CONTENT%></ol>
|
||||
LIST
|
||||
|
||||
PAGE = <<-`PAGE`
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<title>CodeRay HTML Encoder Example</title>
|
||||
<style type="text/css">
|
||||
<%CSS%>
|
||||
</style>
|
||||
</head>
|
||||
<body style="background-color: white;">
|
||||
|
||||
<%CONTENT%>
|
||||
</body>
|
||||
</html>
|
||||
PAGE
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user