rouge 3.2.0 → 3.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Gemfile +17 -3
- data/bin/rougify +1 -0
- data/lib/rouge.rb +67 -43
- data/lib/rouge/cli.rb +84 -17
- data/lib/rouge/demos/ada +26 -0
- data/lib/rouge/demos/apex +9 -0
- data/lib/rouge/demos/armasm +12 -0
- data/lib/rouge/demos/batchfile +3 -0
- data/lib/rouge/demos/bbcbasic +6 -0
- data/lib/rouge/demos/bpf +7 -0
- data/lib/rouge/demos/brainfuck +5 -0
- data/lib/rouge/demos/clean +6 -0
- data/lib/rouge/demos/cmhg +8 -0
- data/lib/rouge/demos/csvs +8 -0
- data/lib/rouge/demos/cuda +11 -0
- data/lib/rouge/demos/cypher +5 -0
- data/lib/rouge/demos/cython +6 -0
- data/lib/rouge/demos/datastudio +21 -0
- data/lib/rouge/demos/ecl +18 -0
- data/lib/rouge/demos/eex +1 -0
- data/lib/rouge/demos/epp +4 -0
- data/lib/rouge/demos/escape +3 -0
- data/lib/rouge/demos/freefem +16 -0
- data/lib/rouge/demos/gdscript +18 -0
- data/lib/rouge/demos/ghc-cmm +23 -0
- data/lib/rouge/demos/ghc-core +26 -0
- data/lib/rouge/demos/haxe +5 -0
- data/lib/rouge/demos/hocon +8 -0
- data/lib/rouge/demos/hql +5 -0
- data/lib/rouge/demos/isbl +4 -0
- data/lib/rouge/demos/jsl +3 -0
- data/lib/rouge/demos/jsp +29 -0
- data/lib/rouge/demos/liquid +0 -1
- data/lib/rouge/demos/lustre +6 -0
- data/lib/rouge/demos/lutin +18 -0
- data/lib/rouge/demos/m68k +16 -0
- data/lib/rouge/demos/magik +6 -0
- data/lib/rouge/demos/mason +22 -0
- data/lib/rouge/demos/mathematica +8 -0
- data/lib/rouge/demos/minizinc +23 -0
- data/lib/rouge/demos/msgtrans +4 -0
- data/lib/rouge/demos/nasm +6 -6
- data/lib/rouge/demos/nesasm +11 -0
- data/lib/rouge/demos/objective_cpp +17 -0
- data/lib/rouge/demos/openedge +4 -0
- data/lib/rouge/demos/opentype_feature_file +6 -0
- data/lib/rouge/demos/plist +1 -132
- data/lib/rouge/demos/powershell +12 -48
- data/lib/rouge/demos/q +6 -0
- data/lib/rouge/demos/reasonml +12 -0
- data/lib/rouge/demos/rego +8 -0
- data/lib/rouge/demos/robot_framework +27 -0
- data/lib/rouge/demos/sas +13 -0
- data/lib/rouge/demos/slice +10 -0
- data/lib/rouge/demos/solidity +13 -0
- data/lib/rouge/demos/sparql +6 -0
- data/lib/rouge/demos/sqf +14 -0
- data/lib/rouge/demos/supercollider +11 -0
- data/lib/rouge/demos/terraform +0 -15
- data/lib/rouge/demos/ttcn3 +6 -0
- data/lib/rouge/demos/vcl +12 -0
- data/lib/rouge/demos/xojo +14 -0
- data/lib/rouge/demos/xpath +2 -0
- data/lib/rouge/demos/xquery +22 -0
- data/lib/rouge/demos/yang +17 -0
- data/lib/rouge/formatter.rb +39 -2
- data/lib/rouge/formatters/html.rb +21 -2
- data/lib/rouge/formatters/html_inline.rb +1 -0
- data/lib/rouge/formatters/html_legacy.rb +1 -0
- data/lib/rouge/formatters/html_line_table.rb +53 -0
- data/lib/rouge/formatters/html_linewise.rb +7 -11
- data/lib/rouge/formatters/html_pygments.rb +2 -0
- data/lib/rouge/formatters/html_table.rb +21 -31
- data/lib/rouge/formatters/null.rb +1 -0
- data/lib/rouge/formatters/terminal256.rb +23 -5
- data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
- data/lib/rouge/formatters/tex.rb +92 -0
- data/lib/rouge/guesser.rb +2 -0
- data/lib/rouge/guessers/disambiguation.rb +35 -0
- data/lib/rouge/guessers/filename.rb +2 -0
- data/lib/rouge/guessers/glob_mapping.rb +3 -1
- data/lib/rouge/guessers/mimetype.rb +2 -0
- data/lib/rouge/guessers/modeline.rb +3 -1
- data/lib/rouge/guessers/source.rb +3 -1
- data/lib/rouge/guessers/util.rb +2 -0
- data/lib/rouge/lexer.rb +71 -15
- data/lib/rouge/lexers/abap.rb +13 -11
- data/lib/rouge/lexers/actionscript.rb +35 -34
- data/lib/rouge/lexers/ada.rb +162 -0
- data/lib/rouge/lexers/apache.rb +13 -15
- data/lib/rouge/lexers/apache/keywords.rb +15 -0
- data/lib/rouge/lexers/apex.rb +126 -0
- data/lib/rouge/lexers/apiblueprint.rb +2 -0
- data/lib/rouge/lexers/apple_script.rb +17 -14
- data/lib/rouge/lexers/armasm.rb +145 -0
- data/lib/rouge/lexers/awk.rb +26 -25
- data/lib/rouge/lexers/batchfile.rb +164 -0
- data/lib/rouge/lexers/bbcbasic.rb +112 -0
- data/lib/rouge/lexers/biml.rb +6 -4
- data/lib/rouge/lexers/bpf.rb +118 -0
- data/lib/rouge/lexers/brainfuck.rb +53 -0
- data/lib/rouge/lexers/bsl.rb +13 -12
- data/lib/rouge/lexers/c.rb +35 -57
- data/lib/rouge/lexers/ceylon.rb +7 -34
- data/lib/rouge/lexers/cfscript.rb +27 -26
- data/lib/rouge/lexers/clean.rb +156 -0
- data/lib/rouge/lexers/clojure.rb +15 -14
- data/lib/rouge/lexers/cmake.rb +16 -14
- data/lib/rouge/lexers/cmhg.rb +34 -0
- data/lib/rouge/lexers/coffeescript.rb +90 -49
- data/lib/rouge/lexers/common_lisp.rb +39 -38
- data/lib/rouge/lexers/conf.rb +7 -6
- data/lib/rouge/lexers/console.rb +92 -38
- data/lib/rouge/lexers/coq.rb +27 -23
- data/lib/rouge/lexers/cpp.rb +24 -13
- data/lib/rouge/lexers/crystal.rb +71 -70
- data/lib/rouge/lexers/csharp.rb +29 -29
- data/lib/rouge/lexers/css.rb +24 -23
- data/lib/rouge/lexers/csvs.rb +44 -0
- data/lib/rouge/lexers/cuda.rb +35 -0
- data/lib/rouge/lexers/cypher.rb +108 -0
- data/lib/rouge/lexers/cython.rb +151 -0
- data/lib/rouge/lexers/d.rb +64 -63
- data/lib/rouge/lexers/dart.rb +34 -33
- data/lib/rouge/lexers/datastudio.rb +138 -0
- data/lib/rouge/lexers/diff.rb +10 -4
- data/lib/rouge/lexers/digdag.rb +3 -1
- data/lib/rouge/lexers/docker.rb +12 -11
- data/lib/rouge/lexers/dot.rb +19 -18
- data/lib/rouge/lexers/ecl.rb +175 -0
- data/lib/rouge/lexers/eex.rb +52 -0
- data/lib/rouge/lexers/eiffel.rb +21 -20
- data/lib/rouge/lexers/elixir.rb +52 -36
- data/lib/rouge/lexers/elm.rb +30 -29
- data/lib/rouge/lexers/epp.rb +51 -0
- data/lib/rouge/lexers/erb.rb +5 -4
- data/lib/rouge/lexers/erlang.rb +1 -0
- data/lib/rouge/lexers/escape.rb +58 -0
- data/lib/rouge/lexers/factor.rb +41 -40
- data/lib/rouge/lexers/fortran.rb +34 -32
- data/lib/rouge/lexers/freefem.rb +240 -0
- data/lib/rouge/lexers/fsharp.rb +33 -31
- data/lib/rouge/lexers/gdscript.rb +171 -0
- data/lib/rouge/lexers/ghc_cmm.rb +340 -0
- data/lib/rouge/lexers/ghc_core.rb +151 -0
- data/lib/rouge/lexers/gherkin.rb +17 -14
- data/lib/rouge/lexers/gherkin/keywords.rb +2 -0
- data/lib/rouge/lexers/glsl.rb +2 -5
- data/lib/rouge/lexers/go.rb +3 -2
- data/lib/rouge/lexers/gradle.rb +1 -0
- data/lib/rouge/lexers/graphql.rb +78 -60
- data/lib/rouge/lexers/groovy.rb +24 -25
- data/lib/rouge/lexers/hack.rb +2 -1
- data/lib/rouge/lexers/haml.rb +26 -29
- data/lib/rouge/lexers/handlebars.rb +32 -20
- data/lib/rouge/lexers/haskell.rb +67 -65
- data/lib/rouge/lexers/haxe.rb +246 -0
- data/lib/rouge/lexers/hcl.rb +26 -25
- data/lib/rouge/lexers/hocon.rb +86 -0
- data/lib/rouge/lexers/hql.rb +139 -0
- data/lib/rouge/lexers/html.rb +33 -31
- data/lib/rouge/lexers/http.rb +10 -9
- data/lib/rouge/lexers/hylang.rb +15 -14
- data/lib/rouge/lexers/idlang.rb +34 -32
- data/lib/rouge/lexers/igorpro.rb +32 -31
- data/lib/rouge/lexers/ini.rb +13 -12
- data/lib/rouge/lexers/io.rb +10 -9
- data/lib/rouge/lexers/irb.rb +6 -5
- data/lib/rouge/lexers/isbl.rb +97 -0
- data/lib/rouge/lexers/isbl/builtins.rb +17 -0
- data/lib/rouge/lexers/java.rb +29 -25
- data/lib/rouge/lexers/javascript.rb +58 -61
- data/lib/rouge/lexers/jinja.rb +39 -22
- data/lib/rouge/lexers/jsl.rb +55 -0
- data/lib/rouge/lexers/json.rb +54 -11
- data/lib/rouge/lexers/json_doc.rb +8 -5
- data/lib/rouge/lexers/jsonnet.rb +19 -18
- data/lib/rouge/lexers/jsp.rb +120 -0
- data/lib/rouge/lexers/jsx.rb +18 -16
- data/lib/rouge/lexers/julia.rb +182 -58
- data/lib/rouge/lexers/kotlin.rb +78 -26
- data/lib/rouge/lexers/lasso.rb +54 -58
- data/lib/rouge/lexers/lasso/keywords.rb +14 -0
- data/lib/rouge/lexers/liquid.rb +116 -118
- data/lib/rouge/lexers/literate_coffeescript.rb +3 -2
- data/lib/rouge/lexers/literate_haskell.rb +6 -5
- data/lib/rouge/lexers/llvm.rb +66 -49
- data/lib/rouge/lexers/lua.rb +43 -4
- data/lib/rouge/lexers/lua/builtins.rb +2 -0
- data/lib/rouge/lexers/lustre.rb +79 -0
- data/lib/rouge/lexers/lutin.rb +33 -0
- data/lib/rouge/lexers/m68k.rb +143 -0
- data/lib/rouge/lexers/magik.rb +127 -0
- data/lib/rouge/lexers/make.rb +57 -34
- data/lib/rouge/lexers/markdown.rb +67 -39
- data/lib/rouge/lexers/mason.rb +110 -0
- data/lib/rouge/lexers/mathematica.rb +96 -0
- data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
- data/lib/rouge/lexers/matlab.rb +26 -17
- data/lib/rouge/lexers/matlab/builtins.rb +4 -4
- data/lib/rouge/lexers/minizinc.rb +87 -0
- data/lib/rouge/lexers/moonscript.rb +4 -3
- data/lib/rouge/lexers/mosel.rb +64 -63
- data/lib/rouge/lexers/msgtrans.rb +26 -0
- data/lib/rouge/lexers/mxml.rb +19 -18
- data/lib/rouge/lexers/nasm.rb +43 -169
- data/lib/rouge/lexers/nesasm.rb +78 -0
- data/lib/rouge/lexers/nginx.rb +15 -14
- data/lib/rouge/lexers/nim.rb +4 -2
- data/lib/rouge/lexers/nix.rb +44 -43
- data/lib/rouge/lexers/objective_c.rb +5 -178
- data/lib/rouge/lexers/objective_c/common.rb +184 -0
- data/lib/rouge/lexers/objective_cpp.rb +31 -0
- data/lib/rouge/lexers/ocaml.rb +29 -64
- data/lib/rouge/lexers/ocaml/common.rb +53 -0
- data/lib/rouge/lexers/openedge.rb +429 -0
- data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
- data/lib/rouge/lexers/pascal.rb +6 -5
- data/lib/rouge/lexers/perl.rb +102 -67
- data/lib/rouge/lexers/php.rb +91 -53
- data/lib/rouge/lexers/php/builtins.rb +183 -174
- data/lib/rouge/lexers/plain_text.rb +2 -1
- data/lib/rouge/lexers/plist.rb +16 -14
- data/lib/rouge/lexers/pony.rb +21 -20
- data/lib/rouge/lexers/powershell.rb +190 -638
- data/lib/rouge/lexers/praat.rb +76 -75
- data/lib/rouge/lexers/prolog.rb +27 -19
- data/lib/rouge/lexers/prometheus.rb +32 -30
- data/lib/rouge/lexers/properties.rb +13 -12
- data/lib/rouge/lexers/protobuf.rb +23 -22
- data/lib/rouge/lexers/puppet.rb +33 -32
- data/lib/rouge/lexers/python.rb +124 -99
- data/lib/rouge/lexers/q.rb +17 -14
- data/lib/rouge/lexers/qml.rb +13 -12
- data/lib/rouge/lexers/r.rb +13 -13
- data/lib/rouge/lexers/racket.rb +47 -22
- data/lib/rouge/lexers/reasonml.rb +65 -0
- data/lib/rouge/lexers/rego.rb +45 -0
- data/lib/rouge/lexers/robot_framework.rb +249 -0
- data/lib/rouge/lexers/ruby.rb +88 -71
- data/lib/rouge/lexers/rust.rb +45 -44
- data/lib/rouge/lexers/sas.rb +563 -0
- data/lib/rouge/lexers/sass.rb +9 -8
- data/lib/rouge/lexers/sass/common.rb +41 -40
- data/lib/rouge/lexers/scala.rb +67 -40
- data/lib/rouge/lexers/scheme.rb +19 -18
- data/lib/rouge/lexers/scss.rb +4 -3
- data/lib/rouge/lexers/sed.rb +31 -30
- data/lib/rouge/lexers/shell.rb +67 -55
- data/lib/rouge/lexers/sieve.rb +10 -9
- data/lib/rouge/lexers/slice.rb +32 -0
- data/lib/rouge/lexers/slim.rb +27 -26
- data/lib/rouge/lexers/smalltalk.rb +34 -33
- data/lib/rouge/lexers/smarty.rb +20 -19
- data/lib/rouge/lexers/sml.rb +68 -67
- data/lib/rouge/lexers/solidity.rb +185 -0
- data/lib/rouge/lexers/sparql.rb +129 -0
- data/lib/rouge/lexers/sqf.rb +109 -0
- data/lib/rouge/lexers/sqf/commands.rb +15 -0
- data/lib/rouge/lexers/sql.rb +47 -26
- data/lib/rouge/lexers/supercollider.rb +116 -0
- data/lib/rouge/lexers/swift.rb +49 -44
- data/lib/rouge/lexers/tap.rb +22 -20
- data/lib/rouge/lexers/tcl.rb +28 -27
- data/lib/rouge/lexers/terraform.rb +37 -13
- data/lib/rouge/lexers/tex.rb +20 -19
- data/lib/rouge/lexers/toml.rb +59 -20
- data/lib/rouge/lexers/tsx.rb +1 -0
- data/lib/rouge/lexers/ttcn3.rb +119 -0
- data/lib/rouge/lexers/tulip.rb +38 -36
- data/lib/rouge/lexers/turtle.rb +36 -38
- data/lib/rouge/lexers/twig.rb +1 -0
- data/lib/rouge/lexers/typescript.rb +12 -0
- data/lib/rouge/lexers/typescript/common.rb +1 -0
- data/lib/rouge/lexers/vala.rb +19 -18
- data/lib/rouge/lexers/varnish.rb +168 -0
- data/lib/rouge/lexers/vb.rb +28 -27
- data/lib/rouge/lexers/verilog.rb +27 -28
- data/lib/rouge/lexers/vhdl.rb +12 -11
- data/lib/rouge/lexers/viml.rb +15 -14
- data/lib/rouge/lexers/viml/keywords.rb +2 -0
- data/lib/rouge/lexers/vue.rb +15 -10
- data/lib/rouge/lexers/wollok.rb +27 -26
- data/lib/rouge/lexers/xml.rb +18 -21
- data/lib/rouge/lexers/xojo.rb +61 -0
- data/lib/rouge/lexers/xpath.rb +332 -0
- data/lib/rouge/lexers/xquery.rb +145 -0
- data/lib/rouge/lexers/yaml.rb +64 -61
- data/lib/rouge/lexers/yang.rb +147 -0
- data/lib/rouge/plugins/redcarpet.rb +9 -2
- data/lib/rouge/regex_lexer.rb +27 -25
- data/lib/rouge/template_lexer.rb +1 -0
- data/lib/rouge/tex_theme_renderer.rb +132 -0
- data/lib/rouge/text_analyzer.rb +1 -0
- data/lib/rouge/theme.rb +5 -0
- data/lib/rouge/themes/base16.rb +1 -0
- data/lib/rouge/themes/bw.rb +41 -0
- data/lib/rouge/themes/colorful.rb +1 -0
- data/lib/rouge/themes/github.rb +1 -0
- data/lib/rouge/themes/gruvbox.rb +1 -0
- data/lib/rouge/themes/igor_pro.rb +1 -0
- data/lib/rouge/themes/magritte.rb +78 -0
- data/lib/rouge/themes/molokai.rb +1 -0
- data/lib/rouge/themes/monokai.rb +1 -0
- data/lib/rouge/themes/monokai_sublime.rb +4 -1
- data/lib/rouge/themes/pastie.rb +2 -1
- data/lib/rouge/themes/thankful_eyes.rb +2 -1
- data/lib/rouge/themes/tulip.rb +2 -1
- data/lib/rouge/token.rb +31 -22
- data/lib/rouge/util.rb +3 -2
- data/lib/rouge/version.rb +2 -1
- data/rouge.gemspec +6 -3
- metadata +130 -8
- data/lib/rouge/lexers/apache/keywords.yml +0 -764
- data/lib/rouge/lexers/lasso/keywords.yml +0 -446
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
declare namespace html = "http://www.w3.org/1999/xhtml";
|
|
2
|
+
|
|
3
|
+
declare function local:test-function($catalog as document-node()) {
|
|
4
|
+
<html>
|
|
5
|
+
<head>
|
|
6
|
+
<title>XQuery example for the Rouge highlighter</title>
|
|
7
|
+
<link href="style.css"/>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<h1>List</h1>
|
|
11
|
+
<ul>
|
|
12
|
+
{for $product in $catalog/items/product[@sell-by > current-date()] return
|
|
13
|
+
<li>
|
|
14
|
+
<ul>
|
|
15
|
+
<li>{data($product/name)}</li>
|
|
16
|
+
<li>{$product/price * (1 + $product/tax)}$</li>
|
|
17
|
+
</ul>
|
|
18
|
+
</li>}
|
|
19
|
+
</ul>
|
|
20
|
+
</body>
|
|
21
|
+
</html>
|
|
22
|
+
};
|
data/lib/rouge/formatter.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Rouge
|
|
4
5
|
# A Formatter takes a token stream and formats it for human viewing.
|
|
@@ -20,6 +21,26 @@ module Rouge
|
|
|
20
21
|
REGISTRY[tag]
|
|
21
22
|
end
|
|
22
23
|
|
|
24
|
+
def self.with_escape
|
|
25
|
+
Thread.current[:'rouge/with-escape'] = true
|
|
26
|
+
yield
|
|
27
|
+
ensure
|
|
28
|
+
Thread.current[:'rouge/with-escape'] = false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.escape_enabled?
|
|
32
|
+
!!(((defined? @escape_enabled) && @escape_enabled) || Thread.current[:'rouge/with-escape'])
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.enable_escape!
|
|
36
|
+
@escape_enabled = true
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.disable_escape!
|
|
40
|
+
@escape_enabled = false
|
|
41
|
+
Thread.current[:'rouge/with-escape'] = false
|
|
42
|
+
end
|
|
43
|
+
|
|
23
44
|
# Format a token stream. Delegates to {#format}.
|
|
24
45
|
def self.format(tokens, *a, &b)
|
|
25
46
|
new(*a).format(tokens, &b)
|
|
@@ -29,11 +50,27 @@ module Rouge
|
|
|
29
50
|
# pass
|
|
30
51
|
end
|
|
31
52
|
|
|
53
|
+
def escape?(tok)
|
|
54
|
+
tok == Token::Tokens::Escape
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def filter_escapes(tokens)
|
|
58
|
+
tokens.each do |t, v|
|
|
59
|
+
if t == Token::Tokens::Escape
|
|
60
|
+
yield Token::Tokens::Error, v
|
|
61
|
+
else
|
|
62
|
+
yield t, v
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
32
67
|
# Format a token stream.
|
|
33
68
|
def format(tokens, &b)
|
|
69
|
+
tokens = enum_for(:filter_escapes, tokens) unless Formatter.escape_enabled?
|
|
70
|
+
|
|
34
71
|
return stream(tokens, &b) if block_given?
|
|
35
72
|
|
|
36
|
-
out = ''
|
|
73
|
+
out = String.new('')
|
|
37
74
|
stream(tokens) { |piece| out << piece }
|
|
38
75
|
|
|
39
76
|
out
|
|
@@ -57,7 +94,7 @@ module Rouge
|
|
|
57
94
|
|
|
58
95
|
out = []
|
|
59
96
|
tokens.each do |tok, val|
|
|
60
|
-
val.scan /\n|[^\n]+/ do |s|
|
|
97
|
+
val.scan %r/\n|[^\n]+/ do |s|
|
|
61
98
|
if s == "\n"
|
|
62
99
|
yield out
|
|
63
100
|
out = []
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Rouge
|
|
4
5
|
module Formatters
|
|
@@ -12,7 +13,9 @@ module Rouge
|
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
def span(tok, val)
|
|
15
|
-
|
|
16
|
+
return val if escape?(tok)
|
|
17
|
+
|
|
18
|
+
safe_span(tok, escape_special_html_chars(val))
|
|
16
19
|
end
|
|
17
20
|
|
|
18
21
|
def safe_span(tok, safe_val)
|
|
@@ -26,12 +29,28 @@ module Rouge
|
|
|
26
29
|
end
|
|
27
30
|
end
|
|
28
31
|
|
|
29
|
-
|
|
30
32
|
TABLE_FOR_ESCAPE_HTML = {
|
|
31
33
|
'&' => '&',
|
|
32
34
|
'<' => '<',
|
|
33
35
|
'>' => '>',
|
|
34
36
|
}
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
# A performance-oriented helper method to escape `&`, `<` and `>` for the rendered
|
|
40
|
+
# HTML from this formatter.
|
|
41
|
+
#
|
|
42
|
+
# `String#gsub` will always return a new string instance irrespective of whether
|
|
43
|
+
# a substitution occurs. This method however invokes `String#gsub` only if
|
|
44
|
+
# a substitution is imminent.
|
|
45
|
+
#
|
|
46
|
+
# Returns either the given `value` argument string as is or a new string with the
|
|
47
|
+
# special characters replaced with their escaped counterparts.
|
|
48
|
+
def escape_special_html_chars(value)
|
|
49
|
+
escape_regex = /[&<>]/
|
|
50
|
+
return value unless value =~ escape_regex
|
|
51
|
+
|
|
52
|
+
value.gsub(escape_regex, TABLE_FOR_ESCAPE_HTML)
|
|
53
|
+
end
|
|
35
54
|
end
|
|
36
55
|
end
|
|
37
56
|
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Rouge
|
|
5
|
+
module Formatters
|
|
6
|
+
class HTMLLineTable < Formatter
|
|
7
|
+
tag 'html_line_table'
|
|
8
|
+
|
|
9
|
+
# @param [Rouge::Formatters::Formatter] formatter An instance of a
|
|
10
|
+
# `Rouge::Formatters::HTML` or `Rouge::Formatters::HTMLInline`
|
|
11
|
+
# @param [Hash] opts options for HTMLLineTable instance.
|
|
12
|
+
# @option opts [Integer] :start_line line number to start from. Defaults to `1`.
|
|
13
|
+
# @option opts [String] :table_class Class name for the table.
|
|
14
|
+
# Defaults to `"rouge-line-table"`.
|
|
15
|
+
# @option opts [String] :line_id a `sprintf` template for generating an `id`
|
|
16
|
+
# attribute for each table row corresponding to current line number.
|
|
17
|
+
# Defaults to `"line-%i"`.
|
|
18
|
+
# @option opts [String] :line_class Class name for each table row.
|
|
19
|
+
# Defaults to `"lineno"`.
|
|
20
|
+
# @option opts [String] :gutter_class Class name for rendered line-number cell.
|
|
21
|
+
# Defaults to `"rouge-gutter"`.
|
|
22
|
+
# @option opts [String] :code_class Class name for rendered code cell.
|
|
23
|
+
# Defaults to `"rouge-code"`.
|
|
24
|
+
def initialize(formatter, opts={})
|
|
25
|
+
@formatter = formatter
|
|
26
|
+
@start_line = opts.fetch :start_line, 1
|
|
27
|
+
@table_class = opts.fetch :table_class, 'rouge-line-table'
|
|
28
|
+
@gutter_class = opts.fetch :gutter_class, 'rouge-gutter'
|
|
29
|
+
@code_class = opts.fetch :code_class, 'rouge-code'
|
|
30
|
+
@line_class = opts.fetch :line_class, 'lineno'
|
|
31
|
+
@line_id = opts.fetch :line_id, 'line-%i'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def stream(tokens, &b)
|
|
35
|
+
lineno = @start_line - 1
|
|
36
|
+
buffer = [%(<table class="#@table_class"><tbody>)]
|
|
37
|
+
token_lines(tokens) do |line_tokens|
|
|
38
|
+
lineno += 1
|
|
39
|
+
buffer << %(<tr id="#{sprintf @line_id, lineno}" class="#@line_class">)
|
|
40
|
+
buffer << %(<td class="#@gutter_class gl" )
|
|
41
|
+
buffer << %(style="-moz-user-select: none;-ms-user-select: none;)
|
|
42
|
+
buffer << %(-webkit-user-select: none;user-select: none;">)
|
|
43
|
+
buffer << %(<pre>#{lineno}</pre></td>)
|
|
44
|
+
buffer << %(<td class="#@code_class"><pre>)
|
|
45
|
+
@formatter.stream(line_tokens) { |formatted| buffer << formatted }
|
|
46
|
+
buffer << "\n</pre></td></tr>"
|
|
47
|
+
end
|
|
48
|
+
buffer << %(</tbody></table>)
|
|
49
|
+
yield buffer.join
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -1,27 +1,23 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Rouge
|
|
4
5
|
module Formatters
|
|
5
6
|
class HTMLLinewise < Formatter
|
|
6
7
|
def initialize(formatter, opts={})
|
|
7
8
|
@formatter = formatter
|
|
9
|
+
@tag_name = opts.fetch(:tag_name, 'div')
|
|
8
10
|
@class_format = opts.fetch(:class, 'line-%i')
|
|
9
11
|
end
|
|
10
12
|
|
|
11
13
|
def stream(tokens, &b)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
yield '</div>'
|
|
14
|
+
lineno = 0
|
|
15
|
+
token_lines(tokens) do |line_tokens|
|
|
16
|
+
yield %(<#{@tag_name} class="#{sprintf @class_format, lineno += 1}">)
|
|
17
|
+
@formatter.stream(line_tokens) {|formatted| yield formatted }
|
|
18
|
+
yield %(\n</#{@tag_name}>)
|
|
18
19
|
end
|
|
19
20
|
end
|
|
20
|
-
|
|
21
|
-
def next_line_class
|
|
22
|
-
@lineno ||= 0
|
|
23
|
-
sprintf(@class_format, @lineno += 1).inspect
|
|
24
|
-
end
|
|
25
21
|
end
|
|
26
22
|
end
|
|
27
23
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Rouge
|
|
4
5
|
module Formatters
|
|
@@ -15,46 +16,35 @@ module Rouge
|
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def style(scope)
|
|
18
|
-
yield
|
|
19
|
-
yield
|
|
19
|
+
yield %(#{scope} .rouge-table { border-spacing: 0 })
|
|
20
|
+
yield %(#{scope} .rouge-gutter { text-align: right })
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
def stream(tokens, &b)
|
|
23
|
-
|
|
24
|
-
last_val =
|
|
25
|
-
formatted =
|
|
26
|
-
|
|
27
|
-
tokens.each do |tok, val|
|
|
28
|
-
last_val = val
|
|
29
|
-
num_lines += val.scan(/\n/).size
|
|
30
|
-
formatted << @inner.span(tok, val)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# add an extra line for non-newline-terminated strings
|
|
34
|
-
if last_val[-1] != "\n"
|
|
24
|
+
last_val = nil
|
|
25
|
+
num_lines = tokens.reduce(0) {|count, (_, val)| count + (last_val = val).count(?\n) }
|
|
26
|
+
formatted = @inner.format(tokens)
|
|
27
|
+
unless last_val && last_val.end_with?(?\n)
|
|
35
28
|
num_lines += 1
|
|
36
|
-
|
|
29
|
+
formatted << ?\n
|
|
37
30
|
end
|
|
38
31
|
|
|
39
32
|
# generate a string of newline-separated line numbers for the gutter>
|
|
40
|
-
formatted_line_numbers = (@start_line..num_lines
|
|
41
|
-
sprintf(
|
|
42
|
-
end.join(
|
|
43
|
-
|
|
44
|
-
numbers = %(<pre class="lineno">#{formatted_line_numbers}</pre>)
|
|
45
|
-
|
|
46
|
-
yield %(<table class="#@table_class"><tbody><tr>)
|
|
33
|
+
formatted_line_numbers = (@start_line..(@start_line + num_lines - 1)).map do |i|
|
|
34
|
+
sprintf(@line_format, i)
|
|
35
|
+
end.join(?\n) << ?\n
|
|
47
36
|
|
|
37
|
+
buffer = [%(<table class="#@table_class"><tbody><tr>)]
|
|
48
38
|
# the "gl" class applies the style for Generic.Lineno
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
yield
|
|
39
|
+
buffer << %(<td class="#@gutter_class gl">)
|
|
40
|
+
buffer << %(<pre class="lineno">#{formatted_line_numbers}</pre>)
|
|
41
|
+
buffer << '</td>'
|
|
42
|
+
buffer << %(<td class="#@code_class"><pre>)
|
|
43
|
+
buffer << formatted
|
|
44
|
+
buffer << '</pre></td>'
|
|
45
|
+
buffer << '</tr></tbody></table>'
|
|
46
|
+
|
|
47
|
+
yield buffer.join
|
|
58
48
|
end
|
|
59
49
|
end
|
|
60
50
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Rouge
|
|
4
5
|
module Formatters
|
|
@@ -23,10 +24,7 @@ module Rouge
|
|
|
23
24
|
|
|
24
25
|
def stream(tokens, &b)
|
|
25
26
|
tokens.each do |tok, val|
|
|
26
|
-
|
|
27
|
-
yield escape.style_string
|
|
28
|
-
yield val.gsub("\n", "#{escape.reset_string}\n#{escape.style_string}")
|
|
29
|
-
yield escape.reset_string
|
|
27
|
+
escape_sequence(tok).stream_value(val, &b)
|
|
30
28
|
end
|
|
31
29
|
end
|
|
32
30
|
|
|
@@ -84,6 +82,14 @@ module Rouge
|
|
|
84
82
|
@bg = style.bg && self.class.color_index(style.bg)
|
|
85
83
|
end
|
|
86
84
|
|
|
85
|
+
|
|
86
|
+
def stream_value(val, &b)
|
|
87
|
+
yield style_string
|
|
88
|
+
yield val.gsub("\e", "\\e")
|
|
89
|
+
.gsub("\n", "#{reset_string}\n#{style_string}")
|
|
90
|
+
yield reset_string
|
|
91
|
+
end
|
|
92
|
+
|
|
87
93
|
def style_string
|
|
88
94
|
@style_string ||= begin
|
|
89
95
|
attrs = []
|
|
@@ -156,11 +162,23 @@ module Rouge
|
|
|
156
162
|
end
|
|
157
163
|
end
|
|
158
164
|
|
|
165
|
+
class Unescape < EscapeSequence
|
|
166
|
+
def initialize(*) end
|
|
167
|
+
def style_string(*) '' end
|
|
168
|
+
def reset_string(*) '' end
|
|
169
|
+
def stream_value(val) yield val end
|
|
170
|
+
end
|
|
171
|
+
|
|
159
172
|
# private
|
|
160
173
|
def escape_sequence(token)
|
|
174
|
+
return Unescape.new if escape?(token)
|
|
161
175
|
@escape_sequences ||= {}
|
|
162
176
|
@escape_sequences[token.qualname] ||=
|
|
163
|
-
|
|
177
|
+
make_escape_sequence(get_style(token))
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def make_escape_sequence(style)
|
|
181
|
+
EscapeSequence.new(style)
|
|
164
182
|
end
|
|
165
183
|
|
|
166
184
|
def get_style(token)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
module Rouge
|
|
4
|
+
module Formatters
|
|
5
|
+
class TerminalTruecolor < Terminal256
|
|
6
|
+
tag 'terminal_truecolor'
|
|
7
|
+
|
|
8
|
+
class TruecolorEscapeSequence < Terminal256::EscapeSequence
|
|
9
|
+
def style_string
|
|
10
|
+
@style_string ||= begin
|
|
11
|
+
out = String.new('')
|
|
12
|
+
out << escape(['48', '2', *get_rgb(style.bg)]) if style.bg
|
|
13
|
+
out << escape(['38', '2', *get_rgb(style.fg)]) if style.fg
|
|
14
|
+
out << escape(['1']) if style[:bold] || style[:italic]
|
|
15
|
+
out
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def get_rgb(color)
|
|
20
|
+
color = $1 if color =~ /#(\h+)/
|
|
21
|
+
|
|
22
|
+
case color.size
|
|
23
|
+
when 3 then color.chars.map { |c| c.to_i(16) * 2 }
|
|
24
|
+
when 6 then color.scan(/../).map { |cc| cc.to_i(16) }
|
|
25
|
+
else
|
|
26
|
+
raise "invalid color: #{color.inspect}"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @override
|
|
32
|
+
def make_escape_sequence(style)
|
|
33
|
+
TruecolorEscapeSequence.new(style)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|