rouge_ecl 0.0.1
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 +7 -0
- data/Gemfile +26 -0
- data/LICENSE +186 -0
- data/bin/rougify +17 -0
- data/lib/rouge.rb +82 -0
- data/lib/rouge/cli.rb +429 -0
- data/lib/rouge/demos/abap +6 -0
- data/lib/rouge/demos/actionscript +4 -0
- data/lib/rouge/demos/apache +21 -0
- data/lib/rouge/demos/apiblueprint +33 -0
- data/lib/rouge/demos/applescript +2 -0
- data/lib/rouge/demos/awk +4 -0
- data/lib/rouge/demos/biml +38 -0
- data/lib/rouge/demos/bsl +7 -0
- data/lib/rouge/demos/c +8 -0
- data/lib/rouge/demos/ceylon +7 -0
- data/lib/rouge/demos/cfscript +18 -0
- data/lib/rouge/demos/clojure +5 -0
- data/lib/rouge/demos/cmake +7 -0
- data/lib/rouge/demos/coffeescript +5 -0
- data/lib/rouge/demos/common_lisp +1 -0
- data/lib/rouge/demos/conf +4 -0
- data/lib/rouge/demos/console +6 -0
- data/lib/rouge/demos/coq +13 -0
- data/lib/rouge/demos/cpp +8 -0
- data/lib/rouge/demos/csharp +5 -0
- data/lib/rouge/demos/css +4 -0
- data/lib/rouge/demos/d +16 -0
- data/lib/rouge/demos/dart +6 -0
- data/lib/rouge/demos/diff +7 -0
- data/lib/rouge/demos/digdag +19 -0
- data/lib/rouge/demos/docker +9 -0
- data/lib/rouge/demos/dot +5 -0
- data/lib/rouge/demos/ecl +1 -0
- data/lib/rouge/demos/eiffel +30 -0
- data/lib/rouge/demos/elixir +1 -0
- data/lib/rouge/demos/elm +4 -0
- data/lib/rouge/demos/erb +1 -0
- data/lib/rouge/demos/erlang +7 -0
- data/lib/rouge/demos/factor +5 -0
- data/lib/rouge/demos/fortran +22 -0
- data/lib/rouge/demos/fsharp +12 -0
- data/lib/rouge/demos/gherkin +17 -0
- data/lib/rouge/demos/glsl +14 -0
- data/lib/rouge/demos/go +7 -0
- data/lib/rouge/demos/gradle +10 -0
- data/lib/rouge/demos/graphql +17 -0
- data/lib/rouge/demos/groovy +9 -0
- data/lib/rouge/demos/hack +5 -0
- data/lib/rouge/demos/haml +5 -0
- data/lib/rouge/demos/handlebars +7 -0
- data/lib/rouge/demos/haskell +6 -0
- data/lib/rouge/demos/html +8 -0
- data/lib/rouge/demos/http +14 -0
- data/lib/rouge/demos/hylang +10 -0
- data/lib/rouge/demos/idlang +8 -0
- data/lib/rouge/demos/igorpro +9 -0
- data/lib/rouge/demos/ini +4 -0
- data/lib/rouge/demos/io +11 -0
- data/lib/rouge/demos/irb +4 -0
- data/lib/rouge/demos/irb_output +2 -0
- data/lib/rouge/demos/java +5 -0
- data/lib/rouge/demos/javascript +1 -0
- data/lib/rouge/demos/jinja +9 -0
- data/lib/rouge/demos/json +1 -0
- data/lib/rouge/demos/json-doc +1 -0
- data/lib/rouge/demos/jsonnet +28 -0
- data/lib/rouge/demos/jsx +17 -0
- data/lib/rouge/demos/julia +11 -0
- data/lib/rouge/demos/kotlin +3 -0
- data/lib/rouge/demos/lasso +12 -0
- data/lib/rouge/demos/liquid +11 -0
- data/lib/rouge/demos/literate_coffeescript +3 -0
- data/lib/rouge/demos/literate_haskell +7 -0
- data/lib/rouge/demos/llvm +20 -0
- data/lib/rouge/demos/lua +12 -0
- data/lib/rouge/demos/make +6 -0
- data/lib/rouge/demos/markdown +4 -0
- data/lib/rouge/demos/matlab +6 -0
- data/lib/rouge/demos/moonscript +16 -0
- data/lib/rouge/demos/mosel +10 -0
- data/lib/rouge/demos/mxml +22 -0
- data/lib/rouge/demos/nasm +26 -0
- data/lib/rouge/demos/nginx +5 -0
- data/lib/rouge/demos/nim +27 -0
- data/lib/rouge/demos/nix +19 -0
- data/lib/rouge/demos/objective_c +18 -0
- data/lib/rouge/demos/ocaml +12 -0
- data/lib/rouge/demos/pascal +14 -0
- data/lib/rouge/demos/perl +5 -0
- data/lib/rouge/demos/php +3 -0
- data/lib/rouge/demos/plaintext +1 -0
- data/lib/rouge/demos/plist +142 -0
- data/lib/rouge/demos/pony +17 -0
- data/lib/rouge/demos/powershell +49 -0
- data/lib/rouge/demos/praat +26 -0
- data/lib/rouge/demos/prolog +9 -0
- data/lib/rouge/demos/prometheus +9 -0
- data/lib/rouge/demos/properties +7 -0
- data/lib/rouge/demos/protobuf +5 -0
- data/lib/rouge/demos/puppet +6 -0
- data/lib/rouge/demos/python +6 -0
- data/lib/rouge/demos/q +2 -0
- data/lib/rouge/demos/qml +9 -0
- data/lib/rouge/demos/r +8 -0
- data/lib/rouge/demos/racket +24 -0
- data/lib/rouge/demos/ruby +9 -0
- data/lib/rouge/demos/rust +12 -0
- data/lib/rouge/demos/sass +3 -0
- data/lib/rouge/demos/scala +3 -0
- data/lib/rouge/demos/scheme +4 -0
- data/lib/rouge/demos/scss +5 -0
- data/lib/rouge/demos/sed +4 -0
- data/lib/rouge/demos/shell +2 -0
- data/lib/rouge/demos/sieve +10 -0
- data/lib/rouge/demos/slim +17 -0
- data/lib/rouge/demos/smalltalk +6 -0
- data/lib/rouge/demos/smarty +12 -0
- data/lib/rouge/demos/sml +4 -0
- data/lib/rouge/demos/sql +1 -0
- data/lib/rouge/demos/swift +5 -0
- data/lib/rouge/demos/tap +5 -0
- data/lib/rouge/demos/tcl +1 -0
- data/lib/rouge/demos/tex +1 -0
- data/lib/rouge/demos/toml +9 -0
- data/lib/rouge/demos/tsx +17 -0
- data/lib/rouge/demos/tulip +13 -0
- data/lib/rouge/demos/turtle +26 -0
- data/lib/rouge/demos/twig +9 -0
- data/lib/rouge/demos/typescript +1 -0
- data/lib/rouge/demos/vala +8 -0
- data/lib/rouge/demos/vb +4 -0
- data/lib/rouge/demos/verilog +27 -0
- data/lib/rouge/demos/vhdl +23 -0
- data/lib/rouge/demos/viml +14 -0
- data/lib/rouge/demos/vue +11 -0
- data/lib/rouge/demos/wollok +11 -0
- data/lib/rouge/demos/xml +2 -0
- data/lib/rouge/demos/yaml +4 -0
- data/lib/rouge/formatter.rb +75 -0
- data/lib/rouge/formatters/html.rb +37 -0
- data/lib/rouge/formatters/html_inline.rb +30 -0
- data/lib/rouge/formatters/html_legacy.rb +44 -0
- data/lib/rouge/formatters/html_linewise.rb +27 -0
- data/lib/rouge/formatters/html_pygments.rb +16 -0
- data/lib/rouge/formatters/html_table.rb +61 -0
- data/lib/rouge/formatters/null.rb +19 -0
- data/lib/rouge/formatters/terminal256.rb +180 -0
- data/lib/rouge/guesser.rb +55 -0
- data/lib/rouge/guessers/disambiguation.rb +101 -0
- data/lib/rouge/guessers/filename.rb +25 -0
- data/lib/rouge/guessers/glob_mapping.rb +43 -0
- data/lib/rouge/guessers/mimetype.rb +14 -0
- data/lib/rouge/guessers/modeline.rb +44 -0
- data/lib/rouge/guessers/source.rb +29 -0
- data/lib/rouge/guessers/util.rb +32 -0
- data/lib/rouge/lexer.rb +461 -0
- data/lib/rouge/lexers/abap.rb +238 -0
- data/lib/rouge/lexers/actionscript.rb +195 -0
- data/lib/rouge/lexers/apache.rb +71 -0
- data/lib/rouge/lexers/apache/keywords.yml +764 -0
- data/lib/rouge/lexers/apiblueprint.rb +47 -0
- data/lib/rouge/lexers/apple_script.rb +367 -0
- data/lib/rouge/lexers/awk.rb +161 -0
- data/lib/rouge/lexers/biml.rb +41 -0
- data/lib/rouge/lexers/bsl.rb +81 -0
- data/lib/rouge/lexers/c.rb +212 -0
- data/lib/rouge/lexers/ceylon.rb +123 -0
- data/lib/rouge/lexers/cfscript.rb +153 -0
- data/lib/rouge/lexers/clojure.rb +112 -0
- data/lib/rouge/lexers/cmake.rb +206 -0
- data/lib/rouge/lexers/coffeescript.rb +174 -0
- data/lib/rouge/lexers/common_lisp.rb +345 -0
- data/lib/rouge/lexers/conf.rb +24 -0
- data/lib/rouge/lexers/console.rb +136 -0
- data/lib/rouge/lexers/coq.rb +187 -0
- data/lib/rouge/lexers/cpp.rb +78 -0
- data/lib/rouge/lexers/csharp.rb +114 -0
- data/lib/rouge/lexers/css.rb +273 -0
- data/lib/rouge/lexers/d.rb +176 -0
- data/lib/rouge/lexers/dart.rb +104 -0
- data/lib/rouge/lexers/diff.rb +31 -0
- data/lib/rouge/lexers/digdag.rb +68 -0
- data/lib/rouge/lexers/docker.rb +50 -0
- data/lib/rouge/lexers/dot.rb +68 -0
- data/lib/rouge/lexers/ecl.rb +138 -0
- data/lib/rouge/lexers/eiffel.rb +65 -0
- data/lib/rouge/lexers/elixir.rb +133 -0
- data/lib/rouge/lexers/elm.rb +89 -0
- data/lib/rouge/lexers/erb.rb +52 -0
- data/lib/rouge/lexers/erlang.rb +114 -0
- data/lib/rouge/lexers/factor.rb +302 -0
- data/lib/rouge/lexers/fortran.rb +176 -0
- data/lib/rouge/lexers/fsharp.rb +118 -0
- data/lib/rouge/lexers/gherkin.rb +137 -0
- data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
- data/lib/rouge/lexers/glsl.rb +135 -0
- data/lib/rouge/lexers/go.rb +174 -0
- data/lib/rouge/lexers/gradle.rb +37 -0
- data/lib/rouge/lexers/graphql.rb +243 -0
- data/lib/rouge/lexers/groovy.rb +112 -0
- data/lib/rouge/lexers/hack.rb +48 -0
- data/lib/rouge/lexers/haml.rb +229 -0
- data/lib/rouge/lexers/handlebars.rb +79 -0
- data/lib/rouge/lexers/haskell.rb +182 -0
- data/lib/rouge/lexers/html.rb +139 -0
- data/lib/rouge/lexers/http.rb +80 -0
- data/lib/rouge/lexers/hylang.rb +93 -0
- data/lib/rouge/lexers/idlang.rb +310 -0
- data/lib/rouge/lexers/igorpro.rb +408 -0
- data/lib/rouge/lexers/ini.rb +53 -0
- data/lib/rouge/lexers/io.rb +68 -0
- data/lib/rouge/lexers/irb.rb +66 -0
- data/lib/rouge/lexers/java.rb +87 -0
- data/lib/rouge/lexers/javascript.rb +281 -0
- data/lib/rouge/lexers/jinja.rb +137 -0
- data/lib/rouge/lexers/json.rb +29 -0
- data/lib/rouge/lexers/json_doc.rb +23 -0
- data/lib/rouge/lexers/jsonnet.rb +151 -0
- data/lib/rouge/lexers/jsx.rb +102 -0
- data/lib/rouge/lexers/julia.rb +172 -0
- data/lib/rouge/lexers/kotlin.rb +79 -0
- data/lib/rouge/lexers/lasso.rb +214 -0
- data/lib/rouge/lexers/lasso/keywords.yml +446 -0
- data/lib/rouge/lexers/liquid.rb +287 -0
- data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
- data/lib/rouge/lexers/literate_haskell.rb +36 -0
- data/lib/rouge/lexers/llvm.rb +80 -0
- data/lib/rouge/lexers/lua.rb +125 -0
- data/lib/rouge/lexers/lua/builtins.rb +22 -0
- data/lib/rouge/lexers/make.rb +112 -0
- data/lib/rouge/lexers/markdown.rb +154 -0
- data/lib/rouge/lexers/matlab.rb +71 -0
- data/lib/rouge/lexers/matlab/builtins.rb +11 -0
- data/lib/rouge/lexers/moonscript.rb +114 -0
- data/lib/rouge/lexers/mosel.rb +231 -0
- data/lib/rouge/lexers/mxml.rb +68 -0
- data/lib/rouge/lexers/nasm.rb +198 -0
- data/lib/rouge/lexers/nginx.rb +71 -0
- data/lib/rouge/lexers/nim.rb +152 -0
- data/lib/rouge/lexers/nix.rb +205 -0
- data/lib/rouge/lexers/objective_c.rb +194 -0
- data/lib/rouge/lexers/ocaml.rb +100 -0
- data/lib/rouge/lexers/pascal.rb +66 -0
- data/lib/rouge/lexers/perl.rb +196 -0
- data/lib/rouge/lexers/php.rb +193 -0
- data/lib/rouge/lexers/php/builtins.rb +194 -0
- data/lib/rouge/lexers/plain_text.rb +26 -0
- data/lib/rouge/lexers/plist.rb +45 -0
- data/lib/rouge/lexers/pony.rb +93 -0
- data/lib/rouge/lexers/powershell.rb +678 -0
- data/lib/rouge/lexers/praat.rb +350 -0
- data/lib/rouge/lexers/prolog.rb +59 -0
- data/lib/rouge/lexers/prometheus.rb +121 -0
- data/lib/rouge/lexers/properties.rb +51 -0
- data/lib/rouge/lexers/protobuf.rb +70 -0
- data/lib/rouge/lexers/puppet.rb +128 -0
- data/lib/rouge/lexers/python.rb +232 -0
- data/lib/rouge/lexers/q.rb +123 -0
- data/lib/rouge/lexers/qml.rb +73 -0
- data/lib/rouge/lexers/r.rb +89 -0
- data/lib/rouge/lexers/racket.rb +543 -0
- data/lib/rouge/lexers/ruby.rb +437 -0
- data/lib/rouge/lexers/rust.rb +192 -0
- data/lib/rouge/lexers/sass.rb +74 -0
- data/lib/rouge/lexers/sass/common.rb +180 -0
- data/lib/rouge/lexers/scala.rb +142 -0
- data/lib/rouge/lexers/scheme.rb +112 -0
- data/lib/rouge/lexers/scss.rb +34 -0
- data/lib/rouge/lexers/sed.rb +172 -0
- data/lib/rouge/lexers/shell.rb +189 -0
- data/lib/rouge/lexers/sieve.rb +96 -0
- data/lib/rouge/lexers/slim.rb +228 -0
- data/lib/rouge/lexers/smalltalk.rb +116 -0
- data/lib/rouge/lexers/smarty.rb +80 -0
- data/lib/rouge/lexers/sml.rb +344 -0
- data/lib/rouge/lexers/sql.rb +140 -0
- data/lib/rouge/lexers/swift.rb +181 -0
- data/lib/rouge/lexers/tap.rb +87 -0
- data/lib/rouge/lexers/tcl.rb +192 -0
- data/lib/rouge/lexers/tex.rb +69 -0
- data/lib/rouge/lexers/toml.rb +67 -0
- data/lib/rouge/lexers/tsx.rb +19 -0
- data/lib/rouge/lexers/tulip.rb +106 -0
- data/lib/rouge/lexers/turtle.rb +63 -0
- data/lib/rouge/lexers/twig.rb +39 -0
- data/lib/rouge/lexers/typescript.rb +22 -0
- data/lib/rouge/lexers/typescript/common.rb +33 -0
- data/lib/rouge/lexers/vala.rb +77 -0
- data/lib/rouge/lexers/vb.rb +164 -0
- data/lib/rouge/lexers/verilog.rb +164 -0
- data/lib/rouge/lexers/vhdl.rb +97 -0
- data/lib/rouge/lexers/viml.rb +101 -0
- data/lib/rouge/lexers/viml/keywords.rb +12 -0
- data/lib/rouge/lexers/vue.rb +122 -0
- data/lib/rouge/lexers/wollok.rb +103 -0
- data/lib/rouge/lexers/xml.rb +57 -0
- data/lib/rouge/lexers/yaml.rb +373 -0
- data/lib/rouge/plugins/redcarpet.rb +30 -0
- data/lib/rouge/regex_lexer.rb +441 -0
- data/lib/rouge/template_lexer.rb +20 -0
- data/lib/rouge/text_analyzer.rb +49 -0
- data/lib/rouge/theme.rb +213 -0
- data/lib/rouge/themes/base16.rb +130 -0
- data/lib/rouge/themes/colorful.rb +67 -0
- data/lib/rouge/themes/github.rb +71 -0
- data/lib/rouge/themes/gruvbox.rb +167 -0
- data/lib/rouge/themes/igor_pro.rb +20 -0
- data/lib/rouge/themes/molokai.rb +82 -0
- data/lib/rouge/themes/monokai.rb +92 -0
- data/lib/rouge/themes/monokai_sublime.rb +90 -0
- data/lib/rouge/themes/pastie.rb +69 -0
- data/lib/rouge/themes/thankful_eyes.rb +74 -0
- data/lib/rouge/themes/tulip.rb +69 -0
- data/lib/rouge/token.rb +182 -0
- data/lib/rouge/util.rb +101 -0
- data/lib/rouge/version.rb +7 -0
- data/rouge.gemspec +23 -0
- metadata +365 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Formatters
|
|
5
|
+
class HTMLInline < HTML
|
|
6
|
+
tag 'html_inline'
|
|
7
|
+
|
|
8
|
+
def initialize(theme)
|
|
9
|
+
if theme.is_a?(Class) && theme < Rouge::Theme
|
|
10
|
+
@theme = theme.new
|
|
11
|
+
elsif theme.is_a?(Rouge::Theme)
|
|
12
|
+
@theme = theme
|
|
13
|
+
elsif theme.is_a?(String)
|
|
14
|
+
@theme = Rouge::Theme.find(theme).new
|
|
15
|
+
else
|
|
16
|
+
raise ArgumentError, "invalid theme: #{theme.inspect}"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def safe_span(tok, safe_val)
|
|
21
|
+
return safe_val if tok == Token::Tokens::Text
|
|
22
|
+
|
|
23
|
+
rules = @theme.style_for(tok).rendered_rules
|
|
24
|
+
|
|
25
|
+
"<span style=\"#{rules.to_a.join(';')}\">#{safe_val}</span>"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
|
|
3
|
+
# stdlib
|
|
4
|
+
require 'cgi'
|
|
5
|
+
|
|
6
|
+
module Rouge
|
|
7
|
+
module Formatters
|
|
8
|
+
# Transforms a token stream into HTML output.
|
|
9
|
+
class HTMLLegacy < Formatter
|
|
10
|
+
tag 'html_legacy'
|
|
11
|
+
|
|
12
|
+
# @option opts [String] :css_class ('highlight')
|
|
13
|
+
# @option opts [true/false] :line_numbers (false)
|
|
14
|
+
# @option opts [Rouge::CSSTheme] :inline_theme (nil)
|
|
15
|
+
# @option opts [true/false] :wrap (true)
|
|
16
|
+
#
|
|
17
|
+
# Initialize with options.
|
|
18
|
+
#
|
|
19
|
+
# If `:inline_theme` is given, then instead of rendering the
|
|
20
|
+
# tokens as <span> tags with CSS classes, the styles according to
|
|
21
|
+
# the given theme will be inlined in "style" attributes. This is
|
|
22
|
+
# useful for formats in which stylesheets are not available.
|
|
23
|
+
#
|
|
24
|
+
# Content will be wrapped in a tag (`div` if tableized, `pre` if
|
|
25
|
+
# not) with the given `:css_class` unless `:wrap` is set to `false`.
|
|
26
|
+
def initialize(opts={})
|
|
27
|
+
@formatter = opts[:inline_theme] ? HTMLInline.new(opts[:inline_theme])
|
|
28
|
+
: HTML.new
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@formatter = HTMLTable.new(@formatter, opts) if opts[:line_numbers]
|
|
32
|
+
|
|
33
|
+
if opts.fetch(:wrap, true)
|
|
34
|
+
@formatter = HTMLPygments.new(@formatter, opts.fetch(:css_class, 'codehilite'))
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @yield the html output.
|
|
39
|
+
def stream(tokens, &b)
|
|
40
|
+
@formatter.stream(tokens, &b)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Formatters
|
|
5
|
+
class HTMLLinewise < Formatter
|
|
6
|
+
def initialize(formatter, opts={})
|
|
7
|
+
@formatter = formatter
|
|
8
|
+
@class_format = opts.fetch(:class, 'line-%i')
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def stream(tokens, &b)
|
|
12
|
+
token_lines(tokens) do |line|
|
|
13
|
+
yield "<div class=#{next_line_class}>"
|
|
14
|
+
line.each do |tok, val|
|
|
15
|
+
yield @formatter.span(tok, val)
|
|
16
|
+
end
|
|
17
|
+
yield '</div>'
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def next_line_class
|
|
22
|
+
@lineno ||= 0
|
|
23
|
+
sprintf(@class_format, @lineno += 1).inspect
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Rouge
|
|
2
|
+
module Formatters
|
|
3
|
+
class HTMLPygments < Formatter
|
|
4
|
+
def initialize(inner, css_class='codehilite')
|
|
5
|
+
@inner = inner
|
|
6
|
+
@css_class = css_class
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def stream(tokens, &b)
|
|
10
|
+
yield %(<div class="highlight"><pre class="#{@css_class}"><code>)
|
|
11
|
+
@inner.stream(tokens, &b)
|
|
12
|
+
yield "</code></pre></div>"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Formatters
|
|
5
|
+
class HTMLTable < Formatter
|
|
6
|
+
tag 'html_table'
|
|
7
|
+
|
|
8
|
+
def initialize(inner, opts={})
|
|
9
|
+
@inner = inner
|
|
10
|
+
@start_line = opts.fetch(:start_line, 1)
|
|
11
|
+
@line_format = opts.fetch(:line_format, '%i')
|
|
12
|
+
@table_class = opts.fetch(:table_class, 'rouge-table')
|
|
13
|
+
@gutter_class = opts.fetch(:gutter_class, 'rouge-gutter')
|
|
14
|
+
@code_class = opts.fetch(:code_class, 'rouge-code')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def style(scope)
|
|
18
|
+
yield "#{scope} .rouge-table { border-spacing: 0 }"
|
|
19
|
+
yield "#{scope} .rouge-gutter { text-align: right }"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def stream(tokens, &b)
|
|
23
|
+
num_lines = 0
|
|
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"
|
|
35
|
+
num_lines += 1
|
|
36
|
+
@inner.span(Token::Tokens::Text::Whitespace, "\n") { |str| formatted << str }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# generate a string of newline-separated line numbers for the gutter>
|
|
40
|
+
formatted_line_numbers = (@start_line..num_lines+@start_line-1).map do |i|
|
|
41
|
+
sprintf("#{@line_format}", i) << "\n"
|
|
42
|
+
end.join('')
|
|
43
|
+
|
|
44
|
+
numbers = %(<pre class="lineno">#{formatted_line_numbers}</pre>)
|
|
45
|
+
|
|
46
|
+
yield %(<table class="#@table_class"><tbody><tr>)
|
|
47
|
+
|
|
48
|
+
# the "gl" class applies the style for Generic.Lineno
|
|
49
|
+
yield %(<td class="#@gutter_class gl">)
|
|
50
|
+
yield numbers
|
|
51
|
+
yield '</td>'
|
|
52
|
+
|
|
53
|
+
yield %(<td class="#@code_class"><pre>)
|
|
54
|
+
yield formatted
|
|
55
|
+
yield '</pre></td>'
|
|
56
|
+
|
|
57
|
+
yield "</tr></tbody></table>"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Formatters
|
|
5
|
+
# A formatter which renders nothing.
|
|
6
|
+
class Null < Formatter
|
|
7
|
+
tag 'null'
|
|
8
|
+
|
|
9
|
+
def initialize(*)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def stream(tokens, &b)
|
|
13
|
+
tokens.each do |tok, val|
|
|
14
|
+
yield "#{tok.qualname} #{val.inspect}\n"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Formatters
|
|
5
|
+
# A formatter for 256-color terminals
|
|
6
|
+
class Terminal256 < Formatter
|
|
7
|
+
tag 'terminal256'
|
|
8
|
+
|
|
9
|
+
# @private
|
|
10
|
+
attr_reader :theme
|
|
11
|
+
|
|
12
|
+
# @param [Hash,Rouge::Theme] theme
|
|
13
|
+
# the theme to render with.
|
|
14
|
+
def initialize(theme = Themes::ThankfulEyes.new)
|
|
15
|
+
if theme.is_a?(Rouge::Theme)
|
|
16
|
+
@theme = theme
|
|
17
|
+
elsif theme.is_a?(Hash)
|
|
18
|
+
@theme = theme[:theme] || Themes::ThankfulEyes.new
|
|
19
|
+
else
|
|
20
|
+
raise ArgumentError, "invalid theme: #{theme.inspect}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def stream(tokens, &b)
|
|
25
|
+
tokens.each do |tok, val|
|
|
26
|
+
escape = escape_sequence(tok)
|
|
27
|
+
yield escape.style_string
|
|
28
|
+
yield val.gsub("\n", "#{escape.reset_string}\n#{escape.style_string}")
|
|
29
|
+
yield escape.reset_string
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class EscapeSequence
|
|
34
|
+
attr_reader :style
|
|
35
|
+
def initialize(style)
|
|
36
|
+
@style = style
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.xterm_colors
|
|
40
|
+
@xterm_colors ||= [].tap do |out|
|
|
41
|
+
# colors 0..15: 16 basic colors
|
|
42
|
+
out << [0x00, 0x00, 0x00] # 0
|
|
43
|
+
out << [0xcd, 0x00, 0x00] # 1
|
|
44
|
+
out << [0x00, 0xcd, 0x00] # 2
|
|
45
|
+
out << [0xcd, 0xcd, 0x00] # 3
|
|
46
|
+
out << [0x00, 0x00, 0xee] # 4
|
|
47
|
+
out << [0xcd, 0x00, 0xcd] # 5
|
|
48
|
+
out << [0x00, 0xcd, 0xcd] # 6
|
|
49
|
+
out << [0xe5, 0xe5, 0xe5] # 7
|
|
50
|
+
out << [0x7f, 0x7f, 0x7f] # 8
|
|
51
|
+
out << [0xff, 0x00, 0x00] # 9
|
|
52
|
+
out << [0x00, 0xff, 0x00] # 10
|
|
53
|
+
out << [0xff, 0xff, 0x00] # 11
|
|
54
|
+
out << [0x5c, 0x5c, 0xff] # 12
|
|
55
|
+
out << [0xff, 0x00, 0xff] # 13
|
|
56
|
+
out << [0x00, 0xff, 0xff] # 14
|
|
57
|
+
out << [0xff, 0xff, 0xff] # 15
|
|
58
|
+
|
|
59
|
+
# colors 16..232: the 6x6x6 color cube
|
|
60
|
+
valuerange = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]
|
|
61
|
+
|
|
62
|
+
217.times do |i|
|
|
63
|
+
r = valuerange[(i / 36) % 6]
|
|
64
|
+
g = valuerange[(i / 6) % 6]
|
|
65
|
+
b = valuerange[i % 6]
|
|
66
|
+
out << [r, g, b]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# colors 233..253: grayscale
|
|
70
|
+
1.upto 22 do |i|
|
|
71
|
+
v = 8 + i * 10
|
|
72
|
+
out << [v, v, v]
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def fg
|
|
78
|
+
return @fg if instance_variable_defined? :@fg
|
|
79
|
+
@fg = style.fg && self.class.color_index(style.fg)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def bg
|
|
83
|
+
return @bg if instance_variable_defined? :@bg
|
|
84
|
+
@bg = style.bg && self.class.color_index(style.bg)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def style_string
|
|
88
|
+
@style_string ||= begin
|
|
89
|
+
attrs = []
|
|
90
|
+
|
|
91
|
+
attrs << ['38', '5', fg.to_s] if fg
|
|
92
|
+
attrs << ['48', '5', bg.to_s] if bg
|
|
93
|
+
attrs << '01' if style[:bold]
|
|
94
|
+
attrs << '04' if style[:italic] # underline, but hey, whatevs
|
|
95
|
+
escape(attrs)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def reset_string
|
|
100
|
+
@reset_string ||= begin
|
|
101
|
+
attrs = []
|
|
102
|
+
attrs << '39' if fg # fg reset
|
|
103
|
+
attrs << '49' if bg # bg reset
|
|
104
|
+
attrs << '00' if style[:bold] || style[:italic]
|
|
105
|
+
|
|
106
|
+
escape(attrs)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
private
|
|
111
|
+
def escape(attrs)
|
|
112
|
+
return '' if attrs.empty?
|
|
113
|
+
"\e[#{attrs.join(';')}m"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def self.color_index(color)
|
|
117
|
+
@color_index_cache ||= {}
|
|
118
|
+
@color_index_cache[color] ||= closest_color(*get_rgb(color))
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def self.get_rgb(color)
|
|
122
|
+
color = $1 if color =~ /#([0-9a-f]+)/i
|
|
123
|
+
hexes = case color.size
|
|
124
|
+
when 3
|
|
125
|
+
color.chars.map { |c| "#{c}#{c}" }
|
|
126
|
+
when 6
|
|
127
|
+
color.scan(/../)
|
|
128
|
+
else
|
|
129
|
+
raise "invalid color: #{color}"
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
hexes.map { |h| h.to_i(16) }
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# max distance between two colors, #000000 to #ffffff
|
|
136
|
+
MAX_DISTANCE = 257 * 257 * 3
|
|
137
|
+
|
|
138
|
+
def self.closest_color(r, g, b)
|
|
139
|
+
@@colors_cache ||= {}
|
|
140
|
+
key = (r << 16) + (g << 8) + b
|
|
141
|
+
@@colors_cache.fetch(key) do
|
|
142
|
+
distance = MAX_DISTANCE
|
|
143
|
+
|
|
144
|
+
match = 0
|
|
145
|
+
|
|
146
|
+
xterm_colors.each_with_index do |(cr, cg, cb), i|
|
|
147
|
+
d = (r - cr)**2 + (g - cg)**2 + (b - cb)**2
|
|
148
|
+
next if d >= distance
|
|
149
|
+
|
|
150
|
+
match = i
|
|
151
|
+
distance = d
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
match
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# private
|
|
160
|
+
def escape_sequence(token)
|
|
161
|
+
@escape_sequences ||= {}
|
|
162
|
+
@escape_sequences[token.qualname] ||=
|
|
163
|
+
EscapeSequence.new(get_style(token))
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def get_style(token)
|
|
167
|
+
return text_style if token.ancestors.include? Token::Tokens::Text
|
|
168
|
+
|
|
169
|
+
theme.get_own_style(token) || text_style
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def text_style
|
|
173
|
+
style = theme.get_style(Token['Text'])
|
|
174
|
+
# don't highlight text backgrounds
|
|
175
|
+
style.delete :bg
|
|
176
|
+
style
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Rouge
|
|
2
|
+
class Guesser
|
|
3
|
+
class Ambiguous < StandardError
|
|
4
|
+
attr_reader :alternatives
|
|
5
|
+
def initialize(alternatives); @alternatives = alternatives; end
|
|
6
|
+
|
|
7
|
+
def message
|
|
8
|
+
"Ambiguous guess: can't decide between #{alternatives.map(&:tag).inspect}"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.guess(guessers, lexers)
|
|
13
|
+
original_size = lexers.size
|
|
14
|
+
|
|
15
|
+
guessers.each do |g|
|
|
16
|
+
new_lexers = case g
|
|
17
|
+
when Guesser then g.filter(lexers)
|
|
18
|
+
when proc { |x| x.respond_to? :call } then g.call(lexers)
|
|
19
|
+
else raise "bad guesser: #{g}"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
lexers = new_lexers && new_lexers.any? ? new_lexers : lexers
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# if we haven't filtered the input at *all*,
|
|
26
|
+
# then we have no idea what language it is,
|
|
27
|
+
# so we bail and return [].
|
|
28
|
+
lexers.size < original_size ? lexers : []
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def collect_best(lexers, opts={}, &scorer)
|
|
32
|
+
best = []
|
|
33
|
+
best_score = opts[:threshold]
|
|
34
|
+
|
|
35
|
+
lexers.each do |lexer|
|
|
36
|
+
score = scorer.call(lexer)
|
|
37
|
+
|
|
38
|
+
next if score.nil?
|
|
39
|
+
|
|
40
|
+
if best_score.nil? || score > best_score
|
|
41
|
+
best_score = score
|
|
42
|
+
best = [lexer]
|
|
43
|
+
elsif score == best_score
|
|
44
|
+
best << lexer
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
best
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def filter(lexers)
|
|
52
|
+
raise 'abstract'
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
module Rouge
|
|
2
|
+
module Guessers
|
|
3
|
+
class Disambiguation < Guesser
|
|
4
|
+
include Util
|
|
5
|
+
include Lexers
|
|
6
|
+
|
|
7
|
+
def initialize(filename, source)
|
|
8
|
+
@filename = File.basename(filename)
|
|
9
|
+
@source = source
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def filter(lexers)
|
|
13
|
+
return lexers if lexers.size == 1
|
|
14
|
+
return lexers if lexers.size == Lexer.all.size
|
|
15
|
+
|
|
16
|
+
@analyzer = TextAnalyzer.new(get_source(@source))
|
|
17
|
+
|
|
18
|
+
self.class.disambiguators.each do |disambiguator|
|
|
19
|
+
next unless disambiguator.match?(@filename)
|
|
20
|
+
|
|
21
|
+
filtered = disambiguator.decide!(self)
|
|
22
|
+
return filtered if filtered
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
return lexers
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def contains?(text)
|
|
29
|
+
return @analyzer.include?(text)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def matches?(re)
|
|
33
|
+
return !!(@analyzer =~ re)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
@disambiguators = []
|
|
37
|
+
def self.disambiguate(*patterns, &decider)
|
|
38
|
+
@disambiguators << Disambiguator.new(patterns, &decider)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.disambiguators
|
|
42
|
+
@disambiguators
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class Disambiguator
|
|
46
|
+
include Util
|
|
47
|
+
|
|
48
|
+
def initialize(patterns, &decider)
|
|
49
|
+
@patterns = patterns
|
|
50
|
+
@decider = decider
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def decide!(guesser)
|
|
54
|
+
out = guesser.instance_eval(&@decider)
|
|
55
|
+
case out
|
|
56
|
+
when Array then out
|
|
57
|
+
when nil then nil
|
|
58
|
+
else [out]
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def match?(filename)
|
|
63
|
+
@patterns.any? { |p| test_glob(p, filename) }
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
disambiguate '*.pl' do
|
|
68
|
+
next Perl if contains?('my $')
|
|
69
|
+
next Prolog if contains?(':-')
|
|
70
|
+
next Prolog if matches?(/\A\w+(\(\w+\,\s*\w+\))*\./)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
disambiguate '*.h' do
|
|
74
|
+
next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
|
|
75
|
+
next ObjectiveC if contains?('@"')
|
|
76
|
+
|
|
77
|
+
C
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
disambiguate '*.m' do
|
|
81
|
+
next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
|
|
82
|
+
next ObjectiveC if contains?('@"')
|
|
83
|
+
|
|
84
|
+
next Matlab if matches?(/^\s*?%/)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
disambiguate '*.php' do
|
|
88
|
+
# PHP always takes precedence over Hack
|
|
89
|
+
PHP
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
disambiguate '*.hh' do
|
|
93
|
+
next Cpp if matches?(/^\s*#include/)
|
|
94
|
+
next Hack if matches?(/^<\?hh/)
|
|
95
|
+
next Hack if matches?(/(\(|, ?)\$\$/)
|
|
96
|
+
|
|
97
|
+
Cpp
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|