rouge 0.2.2 → 0.2.3
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.rb +4 -0
- data/lib/rouge/lexers/coffeescript.rb +176 -0
- data/lib/rouge/lexers/handlebars.rb +76 -0
- data/lib/rouge/lexers/sass.rb +2 -0
- data/lib/rouge/lexers/smalltalk.rb +114 -0
- data/lib/rouge/regex_lexer.rb +3 -2
- data/lib/rouge/version.rb +1 -1
- metadata +5 -2
data/lib/rouge.rb
CHANGED
@@ -45,8 +45,10 @@ load load_dir.join('rouge/lexers/php.rb')
|
|
45
45
|
load load_dir.join('rouge/lexers/haml.rb')
|
46
46
|
load load_dir.join('rouge/lexers/sass.rb')
|
47
47
|
load load_dir.join('rouge/lexers/scss.rb')
|
48
|
+
load load_dir.join('rouge/lexers/coffeescript.rb')
|
48
49
|
|
49
50
|
load load_dir.join('rouge/lexers/erb.rb')
|
51
|
+
load load_dir.join('rouge/lexers/handlebars.rb')
|
50
52
|
|
51
53
|
load load_dir.join('rouge/lexers/tcl.rb')
|
52
54
|
load load_dir.join('rouge/lexers/python.rb')
|
@@ -64,6 +66,8 @@ load load_dir.join('rouge/lexers/c.rb')
|
|
64
66
|
load load_dir.join('rouge/lexers/cpp.rb')
|
65
67
|
load load_dir.join('rouge/lexers/java.rb')
|
66
68
|
|
69
|
+
load load_dir.join('rouge/lexers/smalltalk.rb')
|
70
|
+
|
67
71
|
load load_dir.join('rouge/formatter.rb')
|
68
72
|
load load_dir.join('rouge/formatters/html.rb')
|
69
73
|
load load_dir.join('rouge/formatters/terminal256.rb')
|
@@ -0,0 +1,176 @@
|
|
1
|
+
module Rouge
|
2
|
+
module Lexers
|
3
|
+
class Coffeescript < RegexLexer
|
4
|
+
tag 'coffeescript'
|
5
|
+
aliases 'coffee', 'coffee-script'
|
6
|
+
filenames '*.coffee', 'Cakefile'
|
7
|
+
mimetypes 'text/coffeescript'
|
8
|
+
|
9
|
+
desc 'The Coffeescript programming language (coffeescript.org)'
|
10
|
+
|
11
|
+
def self.analyze_text(text)
|
12
|
+
return 1 if text.shebang? 'coffee'
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.keywords
|
16
|
+
@keywords ||= Set.new %w(
|
17
|
+
for in of while break return continue switch when then if else
|
18
|
+
throw try catch finally new delete typeof instanceof super
|
19
|
+
extends this class by
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.constants
|
24
|
+
@constants ||= Set.new %w(
|
25
|
+
true false yes no on off null NaN Infinity undefined
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.builtins
|
30
|
+
@builtins ||= Set.new %w(
|
31
|
+
Array Boolean Date Error Function Math netscape Number Object
|
32
|
+
Packages RegExp String sun decodeURI decodeURIComponent
|
33
|
+
encodeURI encodeURIComponent eval isFinite isNaN parseFloat
|
34
|
+
parseInt document window
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
id = /[$a-zA-Z_][a-zA-Z0-9_]*/
|
39
|
+
lval = /@?#{id}([.]#{id})*/
|
40
|
+
|
41
|
+
state :comments_and_whitespace do
|
42
|
+
rule /\s+/m, 'Text'
|
43
|
+
rule /###.*?###/m, 'Comment.Multiline'
|
44
|
+
rule /#.*?\n/, 'Comment.Single'
|
45
|
+
end
|
46
|
+
|
47
|
+
state :multiline_regex do
|
48
|
+
mixin :comments_and_whitespace
|
49
|
+
rule %r(///([gim]+\b|\B)), 'Literal.String.Regex', :pop!
|
50
|
+
rule %r(/), 'Literal.String.Regex'
|
51
|
+
rule %r([^/#]+), 'Literal.String.Regex'
|
52
|
+
end
|
53
|
+
|
54
|
+
state :slash_starts_regex do
|
55
|
+
mixin :comments_and_whitespace
|
56
|
+
rule %r(///) do
|
57
|
+
token 'Literal.String.Regex'
|
58
|
+
pop!; push :multiline_regex
|
59
|
+
end
|
60
|
+
|
61
|
+
rule %r(
|
62
|
+
/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/ # a regex
|
63
|
+
([gim]+\b|\B)
|
64
|
+
)x, 'Literal.String.Regex', :pop!
|
65
|
+
|
66
|
+
rule(//) { pop! }
|
67
|
+
end
|
68
|
+
|
69
|
+
state :root do
|
70
|
+
rule(%r(^(?=\s|/|<!--))) { push :slash_starts_regex }
|
71
|
+
mixin :comments_and_whitespace
|
72
|
+
rule %r(
|
73
|
+
[+][+]|--|~|&&|\band\b|\bor\b|\bis\b|\bisnt\b|\bnot\b|[?]|:|=|
|
74
|
+
[|][|]|\\(?=\n)|(<<|>>>?|==?|!=?|[-<>+*`%&|^/])=?
|
75
|
+
)x, 'Operator', :slash_starts_regex
|
76
|
+
|
77
|
+
rule /[-=]>/, 'Name.Function'
|
78
|
+
|
79
|
+
rule /(@)([ \t]*)(#{id})/ do
|
80
|
+
group 'Name.Variable.Instance'; group 'Text'
|
81
|
+
group 'Name.Attribute'
|
82
|
+
push :slash_starts_regex
|
83
|
+
end
|
84
|
+
|
85
|
+
rule /([.])([ \t]*)(#{id})/ do
|
86
|
+
group 'Punctuation'; group 'Text'
|
87
|
+
group 'Name.Attribute'
|
88
|
+
push :slash_starts_regex
|
89
|
+
end
|
90
|
+
|
91
|
+
rule /#{id}(?=\s*:)/, 'Name.Attribute', :slash_starts_regex
|
92
|
+
|
93
|
+
rule /#{id}/, 'Name.Other', :slash_starts_regex
|
94
|
+
|
95
|
+
rule /[{(\[;,]/, 'Punctuation', :slash_starts_regex
|
96
|
+
rule /[})\].]/, 'Punctuation'
|
97
|
+
|
98
|
+
rule /\d+[.]\d+([eE]\d+)?[fd]?/, 'Literal.Number.Float'
|
99
|
+
rule /0x[0-9a-fA-F]+/, 'Literal.Number.Hex'
|
100
|
+
rule /\d+/, 'Literal.Number.Integer'
|
101
|
+
rule /"""/, 'Literal.String', :tdqs
|
102
|
+
rule /'''/, 'Literal.String', :tsqs
|
103
|
+
rule /"/, 'Literal.String', :dqs
|
104
|
+
rule /'/, 'Literal.String', :sqs
|
105
|
+
end
|
106
|
+
|
107
|
+
state :strings do
|
108
|
+
# all coffeescript strings are multi-line
|
109
|
+
rule /[^#\\'"]+/m, 'Literal.String'
|
110
|
+
|
111
|
+
rule /\\./, 'Literal.String.Escape'
|
112
|
+
rule /#/, 'Literal.String'
|
113
|
+
end
|
114
|
+
|
115
|
+
state :double_strings do
|
116
|
+
rule /'/, 'Literal.String'
|
117
|
+
mixin :has_interpolation
|
118
|
+
mixin :strings
|
119
|
+
end
|
120
|
+
|
121
|
+
state :single_strings do
|
122
|
+
rule /"/, 'Literal.String'
|
123
|
+
mixin :strings
|
124
|
+
end
|
125
|
+
|
126
|
+
state :interpolation do
|
127
|
+
rule /}/, 'Literal.String.Interpol', :pop!
|
128
|
+
mixin :root
|
129
|
+
end
|
130
|
+
|
131
|
+
state :has_interpolation do
|
132
|
+
rule /[#][{]/, 'Literal.String.Interpol', :interpolation
|
133
|
+
end
|
134
|
+
|
135
|
+
state :dqs do
|
136
|
+
rule /"/, 'Literal.String', :pop!
|
137
|
+
mixin :double_strings
|
138
|
+
end
|
139
|
+
|
140
|
+
state :tdqs do
|
141
|
+
rule /"""/, 'Literal.String', :pop!
|
142
|
+
rule /"/, 'Literal.String'
|
143
|
+
mixin :double_strings
|
144
|
+
end
|
145
|
+
|
146
|
+
state :sqs do
|
147
|
+
rule /'/, 'Literal.String', :pop!
|
148
|
+
mixin :single_strings
|
149
|
+
end
|
150
|
+
|
151
|
+
state :tsqs do
|
152
|
+
rule /'''/, 'Literal.String', :pop!
|
153
|
+
rule /'/, 'Literal.String'
|
154
|
+
mixin :single_strings
|
155
|
+
end
|
156
|
+
|
157
|
+
postprocess 'Name' do |tok, val|
|
158
|
+
if tok.name == 'Name.Attribute'
|
159
|
+
if self.class.keywords.include? val
|
160
|
+
tok = 'Error' # keywords as attributes = nono
|
161
|
+
else
|
162
|
+
# pass. leave attributes alone.
|
163
|
+
end
|
164
|
+
elsif self.class.keywords.include? val
|
165
|
+
tok = 'Keyword'
|
166
|
+
elsif self.class.constants.include? val
|
167
|
+
tok = 'Name.Constant'
|
168
|
+
elsif self.class.builtins.include? val
|
169
|
+
tok = 'Name.Builtin'
|
170
|
+
end
|
171
|
+
|
172
|
+
token tok, val
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Rouge
|
2
|
+
module Lexers
|
3
|
+
class Handlebars < TemplateLexer
|
4
|
+
desc 'the Handlebars and Mustache templating languages'
|
5
|
+
tag 'handlebars'
|
6
|
+
aliases 'hbs', 'mustache'
|
7
|
+
filenames '*.handlebars', '*.hbs', '*.mustache'
|
8
|
+
mimetypes 'text/x-handlebars', 'text/x-mustache'
|
9
|
+
|
10
|
+
id = %r([\w$-]+)
|
11
|
+
|
12
|
+
state :root do
|
13
|
+
# escaped slashes
|
14
|
+
rule(/\\{+/) { delegate parent }
|
15
|
+
|
16
|
+
# block comments
|
17
|
+
rule /{{!--/, 'Comment', :comment
|
18
|
+
rule /{{!.*?}}/, 'Comment'
|
19
|
+
|
20
|
+
rule /{{{?/ do
|
21
|
+
token 'Keyword'
|
22
|
+
push :stache
|
23
|
+
push :open_sym
|
24
|
+
end
|
25
|
+
|
26
|
+
rule(/(.+?)(?=\\|{{)/m) { delegate parent }
|
27
|
+
|
28
|
+
# if we get here, there's no more mustache tags, so we eat
|
29
|
+
# the rest of the doc
|
30
|
+
rule(/.+/m) { delegate parent }
|
31
|
+
end
|
32
|
+
|
33
|
+
state :comment do
|
34
|
+
rule(/{{/) { token 'Comment'; push }
|
35
|
+
rule(/}}/) { token 'Comment'; pop! }
|
36
|
+
rule(/[^{}]+/m) { token 'Comment' }
|
37
|
+
rule(/[{}]/) { token 'Comment' }
|
38
|
+
end
|
39
|
+
|
40
|
+
state :stache do
|
41
|
+
rule /}}}?/, 'Keyword', :pop!
|
42
|
+
rule /\s+/m, 'Text'
|
43
|
+
rule /[=]/, 'Operator'
|
44
|
+
rule /[\[\]]/, 'Punctuation'
|
45
|
+
rule /[.](?=[}\s])/, 'Name.Variable'
|
46
|
+
rule /[.][.]/, 'Name.Variable'
|
47
|
+
rule %r([/.]), 'Punctuation'
|
48
|
+
rule /"(\\.|.)*?"/, 'Literal.String.Double'
|
49
|
+
rule /'(\\.|.)*?'/, 'Literal.String.Single'
|
50
|
+
rule /\d+(?=}\s)/, 'Literal.Number'
|
51
|
+
rule /(true|false)(?=[}\s])/, 'Keyword.Constant'
|
52
|
+
rule /else(?=[}\s])/, 'Keyword'
|
53
|
+
rule /this(?=[}\s])/, 'Name.Builtin.Pseudo'
|
54
|
+
rule /@#{id}/, 'Name.Attribute'
|
55
|
+
rule id, 'Name.Variable'
|
56
|
+
end
|
57
|
+
|
58
|
+
state :open_sym do
|
59
|
+
rule %r([#/]) do
|
60
|
+
token 'Keyword'
|
61
|
+
pop!; push :block_name
|
62
|
+
end
|
63
|
+
|
64
|
+
rule /[>^&]/, 'Keyword'
|
65
|
+
|
66
|
+
rule(//) { pop! }
|
67
|
+
end
|
68
|
+
|
69
|
+
state :block_name do
|
70
|
+
rule /if(?=[}\s])/, 'Keyword'
|
71
|
+
rule id, 'Name.Namespace', :pop!
|
72
|
+
rule(//) { pop! }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/rouge/lexers/sass.rb
CHANGED
@@ -0,0 +1,114 @@
|
|
1
|
+
module Rouge
|
2
|
+
module Lexers
|
3
|
+
class Smalltalk < RegexLexer
|
4
|
+
desc 'The Smalltalk programming language'
|
5
|
+
|
6
|
+
tag 'smalltalk'
|
7
|
+
aliases 'st', 'squeak'
|
8
|
+
filenames '*.st'
|
9
|
+
mimetypes 'text/x-smalltalk'
|
10
|
+
|
11
|
+
ops = %r([-+*/\\~<>=|&!?,@%])
|
12
|
+
|
13
|
+
state :root do
|
14
|
+
rule /(<)(\w+:)(.*?)(>)/ do
|
15
|
+
group 'Punctuation'; group 'Keyword'; group 'Text'; group 'Punctuation'
|
16
|
+
end
|
17
|
+
|
18
|
+
# mixin :squeak_fileout
|
19
|
+
mixin :whitespaces
|
20
|
+
mixin :method_definition
|
21
|
+
rule /([|])([\w\s]*)([|])/ do
|
22
|
+
group 'Punctuation'; group 'Name.Variable'; group 'Punctuation'
|
23
|
+
end
|
24
|
+
mixin :objects
|
25
|
+
rule /\^|:=|_/, 'Operator'
|
26
|
+
|
27
|
+
rule /[)}\]]/, 'Punctuation', :after_object
|
28
|
+
rule /[({\[!]/, 'Punctuation'
|
29
|
+
end
|
30
|
+
|
31
|
+
state :method_definition do
|
32
|
+
rule /([a-z]\w*:)(\s*)(\w+)/i do
|
33
|
+
group 'Name.Function'; group 'Text'; group 'Name.Variable'
|
34
|
+
end
|
35
|
+
|
36
|
+
rule /^(\s*)(\b[a-z]\w*\b)(\s*)$/i do
|
37
|
+
group 'Text'; group 'Name.Function'; group 'Text'
|
38
|
+
end
|
39
|
+
|
40
|
+
rule %r(^(\s*)(#{ops}+)(\s*)(\w+)(\s*)$) do
|
41
|
+
group 'Text'; group 'Name.Function';
|
42
|
+
group 'Text'; group 'Name.Variable'; group 'Text';
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
state :block_variables do
|
47
|
+
mixin :whitespaces
|
48
|
+
rule /(:)(\s*)(\w+)/ do
|
49
|
+
group 'Operator'; group 'Text'; group 'Name.Variable'
|
50
|
+
end
|
51
|
+
|
52
|
+
rule /[|]/, 'Punctuation', :pop!
|
53
|
+
|
54
|
+
rule(//) { pop! }
|
55
|
+
end
|
56
|
+
|
57
|
+
state :literals do
|
58
|
+
rule /'(''|.)*?'/m, 'Literal.String', :after_object
|
59
|
+
rule /[$]./, 'Literal.String.Char', :after_object
|
60
|
+
rule /#[(]/, 'Literal.String.Symbol', :parenth
|
61
|
+
rule /(\d+r)?-?\d+(\.\d+)?(e-?\d+)?/,
|
62
|
+
'Literal.Number', :after_object
|
63
|
+
rule /#("[^"]*"|#{ops}+|[\w:]+)/,
|
64
|
+
'Literal.String.Symbol', :after_object
|
65
|
+
end
|
66
|
+
|
67
|
+
state :parenth do
|
68
|
+
rule /[)]/ do
|
69
|
+
token 'Literal.String.Symbol'
|
70
|
+
pop!; push :after_object
|
71
|
+
end
|
72
|
+
|
73
|
+
mixin :inner_parenth
|
74
|
+
end
|
75
|
+
|
76
|
+
state :inner_parenth do
|
77
|
+
rule /#[(]/, 'Literal.String.Symbol', :inner_parenth
|
78
|
+
rule /[)]/, 'Literal.String.Symbol', :pop!
|
79
|
+
mixin :whitespaces
|
80
|
+
mixin :literals
|
81
|
+
rule /(#{ops}|[\w:])+/, 'Literal.String.Symbol'
|
82
|
+
end
|
83
|
+
|
84
|
+
state :whitespaces do
|
85
|
+
rule /! !$/, 'Keyword' # squeak chunk delimiter
|
86
|
+
rule /\s+/m, 'Text'
|
87
|
+
rule /".*?"/m, 'Comment'
|
88
|
+
end
|
89
|
+
|
90
|
+
state :objects do
|
91
|
+
rule /\[/, 'Punctuation', :block_variables
|
92
|
+
rule /(self|super|true|false|nil|thisContext)\b/,
|
93
|
+
'Name.Builtin.Pseudo', :after_object
|
94
|
+
rule /[A-Z]\w*(?!:)\b/, 'Name.Class', :after_object
|
95
|
+
rule /[a-z]\w*(?!:)\b/, 'Name.Variable', :after_object
|
96
|
+
mixin :literals
|
97
|
+
end
|
98
|
+
|
99
|
+
state :after_object do
|
100
|
+
mixin :whitespaces
|
101
|
+
rule /(ifTrue|ifFalse|whileTrue|whileFalse|timesRepeat):/,
|
102
|
+
'Name.Builtin', :pop!
|
103
|
+
rule /new(?!:)\b/, 'Name.Builtin'
|
104
|
+
rule /:=|_/, 'Operator', :pop!
|
105
|
+
rule /[a-z]+\w*:/i, 'Name.Function', :pop!
|
106
|
+
rule /[a-z]+\w*/i, 'Name.Function'
|
107
|
+
rule /#{ops}+/, 'Name.Function', :pop!
|
108
|
+
rule /[.]/, 'Punctuation', :pop!
|
109
|
+
rule /;/, 'Punctuation'
|
110
|
+
rule(//) { pop! }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
data/lib/rouge/regex_lexer.rb
CHANGED
@@ -196,7 +196,7 @@ module Rouge
|
|
196
196
|
# @see #step #step (where (2.) is implemented)
|
197
197
|
def stream_tokens(stream, &b)
|
198
198
|
stream_without_postprocessing(stream) do |tok, val|
|
199
|
-
_, processor = self.class.postprocesses.find { |t, _| t
|
199
|
+
_, processor = self.class.postprocesses.find { |t, _| t === tok }
|
200
200
|
|
201
201
|
if processor
|
202
202
|
with_output_stream(b) do
|
@@ -385,6 +385,7 @@ module Rouge
|
|
385
385
|
|
386
386
|
private
|
387
387
|
def with_output_stream(output_stream, &b)
|
388
|
+
old_output_stream = @output_stream
|
388
389
|
@output_stream = Yielder.new do |tok, val|
|
389
390
|
debug { " yielding #{tok.to_s.inspect}, #{val.inspect}" }
|
390
391
|
output_stream.call(Token[tok], val)
|
@@ -393,7 +394,7 @@ module Rouge
|
|
393
394
|
yield
|
394
395
|
|
395
396
|
ensure
|
396
|
-
@output_stream =
|
397
|
+
@output_stream = old_output_stream
|
397
398
|
end
|
398
399
|
end
|
399
400
|
end
|
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.3
|
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-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -53,9 +53,11 @@ files:
|
|
53
53
|
- lib/rouge/lexers/javascript.rb
|
54
54
|
- lib/rouge/lexers/diff.rb
|
55
55
|
- lib/rouge/lexers/viml.rb
|
56
|
+
- lib/rouge/lexers/smalltalk.rb
|
56
57
|
- lib/rouge/lexers/php/builtins.rb
|
57
58
|
- lib/rouge/lexers/haskell.rb
|
58
59
|
- lib/rouge/lexers/c.rb
|
60
|
+
- lib/rouge/lexers/handlebars.rb
|
59
61
|
- lib/rouge/lexers/tex.rb
|
60
62
|
- lib/rouge/lexers/text.rb
|
61
63
|
- lib/rouge/lexers/html.rb
|
@@ -63,6 +65,7 @@ files:
|
|
63
65
|
- lib/rouge/lexers/java.rb
|
64
66
|
- lib/rouge/lexers/php.rb
|
65
67
|
- lib/rouge/lexers/yaml.rb
|
68
|
+
- lib/rouge/lexers/coffeescript.rb
|
66
69
|
- lib/rouge/lexers/tcl.rb
|
67
70
|
- lib/rouge/lexers/css.rb
|
68
71
|
- lib/rouge/lexers/cpp.rb
|