rouge 0.0.2 → 0.0.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 +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
|