rouge 2.0.7 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +7 -9
- data/lib/rouge.rb +1 -0
- data/lib/rouge/cli.rb +20 -0
- data/lib/rouge/demos/awk +4 -0
- data/lib/rouge/demos/console +6 -0
- data/lib/rouge/demos/digdag +19 -0
- data/lib/rouge/demos/dot +5 -0
- data/lib/rouge/demos/graphql +17 -0
- data/lib/rouge/demos/hylang +10 -0
- data/lib/rouge/demos/igorpro +9 -0
- data/lib/rouge/demos/irb +4 -0
- data/lib/rouge/demos/irb_output +2 -0
- data/lib/rouge/demos/lasso +12 -0
- data/lib/rouge/demos/mosel +10 -0
- data/lib/rouge/demos/plist +142 -0
- data/lib/rouge/demos/pony +17 -0
- data/lib/rouge/demos/q +2 -0
- data/lib/rouge/demos/sieve +10 -0
- data/lib/rouge/demos/tsx +17 -0
- data/lib/rouge/demos/turtle +0 -0
- data/lib/rouge/demos/wollok +11 -0
- data/lib/rouge/formatters/html_inline.rb +9 -1
- data/lib/rouge/formatters/html_pygments.rb +2 -2
- data/lib/rouge/formatters/html_table.rb +1 -1
- data/lib/rouge/formatters/terminal256.rb +1 -1
- data/lib/rouge/lexer.rb +124 -37
- data/lib/rouge/lexers/abap.rb +2 -2
- data/lib/rouge/lexers/apache.rb +1 -1
- data/lib/rouge/lexers/awk.rb +161 -0
- data/lib/rouge/lexers/clojure.rb +2 -2
- data/lib/rouge/lexers/coffeescript.rb +1 -1
- data/lib/rouge/lexers/console.rb +136 -0
- data/lib/rouge/lexers/csharp.rb +26 -7
- data/lib/rouge/lexers/digdag.rb +72 -0
- data/lib/rouge/lexers/docker.rb +1 -1
- data/lib/rouge/lexers/dot.rb +68 -0
- data/lib/rouge/lexers/elixir.rb +52 -27
- data/lib/rouge/lexers/fortran.rb +56 -28
- data/lib/rouge/lexers/fsharp.rb +1 -1
- data/lib/rouge/lexers/gherkin/keywords.rb +4 -4
- data/lib/rouge/lexers/graphql.rb +243 -0
- data/lib/rouge/lexers/groovy.rb +5 -1
- data/lib/rouge/lexers/haml.rb +19 -24
- data/lib/rouge/lexers/html.rb +48 -4
- data/lib/rouge/lexers/hylang.rb +93 -0
- data/lib/rouge/lexers/igorpro.rb +407 -0
- data/lib/rouge/lexers/irb.rb +66 -0
- data/lib/rouge/lexers/javascript.rb +21 -10
- data/lib/rouge/lexers/json.rb +3 -2
- data/lib/rouge/lexers/json_doc.rb +6 -0
- data/lib/rouge/lexers/jsx.rb +2 -1
- data/lib/rouge/lexers/lasso.rb +217 -0
- data/lib/rouge/lexers/lasso/keywords.yml +446 -0
- data/lib/rouge/lexers/lua.rb +3 -0
- data/lib/rouge/lexers/lua/builtins.rb +1 -1
- data/lib/rouge/lexers/markdown.rb +2 -3
- data/lib/rouge/lexers/matlab/builtins.rb +1 -1
- data/lib/rouge/lexers/moonscript.rb +8 -4
- data/lib/rouge/lexers/mosel.rb +231 -0
- data/lib/rouge/lexers/ocaml.rb +9 -20
- data/lib/rouge/lexers/php.rb +40 -20
- data/lib/rouge/lexers/php/builtins.rb +27 -37
- data/lib/rouge/lexers/plain_text.rb +4 -3
- data/lib/rouge/lexers/plist.rb +49 -0
- data/lib/rouge/lexers/pony.rb +93 -0
- data/lib/rouge/lexers/powershell.rb +36 -0
- data/lib/rouge/lexers/properties.rb +2 -2
- data/lib/rouge/lexers/q.rb +124 -0
- data/lib/rouge/lexers/r.rb +2 -2
- data/lib/rouge/lexers/ruby.rb +26 -13
- data/lib/rouge/lexers/rust.rb +7 -5
- data/lib/rouge/lexers/sed.rb +4 -2
- data/lib/rouge/lexers/shell.rb +38 -16
- data/lib/rouge/lexers/sieve.rb +96 -0
- data/lib/rouge/lexers/sml.rb +3 -2
- data/lib/rouge/lexers/tsx.rb +19 -0
- data/lib/rouge/lexers/turtle.rb +0 -0
- data/lib/rouge/lexers/typescript.rb +3 -27
- data/lib/rouge/lexers/typescript/common.rb +33 -0
- data/lib/rouge/lexers/viml/keywords.rb +2 -2
- data/lib/rouge/lexers/wollok.rb +107 -0
- data/lib/rouge/lexers/xml.rb +1 -1
- data/lib/rouge/lexers/yaml.rb +4 -1
- data/lib/rouge/regex_lexer.rb +1 -0
- data/lib/rouge/template_lexer.rb +3 -5
- data/lib/rouge/theme.rb +14 -4
- data/lib/rouge/themes/igor_pro.rb +20 -0
- data/lib/rouge/themes/pastie.rb +69 -0
- data/lib/rouge/themes/thankful_eyes.rb +8 -5
- data/lib/rouge/version.rb +1 -1
- metadata +40 -6
- data/lib/rouge/demos/shell_session +0 -10
- data/lib/rouge/lexers/shell_session.rb +0 -29
@@ -7,9 +7,9 @@ module Rouge
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def stream(tokens, &b)
|
10
|
-
yield %(<pre class="#{@css_class}"><code>)
|
10
|
+
yield %(<div class="highlight"><pre class="#{@css_class}"><code>)
|
11
11
|
@inner.stream(tokens, &b)
|
12
|
-
yield "</code></pre>"
|
12
|
+
yield "</code></pre></div>"
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -17,7 +17,7 @@ module Rouge
|
|
17
17
|
tokens.each do |tok, val|
|
18
18
|
escape = escape_sequence(tok)
|
19
19
|
yield escape.style_string
|
20
|
-
yield val.gsub("\n", "\n#{escape.style_string}")
|
20
|
+
yield val.gsub("\n", "#{escape.reset_string}\n#{escape.style_string}")
|
21
21
|
yield escape.reset_string
|
22
22
|
end
|
23
23
|
end
|
data/lib/rouge/lexer.rb
CHANGED
@@ -11,6 +11,8 @@ module Rouge
|
|
11
11
|
class Lexer
|
12
12
|
include Token::Tokens
|
13
13
|
|
14
|
+
@option_docs = {}
|
15
|
+
|
14
16
|
class << self
|
15
17
|
# Lexes `stream` with the given options. The lex is delegated to a
|
16
18
|
# new instance.
|
@@ -20,12 +22,6 @@ module Rouge
|
|
20
22
|
new(opts).lex(stream, &b)
|
21
23
|
end
|
22
24
|
|
23
|
-
def default_options(o={})
|
24
|
-
@default_options ||= {}
|
25
|
-
@default_options.merge!(o)
|
26
|
-
@default_options
|
27
|
-
end
|
28
|
-
|
29
25
|
# Given a string, return the correct lexer class.
|
30
26
|
def find(name)
|
31
27
|
registry[name.to_s]
|
@@ -45,19 +41,30 @@ module Rouge
|
|
45
41
|
# This is used in the Redcarpet plugin as well as Rouge's own
|
46
42
|
# markdown lexer for highlighting internal code blocks.
|
47
43
|
#
|
48
|
-
def find_fancy(str, code=nil)
|
44
|
+
def find_fancy(str, code=nil, additional_options={})
|
45
|
+
if str && !str.include?('?') && str != 'guess'
|
46
|
+
lexer_class = find(str)
|
47
|
+
return lexer_class && lexer_class.new(additional_options)
|
48
|
+
end
|
49
|
+
|
49
50
|
name, opts = str ? str.split('?', 2) : [nil, '']
|
50
51
|
|
51
52
|
# parse the options hash from a cgi-style string
|
52
53
|
opts = CGI.parse(opts || '').map do |k, vals|
|
53
|
-
|
54
|
+
val = case vals.size
|
55
|
+
when 0 then true
|
56
|
+
when 1 then vals[0]
|
57
|
+
else vals
|
58
|
+
end
|
59
|
+
|
60
|
+
[ k.to_s, val ]
|
54
61
|
end
|
55
62
|
|
56
|
-
opts = Hash[opts]
|
63
|
+
opts = additional_options.merge(Hash[opts])
|
57
64
|
|
58
65
|
lexer_class = case name
|
59
66
|
when 'guess', nil
|
60
|
-
self.guess(:source => code, :mimetype => opts[
|
67
|
+
self.guess(:source => code, :mimetype => opts['mimetype'])
|
61
68
|
when String
|
62
69
|
self.find(name)
|
63
70
|
end
|
@@ -82,6 +89,14 @@ module Rouge
|
|
82
89
|
end
|
83
90
|
end
|
84
91
|
|
92
|
+
def option_docs
|
93
|
+
@option_docs ||= InheritableHash.new(superclass.option_docs)
|
94
|
+
end
|
95
|
+
|
96
|
+
def option(name, desc)
|
97
|
+
option_docs[name.to_s] = desc
|
98
|
+
end
|
99
|
+
|
85
100
|
# Specify or get the path name containing a small demo for
|
86
101
|
# this lexer (can be overriden by {demo}).
|
87
102
|
def demo_file(arg=:absent)
|
@@ -156,7 +171,17 @@ module Rouge
|
|
156
171
|
guess :source => source
|
157
172
|
end
|
158
173
|
|
159
|
-
|
174
|
+
def enable_debug!
|
175
|
+
@debug_enabled = true
|
176
|
+
end
|
177
|
+
|
178
|
+
def disable_debug!
|
179
|
+
@debug_enabled = false
|
180
|
+
end
|
181
|
+
|
182
|
+
def debug_enabled?
|
183
|
+
!!@debug_enabled
|
184
|
+
end
|
160
185
|
|
161
186
|
protected
|
162
187
|
# @private
|
@@ -234,6 +259,7 @@ module Rouge
|
|
234
259
|
|
235
260
|
# -*- instance methods -*- #
|
236
261
|
|
262
|
+
attr_reader :options
|
237
263
|
# Create a new lexer with the given options. Individual lexers may
|
238
264
|
# specify extra options. The only current globally accepted option
|
239
265
|
# is `:debug`.
|
@@ -244,42 +270,103 @@ module Rouge
|
|
244
270
|
# state stack at the beginning of each step, along with each regex
|
245
271
|
# tried and each stream consumed. Try it, it's pretty useful.
|
246
272
|
def initialize(opts={})
|
247
|
-
options
|
273
|
+
@options = {}
|
274
|
+
opts.each { |k, v| @options[k.to_s] = v }
|
275
|
+
|
276
|
+
@debug = Lexer.debug_enabled? && bool_option(:debug)
|
277
|
+
end
|
248
278
|
|
249
|
-
|
279
|
+
def as_bool(val)
|
280
|
+
case val
|
281
|
+
when nil, false, 0, '0', 'off'
|
282
|
+
false
|
283
|
+
when Array
|
284
|
+
val.empty? ? true : as_bool(val.last)
|
285
|
+
else
|
286
|
+
true
|
287
|
+
end
|
250
288
|
end
|
251
289
|
|
252
|
-
|
253
|
-
|
254
|
-
(@options ||= {}).merge!(o)
|
290
|
+
def as_string(val)
|
291
|
+
return as_string(val.last) if val.is_a?(Array)
|
255
292
|
|
256
|
-
|
293
|
+
val ? val.to_s : nil
|
257
294
|
end
|
258
295
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
296
|
+
def as_list(val)
|
297
|
+
case val
|
298
|
+
when Array
|
299
|
+
val.flat_map { |v| as_list(v) }
|
300
|
+
when String
|
301
|
+
val.split(',')
|
263
302
|
else
|
264
|
-
|
303
|
+
[]
|
265
304
|
end
|
266
305
|
end
|
267
306
|
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
307
|
+
def as_lexer(val)
|
308
|
+
return as_lexer(val.last) if val.is_a?(Array)
|
309
|
+
return val.new(@options) if val.is_a?(Class) && val < Lexer
|
310
|
+
|
311
|
+
case val
|
312
|
+
when Lexer
|
313
|
+
val
|
314
|
+
when String
|
315
|
+
lexer_class = Lexer.find(val)
|
316
|
+
lexer_class && lexer_class.new(@options)
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
def as_token(val)
|
321
|
+
return as_token(val.last) if val.is_a?(Array)
|
322
|
+
case val
|
323
|
+
when Token
|
324
|
+
val
|
325
|
+
else
|
326
|
+
Token[val]
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def bool_option(name, &default)
|
331
|
+
if @options.key?(name.to_s)
|
332
|
+
as_bool(@options[name.to_s])
|
333
|
+
else
|
334
|
+
default ? default.call : false
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
def string_option(name, &default)
|
339
|
+
as_string(@options.delete(name.to_s, &default))
|
340
|
+
end
|
341
|
+
|
342
|
+
def lexer_option(name, &default)
|
343
|
+
as_lexer(@options.delete(name.to_s, &default))
|
344
|
+
end
|
345
|
+
|
346
|
+
def list_option(name, &default)
|
347
|
+
as_list(@options.delete(name.to_s, &default))
|
348
|
+
end
|
349
|
+
|
350
|
+
def token_option(name, &default)
|
351
|
+
as_token(@options.delete(name.to_s, &default))
|
352
|
+
end
|
353
|
+
|
354
|
+
def hash_option(name, defaults, &val_cast)
|
355
|
+
name = name.to_s
|
356
|
+
out = defaults.dup
|
357
|
+
|
358
|
+
base = @options.delete(name.to_s)
|
359
|
+
base = {} unless base.is_a?(Hash)
|
360
|
+
base.each { |k, v| out[k.to_s] = val_cast ? val_cast.call(v) : v }
|
361
|
+
|
362
|
+
@options.keys.each do |key|
|
363
|
+
next unless key =~ /(\w+)\[(\w+)\]/ and $1 == name
|
364
|
+
value = @options.delete(key)
|
365
|
+
|
366
|
+
out[$2] = val_cast ? val_cast.call(value) : value
|
367
|
+
end
|
368
|
+
|
369
|
+
out
|
283
370
|
end
|
284
371
|
|
285
372
|
# @abstract
|
data/lib/rouge/lexers/abap.rb
CHANGED
@@ -217,13 +217,13 @@ module Rouge
|
|
217
217
|
|
218
218
|
# operators
|
219
219
|
rule %r((->|->>|=>)), Operator
|
220
|
-
rule %r([
|
220
|
+
rule %r([-\*\+%/~=&\?<>!#\@\^]+), Operator
|
221
221
|
|
222
222
|
end
|
223
223
|
|
224
224
|
state :operators do
|
225
225
|
rule %r((->|->>|=>)), Operator
|
226
|
-
rule %r([
|
226
|
+
rule %r([-\*\+%/~=&\?<>!#\@\^]+), Operator
|
227
227
|
end
|
228
228
|
|
229
229
|
state :single_string do
|
data/lib/rouge/lexers/apache.rb
CHANGED
@@ -13,7 +13,7 @@ module Rouge
|
|
13
13
|
attr_reader :keywords
|
14
14
|
end
|
15
15
|
# Load Apache keywords from separate YML file
|
16
|
-
@keywords = ::YAML.
|
16
|
+
@keywords = ::YAML.load_file(Pathname.new(__FILE__).dirname.join('apache/keywords.yml')).tap do |h|
|
17
17
|
h.each do |k,v|
|
18
18
|
h[k] = Set.new v
|
19
19
|
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class Awk < RegexLexer
|
6
|
+
title "Awk"
|
7
|
+
desc "pattern-directed scanning and processing language"
|
8
|
+
|
9
|
+
tag 'awk'
|
10
|
+
filenames '*.awk'
|
11
|
+
mimetypes 'application/x-awk'
|
12
|
+
|
13
|
+
def self.analyze_text(text)
|
14
|
+
return 1 if text.shebang?('awk')
|
15
|
+
end
|
16
|
+
|
17
|
+
id = /[$a-zA-Z_][a-zA-Z0-9_]*/
|
18
|
+
|
19
|
+
def self.keywords
|
20
|
+
@keywords ||= Set.new %w(
|
21
|
+
if else while for do break continue return next nextfile delete
|
22
|
+
exit print printf getline
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.declarations
|
27
|
+
@declarations ||= Set.new %w(function)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.reserved
|
31
|
+
@reserved ||= Set.new %w(BEGIN END)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.constants
|
35
|
+
@constants ||= Set.new %w(
|
36
|
+
CONVFMT FS NF NR FNR FILENAME RS OFS ORS OFMT SUBSEP ARGC ARGV
|
37
|
+
ENVIRON
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.builtins
|
42
|
+
@builtins ||= %w(
|
43
|
+
exp log sqrt sin cos atan2 length rand srand int substr index match
|
44
|
+
split sub gsub sprintf system tolower toupper
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
state :comments_and_whitespace do
|
49
|
+
rule /\s+/, Text
|
50
|
+
rule %r(#.*?$), Comment::Single
|
51
|
+
end
|
52
|
+
|
53
|
+
state :expr_start do
|
54
|
+
mixin :comments_and_whitespace
|
55
|
+
rule %r(/) do
|
56
|
+
token Str::Regex
|
57
|
+
goto :regex
|
58
|
+
end
|
59
|
+
rule //, Text, :pop!
|
60
|
+
end
|
61
|
+
|
62
|
+
state :regex do
|
63
|
+
rule %r(/) do
|
64
|
+
token Str::Regex
|
65
|
+
goto :regex_end
|
66
|
+
end
|
67
|
+
|
68
|
+
rule %r([^/]\n), Error, :pop!
|
69
|
+
|
70
|
+
rule /\n/, Error, :pop!
|
71
|
+
rule /\[\^/, Str::Escape, :regex_group
|
72
|
+
rule /\[/, Str::Escape, :regex_group
|
73
|
+
rule /\\./, Str::Escape
|
74
|
+
rule %r{[(][?][:=<!]}, Str::Escape
|
75
|
+
rule /[{][\d,]+[}]/, Str::Escape
|
76
|
+
rule /[()?]/, Str::Escape
|
77
|
+
rule /./, Str::Regex
|
78
|
+
end
|
79
|
+
|
80
|
+
state :regex_end do
|
81
|
+
rule(//) { pop! }
|
82
|
+
end
|
83
|
+
|
84
|
+
state :regex_group do
|
85
|
+
# specially highlight / in a group to indicate that it doesn't
|
86
|
+
# close the regex
|
87
|
+
rule /\//, Str::Escape
|
88
|
+
|
89
|
+
rule %r([^/]\n) do
|
90
|
+
token Error
|
91
|
+
pop! 2
|
92
|
+
end
|
93
|
+
|
94
|
+
rule /\]/, Str::Escape, :pop!
|
95
|
+
rule /\\./, Str::Escape
|
96
|
+
rule /./, Str::Regex
|
97
|
+
end
|
98
|
+
|
99
|
+
state :bad_regex do
|
100
|
+
rule /[^\n]+/, Error, :pop!
|
101
|
+
end
|
102
|
+
|
103
|
+
state :root do
|
104
|
+
mixin :comments_and_whitespace
|
105
|
+
rule %r((?<=\n)(?=\s|/)), Text, :expr_start
|
106
|
+
rule %r([-<>+*/%\^!=]=?|in\b|\+\+|--|\|), Operator, :expr_start
|
107
|
+
rule %r(&&|\|\||~!?), Operator, :expr_start
|
108
|
+
rule /[(\[,]/, Punctuation, :expr_start
|
109
|
+
rule /;/, Punctuation, :statement
|
110
|
+
rule /[)\].]/, Punctuation
|
111
|
+
|
112
|
+
rule /[?]/ do
|
113
|
+
token Punctuation
|
114
|
+
push :ternary
|
115
|
+
push :expr_start
|
116
|
+
end
|
117
|
+
|
118
|
+
rule /[{}]/, Punctuation, :statement
|
119
|
+
|
120
|
+
rule id do |m|
|
121
|
+
if self.class.keywords.include? m[0]
|
122
|
+
token Keyword
|
123
|
+
push :expr_start
|
124
|
+
elsif self.class.declarations.include? m[0]
|
125
|
+
token Keyword::Declaration
|
126
|
+
push :expr_start
|
127
|
+
elsif self.class.reserved.include? m[0]
|
128
|
+
token Keyword::Reserved
|
129
|
+
elsif self.class.constants.include? m[0]
|
130
|
+
token Keyword::Constant
|
131
|
+
elsif self.class.builtins.include? m[0]
|
132
|
+
token Name::Builtin
|
133
|
+
elsif m[0] =~ /^\$/
|
134
|
+
token Name::Variable
|
135
|
+
else
|
136
|
+
token Name::Other
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
rule /[0-9]+\.[0-9]+/, Num::Float
|
141
|
+
rule /[0-9]+/, Num::Integer
|
142
|
+
rule /"(\\[\\"]|[^"])*"/, Str::Double
|
143
|
+
rule /:/, Punctuation
|
144
|
+
end
|
145
|
+
|
146
|
+
state :statement do
|
147
|
+
rule /[{}]/, Punctuation
|
148
|
+
mixin :expr_start
|
149
|
+
end
|
150
|
+
|
151
|
+
state :ternary do
|
152
|
+
rule /:/ do
|
153
|
+
token Punctuation
|
154
|
+
goto :expr_start
|
155
|
+
end
|
156
|
+
|
157
|
+
mixin :root
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
data/lib/rouge/lexers/clojure.rb
CHANGED
@@ -9,7 +9,7 @@ module Rouge
|
|
9
9
|
tag 'clojure'
|
10
10
|
aliases 'clj', 'cljs'
|
11
11
|
|
12
|
-
filenames '*.clj', '*.cljs', '*.cljc', 'build.boot'
|
12
|
+
filenames '*.clj', '*.cljs', '*.cljc', 'build.boot', '*.edn'
|
13
13
|
|
14
14
|
mimetypes 'text/x-clojure', 'application/x-clojure'
|
15
15
|
|
@@ -86,7 +86,7 @@ module Rouge
|
|
86
86
|
rule /\\(.|[a-z]+)/i, Str::Char
|
87
87
|
|
88
88
|
|
89
|
-
rule /~@|[`\'
|
89
|
+
rule /~@|[`\'#^~&@]/, Operator
|
90
90
|
|
91
91
|
rule /(\()(\s*)(#{identifier})/m do |m|
|
92
92
|
token Punctuation, m[1]
|