rouge 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rouge.rb +7 -2
- data/lib/rouge/formatters/html.rb +4 -3
- data/lib/rouge/lexer.rb +259 -122
- data/lib/rouge/lexers/css.rb +165 -0
- data/lib/rouge/lexers/diff.rb +28 -0
- data/lib/rouge/lexers/html.rb +65 -0
- data/lib/rouge/lexers/javascript.rb +22 -18
- data/lib/rouge/lexers/shell.rb +40 -24
- data/lib/rouge/lexers/text.rb +11 -0
- data/lib/rouge/theme.rb +36 -47
- data/lib/rouge/themes/colorful.rb +63 -0
- data/lib/rouge/themes/thankful_eyes.rb +11 -9
- data/lib/rouge/token.rb +14 -2
- data/lib/rouge/version.rb +1 -1
- metadata +7 -2
@@ -0,0 +1,165 @@
|
|
1
|
+
module Rouge
|
2
|
+
module Lexers
|
3
|
+
class CSSLexer < RegexLexer
|
4
|
+
tag 'css'
|
5
|
+
extensions 'css'
|
6
|
+
|
7
|
+
identifier = /[a-zA-Z0-9_-]+/
|
8
|
+
number = /-?(?:[0-9]+(\.[0-9]+)?|\.[0-9]+)/
|
9
|
+
keywords = %w(
|
10
|
+
azimuth background-attachment background-color
|
11
|
+
background-image background-position background-repeat
|
12
|
+
background border-bottom-color border-bottom-style
|
13
|
+
border-bottom-width border-left-color border-left-style
|
14
|
+
border-left-width border-right border-right-color
|
15
|
+
border-right-style border-right-width border-top-color
|
16
|
+
border-top-style border-top-width border-bottom
|
17
|
+
border-collapse border-left border-width border-color
|
18
|
+
border-spacing border-style border-top border caption-side
|
19
|
+
clear clip color content counter-increment counter-reset
|
20
|
+
cue-after cue-before cue cursor direction display
|
21
|
+
elevation empty-cells float font-family font-size
|
22
|
+
font-size-adjust font-stretch font-style font-variant
|
23
|
+
font-weight font height letter-spacing line-height
|
24
|
+
list-style-type list-style-image list-style-position
|
25
|
+
list-style margin-bottom margin-left margin-right
|
26
|
+
margin-top margin marker-offset marks max-height max-width
|
27
|
+
min-height min-width opacity orphans outline outline-color
|
28
|
+
outline-style outline-width overflow(?:-x -y ) padding-bottom
|
29
|
+
padding-left padding-right padding-top padding page
|
30
|
+
page-break-after page-break-before page-break-inside
|
31
|
+
pause-after pause-before pause pitch pitch-range
|
32
|
+
play-during position quotes richness right size
|
33
|
+
speak-header speak-numeral speak-punctuation speak
|
34
|
+
speech-rate stress table-layout text-align text-decoration
|
35
|
+
text-indent text-shadow text-transform top unicode-bidi
|
36
|
+
vertical-align visibility voice-family volume white-space
|
37
|
+
widows width word-spacing z-index bottom left
|
38
|
+
above absolute always armenian aural auto avoid baseline
|
39
|
+
behind below bidi-override blink block bold bolder both
|
40
|
+
capitalize center-left center-right center circle
|
41
|
+
cjk-ideographic close-quote collapse condensed continuous
|
42
|
+
crop crosshair cross cursive dashed decimal-leading-zero
|
43
|
+
decimal default digits disc dotted double e-resize embed
|
44
|
+
extra-condensed extra-expanded expanded fantasy far-left
|
45
|
+
far-right faster fast fixed georgian groove hebrew help
|
46
|
+
hidden hide higher high hiragana-iroha hiragana icon
|
47
|
+
inherit inline-table inline inset inside invert italic
|
48
|
+
justify katakana-iroha katakana landscape larger large
|
49
|
+
left-side leftwards level lighter line-through list-item
|
50
|
+
loud lower-alpha lower-greek lower-roman lowercase ltr
|
51
|
+
lower low medium message-box middle mix monospace
|
52
|
+
n-resize narrower ne-resize no-close-quote no-open-quote
|
53
|
+
no-repeat none normal nowrap nw-resize oblique once
|
54
|
+
open-quote outset outside overline pointer portrait px
|
55
|
+
relative repeat-x repeat-y repeat rgb ridge right-side
|
56
|
+
rightwards s-resize sans-serif scroll se-resize
|
57
|
+
semi-condensed semi-expanded separate serif show silent
|
58
|
+
slow slower small-caps small-caption smaller soft solid
|
59
|
+
spell-out square static status-bar super sw-resize
|
60
|
+
table-caption table-cell table-column table-column-group
|
61
|
+
table-footer-group table-header-group table-row
|
62
|
+
table-row-group text text-bottom text-top thick thin
|
63
|
+
transparent ultra-condensed ultra-expanded underline
|
64
|
+
upper-alpha upper-latin upper-roman uppercase url
|
65
|
+
visible w-resize wait wider x-fast x-high x-large x-loud
|
66
|
+
x-low x-small x-soft xx-large xx-small yes
|
67
|
+
).join('|')
|
68
|
+
|
69
|
+
builtins = %w(
|
70
|
+
indigo gold firebrick indianred yellow darkolivegreen
|
71
|
+
darkseagreen mediumvioletred mediumorchid chartreuse
|
72
|
+
mediumslateblue black springgreen crimson lightsalmon brown
|
73
|
+
turquoise olivedrab cyan silver skyblue gray darkturquoise
|
74
|
+
goldenrod darkgreen darkviolet darkgray lightpink teal
|
75
|
+
darkmagenta lightgoldenrodyellow lavender yellowgreen thistle
|
76
|
+
violet navy orchid blue ghostwhite honeydew cornflowerblue
|
77
|
+
darkblue darkkhaki mediumpurple cornsilk red bisque slategray
|
78
|
+
darkcyan khaki wheat deepskyblue darkred steelblue aliceblue
|
79
|
+
gainsboro mediumturquoise floralwhite coral purple lightgrey
|
80
|
+
lightcyan darksalmon beige azure lightsteelblue oldlace
|
81
|
+
greenyellow royalblue lightseagreen mistyrose sienna
|
82
|
+
lightcoral orangered navajowhite lime palegreen burlywood
|
83
|
+
seashell mediumspringgreen fuchsia papayawhip blanchedalmond
|
84
|
+
peru aquamarine white darkslategray ivory dodgerblue
|
85
|
+
lemonchiffon chocolate orange forestgreen slateblue olive
|
86
|
+
mintcream antiquewhite darkorange cadetblue moccasin
|
87
|
+
limegreen saddlebrown darkslateblue lightskyblue deeppink
|
88
|
+
plum aqua darkgoldenrod maroon sandybrown magenta tan
|
89
|
+
rosybrown pink lightblue palevioletred mediumseagreen
|
90
|
+
dimgray powderblue seagreen snow mediumblue midnightblue
|
91
|
+
paleturquoise palegoldenrod whitesmoke darkorchid salmon
|
92
|
+
lightslategray lawngreen lightgreen tomato hotpink
|
93
|
+
lightyellow lavenderblush linen mediumaquamarine green
|
94
|
+
blueviolet peachpuff
|
95
|
+
).join('|')
|
96
|
+
|
97
|
+
state :root do
|
98
|
+
mixin :basics
|
99
|
+
rule /{/, 'Punctuation', :stanza
|
100
|
+
rule /:#{identifier}/, 'Name.Decorator'
|
101
|
+
rule /\.#{identifier}/, 'Name.Class'
|
102
|
+
rule /##{identifier}/, 'Name.Function'
|
103
|
+
rule /@#{identifier}/, 'Keyword', :at_rule
|
104
|
+
rule identifier, 'Name.Tag'
|
105
|
+
rule %r([~^*!%&\[\]()<>|+=@:;,./?-]), 'Operator'
|
106
|
+
end
|
107
|
+
|
108
|
+
state :value do
|
109
|
+
mixin :basics
|
110
|
+
rule /url\(.*?\)/, 'Literal.String.Other'
|
111
|
+
rule /#[0-9a-f]{1,6}/i, 'Literal.Number' # colors
|
112
|
+
rule /#{number}(?:em|px|%|pt|pc|in|mm|m|ex|s)?\b/, 'Literal.Number'
|
113
|
+
rule /[\[\]():\/.]/, 'Punctuation'
|
114
|
+
rule /"(\\\\|\\"|[^"])*"/, 'Literal.String.Single'
|
115
|
+
rule /'(\\\\|\\'|[^'])*'/, 'Literal.String.Double'
|
116
|
+
rule identifier, 'Name'
|
117
|
+
end
|
118
|
+
|
119
|
+
state :at_rule do
|
120
|
+
rule /{(?=\s*#{identifier}\s*:)/m, 'Punctuation', :at_stanza
|
121
|
+
rule /{/, 'Punctuation', :at_body
|
122
|
+
rule /;/, 'Punctuation', :pop!
|
123
|
+
mixin :value
|
124
|
+
end
|
125
|
+
|
126
|
+
state :at_body do
|
127
|
+
mixin :at_content
|
128
|
+
mixin :root
|
129
|
+
end
|
130
|
+
|
131
|
+
state :at_stanza do
|
132
|
+
mixin :at_content
|
133
|
+
mixin :stanza
|
134
|
+
end
|
135
|
+
|
136
|
+
state :at_content do
|
137
|
+
rule /}/ do
|
138
|
+
token 'Punctuation'
|
139
|
+
pop!; pop!
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
state :basics do
|
144
|
+
rule /\s+/m, 'Text'
|
145
|
+
rule %r(/\*(?:.*?)\*/)m, 'Comment'
|
146
|
+
end
|
147
|
+
|
148
|
+
state :stanza do
|
149
|
+
mixin :basics
|
150
|
+
rule /}/, 'Punctuation', :pop!
|
151
|
+
rule /(?:#{keywords})\s*:/m, 'Keyword', :stanza_value
|
152
|
+
rule /(?:#{builtins})\s*:/m, 'Name.Builtin', :stanza_value
|
153
|
+
rule /#{identifier}\s*:/m, 'Name', :stanza_value
|
154
|
+
end
|
155
|
+
|
156
|
+
state :stanza_value do
|
157
|
+
rule /;/, 'Punctuation', :pop!
|
158
|
+
rule(/(?=})/) { pop! }
|
159
|
+
rule /!important\b/, 'Comment.Preproc'
|
160
|
+
rule /^@.*?$/, 'Comment.Preproc'
|
161
|
+
mixin :value
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Rouge
|
2
|
+
module Lexers
|
3
|
+
class Diff < RegexLexer
|
4
|
+
tag 'diff'
|
5
|
+
aliases 'patch'
|
6
|
+
extensions 'diff', 'patch'
|
7
|
+
|
8
|
+
state :header do
|
9
|
+
rule /^diff .*?\n(?=---|\+\+\+)/m, 'Generic.Heading'
|
10
|
+
rule /^--- .*?\n/, 'Generic.Deleted'
|
11
|
+
rule /^\+\+\+ .*?\n/, 'Generic.Inserted'
|
12
|
+
end
|
13
|
+
|
14
|
+
state :diff do
|
15
|
+
rule /@@ -\d+,\d+ \+\d+,\d+ @@.*?\n/, 'Generic.Heading'
|
16
|
+
rule /^\+.*?\n/, 'Generic.Inserted'
|
17
|
+
rule /^-.*?\n/, 'Generic.Deleted'
|
18
|
+
rule /^ .*?\n/, 'Text'
|
19
|
+
rule /^.*?\n/, 'Error'
|
20
|
+
end
|
21
|
+
|
22
|
+
state :root do
|
23
|
+
mixin :header
|
24
|
+
mixin :diff
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Rouge
|
2
|
+
module Lexers
|
3
|
+
class HTML < RegexLexer
|
4
|
+
tag 'html'
|
5
|
+
extensions 'htm', 'html'
|
6
|
+
|
7
|
+
state :root do
|
8
|
+
rule /[^<&]+/m, 'Text'
|
9
|
+
rule /&\S*?;/, 'Name.Entity'
|
10
|
+
rule /<!\[CDATA\[.*?\]\]>/m, 'Comment.Preproc'
|
11
|
+
rule /<!--/, 'Comment', :comment
|
12
|
+
rule /<\?.*?\?>/m, 'Comment.Preproc' # php? really?
|
13
|
+
|
14
|
+
rule /<\s*script\s*/m do
|
15
|
+
token 'Name.Tag'
|
16
|
+
push :script_content
|
17
|
+
push :tag
|
18
|
+
end
|
19
|
+
|
20
|
+
rule /<\s*style\s*/m do
|
21
|
+
token 'Name.Tag'
|
22
|
+
push :style_content
|
23
|
+
push :tag
|
24
|
+
end
|
25
|
+
|
26
|
+
rule %r(<\s*[a-zA-Z0-9:]+), 'Name.Tag', :tag # opening tags
|
27
|
+
rule %r(<\s*/\s*[a-zA-Z0-9:]+\s*>), 'Name.Tag' # closing tags
|
28
|
+
end
|
29
|
+
|
30
|
+
state :comment do
|
31
|
+
rule /[^-]+/, 'Comment'
|
32
|
+
rule /-->/, 'Comment', :pop!
|
33
|
+
rule /-/, 'Comment'
|
34
|
+
end
|
35
|
+
|
36
|
+
state :tag do
|
37
|
+
rule /\s+/m, 'Text'
|
38
|
+
rule /[a-zA-Z0-9_:-]+\s*=/m, 'Name.Attribute', :attr
|
39
|
+
rule /[a-zA-Z0-9_:-]+/, 'Name.Attribute'
|
40
|
+
rule %r(/?\s*>)m, 'Name.Tag', :pop!
|
41
|
+
end
|
42
|
+
|
43
|
+
state :attr do
|
44
|
+
# TODO: are backslash escapes valid here?
|
45
|
+
rule /".*?"/, 'Literal.String', :pop!
|
46
|
+
rule /'.*?'/, 'Literal.String', :pop!
|
47
|
+
rule /[^\s>]+/, 'Literal.String', :pop!
|
48
|
+
end
|
49
|
+
|
50
|
+
state :script_content do
|
51
|
+
rule %r(<\s*/\s*script\s*>)m, 'Name.Tag', :pop!
|
52
|
+
rule %r(.*?(?=<\s*/\s*script\s*>))m do
|
53
|
+
delegate JavascriptLexer
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
state :style_content do
|
58
|
+
rule %r(<\s*/\s*style\s*>)m, 'Name.Tag', :pop!
|
59
|
+
rule %r(.*(?=<\s*/\s*style\s*>))m do
|
60
|
+
delegate CSSLexer
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,23 +1,28 @@
|
|
1
1
|
module Rouge
|
2
2
|
module Lexers
|
3
|
-
JavascriptLexer
|
4
|
-
|
5
|
-
|
6
|
-
name 'javascript'
|
3
|
+
class JavascriptLexer < RegexLexer
|
4
|
+
tag 'javascript'
|
7
5
|
aliases 'js'
|
6
|
+
extensions 'js'
|
8
7
|
|
9
|
-
|
8
|
+
state :comments_and_whitespace do
|
10
9
|
rule /\s+/, 'Text'
|
11
10
|
rule /<!--/, 'Comment' # really...?
|
12
11
|
rule %r(//.*?\n), 'Comment.Single'
|
13
12
|
rule %r(/\*.*?\*/), 'Comment.Multiline'
|
14
13
|
end
|
15
14
|
|
16
|
-
|
15
|
+
state :slash_starts_regex do
|
17
16
|
mixin :comments_and_whitespace
|
17
|
+
|
18
18
|
rule %r(
|
19
|
-
/
|
20
|
-
(
|
19
|
+
/ # opening slash
|
20
|
+
( \\. # escape sequences
|
21
|
+
| [^/\\\n] # regular characters
|
22
|
+
| \[ (\\. | [^\]\\\n])* \] # character classes
|
23
|
+
)+
|
24
|
+
/ # closing slash
|
25
|
+
(?:[gim]+\b|\B) # flags
|
21
26
|
)x, 'Literal.String.Regex'
|
22
27
|
|
23
28
|
# if it's not matched by the above r.e., it's not
|
@@ -25,10 +30,10 @@ module Rouge
|
|
25
30
|
# end of the line.
|
26
31
|
rule %r(/), 'Literal.String.Regex', :bad_regex
|
27
32
|
rule //, 'Text', :pop!
|
33
|
+
end
|
28
34
|
|
29
|
-
|
30
|
-
|
31
|
-
end
|
35
|
+
state :bad_regex do
|
36
|
+
rule /[^\n]+/, 'Error', :pop!
|
32
37
|
end
|
33
38
|
|
34
39
|
keywords = %w(
|
@@ -55,10 +60,11 @@ module Rouge
|
|
55
60
|
window
|
56
61
|
).join('|')
|
57
62
|
|
58
|
-
|
63
|
+
state :root do
|
59
64
|
rule %r(^(?=\s|/|<!--)), 'Text', :slash_starts_regex
|
60
65
|
mixin :comments_and_whitespace
|
61
|
-
rule %r(
|
66
|
+
rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | ===
|
67
|
+
| !== | \? | : )x,
|
62
68
|
'Operator', :slash_starts_regex
|
63
69
|
rule %r([-<>+*%&|\^/!=]=?), 'Operator', :slash_starts_regex
|
64
70
|
rule /[{(\[;,]/, 'Punctuation', :slash_starts_regex
|
@@ -70,14 +76,12 @@ module Rouge
|
|
70
76
|
rule /(?:#{builtins})\b/, 'Name.Builtin'
|
71
77
|
rule /[$a-zA-Z_][a-zA-Z0-9_]*/, 'Name.Other'
|
72
78
|
|
73
|
-
rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, 'Number.Float'
|
74
|
-
rule /0x[0-9a-fA-F]+/, 'Number.Hex'
|
75
|
-
rule /[0-9]+/, 'Number.Integer'
|
79
|
+
rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, 'Literal.Number.Float'
|
80
|
+
rule /0x[0-9a-fA-F]+/, 'Literal.Number.Hex'
|
81
|
+
rule /[0-9]+/, 'Literal.Number.Integer'
|
76
82
|
rule /"(\\\\|\\"|[^"])*"/, 'Literal.String.Double'
|
77
83
|
rule /'(\\\\|\\'|[^'])*'/, 'Literal.String.Single'
|
78
84
|
end
|
79
|
-
|
80
|
-
mixin :root
|
81
85
|
end
|
82
86
|
end
|
83
87
|
end
|
data/lib/rouge/lexers/shell.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Rouge
|
2
2
|
module Lexers
|
3
|
-
ShellLexer
|
4
|
-
|
3
|
+
class ShellLexer < RegexLexer
|
4
|
+
tag 'shell'
|
5
5
|
aliases 'bash', 'zsh', 'ksh', 'sh'
|
6
|
+
extensions 'sh', 'bash', 'zsh', 'ksh'
|
6
7
|
|
7
8
|
KEYWORDS = %w(
|
8
|
-
if fi else while do done for then return function
|
9
|
-
select continue until esac elif
|
9
|
+
if fi else while do done for then return function
|
10
|
+
select continue until esac elif in
|
10
11
|
).join('|')
|
11
12
|
|
12
13
|
BUILTINS = %w(
|
@@ -18,16 +19,17 @@ module Rouge
|
|
18
19
|
ulimit umask unalias unset wait
|
19
20
|
).join('|')
|
20
21
|
|
21
|
-
|
22
|
+
state :basic do
|
22
23
|
rule /#.*\n/, 'Comment'
|
23
24
|
|
24
25
|
rule /\b(#{KEYWORDS})\s*\b/, 'Keyword'
|
26
|
+
rule /\bcase\b/, 'Keyword', :case
|
25
27
|
|
26
28
|
rule /\b(#{BUILTINS})\s*\b(?!\.)/, 'Name.Builtin'
|
27
29
|
|
28
|
-
rule /(\b\w+)(=)/ do |
|
29
|
-
|
30
|
-
|
30
|
+
rule /(\b\w+)(=)/ do |m|
|
31
|
+
group 'Name.Variable'
|
32
|
+
group 'Operator'
|
31
33
|
end
|
32
34
|
|
33
35
|
rule /[\[\]{}()=]/, 'Operator'
|
@@ -38,17 +40,17 @@ module Rouge
|
|
38
40
|
rule /<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2/, 'Literal.String'
|
39
41
|
end
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
43
|
+
state :double_quotes do
|
44
|
+
# NB: "abc$" is literally the string abc$.
|
45
|
+
# Here we prevent :interp from interpreting $" as a variable.
|
46
|
+
rule /(?:\$#?)?"/, 'Literal.String.Double', :pop!
|
44
47
|
mixin :interp
|
45
48
|
rule /[^"`\\$]+/, 'Literal.String.Double'
|
46
49
|
end
|
47
50
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
rule /$?"/, 'Literal.String.Double', :double_quotes
|
51
|
+
state :data do
|
52
|
+
rule /\\./, 'Literal.String.Escape'
|
53
|
+
rule /\$?"/, 'Literal.String.Double', :double_quotes
|
52
54
|
|
53
55
|
# single quotes are much easier than double quotes - we can
|
54
56
|
# literally just scan until the next single quote.
|
@@ -57,15 +59,17 @@ module Rouge
|
|
57
59
|
# single-quotes. A single-quote cannot occur within single-quotes.
|
58
60
|
rule /$?'[^']*'/, 'Literal.String.Single'
|
59
61
|
|
62
|
+
rule /\*/, 'Keyword'
|
63
|
+
|
60
64
|
rule /;/, 'Text'
|
61
65
|
rule /\s+/, 'Text'
|
62
|
-
rule /[^=\s
|
66
|
+
rule /[^=\s{}()$"\'`\\<]+/, 'Text'
|
63
67
|
rule /\d+(?= |\Z)/, 'Number'
|
64
68
|
rule /</, 'Text'
|
65
69
|
mixin :interp
|
66
70
|
end
|
67
71
|
|
68
|
-
|
72
|
+
state :curly do
|
69
73
|
rule /}/, 'Keyword', :pop!
|
70
74
|
rule /:-/, 'Keyword'
|
71
75
|
rule /[a-zA-Z0-9_]+/, 'Name.Variable'
|
@@ -73,24 +77,38 @@ module Rouge
|
|
73
77
|
mixin :root
|
74
78
|
end
|
75
79
|
|
76
|
-
|
80
|
+
state :paren do
|
77
81
|
rule /\)/, 'Keyword', :pop!
|
78
82
|
mixin :root
|
79
83
|
end
|
80
84
|
|
81
|
-
|
85
|
+
state :math do
|
82
86
|
rule /\)\)/, 'Keyword', :pop!
|
83
87
|
rule %r([-+*/%^|&]|\*\*|\|\|), 'Operator'
|
84
88
|
rule /\d+/, 'Number'
|
85
89
|
mixin :root
|
86
90
|
end
|
87
91
|
|
88
|
-
|
92
|
+
state :case do
|
93
|
+
rule /\besac\b/, 'Keyword', :pop!
|
94
|
+
rule /\|/, 'Punctuation'
|
95
|
+
rule /\)/, 'Punctuation', :case_stanza
|
96
|
+
mixin :root
|
97
|
+
end
|
98
|
+
|
99
|
+
state :case_stanza do
|
100
|
+
rule /;;/, 'Punctuation', :pop!
|
101
|
+
mixin :root
|
102
|
+
end
|
103
|
+
|
104
|
+
state :backticks do
|
89
105
|
rule /`/, 'Literal.String.Backtick', :pop!
|
90
106
|
mixin :root
|
91
107
|
end
|
92
108
|
|
93
|
-
|
109
|
+
state :interp do
|
110
|
+
rule /\\$/, 'Literal.String.Escape' # line continuation
|
111
|
+
rule /\\./, 'Literal.String.Escape'
|
94
112
|
rule /\$\(\(/, 'Keyword', :math
|
95
113
|
rule /\$\(/, 'Keyword', :paren
|
96
114
|
rule /\${#?/, 'Keyword', :curly
|
@@ -98,12 +116,10 @@ module Rouge
|
|
98
116
|
rule /\$#?(\w+|.)/, 'Name.Variable'
|
99
117
|
end
|
100
118
|
|
101
|
-
|
119
|
+
state :root do
|
102
120
|
mixin :basic
|
103
121
|
mixin :data
|
104
122
|
end
|
105
|
-
|
106
|
-
mixin :root
|
107
123
|
end
|
108
124
|
end
|
109
125
|
end
|