rouge 0.2.3 → 0.2.4
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 +3 -0
- data/lib/rouge/formatter.rb +7 -0
- data/lib/rouge/lexer.rb +15 -0
- data/lib/rouge/lexers/javascript.rb +98 -32
- data/lib/rouge/lexers/sass.rb +10 -1
- data/lib/rouge/lexers/scheme.rb +67 -50
- data/lib/rouge/version.rb +1 -1
- metadata +2 -2
data/lib/rouge.rb
CHANGED
@@ -7,6 +7,9 @@ module Rouge
|
|
7
7
|
lexer = Lexer.find(lexer) unless lexer.respond_to? :lex
|
8
8
|
raise "unknown lexer #{lexer}" unless lexer
|
9
9
|
|
10
|
+
formatter = Formatter.find(formatter) unless formatter.respond_to? :format
|
11
|
+
raise "unknown formatter #{formatter}" unless formatter
|
12
|
+
|
10
13
|
formatter.format(lexer.lex(text))
|
11
14
|
end
|
12
15
|
end
|
data/lib/rouge/formatter.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Rouge
|
2
2
|
# A Formatter takes a token stream and formats it for human viewing.
|
3
3
|
class Formatter
|
4
|
+
# @private
|
4
5
|
REGISTRY = {}
|
5
6
|
|
6
7
|
# Specify or get the unique tag for this formatter. This is used
|
@@ -17,11 +18,17 @@ module Rouge
|
|
17
18
|
REGISTRY[tag]
|
18
19
|
end
|
19
20
|
|
21
|
+
# Format a token stream. Delegates to {#format}.
|
22
|
+
def self.format(tokens, opts={})
|
23
|
+
new(opts).format(tokens)
|
24
|
+
end
|
25
|
+
|
20
26
|
# Format a token stream.
|
21
27
|
def format(tokens)
|
22
28
|
enum_for(:stream, tokens).to_a.join
|
23
29
|
end
|
24
30
|
|
31
|
+
# @deprecated Use {#format} instead.
|
25
32
|
def render(tokens)
|
26
33
|
warn 'Formatter#render is deprecated, use #format instead.'
|
27
34
|
format(tokens)
|
data/lib/rouge/lexer.rb
CHANGED
@@ -68,6 +68,21 @@ module Rouge
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
+
# Specify or get the path name containing a small demo for
|
72
|
+
# this lexer (can be overriden by {demo}).
|
73
|
+
def demo_file(arg=:absent)
|
74
|
+
return @demo_file = Pathname.new(arg) unless arg == :absent
|
75
|
+
|
76
|
+
@demo_file = Pathname.new(__FILE__).dirname.join('demos', tag)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Specify or get a small demo string for this lexer
|
80
|
+
def demo(arg=:absent)
|
81
|
+
return @demo = arg unless arg == :absent
|
82
|
+
|
83
|
+
@demo = File.read(demo_file)
|
84
|
+
end
|
85
|
+
|
71
86
|
# @return a list of all lexers.
|
72
87
|
def all
|
73
88
|
registry.values.uniq
|
@@ -46,46 +46,85 @@ module Rouge
|
|
46
46
|
rule /[^\n]+/, 'Error', :pop!
|
47
47
|
end
|
48
48
|
|
49
|
-
keywords
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
49
|
+
def self.keywords
|
50
|
+
@keywords ||= Set.new %w(
|
51
|
+
for in while do break return continue switch case default
|
52
|
+
if else throw try catch finally new delete typeof instanceof
|
53
|
+
void this
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.declarations
|
58
|
+
@declarations ||= Set.new %w(var let with function)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.reserved
|
62
|
+
@reserved ||= Set.new %w(
|
63
|
+
abstract boolean byte char class const debugger double enum
|
64
|
+
export extends final float goto implements import int interface
|
65
|
+
long native package private protected public short static
|
66
|
+
super synchronized throws transient volatile
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.constants
|
71
|
+
@constants ||= Set.new %w(true false null NaN Infinity undefined)
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.builtins
|
75
|
+
@builtins ||= %w(
|
76
|
+
Array Boolean Date Error Function Math netscape
|
77
|
+
Number Object Packages RegExp String sun decodeURI
|
78
|
+
decodeURIComponent encodeURI encodeURIComponent
|
79
|
+
Error eval isFinite isNaN parseFloat parseInt document this
|
80
|
+
window
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
id = /[$a-zA-Z_][a-zA-Z0-9_]*/
|
72
85
|
|
73
86
|
state :root do
|
74
87
|
rule /\A\s*#!.*?\n/m, 'Comment.Preproc'
|
75
88
|
rule %r((?<=\n)(?=\s|/|<!--)), 'Text', :slash_starts_regex
|
76
89
|
mixin :comments_and_whitespace
|
77
90
|
rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | ===
|
78
|
-
| !==
|
91
|
+
| !== )x,
|
79
92
|
'Operator', :slash_starts_regex
|
80
93
|
rule %r([-<>+*%&|\^/!=]=?), 'Operator', :slash_starts_regex
|
81
|
-
rule /[
|
82
|
-
rule /[
|
83
|
-
|
84
|
-
rule /
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
94
|
+
rule /[(\[;,]/, 'Punctuation', :slash_starts_regex
|
95
|
+
rule /[)\].]/, 'Punctuation'
|
96
|
+
|
97
|
+
rule /[?]/ do
|
98
|
+
token 'Punctuation'
|
99
|
+
push :ternary
|
100
|
+
push :slash_starts_regex
|
101
|
+
end
|
102
|
+
|
103
|
+
rule /[{](?=\s*(#{id}|"[^\n]*?")\s*:)/, 'Punctuation', :object
|
104
|
+
|
105
|
+
rule /[{]/ do
|
106
|
+
token 'Punctuation'
|
107
|
+
push :block
|
108
|
+
push :slash_starts_regex
|
109
|
+
end
|
110
|
+
|
111
|
+
rule id do |m|
|
112
|
+
if self.class.keywords.include? m[0]
|
113
|
+
token 'Keyword'
|
114
|
+
push :slash_starts_regex
|
115
|
+
elsif self.class.declarations.include? m[0]
|
116
|
+
token 'Keyword.Declaration'
|
117
|
+
push :slash_starts_regex
|
118
|
+
elsif self.class.reserved.include? m[0]
|
119
|
+
token 'Keyword.Reserved'
|
120
|
+
elsif self.class.constants.include? m[0]
|
121
|
+
token 'Keyword.Constant'
|
122
|
+
elsif self.class.builtins.include? m[0]
|
123
|
+
token 'Name.Builtin'
|
124
|
+
else
|
125
|
+
token 'Name.Other'
|
126
|
+
end
|
127
|
+
end
|
89
128
|
|
90
129
|
rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, 'Literal.Number.Float'
|
91
130
|
rule /0x[0-9a-fA-F]+/, 'Literal.Number.Hex'
|
@@ -93,6 +132,33 @@ module Rouge
|
|
93
132
|
rule /"(\\\\|\\"|[^"])*"/, 'Literal.String.Double'
|
94
133
|
rule /'(\\\\|\\'|[^'])*'/, 'Literal.String.Single'
|
95
134
|
end
|
135
|
+
|
136
|
+
# braced parts that aren't object literals
|
137
|
+
state :block do
|
138
|
+
rule /(#{id})(\s*)(:)/ do
|
139
|
+
group 'Name.Label'; group 'Text'
|
140
|
+
group 'Punctuation'
|
141
|
+
end
|
142
|
+
|
143
|
+
rule /[}]/, 'Punctuation', :pop!
|
144
|
+
mixin :root
|
145
|
+
end
|
146
|
+
|
147
|
+
# object literals
|
148
|
+
state :object do
|
149
|
+
rule /[}]/, 'Punctuation', :pop!
|
150
|
+
rule /(#{id})(\s*)(:)/ do
|
151
|
+
group 'Name.Attribute'; group 'Text'
|
152
|
+
group 'Punctuation'
|
153
|
+
end
|
154
|
+
mixin :root
|
155
|
+
end
|
156
|
+
|
157
|
+
# ternary expressions, where <id>: is not a label!
|
158
|
+
state :ternary do
|
159
|
+
rule /:/, 'Punctuation', :pop!
|
160
|
+
mixin :root
|
161
|
+
end
|
96
162
|
end
|
97
163
|
|
98
164
|
class JSON < RegexLexer
|
data/lib/rouge/lexers/sass.rb
CHANGED
@@ -37,7 +37,7 @@ module Rouge
|
|
37
37
|
|
38
38
|
rule /:/, 'Name.Attribute', :old_style_attr
|
39
39
|
|
40
|
-
rule(/(?=.+?:(^a-z|$))/) { push :attribute }
|
40
|
+
rule(/(?=.+?:([^a-z]|$))/) { push :attribute }
|
41
41
|
|
42
42
|
rule(//) { push :selector }
|
43
43
|
end
|
@@ -76,6 +76,8 @@ module Rouge
|
|
76
76
|
push :value
|
77
77
|
end
|
78
78
|
|
79
|
+
rule /@extend\b/, 'Keyword', :selector
|
80
|
+
|
79
81
|
rule /(@include)(\s+)(#{id})/ do
|
80
82
|
group 'Keyword'; group 'Text'; group 'Name.Decorator'
|
81
83
|
push :value
|
@@ -96,6 +98,7 @@ module Rouge
|
|
96
98
|
rule /[$]#{id}/, 'Name.Variable'
|
97
99
|
rule /url[(]/, 'Literal.String.Other', :string_url
|
98
100
|
rule /#{id}(?=\s*[(])/, 'Name.Function'
|
101
|
+
rule /%#{id}/, 'Name.Decorator'
|
99
102
|
|
100
103
|
# named literals
|
101
104
|
rule /(true|false)\b/, 'Name.Pseudo'
|
@@ -149,6 +152,7 @@ module Rouge
|
|
149
152
|
rule /:/, 'Name.Decorator', :pseudo_class
|
150
153
|
rule /[.]/, 'Name.Class', :class
|
151
154
|
rule /#/, 'Name.Namespace', :id
|
155
|
+
rule /%/, 'Name.Variable', :placeholder
|
152
156
|
rule id, 'Name.Tag'
|
153
157
|
rule /&/, 'Keyword'
|
154
158
|
rule /[~^*!&\[\]()<>\|+=@:;,.\/?-]/, 'Operator'
|
@@ -192,6 +196,11 @@ module Rouge
|
|
192
196
|
mixin :selector_piece
|
193
197
|
end
|
194
198
|
|
199
|
+
state :placeholder do
|
200
|
+
rule id, 'Name.Variable'
|
201
|
+
mixin :selector_piece
|
202
|
+
end
|
203
|
+
|
195
204
|
state :for do
|
196
205
|
rule /(from|to|through)/, 'Operator.Word'
|
197
206
|
mixin :value
|
data/lib/rouge/lexers/scheme.rb
CHANGED
@@ -7,69 +7,76 @@ module Rouge
|
|
7
7
|
filenames '*.scm', '*.ss', '*.rkt'
|
8
8
|
mimetypes 'text/x-scheme', 'application/x-scheme'
|
9
9
|
|
10
|
-
keywords
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
def self.keywords
|
11
|
+
@keywords ||= Set.new %w(
|
12
|
+
lambda define if else cond and or case let let* letrec begin
|
13
|
+
do delay set! => quote quasiquote unquote unquote-splicing
|
14
|
+
define-syntax let-syntax letrec-syntax syntax-rules
|
15
|
+
)
|
16
|
+
end
|
15
17
|
|
16
|
-
builtins
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
18
|
+
def self.builtins
|
19
|
+
@builtins ||= Set.new %w(
|
20
|
+
* + - / < <= = > >= abs acos angle append apply asin
|
21
|
+
assoc assq assv atan boolean? caaaar caaadr caaar caadar
|
22
|
+
caaddr caadr caar cadaar cadadr cadar caddar cadddr caddr
|
23
|
+
cadr call-with-current-continuation call-with-input-file
|
24
|
+
call-with-output-file call-with-values call/cc car cdaaar cdaadr
|
25
|
+
cdaar cdadar cdaddr cdadr cdar cddaar cddadr cddar cdddar cddddr
|
26
|
+
cdddr cddr cdr ceiling char->integer char-alphabetic? char-ci<=?
|
27
|
+
char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase
|
28
|
+
char-lower-case? char-numeric? char-ready? char-upcase
|
29
|
+
char-upper-case? char-whitespace? char<=? char<? char=? char>=?
|
30
|
+
char>? char? close-input-port close-output-port complex? cons
|
31
|
+
cos current-input-port current-output-port denominator
|
32
|
+
display dynamic-wind eof-object? eq? equal? eqv? eval
|
33
|
+
even? exact->inexact exact? exp expt floor for-each force gcd
|
34
|
+
imag-part inexact->exact inexact? input-port? integer->char
|
35
|
+
integer? interaction-environment lcm length list list->string
|
36
|
+
list->vector list-ref list-tail list? load log magnitude
|
37
|
+
make-polar make-rectangular make-string make-vector map
|
38
|
+
max member memq memv min modulo negative? newline not
|
39
|
+
null-environment null? number->string number? numerator odd?
|
40
|
+
open-input-file open-output-file output-port? pair? peek-char
|
41
|
+
port? positive? procedure? quotient rational? rationalize
|
42
|
+
read read-char real-part real? remainder reverse round
|
43
|
+
scheme-report-environment set-car! set-cdr! sin sqrt string
|
44
|
+
string->list string->number string->symbol string-append
|
45
|
+
string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>?
|
46
|
+
string-copy string-fill! string-length string-ref
|
47
|
+
string-set! string<=? string<? string=? string>=?
|
48
|
+
string>? string? substring symbol->string symbol?
|
49
|
+
tan transcript-off transcript-on truncate values vector
|
50
|
+
vector->list vector-fill! vector-length vector-ref
|
51
|
+
vector-set! vector? with-input-from-file with-output-to-file
|
52
|
+
write write-char zero?
|
53
|
+
)
|
54
|
+
end
|
51
55
|
|
52
56
|
id = /[a-z0-9!$\%&*+,\/:<=>?@^_~|-]+/i
|
53
57
|
|
54
|
-
escape = Regexp.method(:escape)
|
55
|
-
|
56
58
|
state :root do
|
57
59
|
# comments
|
58
60
|
rule /;.*$/, 'Comment.Single'
|
59
61
|
rule /\s+/m, 'Text'
|
60
|
-
rule /-?\d+\.\d+/, 'Number.Float'
|
62
|
+
rule /-?\d+\.\d+/, 'Literal.Number.Float'
|
63
|
+
rule /-?\d+/, 'Literal.Number.Integer'
|
64
|
+
|
65
|
+
# Racket infinitites
|
66
|
+
rule /[+-]inf[.][f0]/, 'Literal.Number'
|
67
|
+
|
68
|
+
rule /#b[01]+/, 'Literal.Number.Binary'
|
69
|
+
rule /#o[0-7]+/, 'Literal.Number.Oct'
|
70
|
+
rule /#d[0-9]+/, 'Literal.Number.Integer'
|
71
|
+
rule /#x[0-9a-f]+/i, 'Literal.Number.Hex'
|
72
|
+
rule /#[ei][\d.]+/, 'Literal.Number.Other'
|
61
73
|
|
62
|
-
# support for uncommon kinds of numbers -
|
63
|
-
# have to figure out what the characters mean
|
64
|
-
# rule /(#e|#i|#b|#o|#d|#x)[\d.]+/, 'Number'
|
65
74
|
rule /"(\\\\|\\"|[^"])*"/, 'Literal.String'
|
66
75
|
rule /'#{id}/i, 'Literal.String.Symbol'
|
67
76
|
rule /#\\([()\/'"._!\$%& ?=+-]{1}|[a-z0-9]+)/i,
|
68
77
|
'Literal.String.Char'
|
69
78
|
rule /#t|#f/, 'Name.Constant'
|
70
79
|
rule /(?:'|#|`|,@|,|\.)/, 'Operator'
|
71
|
-
rule /(?:#{keywords.map(&escape).join('|')})(?=[^\w-])/,
|
72
|
-
'Keyword'
|
73
80
|
|
74
81
|
rule /(['#])(\s*)(\()/m do
|
75
82
|
group 'Literal.String.Symbol'
|
@@ -84,8 +91,18 @@ module Rouge
|
|
84
91
|
end
|
85
92
|
|
86
93
|
state :command do
|
87
|
-
rule
|
88
|
-
|
94
|
+
rule id, 'Name.Function' do |m|
|
95
|
+
if self.class.keywords.include? m[0]
|
96
|
+
token 'Keyword'
|
97
|
+
elsif self.class.builtins.include? m[0]
|
98
|
+
token 'Name.Builtin'
|
99
|
+
else
|
100
|
+
token 'Name.Function'
|
101
|
+
end
|
102
|
+
|
103
|
+
pop!
|
104
|
+
end
|
105
|
+
|
89
106
|
rule(//) { pop! }
|
90
107
|
end
|
91
108
|
|
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.4
|
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-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|