Feature #24681 » 0001-Switch-syntax-highlighter-to-Rouge-from-CodeRay.patch
Gemfile | ||
---|---|---|
5 | 5 |
end |
6 | 6 | |
7 | 7 |
gem "rails", "5.2.1" |
8 |
gem "coderay", "~> 1.1.1"
|
|
8 |
gem "rouge", "~> 3.2.1"
|
|
9 | 9 |
gem "request_store", "1.0.5" |
10 | 10 |
gem "mini_mime", "~> 1.0.1" |
11 | 11 |
gem "actionpack-xml_parser" |
lib/redmine/syntax_highlighting.rb | ||
---|---|---|
52 | 52 |
end |
53 | 53 |
end |
54 | 54 | |
55 |
module CodeRay
|
|
56 |
require 'coderay'
|
|
55 |
module Rouge
|
|
56 |
require 'rouge'
|
|
57 | 57 | |
58 |
def self.retrieve_supported_languages |
|
59 |
::CodeRay::Scanners.list + |
|
60 |
# Add CodeRay scanner aliases |
|
61 |
::CodeRay::Scanners.plugin_hash.keys.map(&:to_sym) - |
|
62 |
# Remove internal CodeRay scanners |
|
63 |
%w(debug default raydebug scanner).map(&:to_sym) |
|
64 |
end |
|
65 |
private_class_method :retrieve_supported_languages |
|
58 |
# Customized formatter based on Rouge::Formatters::HTMLLinewise |
|
59 |
# Syntax highlighting is completed within each line. |
|
60 |
class CustomHTMLLinewise < ::Rouge::Formatter |
|
61 |
def initialize(formatter) |
|
62 |
@formatter = formatter |
|
63 |
end |
|
66 | 64 | |
67 |
SUPPORTED_LANGUAGES = retrieve_supported_languages |
|
65 |
def stream(tokens, &b) |
|
66 |
token_lines(tokens) do |line| |
|
67 |
line.each do |tok, val| |
|
68 |
yield @formatter.span(tok, val) |
|
69 |
end |
|
70 |
yield "\n" |
|
71 |
end |
|
72 |
end |
|
73 |
end |
|
68 | 74 | |
69 | 75 |
class << self |
70 | 76 |
# Highlights +text+ as the content of +filename+ |
71 | 77 |
# Should not return line numbers nor outer pre tag |
72 | 78 |
def highlight_by_filename(text, filename) |
73 |
language = ::CodeRay::FileType[filename] |
|
74 |
language ? ::CodeRay.scan(text, language).html(:break_lines => true) : ERB::Util.h(text) |
|
79 |
lexer =::Rouge::Lexer.guess_by_filename(filename) |
|
80 |
formatter = ::Rouge::Formatters::HTML.new |
|
81 |
::Rouge.highlight(text, lexer, CustomHTMLLinewise.new(formatter)) |
|
75 | 82 |
end |
76 | 83 | |
77 | 84 |
# Highlights +text+ using +language+ syntax |
78 | 85 |
# Should not return outer pre tag |
79 | 86 |
def highlight_by_language(text, language) |
80 |
::CodeRay.scan(text, language).html(:wrap => :span) |
|
87 |
lexer = |
|
88 |
find_lexer(language.to_s.downcase) || ::Rouge::Lexers::PlainText |
|
89 |
::Rouge.highlight(text, lexer, ::Rouge::Formatters::HTML) |
|
81 | 90 |
end |
82 | 91 | |
83 | 92 |
def language_supported?(language) |
84 |
SUPPORTED_LANGUAGES.include?(language.to_s.downcase.to_sym) |
|
85 |
rescue |
|
86 |
false |
|
93 |
find_lexer(language.to_s.downcase) ? true : false |
|
94 |
end |
|
95 |
|
|
96 |
private |
|
97 |
# Alias names used by CodeRay and not supported by Rouge |
|
98 |
LANG_ALIASES = { |
|
99 |
'delphi' => 'pascal', |
|
100 |
'cplusplus' => 'cpp', |
|
101 |
'ecmascript' => 'javascript', |
|
102 |
'ecma_script' => 'javascript', |
|
103 |
'java_script' => 'javascript', |
|
104 |
'xhtml' => 'html' |
|
105 |
} |
|
106 | ||
107 |
def find_lexer(language) |
|
108 |
::Rouge::Lexer.find(language) || |
|
109 |
::Rouge::Lexer.find(LANG_ALIASES[language]) |
|
87 | 110 |
end |
88 | 111 |
end |
89 | 112 |
end |
90 | 113 |
end |
91 | 114 | |
92 |
SyntaxHighlighting.highlighter = 'CodeRay'
|
|
115 |
SyntaxHighlighting.highlighter = 'Rouge'
|
|
93 | 116 |
end |
lib/redmine/wiki_formatting/textile/formatter.rb | ||
---|---|---|
125 | 125 |
language = $1 |
126 | 126 |
text = $2 |
127 | 127 |
if Redmine::SyntaxHighlighting.language_supported?(language) |
128 |
text.gsub!(/x%x%/, '&') |
|
128 | 129 |
content = "<code class=\"#{language} syntaxhl\">" + |
129 | 130 |
Redmine::SyntaxHighlighting.highlight_by_language(text, language) |
130 | 131 |
else |
public/javascripts/jstoolbar/jstoolbar.js | ||
---|---|---|
453 | 453 | |
454 | 454 |
/* Code highlighting menu */ |
455 | 455 |
jsToolBar.prototype.precodeMenu = function(fn){ |
456 |
var codeRayLanguages = ["c", "clojure", "cpp", "css", "delphi", "diff", "erb", "go", "groovy", "haml", "html", "java", "javascript", "json", "lua", "php", "python", "ruby", "sass", "sql", "taskpaper", "text", "xml", "yaml"];
|
|
456 |
var hlLanguages = ["c", "clojure", "cpp", "css", "diff", "erb", "go", "groovy", "haml", "html", "java", "javascript", "json", "lua", "pascal", "php", "python", "ruby", "sass", "sql", "text", "xml", "yaml"];
|
|
457 | 457 |
var menu = $("<ul style='position:absolute;'></ul>"); |
458 |
for (var i = 0; i < codeRayLanguages.length; i++) {
|
|
459 |
$("<li></li>").text(codeRayLanguages[i]).appendTo(menu).mousedown(function(){
|
|
458 |
for (var i = 0; i < hlLanguages.length; i++) {
|
|
459 |
$("<li></li>").text(hlLanguages[i]).appendTo(menu).mousedown(function(){
|
|
460 | 460 |
fn($(this).text()); |
461 | 461 |
}); |
462 | 462 |
} |
public/stylesheets/application.css | ||
---|---|---|
1407 | 1407 |
.ui-datepicker-title select {width:70px !important; margin-top:-2px !important; margin-right:4px !important;} |
1408 | 1408 | |
1409 | 1409 | |
1410 |
/************* CodeRay styles *************/ |
|
1411 |
.syntaxhl div {display: inline;} |
|
1412 |
.syntaxhl .code pre { overflow: auto } |
|
1413 | ||
1414 |
.syntaxhl .annotation { color:#007 } |
|
1415 |
.syntaxhl .attribute-name { color:#b48 } |
|
1416 |
.syntaxhl .attribute-value { color:#700 } |
|
1417 |
.syntaxhl .binary { color:#549 } |
|
1418 |
.syntaxhl .binary .char { color:#325 } |
|
1419 |
.syntaxhl .binary .delimiter { color:#325 } |
|
1420 |
.syntaxhl .char { color:#D20 } |
|
1421 |
.syntaxhl .char .content { color:#D20 } |
|
1422 |
.syntaxhl .char .delimiter { color:#710 } |
|
1423 |
.syntaxhl .class { color:#B06; font-weight:bold } |
|
1424 |
.syntaxhl .class-variable { color:#369 } |
|
1425 |
.syntaxhl .color { color:#0A0 } |
|
1426 |
.syntaxhl .comment { color:#777 } |
|
1427 |
.syntaxhl .comment .char { color:#444 } |
|
1428 |
.syntaxhl .comment .delimiter { color:#444 } |
|
1429 |
.syntaxhl .constant { color:#036; font-weight:bold } |
|
1430 |
.syntaxhl .decorator { color:#B0B } |
|
1431 |
.syntaxhl .definition { color:#099; font-weight:bold } |
|
1432 |
.syntaxhl .delimiter { color:black } |
|
1433 |
.syntaxhl .directive { color:#088; font-weight:bold } |
|
1434 |
.syntaxhl .docstring { color:#D42; } |
|
1435 |
.syntaxhl .doctype { color:#34b } |
|
1436 |
.syntaxhl .done { text-decoration: line-through; color: gray } |
|
1437 |
.syntaxhl .entity { color:#800; font-weight:bold } |
|
1438 |
.syntaxhl .error { color:#F00; background-color:#FAA } |
|
1439 |
.syntaxhl .escape { color:#666 } |
|
1440 |
.syntaxhl .exception { color:#C00; font-weight:bold } |
|
1441 |
.syntaxhl .float { color:#60E } |
|
1442 |
.syntaxhl .function { color:#06B; font-weight:bold } |
|
1443 |
.syntaxhl .function .delimiter { color:#059 } |
|
1444 |
.syntaxhl .function .content { color:#037 } |
|
1445 |
.syntaxhl .global-variable { color:#d70 } |
|
1446 |
.syntaxhl .hex { color:#02b } |
|
1447 |
.syntaxhl .id { color:#33D; font-weight:bold } |
|
1448 |
.syntaxhl .include { color:#B44; font-weight:bold } |
|
1449 |
.syntaxhl .inline { background-color: hsla(0,0%,0%,0.07); color: black } |
|
1450 |
.syntaxhl .inline-delimiter { font-weight: bold; color: #666 } |
|
1451 |
.syntaxhl .instance-variable { color:#33B } |
|
1452 |
.syntaxhl .integer { color:#00D } |
|
1453 |
.syntaxhl .imaginary { color:#f00 } |
|
1454 |
.syntaxhl .important { color:#D00 } |
|
1455 |
.syntaxhl .key { color: #606 } |
|
1456 |
.syntaxhl .key .char { color: #60f } |
|
1457 |
.syntaxhl .key .delimiter { color: #404 } |
|
1458 |
.syntaxhl .keyword { color:#080; font-weight:bold } |
|
1459 |
.syntaxhl .label { color:#970; font-weight:bold } |
|
1460 |
.syntaxhl .local-variable { color:#950 } |
|
1461 |
.syntaxhl .map .content { color:#808 } |
|
1462 |
.syntaxhl .map .delimiter { color:#40A} |
|
1463 |
.syntaxhl .map { background-color:hsla(200,100%,50%,0.06); } |
|
1464 |
.syntaxhl .namespace { color:#707; font-weight:bold } |
|
1465 |
.syntaxhl .octal { color:#40E } |
|
1466 |
.syntaxhl .operator { } |
|
1467 |
.syntaxhl .predefined { color:#369; font-weight:bold } |
|
1468 |
.syntaxhl .predefined-constant { color:#069 } |
|
1469 |
.syntaxhl .predefined-type { color:#0a8; font-weight:bold } |
|
1470 |
.syntaxhl .preprocessor { color:#579 } |
|
1471 |
.syntaxhl .pseudo-class { color:#00C; font-weight:bold } |
|
1472 |
.syntaxhl .regexp { background-color:hsla(300,100%,50%,0.06); } |
|
1473 |
.syntaxhl .regexp .content { color:#808 } |
|
1474 |
.syntaxhl .regexp .delimiter { color:#404 } |
|
1475 |
.syntaxhl .regexp .modifier { color:#C2C } |
|
1476 |
.syntaxhl .reserved { color:#080; font-weight:bold } |
|
1477 |
.syntaxhl .shell { background-color:hsla(120,100%,50%,0.06); } |
|
1478 |
.syntaxhl .shell .content { color:#2B2 } |
|
1479 |
.syntaxhl .shell .delimiter { color:#161 } |
|
1480 |
.syntaxhl .string { background-color:hsla(0,100%,50%,0.05); } |
|
1481 |
.syntaxhl .string .char { color: #b0b } |
|
1482 |
.syntaxhl .string .content { color: #D20 } |
|
1483 |
.syntaxhl .string .delimiter { color: #710 } |
|
1484 |
.syntaxhl .string .modifier { color: #E40 } |
|
1485 |
.syntaxhl .symbol { color:#A60 } |
|
1486 |
.syntaxhl .symbol .content { color:#A60 } |
|
1487 |
.syntaxhl .symbol .delimiter { color:#740 } |
|
1488 |
.syntaxhl .tag { color:#070; font-weight:bold } |
|
1489 |
.syntaxhl .type { color:#339; font-weight:bold } |
|
1490 |
.syntaxhl .value { color: #088 } |
|
1491 |
.syntaxhl .variable { color:#037 } |
|
1492 | ||
1493 |
.syntaxhl .insert { background: hsla(120,100%,50%,0.12) } |
|
1494 |
.syntaxhl .delete { background: hsla(0,100%,50%,0.12) } |
|
1495 |
.syntaxhl .change { color: #bbf; background: #007 } |
|
1496 |
.syntaxhl .head { color: #f8f; background: #505 } |
|
1497 |
.syntaxhl .head .filename { color: white; } |
|
1498 | ||
1499 |
.syntaxhl .delete .eyecatcher { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; } |
|
1500 |
.syntaxhl .insert .eyecatcher { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } |
|
1501 | ||
1502 |
.syntaxhl .insert .insert { color: #0c0; background:transparent; font-weight:bold } |
|
1503 |
.syntaxhl .delete .delete { color: #c00; background:transparent; font-weight:bold } |
|
1504 |
.syntaxhl .change .change { color: #88f } |
|
1505 |
.syntaxhl .head .head { color: #f4f } |
|
1410 |
/************* Rouge styles *************/ |
|
1411 |
/* generated by: pygmentize -f html -a .syntaxhl -S colorful */ |
|
1412 |
.syntaxhl .hll { background-color: #ffffcc } |
|
1413 |
.syntaxhl { background: #fafafa; } |
|
1414 |
.syntaxhl .c { color: #888888 } /* Comment */ |
|
1415 |
.syntaxhl .err { color: #FF0000; background-color: #FFAAAA } /* Error */ |
|
1416 |
.syntaxhl .k { color: #008800; font-weight: bold } /* Keyword */ |
|
1417 |
.syntaxhl .o { color: #333333 } /* Operator */ |
|
1418 |
.syntaxhl .ch { color: #888888 } /* Comment.Hashbang */ |
|
1419 |
.syntaxhl .cm { color: #888888 } /* Comment.Multiline */ |
|
1420 |
.syntaxhl .cp { color: #557799 } /* Comment.Preproc */ |
|
1421 |
.syntaxhl .cpf { color: #888888 } /* Comment.PreprocFile */ |
|
1422 |
.syntaxhl .c1 { color: #888888 } /* Comment.Single */ |
|
1423 |
.syntaxhl .cs { color: #cc0000; font-weight: bold } /* Comment.Special */ |
|
1424 |
.syntaxhl .gd { color: #A00000 } /* Generic.Deleted */ |
|
1425 |
.syntaxhl .ge { font-style: italic } /* Generic.Emph */ |
|
1426 |
.syntaxhl .gr { color: #FF0000 } /* Generic.Error */ |
|
1427 |
.syntaxhl .gh { color: #000080; font-weight: bold } /* Generic.Heading */ |
|
1428 |
.syntaxhl .gi { color: #00A000 } /* Generic.Inserted */ |
|
1429 |
.syntaxhl .go { color: #888888 } /* Generic.Output */ |
|
1430 |
.syntaxhl .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ |
|
1431 |
.syntaxhl .gs { font-weight: bold } /* Generic.Strong */ |
|
1432 |
.syntaxhl .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ |
|
1433 |
.syntaxhl .gt { color: #0044DD } /* Generic.Traceback */ |
|
1434 |
.syntaxhl .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ |
|
1435 |
.syntaxhl .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ |
|
1436 |
.syntaxhl .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ |
|
1437 |
.syntaxhl .kp { color: #003388; font-weight: bold } /* Keyword.Pseudo */ |
|
1438 |
.syntaxhl .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ |
|
1439 |
.syntaxhl .kt { color: #333399; font-weight: bold } /* Keyword.Type */ |
|
1440 |
.syntaxhl .m { color: #6600EE; font-weight: bold } /* Literal.Number */ |
|
1441 |
.syntaxhl .s { background-color: #fff0f0 } /* Literal.String */ |
|
1442 |
.syntaxhl .na { color: #0000CC } /* Name.Attribute */ |
|
1443 |
.syntaxhl .nb { color: #007020 } /* Name.Builtin */ |
|
1444 |
.syntaxhl .nc { color: #BB0066; font-weight: bold } /* Name.Class */ |
|
1445 |
.syntaxhl .no { color: #003366; font-weight: bold } /* Name.Constant */ |
|
1446 |
.syntaxhl .nd { color: #555555; font-weight: bold } /* Name.Decorator */ |
|
1447 |
.syntaxhl .ni { color: #880000; font-weight: bold } /* Name.Entity */ |
|
1448 |
.syntaxhl .ne { color: #FF0000; font-weight: bold } /* Name.Exception */ |
|
1449 |
.syntaxhl .nf { color: #0066BB; font-weight: bold } /* Name.Function */ |
|
1450 |
.syntaxhl .nl { color: #997700; font-weight: bold } /* Name.Label */ |
|
1451 |
.syntaxhl .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ |
|
1452 |
.syntaxhl .nt { color: #007700 } /* Name.Tag */ |
|
1453 |
.syntaxhl .nv { color: #996633 } /* Name.Variable */ |
|
1454 |
.syntaxhl .ow { color: #000000; font-weight: bold } /* Operator.Word */ |
|
1455 |
.syntaxhl .w { color: #bbbbbb } /* Text.Whitespace */ |
|
1456 |
.syntaxhl .mb { color: #6600EE; font-weight: bold } /* Literal.Number.Bin */ |
|
1457 |
.syntaxhl .mf { color: #6600EE; font-weight: bold } /* Literal.Number.Float */ |
|
1458 |
.syntaxhl .mh { color: #005588; font-weight: bold } /* Literal.Number.Hex */ |
|
1459 |
.syntaxhl .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ |
|
1460 |
.syntaxhl .mo { color: #4400EE; font-weight: bold } /* Literal.Number.Oct */ |
|
1461 |
.syntaxhl .sa { background-color: #fff0f0 } /* Literal.String.Affix */ |
|
1462 |
.syntaxhl .sb { background-color: #fff0f0 } /* Literal.String.Backtick */ |
|
1463 |
.syntaxhl .sc { color: #0044DD } /* Literal.String.Char */ |
|
1464 |
.syntaxhl .dl { background-color: #fff0f0 } /* Literal.String.Delimiter */ |
|
1465 |
.syntaxhl .sd { color: #DD4422 } /* Literal.String.Doc */ |
|
1466 |
.syntaxhl .s2 { background-color: #fff0f0 } /* Literal.String.Double */ |
|
1467 |
.syntaxhl .se { color: #666666; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */ |
|
1468 |
.syntaxhl .sh { background-color: #fff0f0 } /* Literal.String.Heredoc */ |
|
1469 |
.syntaxhl .si { background-color: #eeeeee } /* Literal.String.Interpol */ |
|
1470 |
.syntaxhl .sx { color: #DD2200; background-color: #fff0f0 } /* Literal.String.Other */ |
|
1471 |
.syntaxhl .sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */ |
|
1472 |
.syntaxhl .s1 { background-color: #fff0f0 } /* Literal.String.Single */ |
|
1473 |
.syntaxhl .ss { color: #AA6600 } /* Literal.String.Symbol */ |
|
1474 |
.syntaxhl .bp { color: #007020 } /* Name.Builtin.Pseudo */ |
|
1475 |
.syntaxhl .fm { color: #0066BB; font-weight: bold } /* Name.Function.Magic */ |
|
1476 |
.syntaxhl .vc { color: #336699 } /* Name.Variable.Class */ |
|
1477 |
.syntaxhl .vg { color: #dd7700; font-weight: bold } /* Name.Variable.Global */ |
|
1478 |
.syntaxhl .vi { color: #3333BB } /* Name.Variable.Instance */ |
|
1479 |
.syntaxhl .vm { color: #996633 } /* Name.Variable.Magic */ |
|
1480 |
.syntaxhl .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ |
|
1506 | 1481 | |
1507 | 1482 |
/***** Media print specific styles *****/ |
1508 | 1483 |
@media print { |
public/stylesheets/rtl.css | ||
---|---|---|
373 | 373 |
/* Custom JQuery styles */ |
374 | 374 |
.ui-datepicker-title select {margin-left:4px !important; margin-right:0 !important;} |
375 | 375 | |
376 |
/************* CodeRay styles *************/ |
|
377 |
.syntaxhl .line-numbers {margin:0px 0px 0px 5px;} |
|
378 | ||
379 | 376 |
/***** Media print specific styles *****/ |
380 | 377 |
@media print { |
381 | 378 |
} |
test/helpers/application_helper_test.rb | ||
---|---|---|
1094 | 1094 | |
1095 | 1095 |
def test_syntax_highlight |
1096 | 1096 |
raw = <<-RAW |
1097 |
<pre><code class="ruby"> |
|
1098 |
# Some ruby code here |
|
1097 |
<pre><code class="ECMA_script"> |
|
1098 |
/* Hello */ |
|
1099 |
document.write("Hello World!"); |
|
1099 | 1100 |
</code></pre> |
1100 | 1101 |
RAW |
1101 | 1102 | |
1102 | 1103 |
expected = <<-EXPECTED |
1103 |
<pre><code class="ruby syntaxhl"><span class=\"CodeRay\"><span class="comment"># Some ruby code here</span></span> |
|
1104 |
</code></pre> |
|
1104 |
<pre><code class=\"ECMA_script syntaxhl\"><span class=\"cm\">/* Hello */</span><span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"s2\">\"Hello World!\"</span><span class=\"p\">);</span></code></pre> |
|
1105 | 1105 |
EXPECTED |
1106 | 1106 | |
1107 | 1107 |
assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '') |
1108 | 1108 |
end |
1109 | 1109 | |
1110 |
def test_syntax_highlight_ampersand_in_textile |
|
1111 |
raw = <<-RAW |
|
1112 |
<pre><code class="ruby"> |
|
1113 |
x = a & b |
|
1114 |
</code></pre> |
|
1115 |
RAW |
|
1116 | ||
1117 |
expected = <<-EXPECTED |
|
1118 |
<pre><code class=\"ruby syntaxhl\"><span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">a</span> <span class=\"o\">&</span> <span class=\"n\">b</span></code></pre> |
|
1119 |
EXPECTED |
|
1120 | ||
1121 |
with_settings :text_formatting => 'textile' do |
|
1122 |
assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '') |
|
1123 |
end |
|
1124 |
end |
|
1125 | ||
1110 | 1126 |
def test_to_path_param |
1111 | 1127 |
assert_equal 'test1/test2', to_path_param('test1/test2') |
1112 | 1128 |
assert_equal 'test1/test2', to_path_param('/test1/test2/') |
test/unit/lib/redmine/syntax_highlighting/coderay_test.rb | ||
---|---|---|
1 |
# Redmine - project management software |
|
2 |
# Copyright (C) 2006-2017 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 |
require File.expand_path('../../../../../test_helper', __FILE__) |
|
19 | ||
20 |
class Redmine::SyntaxHighlighting::CodeRayTest < ActiveSupport::TestCase |
|
21 |
def test_retrieve_supported_languages_should_return_array_of_symbols |
|
22 |
assert_kind_of Array, Redmine::SyntaxHighlighting::CodeRay.send(:retrieve_supported_languages) |
|
23 |
assert_kind_of Symbol, Redmine::SyntaxHighlighting::CodeRay.send(:retrieve_supported_languages).first |
|
24 |
end |
|
25 | ||
26 |
def test_retrieve_supported_languages_should_return_array_of_symbols_holding_languages |
|
27 |
assert_includes Redmine::SyntaxHighlighting::CodeRay.send(:retrieve_supported_languages), :ruby |
|
28 |
end |
|
29 | ||
30 |
def test_retrieve_supported_languages_should_return_array_of_symbols_holding_languages_aliases |
|
31 |
assert_includes Redmine::SyntaxHighlighting::CodeRay.send(:retrieve_supported_languages), :javascript |
|
32 |
end |
|
33 | ||
34 |
def test_retrieve_supported_languages_should_return_array_of_symbols_not_holding_internal_languages |
|
35 |
refute_includes Redmine::SyntaxHighlighting::CodeRay.send(:retrieve_supported_languages), :default |
|
36 |
end |
|
37 |
end |
test/unit/lib/redmine/wiki_formatting/markdown_formatter_test.rb | ||
---|---|---|
66 | 66 |
~~~ |
67 | 67 |
STR |
68 | 68 |
assert_select_in @formatter.new(text).to_html, 'pre code.ruby.syntaxhl' do |
69 |
assert_select 'span.keyword', :text => 'def'
|
|
69 |
assert_select 'span.k', :text => 'def' |
|
70 | 70 |
end |
71 | 71 |
end |
72 | 72 |
test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb | ||
---|---|---|
547 | 547 | |
548 | 548 |
def test_should_allow_valid_language_class_attribute_on_code_tags |
549 | 549 |
# language name is double-quoted |
550 |
assert_html_output({"<code class=\"ruby\">test</code>" => "<code class=\"ruby syntaxhl\"><span class=\"CodeRay\">test</span></code>"}, false)
|
|
550 |
assert_html_output({"<code class=\"ruby\">test</code>" => "<code class=\"ruby syntaxhl\"><span class=\"nb\">test</span></code>"}, false)
|
|
551 | 551 |
# language name is single-quoted |
552 |
assert_html_output({"<code class='ruby'>test</code>" => "<code class=\"ruby syntaxhl\"><span class=\"CodeRay\">test</span></code>"}, false)
|
|
552 |
assert_html_output({"<code class='ruby'>test</code>" => "<code class=\"ruby syntaxhl\"><span class=\"nb\">test</span></code>"}, false)
|
|
553 | 553 |
end |
554 | 554 | |
555 | 555 |
def test_should_not_allow_valid_language_class_attribute_on_non_code_offtags |
- « Previous
- 1
- …
- 9
- 10
- 11
- Next »