rouge 0.2.6 → 0.2.7
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.
- data/lib/rouge/lexer.rb +15 -2
- data/lib/rouge/lexers/c.rb +35 -16
- data/lib/rouge/lexers/common_lisp.rb +21 -23
- data/lib/rouge/lexers/cpp.rb +45 -25
- data/lib/rouge/lexers/factor.rb +9 -12
- data/lib/rouge/lexers/php.rb +24 -19
- data/lib/rouge/lexers/shell.rb +3 -1
- data/lib/rouge/lexers/viml.rb +14 -15
- data/lib/rouge/regex_lexer.rb +44 -90
- data/lib/rouge/version.rb +1 -1
- metadata +2 -2
data/lib/rouge/lexer.rb
CHANGED
@@ -259,9 +259,22 @@ module Rouge
|
|
259
259
|
# @example
|
260
260
|
# debug { "hello, world!" }
|
261
261
|
def debug(&b)
|
262
|
-
|
262
|
+
# This method is a hotspot, unfortunately.
|
263
|
+
#
|
264
|
+
# For performance reasons, the "debug" option of a lexer cannot
|
265
|
+
# be changed once it has begun lexing. This method will redefine
|
266
|
+
# itself on the first call to a noop if "debug" is not set.
|
267
|
+
if option(:debug)
|
268
|
+
class << self
|
269
|
+
def debug; puts yield; end
|
270
|
+
end
|
271
|
+
else
|
272
|
+
class << self
|
273
|
+
def debug; end
|
274
|
+
end
|
275
|
+
end
|
263
276
|
|
264
|
-
|
277
|
+
debug(&b)
|
265
278
|
end
|
266
279
|
|
267
280
|
# @abstract
|
data/lib/rouge/lexers/c.rb
CHANGED
@@ -11,18 +11,28 @@ module Rouge
|
|
11
11
|
ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
|
12
12
|
id = /[a-zA-Z_][a-zA-Z0-9_]*/
|
13
13
|
|
14
|
-
keywords
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
def self.keywords
|
15
|
+
@keywords ||= Set.new %w(
|
16
|
+
auto break case const continue default do else enum extern
|
17
|
+
for goto if register restricted return sizeof static struct
|
18
|
+
switch typedef union volatile virtual while
|
19
|
+
)
|
20
|
+
end
|
19
21
|
|
20
|
-
keywords_type
|
22
|
+
def self.keywords_type
|
23
|
+
@keywords_type ||= Set.new %w(
|
24
|
+
int long float short double char unsigned signed void
|
25
|
+
)
|
26
|
+
end
|
21
27
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
28
|
+
def self.reserved
|
29
|
+
@reserved ||= Set.new %w(
|
30
|
+
__asm __int8 __based __except __int16 __stdcall __cdecl
|
31
|
+
__fastcall __int32 __declspec __finally __int61 __try __leave
|
32
|
+
inline _inline __inline naked _naked __naked restrict _restrict
|
33
|
+
__restrict thread _thread __thread typename _typename __typename
|
34
|
+
)
|
35
|
+
end
|
26
36
|
|
27
37
|
state :whitespace do
|
28
38
|
rule /^#if\s+0\b/, 'Comment.Preproc', :if_0
|
@@ -41,6 +51,8 @@ module Rouge
|
|
41
51
|
end
|
42
52
|
|
43
53
|
state :statements do
|
54
|
+
rule /\s+/m, 'Text'
|
55
|
+
|
44
56
|
rule /L?"/, 'Literal.String', :string
|
45
57
|
rule %r(L?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, 'Literal.String.Char'
|
46
58
|
rule %r((\d+\.\d*|\.\d+|\d+)[e][+-]?\d+[lu]*)i, 'Literal.Number.Float'
|
@@ -51,13 +63,20 @@ module Rouge
|
|
51
63
|
rule %r([~!%^&*+=\|?:<>/-]), 'Operator'
|
52
64
|
rule /[()\[\],.]/, 'Punctuation'
|
53
65
|
rule /\bcase\b/, 'Keyword', :case
|
54
|
-
rule /(?:#{keywords.join('|')})\b/, 'Keyword'
|
55
|
-
rule /(?:#{keywords_type.join('|')})\b/, 'Keyword.Type'
|
56
|
-
rule /(?:_{0,2}inline|naked|restrict|thread|typename)\b/, 'Keyword.Reserved'
|
57
|
-
rule /__(?:#{__reserved.join('|')})\b/, 'Keyword.Reserved'
|
58
66
|
rule /(?:true|false|NULL)\b/, 'Name.Builtin'
|
59
|
-
rule id
|
60
|
-
|
67
|
+
rule id do |m|
|
68
|
+
name = m[0]
|
69
|
+
|
70
|
+
if self.class.keywords.include? name
|
71
|
+
token 'Keyword'
|
72
|
+
elsif self.class.keywords_type.include? name
|
73
|
+
token 'Keyword.Type'
|
74
|
+
elsif self.class.reserved.include? name
|
75
|
+
token 'Keyword.Reserved'
|
76
|
+
else
|
77
|
+
token 'Name'
|
78
|
+
end
|
79
|
+
end
|
61
80
|
end
|
62
81
|
|
63
82
|
state :case do
|
@@ -208,28 +208,6 @@ module Rouge
|
|
208
208
|
structure-object symbol synonym-stream t two-way-stream vector
|
209
209
|
)
|
210
210
|
|
211
|
-
postprocess 'Name.Variable' do |tok, val|
|
212
|
-
tok = if BUILTIN_FUNCTIONS.include? val
|
213
|
-
'Name.Builtin'
|
214
|
-
elsif SPECIAL_FORMS.include? val
|
215
|
-
'Keyword'
|
216
|
-
elsif MACROS.include? val
|
217
|
-
'Name.Builtin'
|
218
|
-
elsif LAMBDA_LIST_KEYWORDS.include? val
|
219
|
-
'Keyword'
|
220
|
-
elsif DECLARATIONS.include? val
|
221
|
-
'Keyword'
|
222
|
-
elsif BUILTIN_TYPES.include? val
|
223
|
-
'Keyword.Type'
|
224
|
-
elsif BUILTIN_CLASSES.include? val
|
225
|
-
'Name.Class'
|
226
|
-
else
|
227
|
-
'Name.Variable'
|
228
|
-
end
|
229
|
-
|
230
|
-
token tok, val
|
231
|
-
end
|
232
|
-
|
233
211
|
nonmacro = /\\.|[a-zA-Z0-9!$%&*+-\/<=>?@\[\]^_{}~]/
|
234
212
|
constituent = /#{nonmacro}|[#.:]/
|
235
213
|
terminated = /(?=[ "'()\n,;`])/ # whitespace or terminating macro chars
|
@@ -319,7 +297,27 @@ module Rouge
|
|
319
297
|
# functions and variables
|
320
298
|
# note that these get filtered through in stream_tokens
|
321
299
|
rule /\*#{symbol}\*/, 'Name.Variable.Global'
|
322
|
-
rule symbol
|
300
|
+
rule symbol do |m|
|
301
|
+
sym = m[0]
|
302
|
+
|
303
|
+
if BUILTIN_FUNCTIONS.include? sym
|
304
|
+
token 'Name.Builtin'
|
305
|
+
elsif SPECIAL_FORMS.include? sym
|
306
|
+
token 'Keyword'
|
307
|
+
elsif MACROS.include? sym
|
308
|
+
token 'Name.Builtin'
|
309
|
+
elsif LAMBDA_LIST_KEYWORDS.include? sym
|
310
|
+
token 'Keyword'
|
311
|
+
elsif DECLARATIONS.include? sym
|
312
|
+
token 'Keyword'
|
313
|
+
elsif BUILTIN_TYPES.include? sym
|
314
|
+
token 'Keyword.Type'
|
315
|
+
elsif BUILTIN_CLASSES.include? sym
|
316
|
+
token 'Name.Class'
|
317
|
+
else
|
318
|
+
token 'Name.Variable'
|
319
|
+
end
|
320
|
+
end
|
323
321
|
|
324
322
|
rule /\(/, 'Punctuation', :root
|
325
323
|
rule /\)/, 'Punctuation' do
|
data/lib/rouge/lexers/cpp.rb
CHANGED
@@ -12,26 +12,37 @@ module Rouge
|
|
12
12
|
'*.cxx', '*.hxx'
|
13
13
|
mimetypes 'text/x-c++hdr', 'text/x-c++src'
|
14
14
|
|
15
|
-
keywords
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
15
|
+
def self.keywords
|
16
|
+
@keywords ||= Set.new %w(
|
17
|
+
asm auto break case catch const const_cast continue
|
18
|
+
default delete do dynamic_cast else enum explicit export
|
19
|
+
extern for friend goto if mutable namespace new operator
|
20
|
+
private protected public register reinterpret_cast return
|
21
|
+
restrict sizeof static static_cast struct switch template
|
22
|
+
this throw throws try typedef typeid typename union using
|
23
|
+
volatile virtual while
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.keywords_type
|
28
|
+
@keywords_type ||= Set.new %w(
|
29
|
+
bool int long float short double char unsigned signed void wchar_t
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.reserved
|
34
|
+
@reserved ||= Set.new %w(
|
35
|
+
__asm __int8 __based __except __int16 __stdcall __cdecl
|
36
|
+
__fastcall __int32 __declspec __finally __int64 __try
|
37
|
+
__leave __wchar_t __w64 __virtual_inheritance __uuidof
|
38
|
+
__unaligned __super __single_inheritance __raise __noop
|
39
|
+
__multiple_inheritance __m128i __m128d __m128 __m64 __interface
|
40
|
+
__identifier __forceinline __event __assume
|
41
|
+
inline _inline __inline
|
42
|
+
naked _naked __naked
|
43
|
+
thread _thread __thread
|
44
|
+
)
|
45
|
+
end
|
35
46
|
|
36
47
|
# optional comments or whitespace
|
37
48
|
ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
|
@@ -61,18 +72,27 @@ module Rouge
|
|
61
72
|
rule %r([~!%^&*+=\|?:<>/-]), 'Operator'
|
62
73
|
rule /[()\[\],.;{}]/, 'Punctuation'
|
63
74
|
|
64
|
-
rule /(?:#{keywords.join('|')})\b/, 'Keyword'
|
65
75
|
rule /class\b/, 'Keyword', :classname
|
66
|
-
|
67
|
-
rule /(?:_{0,2}inline|naked|thread)\b/, 'Keyword.Reserved'
|
68
|
-
rule /__(?:#{__reserved.join('|')})\b/, 'Keyoword.Reserved'
|
76
|
+
|
69
77
|
# Offload C++ extensions, http://offload.codeplay.com/
|
70
78
|
rule /(?:__offload|__blockingoffload|__outer)\b/, 'Keyword.Pseudo'
|
71
79
|
|
72
80
|
rule /(true|false)\b/, 'Keyword.Constant'
|
73
81
|
rule /NULL\b/, 'Name.Builtin'
|
74
82
|
rule /#{id}:(?!:)/, 'Name.Label'
|
75
|
-
rule id
|
83
|
+
rule id do |m|
|
84
|
+
name = m[0]
|
85
|
+
|
86
|
+
if self.class.keywords.include? name
|
87
|
+
token 'Keyword'
|
88
|
+
elsif self.class.keywords_type.include? name
|
89
|
+
token 'Keyword.Type'
|
90
|
+
elsif self.class.reserved.include? name
|
91
|
+
token 'Keyword.Reserved'
|
92
|
+
else
|
93
|
+
token 'Name'
|
94
|
+
end
|
95
|
+
end
|
76
96
|
end
|
77
97
|
|
78
98
|
state :classname do
|
data/lib/rouge/lexers/factor.rb
CHANGED
@@ -262,8 +262,15 @@ module Rouge
|
|
262
262
|
rule /(?:deprecated|final|foldable|flushable|inline|recursive)(?=\s)/,
|
263
263
|
'Keyword'
|
264
264
|
|
265
|
-
|
266
|
-
|
265
|
+
rule /\S+/ do |m|
|
266
|
+
name = m[0]
|
267
|
+
|
268
|
+
if self.class.builtins.values.any? { |b| b.include? name }
|
269
|
+
token 'Name.Builtin'
|
270
|
+
else
|
271
|
+
token 'Name'
|
272
|
+
end
|
273
|
+
end
|
267
274
|
end
|
268
275
|
|
269
276
|
state :stack_effect do
|
@@ -286,16 +293,6 @@ module Rouge
|
|
286
293
|
rule /\s+/, 'Text'
|
287
294
|
rule /\S+/, 'Name.Namespace'
|
288
295
|
end
|
289
|
-
|
290
|
-
postprocess 'Postprocess.Word' do |tok, val|
|
291
|
-
tok = if self.class.builtins.values.any? { |b| b.include? val }
|
292
|
-
'Name.Builtin'
|
293
|
-
else
|
294
|
-
'Name'
|
295
|
-
end
|
296
|
-
|
297
|
-
token tok, val
|
298
|
-
end
|
299
296
|
end
|
300
297
|
end
|
301
298
|
end
|
data/lib/rouge/lexers/php.rb
CHANGED
@@ -43,17 +43,19 @@ module Rouge
|
|
43
43
|
push :php if start_inline?
|
44
44
|
end
|
45
45
|
|
46
|
-
keywords
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
46
|
+
def self.keywords
|
47
|
+
@keywords ||= Set.new %w(
|
48
|
+
and E_PARSE old_function E_ERROR or as E_WARNING parent eval
|
49
|
+
PHP_OS break exit case extends PHP_VERSION cfunction FALSE
|
50
|
+
print for require continue foreach require_once declare return
|
51
|
+
default static do switch die stdClass echo else TRUE elseif
|
52
|
+
var empty if xor enddeclare include virtual endfor include_once
|
53
|
+
while endforeach global __FILE__ endif list __LINE__ endswitch
|
54
|
+
new __sleep endwhile not array __wakeup E_ALL NULL final
|
55
|
+
php_user_filter interface implements public private protected
|
56
|
+
abstract clone try catch throw this use namespace
|
57
|
+
)
|
58
|
+
end
|
57
59
|
|
58
60
|
state :root do
|
59
61
|
rule /<\?(php|=)?/, 'Comment.Preproc', :php
|
@@ -93,13 +95,22 @@ module Rouge
|
|
93
95
|
group 'Keyword'; group 'Text'; group 'Name.Constant'
|
94
96
|
end
|
95
97
|
|
96
|
-
rule /(?:#{keywords.join('|')})\b/, 'Keyword'
|
97
98
|
rule /(true|false|null)\b/, 'Keyword.Constant'
|
98
99
|
rule /\$\{\$+[a-z_]\w*\}/i, 'Name.Variable'
|
99
100
|
rule /\$+[a-z_]\w*/i, 'Name.Variable'
|
100
101
|
|
101
102
|
# may be intercepted for builtin highlighting
|
102
|
-
rule /[\\a-z_][\\\w]*/i
|
103
|
+
rule /[\\a-z_][\\\w]*/i do |m|
|
104
|
+
name = m[0]
|
105
|
+
|
106
|
+
if self.class.keywords.include? name
|
107
|
+
token 'Keyword'
|
108
|
+
elsif self.builtins.include? name
|
109
|
+
token 'Name.Builtin'
|
110
|
+
else
|
111
|
+
token 'Name.Other'
|
112
|
+
end
|
113
|
+
end
|
103
114
|
|
104
115
|
rule /(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?/i, 'Literal.Number.Float'
|
105
116
|
rule /\d+e[+-]?\d+/i, 'Literal.Number.Float'
|
@@ -146,12 +157,6 @@ module Rouge
|
|
146
157
|
rule /\}/, 'Literal.String.Interpol', :pop!
|
147
158
|
mixin :php
|
148
159
|
end
|
149
|
-
|
150
|
-
postprocess 'Name.Other' do |tok, val|
|
151
|
-
tok = 'Name.Builtin' if builtins.include? val
|
152
|
-
|
153
|
-
token tok, val
|
154
|
-
end
|
155
160
|
end
|
156
161
|
end
|
157
162
|
end
|
data/lib/rouge/lexers/shell.rb
CHANGED
@@ -5,7 +5,9 @@ module Rouge
|
|
5
5
|
|
6
6
|
tag 'shell'
|
7
7
|
aliases 'bash', 'zsh', 'ksh', 'sh'
|
8
|
-
filenames '*.sh', '*.bash', '*.zsh', '*.ksh'
|
8
|
+
filenames '*.sh', '*.bash', '*.zsh', '*.ksh',
|
9
|
+
'.bashrc', '.zshrc', '.kshrc', '.profile'
|
10
|
+
|
9
11
|
mimetypes 'application/x-sh', 'application/x-shellscript'
|
10
12
|
|
11
13
|
def self.analyze_text(text)
|
data/lib/rouge/lexers/viml.rb
CHANGED
@@ -41,26 +41,25 @@ module Rouge
|
|
41
41
|
rule /\b(NONE|bold|italic|underline|dark|light)\b/, 'Name.Builtin'
|
42
42
|
|
43
43
|
rule /[absg]:\w+\b/, 'Name.Variable'
|
44
|
-
rule /\b\w+\b
|
44
|
+
rule /\b\w+\b/ do |m|
|
45
|
+
name = m[0]
|
46
|
+
keywords = self.class.keywords
|
47
|
+
|
48
|
+
if mapping_contains?(keywords[:command], name)
|
49
|
+
token 'Keyword'
|
50
|
+
elsif mapping_contains?(keywords[:option], name)
|
51
|
+
token 'Name.Builtin'
|
52
|
+
elsif mapping_contains?(keywords[:auto], name)
|
53
|
+
token 'Name.Builtin'
|
54
|
+
else
|
55
|
+
token 'Text'
|
56
|
+
end
|
57
|
+
end
|
45
58
|
|
46
59
|
# no errors in VimL!
|
47
60
|
rule /./m, 'Text'
|
48
61
|
end
|
49
62
|
|
50
|
-
postprocess 'Postprocess.Name' do |tok, name|
|
51
|
-
keywords = self.class.keywords
|
52
|
-
|
53
|
-
if mapping_contains?(keywords[:command], name)
|
54
|
-
token 'Keyword', name
|
55
|
-
elsif mapping_contains?(keywords[:option], name)
|
56
|
-
token 'Name.Builtin', name
|
57
|
-
elsif mapping_contains?(keywords[:auto], name)
|
58
|
-
token 'Name.Builtin', name
|
59
|
-
else
|
60
|
-
token 'Text', name
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
63
|
def mapping_contains?(mapping, word)
|
65
64
|
shortest, longest = find_likely_mapping(mapping, word)
|
66
65
|
|
data/lib/rouge/regex_lexer.rb
CHANGED
@@ -45,10 +45,15 @@ module Rouge
|
|
45
45
|
@rules ||= []
|
46
46
|
end
|
47
47
|
|
48
|
-
def load!
|
48
|
+
def load!(lexer_class)
|
49
49
|
return self if @loaded
|
50
50
|
@loaded = true
|
51
51
|
StateDSL.new(rules).instance_eval(&@defn)
|
52
|
+
|
53
|
+
rules.map! do |rule|
|
54
|
+
rule.is_a?(String) ? lexer_class.get_state(rule) : rule
|
55
|
+
end
|
56
|
+
|
52
57
|
self
|
53
58
|
end
|
54
59
|
end
|
@@ -79,20 +84,13 @@ module Rouge
|
|
79
84
|
# {RegexLexer#token}, and {RegexLexer#delegate}. The first
|
80
85
|
# argument can be used to access the match groups.
|
81
86
|
def rule(re, tok=nil, next_state=nil, &callback)
|
82
|
-
|
83
|
-
|
87
|
+
callback ||= case next_state
|
88
|
+
when :pop!
|
89
|
+
proc { token tok; pop! }
|
90
|
+
when Symbol
|
91
|
+
proc { token tok; push next_state }
|
84
92
|
else
|
85
|
-
|
86
|
-
|
87
|
-
callback = proc do
|
88
|
-
token tok
|
89
|
-
case next_state
|
90
|
-
when :pop!
|
91
|
-
pop!
|
92
|
-
when Symbol
|
93
|
-
push next_state
|
94
|
-
end # else pass
|
95
|
-
end
|
93
|
+
proc { token tok }
|
96
94
|
end
|
97
95
|
|
98
96
|
rules << Rule.new(re, callback)
|
@@ -127,25 +125,6 @@ module Rouge
|
|
127
125
|
start_procs << b
|
128
126
|
end
|
129
127
|
|
130
|
-
# Specify a filter to be applied as the lexer yields tokens.
|
131
|
-
#
|
132
|
-
# @param toktype
|
133
|
-
# The token type to postprocess
|
134
|
-
# @yield [tok, val]
|
135
|
-
# The token and the matched value. The block will be evaluated in
|
136
|
-
# the context of the lexer, and it must yield an equivalent
|
137
|
-
# token/value pair, usually by calling #token.
|
138
|
-
def self.postprocess(toktype, &b)
|
139
|
-
postprocesses << [Token[toktype], b]
|
140
|
-
end
|
141
|
-
|
142
|
-
# where the postprocess blocks are stored.
|
143
|
-
# @see postprocess
|
144
|
-
def self.postprocesses
|
145
|
-
@postprocesses ||= InheritableList.new(superclass.postprocesses)
|
146
|
-
end
|
147
|
-
@postprocesses = []
|
148
|
-
|
149
128
|
# Define a new state for this lexer with the given name.
|
150
129
|
# The block will be evaluated in the context of a {StateDSL}.
|
151
130
|
def self.state(name, &b)
|
@@ -159,7 +138,7 @@ module Rouge
|
|
159
138
|
|
160
139
|
state = states[name.to_s]
|
161
140
|
raise "unknown state: #{name}" unless state
|
162
|
-
state.load!
|
141
|
+
state.load!(self)
|
163
142
|
end
|
164
143
|
|
165
144
|
# @private
|
@@ -205,21 +184,6 @@ module Rouge
|
|
205
184
|
#
|
206
185
|
# @see #step #step (where (2.) is implemented)
|
207
186
|
def stream_tokens(stream, &b)
|
208
|
-
stream_without_postprocessing(stream) do |tok, val|
|
209
|
-
_, processor = self.class.postprocesses.find { |t, _| t === tok }
|
210
|
-
|
211
|
-
if processor
|
212
|
-
with_output_stream(b) do
|
213
|
-
instance_exec(tok, val, &processor)
|
214
|
-
end
|
215
|
-
else
|
216
|
-
yield tok, val
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
# @private
|
222
|
-
def stream_without_postprocessing(stream, &b)
|
223
187
|
until stream.eos?
|
224
188
|
debug { "lexer: #{self.class.tag}" }
|
225
189
|
debug { "stack: #{stack.map(&:name).inspect}" }
|
@@ -240,35 +204,25 @@ module Rouge
|
|
240
204
|
# @return false otherwise.
|
241
205
|
def step(state, stream, &b)
|
242
206
|
state.rules.each do |rule|
|
243
|
-
|
244
|
-
|
207
|
+
case rule
|
208
|
+
when State
|
209
|
+
debug { " entering mixin #{rule.name}" }
|
210
|
+
return true if step(rule, stream, &b)
|
211
|
+
debug { " exiting mixin #{rule.name}" }
|
212
|
+
when Rule
|
213
|
+
debug { " trying #{rule.inspect}" }
|
245
214
|
|
246
|
-
|
247
|
-
|
215
|
+
if run_rule(rule, stream)
|
216
|
+
debug { " got #{stream[0].inspect}" }
|
248
217
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
debug { " entering mixin #{rule}" }
|
254
|
-
res = step(get_state(rule), stream, &b)
|
255
|
-
debug { " exiting mixin #{rule}" }
|
256
|
-
res
|
257
|
-
when Rule
|
258
|
-
debug { " trying #{rule.inspect}" }
|
259
|
-
# XXX HACK XXX
|
260
|
-
# StringScanner's implementation of ^ is b0rken.
|
261
|
-
# see http://bugs.ruby-lang.org/issues/7092
|
262
|
-
# TODO: this doesn't cover cases like /(a|^b)/, but it's
|
263
|
-
# the most common, for now...
|
264
|
-
return false if rule.beginning_of_line? && !stream.beginning_of_line?
|
265
|
-
|
266
|
-
scan(stream, rule.re) do
|
267
|
-
debug { " got #{stream[0].inspect}" }
|
268
|
-
|
269
|
-
run_callback(stream, rule.callback, &b)
|
218
|
+
run_callback(stream, rule.callback, &b)
|
219
|
+
|
220
|
+
return true
|
221
|
+
end
|
270
222
|
end
|
271
223
|
end
|
224
|
+
|
225
|
+
false
|
272
226
|
end
|
273
227
|
|
274
228
|
# @private
|
@@ -286,28 +240,28 @@ module Rouge
|
|
286
240
|
MAX_NULL_SCANS = 5
|
287
241
|
|
288
242
|
# @private
|
289
|
-
def
|
290
|
-
|
291
|
-
|
292
|
-
|
243
|
+
def run_rule(rule, scanner, &b)
|
244
|
+
# XXX HACK XXX
|
245
|
+
# StringScanner's implementation of ^ is b0rken.
|
246
|
+
# see http://bugs.ruby-lang.org/issues/7092
|
247
|
+
# TODO: this doesn't cover cases like /(a|^b)/, but it's
|
248
|
+
# the most common, for now...
|
249
|
+
return false if rule.beginning_of_line? && !scanner.beginning_of_line?
|
250
|
+
|
251
|
+
if (@null_steps ||= 0) >= MAX_NULL_SCANS
|
293
252
|
debug { " too many scans without consuming the string!" }
|
294
253
|
return false
|
295
254
|
end
|
296
255
|
|
297
|
-
scanner.scan(re)
|
256
|
+
scanner.scan(rule.re) or return false
|
298
257
|
|
299
|
-
if scanner.
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
@null_steps = 0
|
304
|
-
end
|
305
|
-
|
306
|
-
yield self
|
307
|
-
return true
|
258
|
+
if scanner.matched_size.zero?
|
259
|
+
@null_steps += 1
|
260
|
+
else
|
261
|
+
@null_steps = 0
|
308
262
|
end
|
309
263
|
|
310
|
-
|
264
|
+
true
|
311
265
|
end
|
312
266
|
|
313
267
|
# Yield a token.
|
@@ -358,7 +312,7 @@ module Rouge
|
|
358
312
|
push_state = if state_name
|
359
313
|
get_state(state_name)
|
360
314
|
elsif block_given?
|
361
|
-
State.new(b.inspect, &b).load!
|
315
|
+
State.new(b.inspect, &b).load!(self.class)
|
362
316
|
else
|
363
317
|
# use the top of the stack by default
|
364
318
|
self.state
|
data/lib/rouge/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rouge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|