Feature #2985 » syntax_highlighting.diff
app/helpers/application_helper.rb (working copy) | ||
---|---|---|
15 | 15 |
# along with this program; if not, write to the Free Software |
16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
17 | 17 | |
18 |
require 'coderay' |
|
19 |
require 'coderay/helpers/file_type' |
|
20 | 18 |
require 'forwardable' |
21 | 19 |
require 'cgi' |
22 | 20 | |
... | ... | |
216 | 214 |
end |
217 | 215 | |
218 | 216 |
def syntax_highlight(name, content) |
219 |
type = CodeRay::FileType[name] |
|
220 |
type ? CodeRay.scan(content, type).html : h(content) |
|
217 |
Redmine::SyntaxHighlighting.colorize_file(name, content) |
|
221 | 218 |
end |
222 | 219 | |
223 | 220 |
def to_path_param(path) |
app/views/settings/_general.rhtml (working copy) | ||
---|---|---|
27 | 27 |
<p><label><%= l(:setting_text_formatting) %></label> |
28 | 28 |
<%= select_tag 'settings[text_formatting]', options_for_select([[l(:label_none), "0"], *Redmine::WikiFormatting.format_names.collect{|name| [name, name]} ], Setting.text_formatting.to_sym) %></p> |
29 | 29 | |
30 |
<p><label><%= l(:label_syntax_highlighter) %></label> |
|
31 |
<%= select_tag 'settings[syntax_highlighter]', options_for_select( (Redmine::SyntaxHighlighting.available_highlighters.collect{|h| [h, h]}), Setting.syntax_highlighter) %></p> |
|
32 | ||
30 | 33 |
<p><label><%= l(:setting_wiki_compression) %></label> |
31 | 34 |
<%= select_tag 'settings[wiki_compression]', options_for_select( [[l(:label_none), 0], ["gzip", "gzip"]], Setting.wiki_compression) %></p> |
32 | 35 |
app/views/attachments/file.rhtml (working copy) | ||
---|---|---|
8 | 8 | |
9 | 9 |
</div> |
10 | 10 |
|
11 |
<%= render :partial => 'common/file', :locals => {:content => @content, :filename => @attachment.filename} %> |
|
11 |
<%= render :partial => 'common/file', :locals => {:content => @content, :filename => @attachment.disk_filename} %>
|
|
12 | 12 | |
13 | 13 |
<% content_for :header_tags do -%> |
14 | 14 |
<%= stylesheet_link_tag "scm" -%> |
app/views/common/_file.rhtml (working copy) | ||
---|---|---|
1 | 1 |
<div class="autoscroll"> |
2 |
<table class="filecontent CodeRay">
|
|
2 |
<table class="filecontent"> |
|
3 | 3 |
<tbody> |
4 | 4 |
<% line_num = 1 %> |
5 | 5 |
<% syntax_highlight(filename, to_utf8(content)).each_line do |line| %> |
6 |
<tr><th class="line-num" id="L<%= line_num %>"><a href="#L<%= line_num %>"><%= line_num %></a></th><td class="line-code"><pre><%= line %></pre></td></tr>
|
|
6 |
<tr><th class="line-num" id="L<%= line_num %>"><a href="#L<%= line_num %>"><%= line_num %></a></th><td class="line-code"><%= line %></td></tr>
|
|
7 | 7 |
<% line_num += 1 %> |
8 | 8 |
<% end %> |
9 | 9 |
</tbody> |
config/settings.yml (working copy) | ||
---|---|---|
150 | 150 |
default: 0 |
151 | 151 |
openid: |
152 | 152 |
default: 0 |
153 |
syntax_highlighter: |
|
154 |
default: 'DefaultCodeRay' |
config/locales/en.yml (working copy) | ||
---|---|---|
666 | 666 |
label_ascending: Ascending |
667 | 667 |
label_descending: Descending |
668 | 668 |
label_date_from_to: From {{start}} to {{end}} |
669 |
label_syntax_highlighter: Syntax highlighter |
|
669 | 670 |
|
670 | 671 |
button_login: Login |
671 | 672 |
button_submit: Submit |
config/locales/fr.yml (working copy) | ||
---|---|---|
698 | 698 |
label_ascending: Croissant |
699 | 699 |
label_descending: Décroissant |
700 | 700 |
label_date_from_to: Du {{start}} au {{end}} |
701 |
label_syntax_highlighter: Colorateur syntaxique |
|
701 | 702 |
|
702 | 703 |
button_login: Connexion |
703 | 704 |
button_submit: Soumettre |
lib/redmine/wiki_formatting/textile/formatter.rb (working copy) | ||
---|---|---|
16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
17 | 17 | |
18 | 18 |
require 'redcloth3' |
19 |
require 'coderay' |
|
20 | 19 | |
21 | 20 |
module Redmine |
22 | 21 |
module WikiFormatting |
... | ... | |
54 | 53 |
text.gsub!(/<redpre#(\d+)>/) do |
55 | 54 |
content = @pre_list[$1.to_i] |
56 | 55 |
if content.match(/<code\s+class="(\w+)">\s?(.+)/m) |
57 |
content = "<code class=\"#{$1} CodeRay\">" + |
|
58 |
CodeRay.scan($2, $1.downcase).html(:escape => false, :line_numbers => :inline) |
|
56 |
content = Redmine::SyntaxHighlighting.colorize($2, $1) |
|
59 | 57 |
end |
60 | 58 |
content |
61 | 59 |
end |
lib/redmine/syntax_highlighting.rb (revision 0) | ||
---|---|---|
1 |
# Redmine - project management software |
|
2 |
# Copyright (C) 2006-2008 Jean-Philippe Lang |
|
3 |
# |
|
4 |
# This program is free software; you can redistribute it and/or |
|
5 |
# modify it under the terms of the GNU General Public License |
|
6 |
# as published by the Free Software Foundation; either version 2 |
|
7 |
# of the License, or (at your option) any later version. |
|
8 |
# |
|
9 |
# This program is distributed in the hope that it will be useful, |
|
10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
# GNU General Public License for more details. |
|
13 |
# |
|
14 |
# You should have received a copy of the GNU General Public License |
|
15 |
# along with this program; if not, write to the Free Software |
|
16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | ||
18 |
module Redmine |
|
19 |
module SyntaxHighlighting |
|
20 |
|
|
21 |
class << self |
|
22 |
# get highlighter class object |
|
23 |
def highlighter |
|
24 |
const_get(Setting.syntax_highlighter) |
|
25 |
end |
|
26 | ||
27 |
# get all available highlighters |
|
28 |
def available_highlighters |
|
29 |
constants.sort - ["SyntaxAssets"] |
|
30 |
end |
|
31 |
|
|
32 |
# used in the wiki to colorize text |
|
33 |
def colorize(text, format="") |
|
34 |
raise "#{highlighter} should implement 'colorize' method !" unless highlighter.respond_to?(:colorize) |
|
35 |
highlighter.colorize(text, format) |
|
36 |
end |
|
37 |
|
|
38 |
# used in attachments/repository to colorize files |
|
39 |
def colorize_file(filename, content) |
|
40 |
raise "#{highlighter} should implement 'colorize_file' method !" unless highlighter.respond_to?(:colorize_file) |
|
41 |
highlighter.colorize_file(filename, content) |
|
42 |
end |
|
43 |
|
|
44 |
end |
|
45 | ||
46 |
#hook to add chosen highlighter specific js and css tags in layout header |
|
47 |
class SyntaxAssets < Redmine::Hook::ViewListener |
|
48 |
def view_layouts_base_html_head(context) |
|
49 |
res = [] |
|
50 |
h = Redmine::SyntaxHighlighting.highlighter |
|
51 |
# specific stylesheets ; just define a "stylesheets" method returning an array |
|
52 |
h.stylesheets.each do |args| |
|
53 |
res << stylesheet_link_tag(*args) |
|
54 |
end if h.respond_to?(:stylesheets) |
|
55 |
# specific javascripts ; just define a "javascripts" method returning an array |
|
56 |
h.javascripts.each do |args| |
|
57 |
res << javascript_include_tag(*args) |
|
58 |
end if h.respond_to?(:javascripts) |
|
59 |
res.join |
|
60 |
end |
|
61 |
end |
|
62 |
Redmine::Hook.add_listener(SyntaxAssets) |
|
63 |
|
|
64 |
#default highlighter |
|
65 |
module DefaultCodeRay |
|
66 |
require 'coderay' |
|
67 |
require 'coderay/helpers/file_type' |
|
68 |
|
|
69 |
class << self |
|
70 |
def colorize(text, format) |
|
71 |
"<code class=\"#{format} CodeRay\">" + |
|
72 |
CodeRay.scan(text, format.downcase).html(:escape => false, :line_numbers => :inline) |
|
73 |
end |
|
74 |
|
|
75 |
def colorize_file(filename, content) |
|
76 |
type = CodeRay::FileType[filename] |
|
77 |
result = type ? CodeRay.scan(content, type).html : ERB::Util.h(content) |
|
78 |
# to keep old behaviour (<pre> tags were in common/_file.rhtml template, disturbing eventual other highlighter) |
|
79 |
result.split(/\n/).map{|l| "<pre>#{l}</pre>"}.join("\n") |
|
80 |
end |
|
81 |
end |
|
82 |
end |
|
83 |
|
|
84 |
end |
|
85 |
end |
lib/redmine.rb (working copy) | ||
---|---|---|
7 | 7 |
require 'redmine/hook' |
8 | 8 |
require 'redmine/plugin' |
9 | 9 |
require 'redmine/wiki_formatting' |
10 |
require 'redmine/syntax_highlighting' |
|
10 | 11 | |
11 | 12 |
begin |
12 | 13 |
require_library_or_gem 'RMagick' unless Object.const_defined?(:Magick) |
public/stylesheets/scm.css (working copy) | ||
---|---|---|
45 | 45 |
color: inherit; |
46 | 46 |
} |
47 | 47 |
table.filecontent td.line-code pre { |
48 |
margin: 0px; |
|
48 | 49 |
white-space: pre-wrap; /* CSS2.1 compliant */ |
49 | 50 |
white-space: -moz-pre-wrap; /* Mozilla-based browsers */ |
50 | 51 |
white-space: -o-pre-wrap; /* Opera 7+ */ |