rouge 3.3.0 → 3.4.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 +14 -2
- data/lib/rouge.rb +45 -41
- data/lib/rouge/cli.rb +26 -2
- data/lib/rouge/demos/escape +3 -0
- data/lib/rouge/demos/supercollider +11 -0
- data/lib/rouge/demos/xojo +13 -0
- data/lib/rouge/formatter.rb +36 -0
- data/lib/rouge/formatters/html.rb +2 -0
- data/lib/rouge/formatters/html_linewise.rb +6 -11
- data/lib/rouge/formatters/html_table.rb +20 -31
- data/lib/rouge/formatters/terminal256.rb +1 -0
- data/lib/rouge/guessers/disambiguation.rb +13 -0
- data/lib/rouge/guessers/source.rb +1 -1
- data/lib/rouge/lexer.rb +44 -13
- data/lib/rouge/lexers/c.rb +6 -29
- data/lib/rouge/lexers/coffeescript.rb +14 -6
- data/lib/rouge/lexers/common_lisp.rb +1 -1
- data/lib/rouge/lexers/console.rb +2 -2
- data/lib/rouge/lexers/coq.rb +1 -1
- data/lib/rouge/lexers/csharp.rb +0 -1
- data/lib/rouge/lexers/diff.rb +8 -4
- data/lib/rouge/lexers/docker.rb +1 -1
- data/lib/rouge/lexers/escape.rb +55 -0
- data/lib/rouge/lexers/go.rb +1 -1
- data/lib/rouge/lexers/graphql.rb +10 -0
- data/lib/rouge/lexers/html.rb +1 -0
- data/lib/rouge/lexers/java.rb +4 -0
- data/lib/rouge/lexers/javascript.rb +12 -16
- data/lib/rouge/lexers/jinja.rb +15 -1
- data/lib/rouge/lexers/julia.rb +140 -17
- data/lib/rouge/lexers/kotlin.rb +11 -4
- data/lib/rouge/lexers/markdown.rb +21 -4
- data/lib/rouge/lexers/matlab.rb +9 -2
- data/lib/rouge/lexers/objective_c.rb +7 -12
- data/lib/rouge/lexers/perl.rb +38 -6
- data/lib/rouge/lexers/powershell.rb +1 -1
- data/lib/rouge/lexers/rust.rb +1 -1
- data/lib/rouge/lexers/scala.rb +28 -2
- data/lib/rouge/lexers/shell.rb +1 -1
- data/lib/rouge/lexers/slim.rb +2 -2
- data/lib/rouge/lexers/supercollider.rb +116 -0
- data/lib/rouge/lexers/xml.rb +1 -1
- data/lib/rouge/lexers/xojo.rb +61 -0
- data/lib/rouge/regex_lexer.rb +12 -12
- data/lib/rouge/themes/bw.rb +41 -0
- data/lib/rouge/token.rb +30 -22
- data/lib/rouge/version.rb +1 -1
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5794858ca2a3090f6302e34bf98115e3dd56ad8b7abe30151c304b26ff414547
|
4
|
+
data.tar.gz: e633c0de8ab7553b7873e75108a9fcd233b438fb93a19d5f317a8c3b83faf844
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11f8425d849b2f5f0307942c47b99a7504cf6c560d5ae8d87371b901d44ec610cd91b616c2eb6efae6bc0ce3064e0e336b83d2c2393461075f1d14498e239fc1
|
7
|
+
data.tar.gz: d0d07ed86419b3c3b1043b1ff5fcfce7fce1da4fb1a1827edf861603e8f99b79e16b3aa4f2e0f4471eeafce8f79ff93b41cdb79d936afc68302af99fe7e82023
|
data/Gemfile
CHANGED
@@ -4,17 +4,25 @@ source 'http://rubygems.org'
|
|
4
4
|
|
5
5
|
gemspec
|
6
6
|
|
7
|
-
gem 'bundler', '~> 1.15'
|
8
7
|
gem 'rake'
|
9
8
|
|
10
9
|
gem 'minitest', '>= 5.0'
|
11
10
|
gem 'minitest-power_assert'
|
12
11
|
|
12
|
+
gem 'parallel', '~> 1.13.0' if RUBY_VERSION < '2.2.0'
|
13
13
|
gem 'rubocop', '~> 0.49.1'
|
14
14
|
|
15
15
|
# don't try to install redcarpet under jruby
|
16
16
|
gem 'redcarpet', :platforms => :ruby
|
17
17
|
|
18
|
+
# Profiling
|
19
|
+
if RUBY_VERSION >= '2.3.0'
|
20
|
+
gem 'memory_profiler', :require => false
|
21
|
+
end
|
22
|
+
|
23
|
+
# Needed for a Rake task
|
24
|
+
gem 'git'
|
25
|
+
|
18
26
|
group :development do
|
19
27
|
gem 'pry'
|
20
28
|
|
@@ -23,6 +31,10 @@ group :development do
|
|
23
31
|
gem 'github-markup'
|
24
32
|
|
25
33
|
# for visual tests
|
26
|
-
|
34
|
+
if RUBY_VERSION < '2.2.0'
|
35
|
+
gem 'sinatra', '~> 1.4.8'
|
36
|
+
else
|
37
|
+
gem 'sinatra'
|
38
|
+
end
|
27
39
|
gem 'shotgun'
|
28
40
|
end
|
data/lib/rouge.rb
CHANGED
@@ -34,51 +34,55 @@ module Rouge
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
|
37
|
+
# mimic Kernel#require_relative API
|
38
|
+
def load_relative(path)
|
39
|
+
load File.join(__dir__, "#{path}.rb")
|
40
|
+
end
|
39
41
|
|
40
|
-
|
42
|
+
def lexer_dir(path = '')
|
43
|
+
File.join(__dir__, 'rouge', 'lexers', path)
|
44
|
+
end
|
41
45
|
|
42
|
-
|
43
|
-
|
46
|
+
load_relative 'rouge/version'
|
47
|
+
load_relative 'rouge/util'
|
48
|
+
load_relative 'rouge/text_analyzer'
|
49
|
+
load_relative 'rouge/token'
|
44
50
|
|
45
|
-
|
46
|
-
|
47
|
-
|
51
|
+
load_relative 'rouge/lexer'
|
52
|
+
load_relative 'rouge/regex_lexer'
|
53
|
+
load_relative 'rouge/template_lexer'
|
48
54
|
|
49
|
-
|
50
|
-
Dir.glob(lexers_dir.join('*.rb')).each do |f|
|
51
|
-
Rouge::Lexers.load_lexer(Pathname.new(f).relative_path_from(lexers_dir).to_s)
|
52
|
-
end
|
55
|
+
Dir.glob(lexer_dir('*rb')).each { |f| Rouge::Lexers.load_lexer(f.sub(lexer_dir, '')) }
|
53
56
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
57
|
+
load_relative 'rouge/guesser'
|
58
|
+
load_relative 'rouge/guessers/util'
|
59
|
+
load_relative 'rouge/guessers/glob_mapping'
|
60
|
+
load_relative 'rouge/guessers/modeline'
|
61
|
+
load_relative 'rouge/guessers/filename'
|
62
|
+
load_relative 'rouge/guessers/mimetype'
|
63
|
+
load_relative 'rouge/guessers/source'
|
64
|
+
load_relative 'rouge/guessers/disambiguation'
|
62
65
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
66
|
+
load_relative 'rouge/formatter'
|
67
|
+
load_relative 'rouge/formatters/html'
|
68
|
+
load_relative 'rouge/formatters/html_table'
|
69
|
+
load_relative 'rouge/formatters/html_pygments'
|
70
|
+
load_relative 'rouge/formatters/html_legacy'
|
71
|
+
load_relative 'rouge/formatters/html_linewise'
|
72
|
+
load_relative 'rouge/formatters/html_inline'
|
73
|
+
load_relative 'rouge/formatters/terminal256'
|
74
|
+
load_relative 'rouge/formatters/null'
|
72
75
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
76
|
+
load_relative 'rouge/theme'
|
77
|
+
load_relative 'rouge/themes/thankful_eyes'
|
78
|
+
load_relative 'rouge/themes/colorful'
|
79
|
+
load_relative 'rouge/themes/base16'
|
80
|
+
load_relative 'rouge/themes/github'
|
81
|
+
load_relative 'rouge/themes/igor_pro'
|
82
|
+
load_relative 'rouge/themes/monokai'
|
83
|
+
load_relative 'rouge/themes/molokai'
|
84
|
+
load_relative 'rouge/themes/monokai_sublime'
|
85
|
+
load_relative 'rouge/themes/gruvbox'
|
86
|
+
load_relative 'rouge/themes/tulip'
|
87
|
+
load_relative 'rouge/themes/pastie'
|
88
|
+
load_relative 'rouge/themes/bw'
|
data/lib/rouge/cli.rb
CHANGED
@@ -186,6 +186,11 @@ module Rouge
|
|
186
186
|
yield %[]
|
187
187
|
yield %[--require|-r <filename> require a filename or library before]
|
188
188
|
yield %[ highlighting]
|
189
|
+
yield %[]
|
190
|
+
yield %[--escape allow the use of escapes between <! and !>]
|
191
|
+
yield %[]
|
192
|
+
yield %[--escape-with <l> <r> allow the use of escapes between custom]
|
193
|
+
yield %[ delimiters. implies --escape]
|
189
194
|
end
|
190
195
|
|
191
196
|
def self.parse(argv)
|
@@ -218,6 +223,10 @@ module Rouge
|
|
218
223
|
opts[:css_class] = argv.shift
|
219
224
|
when '--lexer-opts', '-L'
|
220
225
|
opts[:lexer_opts] = parse_cgi(argv.shift)
|
226
|
+
when '--escape'
|
227
|
+
opts[:escape] = ['<!', '!>']
|
228
|
+
when '--escape-with'
|
229
|
+
opts[:escape] = [argv.shift, argv.shift]
|
221
230
|
when /^--/
|
222
231
|
error! "unknown option #{arg.inspect}"
|
223
232
|
else
|
@@ -244,11 +253,23 @@ module Rouge
|
|
244
253
|
)
|
245
254
|
end
|
246
255
|
|
256
|
+
def raw_lexer
|
257
|
+
lexer_class.new(@lexer_opts)
|
258
|
+
end
|
259
|
+
|
260
|
+
def escape_lexer
|
261
|
+
Rouge::Lexers::Escape.new(
|
262
|
+
start: @escape[0],
|
263
|
+
end: @escape[1],
|
264
|
+
lang: raw_lexer,
|
265
|
+
)
|
266
|
+
end
|
267
|
+
|
247
268
|
def lexer
|
248
|
-
@lexer ||=
|
269
|
+
@lexer ||= @escape ? escape_lexer : raw_lexer
|
249
270
|
end
|
250
271
|
|
251
|
-
attr_reader :input_file, :lexer_name, :mimetype, :formatter
|
272
|
+
attr_reader :input_file, :lexer_name, :mimetype, :formatter, :escape
|
252
273
|
|
253
274
|
def initialize(opts={})
|
254
275
|
Rouge::Lexer.enable_debug!
|
@@ -281,9 +302,12 @@ module Rouge
|
|
281
302
|
else
|
282
303
|
error! "unknown formatter preset #{opts[:formatter]}"
|
283
304
|
end
|
305
|
+
|
306
|
+
@escape = opts[:escape]
|
284
307
|
end
|
285
308
|
|
286
309
|
def run
|
310
|
+
Formatter.enable_escape! if @escape
|
287
311
|
formatter.format(lexer.lex(input), &method(:print))
|
288
312
|
end
|
289
313
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
// modulate a sine frequency and a noise amplitude with another sine
|
2
|
+
// whose frequency depends on the horizontal mouse pointer position
|
3
|
+
~myFunction = {
|
4
|
+
var x = SinOsc.ar(MouseX.kr(1, 100));
|
5
|
+
SinOsc.ar(300 * x + 800, 0, 0.1)
|
6
|
+
+
|
7
|
+
PinkNoise.ar(0.1 * x + 0.1)
|
8
|
+
};
|
9
|
+
|
10
|
+
~myFunction.play;
|
11
|
+
"that's all, folks!".postln;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Dim f As FolderItem
|
2
|
+
f = GetOpenFolderItem(FileTypes1.jpeg) // defined in the File Type Set editor
|
3
|
+
If not f.Exists Then
|
4
|
+
Beep
|
5
|
+
MsgBox("The file " + f.NativePath + "doesn't ""exist.""")
|
6
|
+
Else // document exists
|
7
|
+
ImageWell1.image=Picture.Open(f)
|
8
|
+
End If
|
9
|
+
if f isa folderitem then
|
10
|
+
msgbox(f.name)
|
11
|
+
end if
|
12
|
+
Exception err As NilObjectException
|
13
|
+
MsgBox("Invalid pathname!")
|
data/lib/rouge/formatter.rb
CHANGED
@@ -21,6 +21,26 @@ module Rouge
|
|
21
21
|
REGISTRY[tag]
|
22
22
|
end
|
23
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
|
+
!!(@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
|
+
|
24
44
|
# Format a token stream. Delegates to {#format}.
|
25
45
|
def self.format(tokens, *a, &b)
|
26
46
|
new(*a).format(tokens, &b)
|
@@ -30,8 +50,24 @@ module Rouge
|
|
30
50
|
# pass
|
31
51
|
end
|
32
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
|
+
|
33
67
|
# Format a token stream.
|
34
68
|
def format(tokens, &b)
|
69
|
+
tokens = enum_for(:filter_escapes, tokens) unless Formatter.escape_enabled?
|
70
|
+
|
35
71
|
return stream(tokens, &b) if block_given?
|
36
72
|
|
37
73
|
out = String.new('')
|
@@ -6,23 +6,18 @@ module Rouge
|
|
6
6
|
class HTMLLinewise < Formatter
|
7
7
|
def initialize(formatter, opts={})
|
8
8
|
@formatter = formatter
|
9
|
+
@tag_name = opts.fetch(:tag_name, 'div')
|
9
10
|
@class_format = opts.fetch(:class, 'line-%i')
|
10
11
|
end
|
11
12
|
|
12
13
|
def stream(tokens, &b)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
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}>)
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
22
|
-
def next_line_class
|
23
|
-
@lineno ||= 0
|
24
|
-
sprintf(@class_format, @lineno += 1).inspect
|
25
|
-
end
|
26
21
|
end
|
27
22
|
end
|
28
23
|
end
|
@@ -16,46 +16,35 @@ module Rouge
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def style(scope)
|
19
|
-
yield
|
20
|
-
yield
|
19
|
+
yield %(#{scope} .rouge-table { border-spacing: 0 })
|
20
|
+
yield %(#{scope} .rouge-gutter { text-align: right })
|
21
21
|
end
|
22
22
|
|
23
23
|
def stream(tokens, &b)
|
24
|
-
|
25
|
-
last_val =
|
26
|
-
formatted =
|
27
|
-
|
28
|
-
tokens.each do |tok, val|
|
29
|
-
last_val = val
|
30
|
-
num_lines += val.scan(/\n/).size
|
31
|
-
formatted << @inner.span(tok, val)
|
32
|
-
end
|
33
|
-
|
34
|
-
# add an extra line for non-newline-terminated strings
|
35
|
-
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)
|
36
28
|
num_lines += 1
|
37
|
-
|
29
|
+
formatted << ?\n
|
38
30
|
end
|
39
31
|
|
40
32
|
# generate a string of newline-separated line numbers for the gutter>
|
41
|
-
formatted_line_numbers = (@start_line..num_lines
|
42
|
-
sprintf(
|
43
|
-
end.join(
|
44
|
-
|
45
|
-
numbers = %(<pre class="lineno">#{formatted_line_numbers}</pre>)
|
46
|
-
|
47
|
-
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
|
48
36
|
|
37
|
+
buffer = [%(<table class="#@table_class"><tbody><tr>)]
|
49
38
|
# the "gl" class applies the style for Generic.Lineno
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
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
|
59
48
|
end
|
60
49
|
end
|
61
50
|
end
|
@@ -101,6 +101,19 @@ module Rouge
|
|
101
101
|
|
102
102
|
Cpp
|
103
103
|
end
|
104
|
+
|
105
|
+
disambiguate '*.plist' do
|
106
|
+
next XML if matches?(/\A<\?xml\b/)
|
107
|
+
|
108
|
+
Plist
|
109
|
+
end
|
110
|
+
|
111
|
+
disambiguate '*.sc' do
|
112
|
+
next Python if matches?(/^#/)
|
113
|
+
next SuperCollider if matches?(/(?:^~|;$)/)
|
114
|
+
|
115
|
+
next Python
|
116
|
+
end
|
104
117
|
end
|
105
118
|
end
|
106
119
|
end
|
data/lib/rouge/lexer.rb
CHANGED
@@ -23,6 +23,14 @@ module Rouge
|
|
23
23
|
new(opts).lex(stream, &b)
|
24
24
|
end
|
25
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
|
+
|
26
34
|
# Given a name in string, return the correct lexer class.
|
27
35
|
# @param [String] name
|
28
36
|
# @return [Class<Rouge::Lexer>,nil]
|
@@ -118,7 +126,7 @@ module Rouge
|
|
118
126
|
|
119
127
|
# @return a list of all lexers.
|
120
128
|
def all
|
121
|
-
registry.values.uniq
|
129
|
+
@all ||= registry.values.uniq
|
122
130
|
end
|
123
131
|
|
124
132
|
# Guess which lexer to use based on a hash of info.
|
@@ -188,16 +196,24 @@ module Rouge
|
|
188
196
|
end
|
189
197
|
|
190
198
|
def disable_debug!
|
191
|
-
|
199
|
+
remove_instance_variable :@debug_enabled
|
192
200
|
end
|
193
201
|
|
194
202
|
def debug_enabled?
|
195
|
-
|
203
|
+
(defined? @debug_enabled) ? true : false
|
204
|
+
end
|
205
|
+
|
206
|
+
# Determine if a lexer has a method named +:detect?+ defined in its
|
207
|
+
# singleton class.
|
208
|
+
def detectable?
|
209
|
+
@detectable ||= methods(false).include?(:detect?)
|
196
210
|
end
|
197
211
|
|
198
212
|
protected
|
199
213
|
# @private
|
200
214
|
def register(name, lexer)
|
215
|
+
# reset an existing list of lexers
|
216
|
+
@all = nil if @all
|
201
217
|
registry[name.to_s] = lexer
|
202
218
|
end
|
203
219
|
|
@@ -236,6 +252,13 @@ module Rouge
|
|
236
252
|
|
237
253
|
# Specify a list of filename globs associated with this lexer.
|
238
254
|
#
|
255
|
+
# If a filename glob is associated with more than one lexer, this can
|
256
|
+
# cause a Guesser::Ambiguous error to be raised in various guessing
|
257
|
+
# methods. These errors can be avoided by disambiguation. Filename globs
|
258
|
+
# are disambiguated in one of two ways. Either the lexer will define a
|
259
|
+
# `self.detect?` method (intended for use with shebangs and doctypes) or a
|
260
|
+
# manual rule will be specified in Guessers::Disambiguation.
|
261
|
+
#
|
239
262
|
# @example
|
240
263
|
# class Ruby < Lexer
|
241
264
|
# filenames '*.rb', '*.ruby', 'Gemfile', 'Rakefile'
|
@@ -256,7 +279,9 @@ module Rouge
|
|
256
279
|
|
257
280
|
# @private
|
258
281
|
def assert_utf8!(str)
|
259
|
-
|
282
|
+
encoding = str.encoding.name
|
283
|
+
return if encoding == 'US-ASCII' || encoding == 'UTF-8' || encoding == 'ASCII-8BIT'
|
284
|
+
|
260
285
|
raise EncodingError.new(
|
261
286
|
"Bad encoding: #{str.encoding.names.join(',')}. " +
|
262
287
|
"Please convert your string to UTF-8."
|
@@ -390,15 +415,23 @@ module Rouge
|
|
390
415
|
|
391
416
|
# Given a string, yield [token, chunk] pairs. If no block is given,
|
392
417
|
# an enumerator is returned.
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
418
|
+
def lex(string, opts=nil, &b)
|
419
|
+
if opts
|
420
|
+
warn 'the :continue option to Formatter#lex is deprecated, use #continue_lex instead.'
|
421
|
+
return continue_lex(string, &b)
|
422
|
+
end
|
423
|
+
|
424
|
+
return enum_for(:lex, string) unless block_given?
|
398
425
|
|
399
426
|
Lexer.assert_utf8!(string)
|
427
|
+
reset!
|
400
428
|
|
401
|
-
|
429
|
+
continue_lex(string, &b)
|
430
|
+
end
|
431
|
+
|
432
|
+
# Continue the lex from the the current state without resetting
|
433
|
+
def continue_lex(string, &b)
|
434
|
+
return enum_for(:continue_lex, string, &b) unless block_given?
|
402
435
|
|
403
436
|
# consolidate consecutive tokens of the same type
|
404
437
|
last_token = nil
|
@@ -454,9 +487,7 @@ module Rouge
|
|
454
487
|
def self.load_lexer(relpath)
|
455
488
|
return if @_loaded_lexers.key?(relpath)
|
456
489
|
@_loaded_lexers[relpath] = true
|
457
|
-
|
458
|
-
root = Pathname.new(__FILE__).dirname.join('lexers')
|
459
|
-
load root.join(relpath)
|
490
|
+
load File.join(__dir__, 'lexers', relpath)
|
460
491
|
end
|
461
492
|
end
|
462
493
|
end
|