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,92 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Rouge
|
|
5
|
+
module Formatters
|
|
6
|
+
class Tex < Formatter
|
|
7
|
+
tag 'tex'
|
|
8
|
+
|
|
9
|
+
# A map of TeX escape characters.
|
|
10
|
+
# Newlines are handled specially by using #token_lines
|
|
11
|
+
# spaces are preserved as long as they aren't at the beginning
|
|
12
|
+
# of a line. see #tag_first for our initial-space strategy
|
|
13
|
+
ESCAPE = {
|
|
14
|
+
'&' => '\&',
|
|
15
|
+
'%' => '\%',
|
|
16
|
+
'$' => '\$',
|
|
17
|
+
'#' => '\#',
|
|
18
|
+
'_' => '\_',
|
|
19
|
+
'{' => '\{',
|
|
20
|
+
'}' => '\}',
|
|
21
|
+
'~' => '{\textasciitilde}',
|
|
22
|
+
'^' => '{\textasciicircum}',
|
|
23
|
+
'|' => '{\textbar}',
|
|
24
|
+
'\\' => '{\textbackslash}',
|
|
25
|
+
'`' => '{\textasciigrave}',
|
|
26
|
+
"'" => "'{}",
|
|
27
|
+
'"' => '"{}',
|
|
28
|
+
"\t" => '{\tab}',
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
ESCAPE_REGEX = /[#{ESCAPE.keys.map(&Regexp.method(:escape)).join}]/om
|
|
32
|
+
|
|
33
|
+
def initialize(opts={})
|
|
34
|
+
@prefix = opts.fetch(:prefix) { 'RG' }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def escape_tex(str)
|
|
38
|
+
str.gsub(ESCAPE_REGEX, ESCAPE)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def stream(tokens, &b)
|
|
42
|
+
# surround the output with \begin{RG*}...\end{RG*}
|
|
43
|
+
yield "\\begin{#{@prefix}*}%\n"
|
|
44
|
+
|
|
45
|
+
# we strip the newline off the last line to avoid
|
|
46
|
+
# an extra line being rendered. we do this by yielding
|
|
47
|
+
# the \newline tag *before* every line group except
|
|
48
|
+
# the first.
|
|
49
|
+
first = true
|
|
50
|
+
|
|
51
|
+
token_lines tokens do |line|
|
|
52
|
+
if first
|
|
53
|
+
first = false
|
|
54
|
+
else
|
|
55
|
+
yield "\\newline%\n"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
render_line(line, &b)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
yield "%\n\\end{#{@prefix}*}%\n"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def render_line(line, &b)
|
|
65
|
+
line.each do |(tok, val)|
|
|
66
|
+
hphantom_tag(tok, val, &b)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Special handling for leading spaces, since they may be gobbled
|
|
71
|
+
# by a previous command. We replace all initial spaces with
|
|
72
|
+
# \hphantom{xxxx}, which renders an empty space equal to the size
|
|
73
|
+
# of the x's.
|
|
74
|
+
def hphantom_tag(tok, val)
|
|
75
|
+
leading = nil
|
|
76
|
+
val.sub!(/^[ ]+/) { leading = $&.size; '' }
|
|
77
|
+
yield "\\hphantom{#{'x' * leading}}" if leading
|
|
78
|
+
yield tag(tok, val) unless val.empty?
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def tag(tok, val)
|
|
82
|
+
if escape?(tok)
|
|
83
|
+
val
|
|
84
|
+
elsif tok == Token::Tokens::Text
|
|
85
|
+
escape_tex(val)
|
|
86
|
+
else
|
|
87
|
+
"\\#@prefix{#{tok.shortname}}{#{escape_tex(val)}}"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
data/lib/rouge/guesser.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Rouge
|
|
2
4
|
module Guessers
|
|
3
5
|
class Disambiguation < Guesser
|
|
@@ -73,6 +75,8 @@ module Rouge
|
|
|
73
75
|
disambiguate '*.h' do
|
|
74
76
|
next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
|
|
75
77
|
next ObjectiveC if contains?('@"')
|
|
78
|
+
next Cpp if matches?(/^\s*(?:catch|class|constexpr|namespace|private|
|
|
79
|
+
protected|public|template|throw|try|using)\b/x)
|
|
76
80
|
|
|
77
81
|
C
|
|
78
82
|
end
|
|
@@ -81,7 +85,14 @@ module Rouge
|
|
|
81
85
|
next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
|
|
82
86
|
next ObjectiveC if contains?('@"')
|
|
83
87
|
|
|
88
|
+
next Mathematica if contains?('(*')
|
|
89
|
+
next Mathematica if contains?(':=')
|
|
90
|
+
|
|
91
|
+
next Mason if matches?(/<%(def|method|text|doc|args|flags|attr|init|once|shared|perl|cleanup|filter)([^>]*)(>)/)
|
|
92
|
+
|
|
84
93
|
next Matlab if matches?(/^\s*?%/)
|
|
94
|
+
|
|
95
|
+
next Mason if matches? %r!(</?%|<&)!
|
|
85
96
|
end
|
|
86
97
|
|
|
87
98
|
disambiguate '*.php' do
|
|
@@ -96,6 +107,30 @@ module Rouge
|
|
|
96
107
|
|
|
97
108
|
Cpp
|
|
98
109
|
end
|
|
110
|
+
|
|
111
|
+
disambiguate '*.plist' do
|
|
112
|
+
next XML if matches?(/\A<\?xml\b/)
|
|
113
|
+
|
|
114
|
+
Plist
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
disambiguate '*.sc' do
|
|
118
|
+
next Python if matches?(/^#/)
|
|
119
|
+
next SuperCollider if matches?(/(?:^~|;$)/)
|
|
120
|
+
|
|
121
|
+
next Python
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
disambiguate 'Messages' do
|
|
125
|
+
next MsgTrans if matches?(/^[^\s:]+:[^\s:]+/)
|
|
126
|
+
|
|
127
|
+
next PlainText
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
disambiguate '*.cls' do
|
|
131
|
+
next TeX if matches?(/\A\s*(?:\\|%)/)
|
|
132
|
+
next Apex
|
|
133
|
+
end
|
|
99
134
|
end
|
|
100
135
|
end
|
|
101
136
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Rouge
|
|
2
4
|
module Guessers
|
|
3
5
|
# This class allows for custom behavior
|
|
@@ -30,7 +32,7 @@ module Rouge
|
|
|
30
32
|
basename = File.basename(filename)
|
|
31
33
|
|
|
32
34
|
collect_best(lexers) do |lexer|
|
|
33
|
-
|
|
35
|
+
(@glob_map[lexer.name] || []).map do |pattern|
|
|
34
36
|
if test_glob(pattern, basename)
|
|
35
37
|
# specificity is better the fewer wildcards there are
|
|
36
38
|
-pattern.scan(/[*?\[]/).size
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Rouge
|
|
2
4
|
module Guessers
|
|
3
5
|
class Modeline < Guesser
|
|
@@ -35,7 +37,7 @@ module Rouge
|
|
|
35
37
|
|
|
36
38
|
matches = MODELINES.map { |re| re.match(search_space) }.compact
|
|
37
39
|
return lexers unless matches.any?
|
|
38
|
-
|
|
40
|
+
|
|
39
41
|
match_set = Set.new(matches.map { |m| m[1] })
|
|
40
42
|
lexers.select { |l| match_set.include?(l.tag) || l.aliases.any? { |a| match_set.include?(a) } }
|
|
41
43
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Rouge
|
|
2
4
|
module Guessers
|
|
3
5
|
class Source < Guesser
|
|
@@ -20,7 +22,7 @@ module Rouge
|
|
|
20
22
|
source_text = TextAnalyzer.new(source_text)
|
|
21
23
|
|
|
22
24
|
collect_best(lexers) do |lexer|
|
|
23
|
-
next unless lexer.
|
|
25
|
+
next unless lexer.detectable?
|
|
24
26
|
lexer.detect?(source_text) ? 1 : nil
|
|
25
27
|
end
|
|
26
28
|
end
|
data/lib/rouge/guessers/util.rb
CHANGED
data/lib/rouge/lexer.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
# stdlib
|
|
4
5
|
require 'strscan'
|
|
@@ -22,6 +23,14 @@ module Rouge
|
|
|
22
23
|
new(opts).lex(stream, &b)
|
|
23
24
|
end
|
|
24
25
|
|
|
26
|
+
# In case #continue_lex is called statically, we simply
|
|
27
|
+
# begin a new lex from the beginning, since there is no state.
|
|
28
|
+
#
|
|
29
|
+
# @see #continue_lex
|
|
30
|
+
def continue_lex(*a, &b)
|
|
31
|
+
lex(*a, &b)
|
|
32
|
+
end
|
|
33
|
+
|
|
25
34
|
# Given a name in string, return the correct lexer class.
|
|
26
35
|
# @param [String] name
|
|
27
36
|
# @return [Class<Rouge::Lexer>,nil]
|
|
@@ -40,6 +49,9 @@ module Rouge
|
|
|
40
49
|
#
|
|
41
50
|
# Lexer.find_fancy('guess', "#!/bin/bash\necho Hello, world")
|
|
42
51
|
#
|
|
52
|
+
# If the code matches more than one lexer then Guesser::Ambiguous
|
|
53
|
+
# is raised.
|
|
54
|
+
#
|
|
43
55
|
# This is used in the Redcarpet plugin as well as Rouge's own
|
|
44
56
|
# markdown lexer for highlighting internal code blocks.
|
|
45
57
|
#
|
|
@@ -105,7 +117,7 @@ module Rouge
|
|
|
105
117
|
def demo_file(arg=:absent)
|
|
106
118
|
return @demo_file = Pathname.new(arg) unless arg == :absent
|
|
107
119
|
|
|
108
|
-
@demo_file = Pathname.new(
|
|
120
|
+
@demo_file = Pathname.new(File.join(__dir__, 'demos', tag))
|
|
109
121
|
end
|
|
110
122
|
|
|
111
123
|
# Specify or get a small demo string for this lexer
|
|
@@ -117,7 +129,7 @@ module Rouge
|
|
|
117
129
|
|
|
118
130
|
# @return a list of all lexers.
|
|
119
131
|
def all
|
|
120
|
-
registry.values.uniq
|
|
132
|
+
@all ||= registry.values.uniq
|
|
121
133
|
end
|
|
122
134
|
|
|
123
135
|
# Guess which lexer to use based on a hash of info.
|
|
@@ -187,16 +199,25 @@ module Rouge
|
|
|
187
199
|
end
|
|
188
200
|
|
|
189
201
|
def disable_debug!
|
|
190
|
-
|
|
202
|
+
remove_instance_variable :@debug_enabled if defined? @debug_enabled
|
|
191
203
|
end
|
|
192
204
|
|
|
193
205
|
def debug_enabled?
|
|
194
|
-
|
|
206
|
+
(defined? @debug_enabled) ? true : false
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Determine if a lexer has a method named +:detect?+ defined in its
|
|
210
|
+
# singleton class.
|
|
211
|
+
def detectable?
|
|
212
|
+
return @detectable if defined?(@detectable)
|
|
213
|
+
@detectable = singleton_methods(false).include?(:detect?)
|
|
195
214
|
end
|
|
196
215
|
|
|
197
216
|
protected
|
|
198
217
|
# @private
|
|
199
218
|
def register(name, lexer)
|
|
219
|
+
# reset an existing list of lexers
|
|
220
|
+
@all = nil if defined?(@all)
|
|
200
221
|
registry[name.to_s] = lexer
|
|
201
222
|
end
|
|
202
223
|
|
|
@@ -235,6 +256,13 @@ module Rouge
|
|
|
235
256
|
|
|
236
257
|
# Specify a list of filename globs associated with this lexer.
|
|
237
258
|
#
|
|
259
|
+
# If a filename glob is associated with more than one lexer, this can
|
|
260
|
+
# cause a Guesser::Ambiguous error to be raised in various guessing
|
|
261
|
+
# methods. These errors can be avoided by disambiguation. Filename globs
|
|
262
|
+
# are disambiguated in one of two ways. Either the lexer will define a
|
|
263
|
+
# `self.detect?` method (intended for use with shebangs and doctypes) or a
|
|
264
|
+
# manual rule will be specified in Guessers::Disambiguation.
|
|
265
|
+
#
|
|
238
266
|
# @example
|
|
239
267
|
# class Ruby < Lexer
|
|
240
268
|
# filenames '*.rb', '*.ruby', 'Gemfile', 'Rakefile'
|
|
@@ -255,7 +283,9 @@ module Rouge
|
|
|
255
283
|
|
|
256
284
|
# @private
|
|
257
285
|
def assert_utf8!(str)
|
|
258
|
-
|
|
286
|
+
encoding = str.encoding.name
|
|
287
|
+
return if encoding == 'US-ASCII' || encoding == 'UTF-8' || encoding == 'ASCII-8BIT'
|
|
288
|
+
|
|
259
289
|
raise EncodingError.new(
|
|
260
290
|
"Bad encoding: #{str.encoding.names.join(',')}. " +
|
|
261
291
|
"Please convert your string to UTF-8."
|
|
@@ -284,12 +314,12 @@ module Rouge
|
|
|
284
314
|
@options = {}
|
|
285
315
|
opts.each { |k, v| @options[k.to_s] = v }
|
|
286
316
|
|
|
287
|
-
@debug = Lexer.debug_enabled? && bool_option(
|
|
317
|
+
@debug = Lexer.debug_enabled? && bool_option('debug')
|
|
288
318
|
end
|
|
289
319
|
|
|
290
320
|
def as_bool(val)
|
|
291
321
|
case val
|
|
292
|
-
when nil, false, 0, '0', 'off'
|
|
322
|
+
when nil, false, 0, '0', 'false', 'off'
|
|
293
323
|
false
|
|
294
324
|
when Array
|
|
295
325
|
val.empty? ? true : as_bool(val.last)
|
|
@@ -339,8 +369,10 @@ module Rouge
|
|
|
339
369
|
end
|
|
340
370
|
|
|
341
371
|
def bool_option(name, &default)
|
|
342
|
-
|
|
343
|
-
|
|
372
|
+
name_str = name.to_s
|
|
373
|
+
|
|
374
|
+
if @options.key?(name_str)
|
|
375
|
+
as_bool(@options[name_str])
|
|
344
376
|
else
|
|
345
377
|
default ? default.call : false
|
|
346
378
|
end
|
|
@@ -392,12 +424,37 @@ module Rouge
|
|
|
392
424
|
#
|
|
393
425
|
# @option opts :continue
|
|
394
426
|
# Continue the lex from the previous state (i.e. don't call #reset!)
|
|
395
|
-
|
|
396
|
-
|
|
427
|
+
#
|
|
428
|
+
# @note The use of :continue => true has been deprecated. A warning is
|
|
429
|
+
# issued if run with `$VERBOSE` set to true.
|
|
430
|
+
#
|
|
431
|
+
# @note The use of arbitrary `opts` has never been supported, but we
|
|
432
|
+
# previously ignored them with no error. We now warn unconditionally.
|
|
433
|
+
def lex(string, opts=nil, &b)
|
|
434
|
+
if opts
|
|
435
|
+
if (opts.keys - [:continue]).size > 0
|
|
436
|
+
# improper use of options hash
|
|
437
|
+
warn('Improper use of Lexer#lex - this method does not receive options.' +
|
|
438
|
+
' This will become an error in a future version.')
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
if opts[:continue]
|
|
442
|
+
warn '`lex :continue => true` is deprecated, please use #continue_lex instead'
|
|
443
|
+
return continue_lex(string, &b)
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
return enum_for(:lex, string) unless block_given?
|
|
397
448
|
|
|
398
449
|
Lexer.assert_utf8!(string)
|
|
450
|
+
reset!
|
|
451
|
+
|
|
452
|
+
continue_lex(string, &b)
|
|
453
|
+
end
|
|
399
454
|
|
|
400
|
-
|
|
455
|
+
# Continue the lex from the the current state without resetting
|
|
456
|
+
def continue_lex(string, &b)
|
|
457
|
+
return enum_for(:continue_lex, string, &b) unless block_given?
|
|
401
458
|
|
|
402
459
|
# consolidate consecutive tokens of the same type
|
|
403
460
|
last_token = nil
|
|
@@ -448,14 +505,13 @@ module Rouge
|
|
|
448
505
|
end
|
|
449
506
|
|
|
450
507
|
module Lexers
|
|
508
|
+
BASE_DIR = "#{__dir__}/lexers".freeze
|
|
451
509
|
@_loaded_lexers = {}
|
|
452
510
|
|
|
453
511
|
def self.load_lexer(relpath)
|
|
454
512
|
return if @_loaded_lexers.key?(relpath)
|
|
455
513
|
@_loaded_lexers[relpath] = true
|
|
456
|
-
|
|
457
|
-
root = Pathname.new(__FILE__).dirname.join('lexers')
|
|
458
|
-
load root.join(relpath)
|
|
514
|
+
load File.join(BASE_DIR, relpath)
|
|
459
515
|
end
|
|
460
516
|
end
|
|
461
517
|
end
|
data/lib/rouge/lexers/abap.rb
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
2
4
|
# ABAP elements taken from http://help.sap.com/abapdocu_750/en/index.htm?file=abapdo.htm
|
|
3
5
|
|
|
4
6
|
module Rouge
|
|
@@ -180,16 +182,16 @@ module Rouge
|
|
|
180
182
|
end
|
|
181
183
|
|
|
182
184
|
state :root do
|
|
183
|
-
rule /\s+/m, Text
|
|
185
|
+
rule %r/\s+/m, Text
|
|
184
186
|
|
|
185
|
-
rule /".*/, Comment::Single
|
|
187
|
+
rule %r/".*/, Comment::Single
|
|
186
188
|
rule %r(^\*.*), Comment::Multiline
|
|
187
|
-
rule /\d+/, Num::Integer
|
|
188
|
-
rule /('|`)/, Str::Single, :single_string
|
|
189
|
-
rule /[\[\]\(\)\{\}
|
|
189
|
+
rule %r/\d+/, Num::Integer
|
|
190
|
+
rule %r/('|`)/, Str::Single, :single_string
|
|
191
|
+
rule %r/[\[\]\(\)\{\}\.,:\|]/, Punctuation
|
|
190
192
|
|
|
191
193
|
# builtins / new ABAP 7.40 keywords (@DATA(), ...)
|
|
192
|
-
rule /(->|=>)?([A-Za-z][A-Za-z0-9_\-]*)(\()/ do |m|
|
|
194
|
+
rule %r/(->|=>)?([A-Za-z][A-Za-z0-9_\-]*)(\()/ do |m|
|
|
193
195
|
if m[1] != ''
|
|
194
196
|
token Operator, m[1]
|
|
195
197
|
end
|
|
@@ -205,7 +207,7 @@ module Rouge
|
|
|
205
207
|
end
|
|
206
208
|
|
|
207
209
|
# keywords, types and normal text
|
|
208
|
-
rule /\w
|
|
210
|
+
rule %r/\w\w*/ do |m|
|
|
209
211
|
if self.class.keywords.include? m[0].upcase
|
|
210
212
|
token Keyword
|
|
211
213
|
elsif self.class.types.include? m[0].downcase
|
|
@@ -227,10 +229,10 @@ module Rouge
|
|
|
227
229
|
end
|
|
228
230
|
|
|
229
231
|
state :single_string do
|
|
230
|
-
rule /\\./, Str::Escape
|
|
231
|
-
rule /(''|``)/, Str::Escape
|
|
232
|
-
rule /['`]/, Str::Single, :pop!
|
|
233
|
-
rule /[^\\'`]+/, Str::Single
|
|
232
|
+
rule %r/\\./, Str::Escape
|
|
233
|
+
rule %r/(''|``)/, Str::Escape
|
|
234
|
+
rule %r/['`]/, Str::Single, :pop!
|
|
235
|
+
rule %r/[^\\'`]+/, Str::Single
|
|
234
236
|
end
|
|
235
237
|
|
|
236
238
|
end
|