rouge 0.5.1 → 0.5.2
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/demos/objective_c +12 -0
- data/lib/rouge/lexer.rb +1 -1
- data/lib/rouge/lexers/c.rb +55 -24
- data/lib/rouge/lexers/cpp.rb +17 -122
- data/lib/rouge/lexers/objective_c.rb +186 -0
- data/lib/rouge/lexers/sass.rb +1 -3
- data/lib/rouge/lexers/sass/common.rb +136 -145
- data/lib/rouge/lexers/scss.rb +1 -3
- data/lib/rouge/lexers/yaml.rb +5 -5
- data/lib/rouge/regex_lexer.rb +74 -23
- data/lib/rouge/version.rb +1 -1
- metadata +4 -2
data/lib/rouge/lexer.rb
CHANGED
data/lib/rouge/lexers/c.rb
CHANGED
@@ -22,6 +22,19 @@ module Rouge
|
|
22
22
|
def self.keywords_type
|
23
23
|
@keywords_type ||= Set.new %w(
|
24
24
|
int long float short double char unsigned signed void
|
25
|
+
|
26
|
+
jmp_buf FILE DIR div_t ldiv_t mbstate_t sig_atomic_t fpos_t
|
27
|
+
clock_t time_t va_list size_t ssize_t off_t wchar_t ptrdiff_t
|
28
|
+
wctrans_t wint_t wctype_t
|
29
|
+
|
30
|
+
_Bool _Complex int8_t int16_t int32_t int64_t
|
31
|
+
uint8_t uint16_t uint32_t uint64_t int_least8_t
|
32
|
+
int_least16_t int_least32_t int_least64_t
|
33
|
+
uint_least8_t uint_least16_t uint_least32_t
|
34
|
+
uint_least64_t int_fast8_t int_fast16_t int_fast32_t
|
35
|
+
int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t
|
36
|
+
uint_fast64_t intptr_t uintptr_t intmax_t
|
37
|
+
uintmax_t
|
25
38
|
)
|
26
39
|
end
|
27
40
|
|
@@ -34,20 +47,31 @@ module Rouge
|
|
34
47
|
)
|
35
48
|
end
|
36
49
|
|
50
|
+
# high priority for filename matches
|
51
|
+
def self.analyze_text(*)
|
52
|
+
0.3
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.builtins
|
56
|
+
@builtins ||= []
|
57
|
+
end
|
58
|
+
|
37
59
|
start { push :bol }
|
38
60
|
|
39
|
-
state :
|
61
|
+
state :expr_bol do
|
40
62
|
mixin :inline_whitespace
|
41
63
|
|
42
|
-
rule /#if\s0/, Comment
|
43
|
-
|
64
|
+
rule /#if\s0/, Comment, :if_0
|
44
65
|
rule /#/, Comment::Preproc, :macro
|
45
66
|
|
46
|
-
rule /#{id}:(?!:)/, Name::Label
|
47
|
-
|
48
67
|
rule(//) { pop! }
|
49
68
|
end
|
50
69
|
|
70
|
+
state :bol do
|
71
|
+
rule /#{id}:(?!:)/, Name::Label
|
72
|
+
mixin :expr_bol
|
73
|
+
end
|
74
|
+
|
51
75
|
state :inline_whitespace do
|
52
76
|
rule /[ \t\r]+/, Text
|
53
77
|
rule /\\\n/, Text # line continuation
|
@@ -55,14 +79,18 @@ module Rouge
|
|
55
79
|
end
|
56
80
|
|
57
81
|
state :whitespace do
|
58
|
-
rule /\n
|
82
|
+
rule /\n+/m, Text, :bol
|
59
83
|
rule %r(//(\\.|.)*?\n), Comment::Single, :bol
|
60
84
|
mixin :inline_whitespace
|
61
85
|
end
|
62
86
|
|
63
|
-
state :
|
64
|
-
rule /\
|
87
|
+
state :expr_whitespace do
|
88
|
+
rule /\n+/m, Text, :expr_bol
|
89
|
+
mixin :whitespace
|
90
|
+
end
|
65
91
|
|
92
|
+
state :statements do
|
93
|
+
mixin :whitespace
|
66
94
|
rule /L?"/, Str, :string
|
67
95
|
rule %r(L?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char
|
68
96
|
rule %r((\d+\.\d*|\.\d+|\d+)[e][+-]?\d+[lu]*)i, Num::Float
|
@@ -83,6 +111,8 @@ module Rouge
|
|
83
111
|
token Keyword::Type
|
84
112
|
elsif self.class.reserved.include? name
|
85
113
|
token Keyword::Reserved
|
114
|
+
elsif self.class.builtins.include? name
|
115
|
+
token Name::Builtin
|
86
116
|
else
|
87
117
|
token Name
|
88
118
|
end
|
@@ -95,7 +125,7 @@ module Rouge
|
|
95
125
|
end
|
96
126
|
|
97
127
|
state :root do
|
98
|
-
mixin :
|
128
|
+
mixin :expr_whitespace
|
99
129
|
|
100
130
|
# functions
|
101
131
|
rule %r(
|
@@ -105,10 +135,10 @@ module Rouge
|
|
105
135
|
(#{ws})({) # open brace
|
106
136
|
)mx do |m|
|
107
137
|
# TODO: do this better.
|
108
|
-
|
138
|
+
recurse m[1]
|
109
139
|
token Name::Function, m[2]
|
110
|
-
|
111
|
-
|
140
|
+
recurse m[3]
|
141
|
+
recurse m[4]
|
112
142
|
token Punctuation, m[5]
|
113
143
|
push :function
|
114
144
|
end
|
@@ -121,10 +151,10 @@ module Rouge
|
|
121
151
|
(#{ws})(;) # semicolon
|
122
152
|
)mx do |m|
|
123
153
|
# TODO: do this better.
|
124
|
-
|
154
|
+
recurse m[1]
|
125
155
|
token Name::Function
|
126
|
-
|
127
|
-
|
156
|
+
recurse m[3]
|
157
|
+
recurse m[4]
|
128
158
|
token Punctuation
|
129
159
|
push :statement
|
130
160
|
end
|
@@ -134,7 +164,7 @@ module Rouge
|
|
134
164
|
|
135
165
|
state :statement do
|
136
166
|
rule /;/, Punctuation, :pop!
|
137
|
-
mixin :
|
167
|
+
mixin :expr_whitespace
|
138
168
|
mixin :statements
|
139
169
|
rule /[{}]/, Punctuation
|
140
170
|
end
|
@@ -156,18 +186,19 @@ module Rouge
|
|
156
186
|
end
|
157
187
|
|
158
188
|
state :macro do
|
159
|
-
|
160
|
-
rule %r(/[*].*?[*]/)m, Comment::Multiline
|
161
|
-
rule %r(//.*$), Comment::Single
|
162
|
-
rule %r(/), Comment::Preproc
|
163
|
-
rule /(?<=\\)\n/, Comment::Preproc
|
189
|
+
# NB: pop! goes back to :bol
|
164
190
|
rule /\n/, Comment::Preproc, :pop!
|
191
|
+
rule %r([^/\n\\]+), Comment::Preproc
|
192
|
+
rule /\\./m, Comment::Preproc
|
193
|
+
mixin :inline_whitespace
|
194
|
+
rule %r(/), Comment::Preproc
|
165
195
|
end
|
166
196
|
|
167
197
|
state :if_0 do
|
168
|
-
|
169
|
-
rule /^\s*#
|
170
|
-
rule /^\s
|
198
|
+
# NB: no \b here, to cover #ifdef and #ifndef
|
199
|
+
rule /^\s*#if/, Comment, :if_0
|
200
|
+
rule /^\s*#\s*el(?:se|if)/, Comment, :pop!
|
201
|
+
rule /^\s*#\s*endif\b.*?(?<!\\)\n/m, Comment, :pop!
|
171
202
|
rule /.*?\n/, Comment
|
172
203
|
end
|
173
204
|
end
|
data/lib/rouge/lexers/cpp.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
require Pathname.new(__FILE__).dirname.join('c.rb')
|
2
|
+
|
1
3
|
module Rouge
|
2
4
|
module Lexers
|
3
|
-
class Cpp <
|
5
|
+
class Cpp < C
|
4
6
|
desc "The C++ programming language"
|
5
7
|
|
6
8
|
tag 'cpp'
|
@@ -13,110 +15,30 @@ module Rouge
|
|
13
15
|
mimetypes 'text/x-c++hdr', 'text/x-c++src'
|
14
16
|
|
15
17
|
def self.keywords
|
16
|
-
@keywords ||= Set.new
|
17
|
-
asm
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
)
|
18
|
+
@keywords ||= super + Set.new(%w(
|
19
|
+
asm catch const_cast delete dynamic_cast explicit export
|
20
|
+
friend mutable namespace new operator private protected public
|
21
|
+
reinterpret_cast restrict static_cast template this throw
|
22
|
+
throws typeid typename using virtual
|
23
|
+
))
|
31
24
|
end
|
32
25
|
|
33
26
|
def self.reserved
|
34
|
-
@reserved ||= Set.new
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
)
|
27
|
+
@reserved ||= super + Set.new(%w(
|
28
|
+
__virtual_inheritance __uuidof __super __single_inheritance
|
29
|
+
__multiple_inheritance __interface __event
|
30
|
+
))
|
45
31
|
end
|
46
32
|
|
47
|
-
# optional comments or whitespace
|
48
|
-
ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
|
49
33
|
id = /[a-zA-Z_][a-zA-Z0-9]*/
|
50
34
|
|
51
|
-
|
52
|
-
|
53
|
-
state :bol do
|
54
|
-
mixin :inline_whitespace
|
55
|
-
rule /#if\s+0/ do
|
56
|
-
token Comment::Preproc
|
57
|
-
goto :if_0
|
58
|
-
end
|
59
|
-
|
60
|
-
rule /#/ do
|
61
|
-
token Comment::Preproc
|
62
|
-
goto :macro
|
63
|
-
end
|
64
|
-
|
65
|
-
rule(//) { pop! }
|
66
|
-
end
|
67
|
-
|
68
|
-
state :inline_whitespace do
|
69
|
-
rule /[ \t\r]+/, Text
|
70
|
-
rule /\\\n/, Text
|
71
|
-
rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline
|
72
|
-
end
|
73
|
-
|
74
|
-
state :whitespace do
|
75
|
-
mixin :inline_whitespace
|
76
|
-
rule %r(/(\\\n)?/(\n|(.|\n)*?[^\\]\n)), Comment::Single, :bol
|
77
|
-
rule /\n/, Text, :bol
|
78
|
-
end
|
79
|
-
|
80
|
-
state :multiline_comment do
|
81
|
-
rule %r([*](\\\n)?/), Comment::Multiline, :pop!
|
82
|
-
rule %r([*]), Comment::Multiline
|
83
|
-
rule %r([^*]+), Comment::Multiline
|
84
|
-
end
|
85
|
-
|
86
|
-
state :root do
|
87
|
-
mixin :whitespace
|
88
|
-
|
89
|
-
rule /L?"/, Str, :string
|
90
|
-
rule %r(L?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char
|
91
|
-
rule %r((\d+\.\d*|\.\d+|\d+)[e][+-]?\d+[lu]*)i, Num::Float
|
92
|
-
rule /0x[0-9a-f]+[lu]*/i, Num::Hex
|
93
|
-
rule /0[0-7]+[lu]*/i, Num::Oct
|
94
|
-
rule /\d+[lu]*/i, Num::Integer
|
95
|
-
rule %r(\*/), Error
|
96
|
-
rule %r([~!%^&*+=\|?:<>/-]), Operator
|
97
|
-
rule /[()\[\],.;{}]/, Punctuation
|
98
|
-
|
99
|
-
rule /class\b/, Keyword, :classname
|
100
|
-
|
35
|
+
prepend :root do
|
101
36
|
# Offload C++ extensions, http://offload.codeplay.com/
|
102
37
|
rule /(?:__offload|__blockingoffload|__outer)\b/, Keyword::Pseudo
|
38
|
+
end
|
103
39
|
|
104
|
-
|
105
|
-
rule /
|
106
|
-
rule /#{id}:(?!:)/, Name::Label
|
107
|
-
rule id do |m|
|
108
|
-
name = m[0]
|
109
|
-
|
110
|
-
if self.class.keywords.include? name
|
111
|
-
token Keyword
|
112
|
-
elsif self.class.keywords_type.include? name
|
113
|
-
token Keyword::Type
|
114
|
-
elsif self.class.reserved.include? name
|
115
|
-
token Keyword::Reserved
|
116
|
-
else
|
117
|
-
token Name
|
118
|
-
end
|
119
|
-
end
|
40
|
+
prepend :statements do
|
41
|
+
rule /class\b/, Keyword, :classname
|
120
42
|
end
|
121
43
|
|
122
44
|
state :classname do
|
@@ -126,33 +48,6 @@ module Rouge
|
|
126
48
|
rule /\s*(?=>)/m, Text, :pop!
|
127
49
|
mixin :whitespace
|
128
50
|
end
|
129
|
-
|
130
|
-
state :string do
|
131
|
-
rule /"/, Str, :pop!
|
132
|
-
rule /\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape
|
133
|
-
rule /[^\\"\n]+/, Str
|
134
|
-
rule /\\\n/, Str
|
135
|
-
rule /\\/, Str # stray backslash
|
136
|
-
end
|
137
|
-
|
138
|
-
state :macro do
|
139
|
-
rule %r([^/\n]+), Comment::Preproc
|
140
|
-
rule %r(/[*].*?[*]/)m, Comment::Multiline
|
141
|
-
rule %r(//.*$), Comment::Single
|
142
|
-
rule %r(/), Comment::Preproc
|
143
|
-
rule /(?<=\\)\n/, Comment::Preproc
|
144
|
-
rule /\n/ do
|
145
|
-
token Comment::Preproc
|
146
|
-
goto :bol
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
state :if_0 do
|
151
|
-
rule /^\s*#if.*?(?<!\\)\n/, Comment::Preproc, :if_0
|
152
|
-
rule /^\s*#el(?:se|if).*\n/, Comment::Preproc, :pop!
|
153
|
-
rule /^\s*#endif.*?(?<!\\)\n/, Comment::Preproc, :pop!
|
154
|
-
rule /.*?\n/, Comment
|
155
|
-
end
|
156
51
|
end
|
157
52
|
end
|
158
53
|
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
require Pathname.new(__FILE__).dirname.join('c.rb')
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class ObjectiveC < C
|
6
|
+
desc 'objective_c'
|
7
|
+
tag 'objective_c'
|
8
|
+
aliases 'objc'
|
9
|
+
filenames '*.m', '*.h'
|
10
|
+
|
11
|
+
mimetypes 'text/x-objective_c', 'application/x-objective_c'
|
12
|
+
|
13
|
+
def self.at_keywords
|
14
|
+
@at_keywords ||= %w(
|
15
|
+
selector private protected public encode synchronized try
|
16
|
+
throw catch finally end property synthesize dynamic optional
|
17
|
+
interface implementation
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.at_builtins
|
22
|
+
@at_builtins ||= %w(true false YES NO)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.builtins
|
26
|
+
@builtins ||= %w(YES NO nil)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.analyze_text(text)
|
30
|
+
return 1 if text =~ /@(end|implementation|protocol)\b/
|
31
|
+
|
32
|
+
id = /[a-z$_][a-z0-9$_]*/i
|
33
|
+
return 0.4 if text =~ %r(
|
34
|
+
\[ \s* #{id} \s+
|
35
|
+
(?:
|
36
|
+
#{id} \s* \]
|
37
|
+
| #{id}? :
|
38
|
+
)
|
39
|
+
)x
|
40
|
+
return 0.4 if text.include? '@"'
|
41
|
+
end
|
42
|
+
|
43
|
+
id = /[a-z$_][a-z0-9$_]*/i
|
44
|
+
|
45
|
+
prepend :statements do
|
46
|
+
rule /@"/, Str, :string
|
47
|
+
rule /@'(\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|\\.|[^\\'\n]')/
|
48
|
+
Str::Char
|
49
|
+
rule /@(\d+[.]\d*|[.]\d+|\d+)e[+-]?\d+l?/i,
|
50
|
+
Num::Float
|
51
|
+
rule /@(\d+[.]\d*|[.]\d+|\d+f)f?/i, Num::Float
|
52
|
+
rule /@0x\h+[lL]?/, Num::Hex
|
53
|
+
rule /@0[0-7]+l?/i, Num::Oct
|
54
|
+
rule /@\d+l?/, Num::Integer
|
55
|
+
rule /\bin\b/, Keyword
|
56
|
+
|
57
|
+
rule /@(?:interface|implementation)\b/ do
|
58
|
+
token Keyword
|
59
|
+
goto :classname
|
60
|
+
end
|
61
|
+
|
62
|
+
rule /@(?:class|protocol)\b/ do
|
63
|
+
token Keyword
|
64
|
+
goto :forward_classname
|
65
|
+
end
|
66
|
+
|
67
|
+
rule /@([[:alnum:]]+)/ do |m|
|
68
|
+
if self.class.at_keywords.include? m[1]
|
69
|
+
token Keyword
|
70
|
+
elsif self.class.at_builtins.include? m[1]
|
71
|
+
token Name::Builtin
|
72
|
+
else
|
73
|
+
token Error
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
rule /[?]/, Punctuation, :ternary
|
78
|
+
rule /\[/, Punctuation, :message
|
79
|
+
end
|
80
|
+
|
81
|
+
state :ternary do
|
82
|
+
rule /:/, Punctuation, :pop!
|
83
|
+
mixin :statements
|
84
|
+
end
|
85
|
+
|
86
|
+
state :message_shared do
|
87
|
+
rule /\]/, Punctuation, :pop!
|
88
|
+
rule /;/, Error
|
89
|
+
|
90
|
+
mixin :statement
|
91
|
+
end
|
92
|
+
|
93
|
+
state :message do
|
94
|
+
rule /(#{id})(\s*)(:)/ do
|
95
|
+
groups(Name::Function, Text, Punctuation)
|
96
|
+
goto :message_with_args
|
97
|
+
end
|
98
|
+
|
99
|
+
rule /(#{id})(\s*)(\])/ do
|
100
|
+
groups(Name::Function, Text, Punctuation)
|
101
|
+
pop!
|
102
|
+
end
|
103
|
+
|
104
|
+
mixin :message_shared
|
105
|
+
end
|
106
|
+
|
107
|
+
state :message_with_args do
|
108
|
+
rule /(#{id})(\s*)(:)/ do
|
109
|
+
groups(Name::Function, Text, Punctuation)
|
110
|
+
end
|
111
|
+
|
112
|
+
mixin :message_shared
|
113
|
+
end
|
114
|
+
|
115
|
+
state :classname do
|
116
|
+
mixin :whitespace
|
117
|
+
|
118
|
+
rule /(#{id})(\s*)(:)(\s*)(#{id})/ do
|
119
|
+
groups(Name::Class, Text,
|
120
|
+
Punctuation, Text,
|
121
|
+
Name::Class)
|
122
|
+
pop!
|
123
|
+
end
|
124
|
+
|
125
|
+
rule /(#{id})(\s*)([(])(\s*)(#{id})(\s*)([)])/ do
|
126
|
+
groups(Name::Class, Text,
|
127
|
+
Punctuation, Text,
|
128
|
+
Name::Label, Text,
|
129
|
+
Punctuation)
|
130
|
+
end
|
131
|
+
|
132
|
+
rule id, Name::Class, :pop!
|
133
|
+
end
|
134
|
+
|
135
|
+
state :forward_classname do
|
136
|
+
rule /(#{id})(\s*)(,)(\s*)/ do
|
137
|
+
groups(Name::Class, Text, Punctuation, Text)
|
138
|
+
push
|
139
|
+
end
|
140
|
+
|
141
|
+
rule /(#{id})(\s*)(;?)/ do
|
142
|
+
groups(Name::Class, Text, Punctuation)
|
143
|
+
pop!
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
prepend :root do
|
148
|
+
rule %r(
|
149
|
+
([-+])(\s*)
|
150
|
+
([(].*?[)])?(\s*)
|
151
|
+
(?=#{id}:?)
|
152
|
+
)ix do |m|
|
153
|
+
token Keyword, m[1]; token Text, m[2]
|
154
|
+
recurse m[3]; token Text, m[4]
|
155
|
+
push :method_definition
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
state :method_definition do
|
160
|
+
rule /,/, Punctuation
|
161
|
+
rule /[.][.][.]/, Punctuation
|
162
|
+
rule /([(].*?[)])(#{id})/ do |m|
|
163
|
+
recurse m[1]; token Name::Variable, m[2]
|
164
|
+
end
|
165
|
+
|
166
|
+
rule /(#{id})(\s*)(:)/m do
|
167
|
+
groups(Name::Function, Text, Punctuation)
|
168
|
+
end
|
169
|
+
|
170
|
+
rule /;/, Punctuation, :pop!
|
171
|
+
|
172
|
+
rule /{/ do
|
173
|
+
token Punctuation
|
174
|
+
goto :function
|
175
|
+
end
|
176
|
+
|
177
|
+
mixin :inline_whitespace
|
178
|
+
rule %r(//.*?\n), Comment::Single
|
179
|
+
rule /\s+/m, Text
|
180
|
+
|
181
|
+
rule(//) { pop! }
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
data/lib/rouge/lexers/sass.rb
CHANGED
@@ -2,7 +2,7 @@ require 'rouge/lexers/sass/common'
|
|
2
2
|
|
3
3
|
module Rouge
|
4
4
|
module Lexers
|
5
|
-
class Sass <
|
5
|
+
class Sass < SassCommon
|
6
6
|
include Indentation
|
7
7
|
|
8
8
|
desc 'The Sass stylesheet language language (sass-lang.com)'
|
@@ -66,8 +66,6 @@ module Rouge
|
|
66
66
|
state :end_section do
|
67
67
|
rule(/\n/) { token Text; reset_stack }
|
68
68
|
end
|
69
|
-
|
70
|
-
include SassCommon
|
71
69
|
end
|
72
70
|
end
|
73
71
|
end
|
@@ -1,180 +1,171 @@
|
|
1
1
|
module Rouge
|
2
2
|
module Lexers
|
3
3
|
# shared states with SCSS
|
4
|
-
|
5
|
-
|
6
|
-
include Token::Tokens
|
4
|
+
class SassCommon < RegexLexer
|
5
|
+
id = /[\w-]+/
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
state :content_common do
|
16
|
-
rule /@for\b/, Keyword, :for
|
17
|
-
rule /@(debug|warn|if|while)/, Keyword, :value
|
18
|
-
rule /(@mixin)(\s+)(#{id})/ do
|
19
|
-
group Keyword; group Text; group Name::Function
|
20
|
-
push :value
|
21
|
-
end
|
7
|
+
state :content_common do
|
8
|
+
rule /@for\b/, Keyword, :for
|
9
|
+
rule /@(debug|warn|if|while)/, Keyword, :value
|
10
|
+
rule /(@mixin)(\s+)(#{id})/ do
|
11
|
+
group Keyword; group Text; group Name::Function
|
12
|
+
push :value
|
13
|
+
end
|
22
14
|
|
23
|
-
|
15
|
+
rule /@extend\b/, Keyword, :selector
|
24
16
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
17
|
+
rule /(@include)(\s+)(#{id})/ do
|
18
|
+
group Keyword; group Text; group Name::Decorator
|
19
|
+
push :value
|
20
|
+
end
|
29
21
|
|
30
|
-
|
22
|
+
rule /@#{id}/, Keyword, :selector
|
31
23
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
24
|
+
# $variable: assignment
|
25
|
+
rule /([$]#{id})([ \t]*)(:)/ do
|
26
|
+
group Name::Variable; group Text; group Punctuation
|
27
|
+
push :value
|
37
28
|
end
|
29
|
+
end
|
38
30
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
31
|
+
state :value do
|
32
|
+
mixin :end_section
|
33
|
+
rule /[ \t]+/, Text
|
34
|
+
rule /[$]#{id}/, Name::Variable
|
35
|
+
rule /url[(]/, Str::Other, :string_url
|
36
|
+
rule /#{id}(?=\s*[(])/, Name::Function
|
37
|
+
rule /%#{id}/, Name::Decorator
|
38
|
+
|
39
|
+
# named literals
|
40
|
+
rule /(true|false)\b/, Name::Builtin::Pseudo
|
41
|
+
rule /(and|or|not)\b/, Operator::Word
|
42
|
+
|
43
|
+
# colors and numbers
|
44
|
+
rule /#[a-z0-9]{1,6}/i, Num::Hex
|
45
|
+
rule /-?\d+(%|[a-z]+)?/, Num
|
46
|
+
rule /-?\d*\.\d+(%|[a-z]+)?/, Num::Integer
|
47
|
+
|
48
|
+
mixin :has_strings
|
49
|
+
mixin :has_interp
|
50
|
+
|
51
|
+
rule /[~^*!&%<>\|+=@:,.\/?-]+/, Operator
|
52
|
+
rule /[\[\]()]+/, Punctuation
|
53
|
+
rule %r(/[*]), Comment::Multiline, :inline_comment
|
54
|
+
rule %r(//[^\n]*), Comment::Single
|
55
|
+
|
56
|
+
# identifiers
|
57
|
+
rule(id) do |m|
|
58
|
+
if CSS.builtins.include? m[0]
|
59
|
+
token Name::Builtin
|
60
|
+
elsif CSS.constants.include? m[0]
|
61
|
+
token Name::Constant
|
62
|
+
else
|
63
|
+
token Name
|
73
64
|
end
|
74
65
|
end
|
66
|
+
end
|
75
67
|
|
76
|
-
|
77
|
-
|
78
|
-
|
68
|
+
state :has_interp do
|
69
|
+
rule /[#][{]/, Str::Interpol, :interpolation
|
70
|
+
end
|
79
71
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
72
|
+
state :has_strings do
|
73
|
+
rule /"/, Str::Double, :dq
|
74
|
+
rule /'/, Str::Single, :sq
|
75
|
+
end
|
84
76
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
77
|
+
state :interpolation do
|
78
|
+
rule /}/, Str::Interpol, :pop!
|
79
|
+
mixin :value
|
80
|
+
end
|
89
81
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
82
|
+
state :selector do
|
83
|
+
mixin :end_section
|
84
|
+
|
85
|
+
mixin :has_strings
|
86
|
+
mixin :has_interp
|
87
|
+
rule /[ \t]+/, Text
|
88
|
+
rule /:/, Name::Decorator, :pseudo_class
|
89
|
+
rule /[.]/, Name::Class, :class
|
90
|
+
rule /#/, Name::Namespace, :id
|
91
|
+
rule /%/, Name::Variable, :placeholder
|
92
|
+
rule id, Name::Tag
|
93
|
+
rule /&/, Keyword
|
94
|
+
rule /[~^*!&\[\]()<>\|+=@:;,.\/?-]/, Operator
|
95
|
+
end
|
104
96
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
97
|
+
state :dq do
|
98
|
+
rule /"/, Str::Double, :pop!
|
99
|
+
mixin :has_interp
|
100
|
+
rule /(\\.|#(?![{])|[^\n"#])+/, Str::Double
|
101
|
+
end
|
110
102
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
103
|
+
state :sq do
|
104
|
+
rule /'/, Str::Single, :pop!
|
105
|
+
mixin :has_interp
|
106
|
+
rule /(\\.|#(?![{])|[^\n'#])+/, Str::Single
|
107
|
+
end
|
116
108
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
109
|
+
state :string_url do
|
110
|
+
rule /[)]/, Str::Other, :pop!
|
111
|
+
rule /(\\.|#(?![{])|[^\n)#])+/, Str::Other
|
112
|
+
mixin :has_interp
|
113
|
+
end
|
122
114
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
115
|
+
state :selector_piece do
|
116
|
+
mixin :has_interp
|
117
|
+
rule(//) { pop! }
|
118
|
+
end
|
127
119
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
120
|
+
state :pseudo_class do
|
121
|
+
rule id, Name::Decorator
|
122
|
+
mixin :selector_piece
|
123
|
+
end
|
132
124
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
125
|
+
state :class do
|
126
|
+
rule id, Name::Class
|
127
|
+
mixin :selector_piece
|
128
|
+
end
|
137
129
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
130
|
+
state :id do
|
131
|
+
rule id, Name::Namespace
|
132
|
+
mixin :selector_piece
|
133
|
+
end
|
142
134
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
135
|
+
state :placeholder do
|
136
|
+
rule id, Name::Variable
|
137
|
+
mixin :selector_piece
|
138
|
+
end
|
147
139
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
140
|
+
state :for do
|
141
|
+
rule /(from|to|through)/, Operator::Word
|
142
|
+
mixin :value
|
143
|
+
end
|
152
144
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
end
|
145
|
+
state :attr_common do
|
146
|
+
mixin :has_interp
|
147
|
+
rule id do |m|
|
148
|
+
if CSS.attributes.include? m[0]
|
149
|
+
token Name::Label
|
150
|
+
else
|
151
|
+
token Name::Attribute
|
161
152
|
end
|
162
153
|
end
|
154
|
+
end
|
163
155
|
|
164
|
-
|
165
|
-
|
156
|
+
state :attribute do
|
157
|
+
mixin :attr_common
|
166
158
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
end
|
159
|
+
rule /([ \t]*)(:)/ do
|
160
|
+
group Text; group Punctuation
|
161
|
+
push :value
|
171
162
|
end
|
163
|
+
end
|
172
164
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
end
|
165
|
+
state :inline_comment do
|
166
|
+
rule /(\\#|#(?=[^\n{])|\*(?=[^\n\/])|[^\n#*])+/, Comment::Multiline
|
167
|
+
mixin :has_interp
|
168
|
+
rule %r([*]/), Comment::Multiline, :pop!
|
178
169
|
end
|
179
170
|
end
|
180
171
|
end
|
data/lib/rouge/lexers/scss.rb
CHANGED
@@ -2,7 +2,7 @@ require 'rouge/lexers/sass/common'
|
|
2
2
|
|
3
3
|
module Rouge
|
4
4
|
module Lexers
|
5
|
-
class Scss <
|
5
|
+
class Scss < SassCommon
|
6
6
|
desc "SCSS stylesheets (sass-lang.com)"
|
7
7
|
tag 'scss'
|
8
8
|
filenames '*.scss'
|
@@ -26,8 +26,6 @@ module Rouge
|
|
26
26
|
rule /\n/, Text
|
27
27
|
rule(/[;{}]/) { token Punctuation; reset_stack }
|
28
28
|
end
|
29
|
-
|
30
|
-
include SassCommon
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|
data/lib/rouge/lexers/yaml.rb
CHANGED
@@ -58,12 +58,12 @@ module Rouge
|
|
58
58
|
@next_indent += match.size
|
59
59
|
end
|
60
60
|
|
61
|
-
def set_indent(opts={})
|
61
|
+
def set_indent(match, opts={})
|
62
62
|
if indent < @next_indent
|
63
63
|
@indent_stack << @next_indent
|
64
64
|
end
|
65
65
|
|
66
|
-
@next_indent +=
|
66
|
+
@next_indent += match.size unless opts[:implicit]
|
67
67
|
end
|
68
68
|
|
69
69
|
plain_scalar_start = /[^ \t\n\r\f\v?:,\[\]{}#&*!\|>'"%@`]/
|
@@ -119,7 +119,7 @@ module Rouge
|
|
119
119
|
end
|
120
120
|
|
121
121
|
# block collection indicators
|
122
|
-
rule(/[?:-](?=[ ]|$)/) { token Punctuation::Indicator; set_indent }
|
122
|
+
rule(/[?:-](?=[ ]|$)/) { |m| token Punctuation::Indicator; set_indent m[0] }
|
123
123
|
|
124
124
|
# the beginning of a block line
|
125
125
|
rule(/[ ]*/) { |m| token Text; continue_indent(m[0]); pop! }
|
@@ -163,9 +163,9 @@ module Rouge
|
|
163
163
|
|
164
164
|
state :block_nodes do
|
165
165
|
# implicit key
|
166
|
-
rule /:(?=\s|$)/ do
|
166
|
+
rule /:(?=\s|$)/ do |m|
|
167
167
|
token Punctuation::Indicator
|
168
|
-
set_indent :implicit => true
|
168
|
+
set_indent m[0], :implicit => true
|
169
169
|
end
|
170
170
|
|
171
171
|
# literal and folded scalars
|
data/lib/rouge/regex_lexer.rb
CHANGED
@@ -35,35 +35,50 @@ module Rouge
|
|
35
35
|
#
|
36
36
|
# @see RegexLexer.state
|
37
37
|
class State
|
38
|
-
attr_reader :name
|
39
|
-
def initialize(name,
|
38
|
+
attr_reader :name, :rules
|
39
|
+
def initialize(name, rules)
|
40
40
|
@name = name
|
41
|
-
@
|
41
|
+
@rules = rules
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
45
|
-
@
|
44
|
+
def inspect
|
45
|
+
"#<#{self.class.name} #{@name.inspect}>"
|
46
46
|
end
|
47
|
+
end
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
class StateDSL
|
50
|
+
attr_reader :rules
|
51
|
+
def initialize(name, &defn)
|
52
|
+
@name = name
|
53
|
+
@defn = defn
|
54
|
+
@rules = []
|
55
|
+
end
|
52
56
|
|
53
|
-
|
57
|
+
def to_state(lexer_class)
|
58
|
+
load!
|
59
|
+
rules = @rules.map do |rule|
|
54
60
|
rule.is_a?(String) ? lexer_class.get_state(rule) : rule
|
55
61
|
end
|
62
|
+
State.new(@name, rules)
|
63
|
+
end
|
56
64
|
|
57
|
-
|
65
|
+
def prepended(&defn)
|
66
|
+
parent_defn = @defn
|
67
|
+
StateDSL.new(@name) do
|
68
|
+
instance_eval(&defn)
|
69
|
+
instance_eval(&parent_defn)
|
70
|
+
end
|
58
71
|
end
|
59
|
-
end
|
60
72
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
73
|
+
def appended(&defn)
|
74
|
+
parent_defn = @defn
|
75
|
+
StateDSL.new(@name) do
|
76
|
+
instance_eval(&parent_defn)
|
77
|
+
instance_eval(&defn)
|
78
|
+
end
|
65
79
|
end
|
66
80
|
|
81
|
+
protected
|
67
82
|
# Define a new rule for this state.
|
68
83
|
#
|
69
84
|
# @overload rule(re, token, next_state=nil)
|
@@ -99,8 +114,15 @@ module Rouge
|
|
99
114
|
# Mix in the rules from another state into this state. The rules
|
100
115
|
# from the mixed-in state will be tried in order before moving on
|
101
116
|
# to the rest of the rules in this state.
|
102
|
-
def mixin(
|
103
|
-
rules <<
|
117
|
+
def mixin(state)
|
118
|
+
rules << state.to_s
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
def load!
|
123
|
+
return if @loaded
|
124
|
+
@loaded = true
|
125
|
+
instance_eval(&@defn)
|
104
126
|
end
|
105
127
|
end
|
106
128
|
|
@@ -110,6 +132,16 @@ module Rouge
|
|
110
132
|
@states ||= {}
|
111
133
|
end
|
112
134
|
|
135
|
+
def self.state_definitions
|
136
|
+
@state_definitions ||= InheritableHash.new(superclass.state_definitions)
|
137
|
+
end
|
138
|
+
@state_definitions = {}
|
139
|
+
|
140
|
+
def self.replace_state(name, new_defn)
|
141
|
+
states[name] = nil
|
142
|
+
state_definitions[name] = new_defn
|
143
|
+
end
|
144
|
+
|
113
145
|
# The routines to run at the beginning of a fresh lex.
|
114
146
|
# @see start
|
115
147
|
def self.start_procs
|
@@ -129,16 +161,31 @@ module Rouge
|
|
129
161
|
# The block will be evaluated in the context of a {StateDSL}.
|
130
162
|
def self.state(name, &b)
|
131
163
|
name = name.to_s
|
132
|
-
|
164
|
+
state_definitions[name] = StateDSL.new(name, &b)
|
165
|
+
end
|
166
|
+
|
167
|
+
def self.prepend(name, &b)
|
168
|
+
name = name.to_s
|
169
|
+
dsl = state_definitions[name] or raise "no such state #{name.inspect}"
|
170
|
+
replace_state(name, dsl.prepended(&b))
|
171
|
+
end
|
172
|
+
|
173
|
+
def self.append(state, &b)
|
174
|
+
name = name.to_s
|
175
|
+
dsl = state_definitions[name] or raise "no such state #{name.inspect}"
|
176
|
+
replace_state(name, dsl.appended(&b))
|
133
177
|
end
|
134
178
|
|
135
179
|
# @private
|
136
180
|
def self.get_state(name)
|
137
181
|
return name if name.is_a? State
|
138
182
|
|
139
|
-
|
140
|
-
|
141
|
-
|
183
|
+
name = name.to_s
|
184
|
+
|
185
|
+
states[name] ||= begin
|
186
|
+
defn = state_definitions[name] or raise "unknown state: #{name.inspect}"
|
187
|
+
defn.to_state(self)
|
188
|
+
end
|
142
189
|
end
|
143
190
|
|
144
191
|
# @private
|
@@ -306,10 +353,14 @@ module Rouge
|
|
306
353
|
|
307
354
|
lexer.lex(text, :continue => true) do |tok, val|
|
308
355
|
debug { " delegated token: #{tok.inspect}, #{val.inspect}" }
|
309
|
-
|
356
|
+
yield_token(tok, val)
|
310
357
|
end
|
311
358
|
end
|
312
359
|
|
360
|
+
def recurse(text=nil)
|
361
|
+
delegate(self.class, text)
|
362
|
+
end
|
363
|
+
|
313
364
|
# Push a state onto the stack. If no state name is given and you've
|
314
365
|
# passed a block, a state will be dynamically created using the
|
315
366
|
# {StateDSL}.
|
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.5.
|
4
|
+
version: 0.5.2
|
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: 2013-09-
|
12
|
+
date: 2013-09-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
type: :runtime
|
@@ -93,6 +93,7 @@ files:
|
|
93
93
|
- lib/rouge/lexers/erlang.rb
|
94
94
|
- lib/rouge/lexers/yaml.rb
|
95
95
|
- lib/rouge/lexers/make.rb
|
96
|
+
- lib/rouge/lexers/objective_c.rb
|
96
97
|
- lib/rouge/lexers/lua.rb
|
97
98
|
- lib/rouge/lexers/viml.rb
|
98
99
|
- lib/rouge/lexers/java.rb
|
@@ -168,6 +169,7 @@ files:
|
|
168
169
|
- lib/rouge/demos/erb
|
169
170
|
- lib/rouge/demos/cpp
|
170
171
|
- lib/rouge/demos/coffeescript
|
172
|
+
- lib/rouge/demos/objective_c
|
171
173
|
- lib/rouge/demos/sql
|
172
174
|
- lib/rouge/demos/puppet
|
173
175
|
- lib/rouge/demos/ini
|