1- import { insertBefore } from '../util/language-util.js' ;
21import clike from './clike.js' ;
32
43/** @type {import('../types.d.ts').LanguageProto<'ruby'> } */
54export default {
65 id : 'ruby' ,
76 base : clike ,
87 alias : 'rb' ,
9- grammar ( { base } ) {
8+ grammar ( ) {
109 /**
1110 * Original by Samuel Flores
1211 *
1312 * Adds the following new token classes:
1413 * constant, builtin, variable, symbol, regex
1514 */
16- insertBefore ( base , 'operator' , {
17- 'double-colon' : {
18- pattern : / : : / ,
19- alias : 'punctuation' ,
20- } ,
21- } ) ;
2215
2316 const interpolation = {
2417 pattern : / ( (?: ^ | [ ^ \\ ] ) (?: \\ { 2 } ) * ) # \{ (?: [ ^ { } ] | \{ [ ^ { } ] * \} ) * \} / ,
@@ -36,8 +29,6 @@ export default {
3629 } ,
3730 } ;
3831
39- delete base . function ;
40-
4132 const percentExpression =
4233 '(?:' +
4334 [
@@ -52,153 +43,162 @@ export default {
5243 const symbolName = / (?: " (?: \\ .| [ ^ " \\ \r \n ] ) * " | (?: \b [ a - z A - Z _ ] \w * | [ ^ \s \0 - \x7F ] + ) [ ? ! ] ? | \$ .) /
5344 . source ;
5445
55- insertBefore ( base , 'keyword' , {
56- 'regex-literal' : [
57- {
58- pattern : RegExp ( / % r / . source + percentExpression + / [ e g i m n o s u x ] { 0 , 6 } / . source ) ,
59- greedy : true ,
60- inside : {
61- 'interpolation' : interpolation ,
62- 'regex' : / [ \s \S ] + / ,
63- } ,
64- } ,
65- {
66- pattern :
67- / ( ^ | [ ^ / ] ) \/ (? ! \/ ) (?: \[ [ ^ \r \n \] ] + \] | \\ .| [ ^ [ / \\ \r \n ] ) + \/ [ e g i m n o s u x ] { 0 , 6 } (? = \s * (?: $ | [ \r \n , . ; } ) # ] ) ) / ,
68- lookbehind : true ,
69- greedy : true ,
70- inside : {
71- 'interpolation' : interpolation ,
72- 'regex' : / [ \s \S ] + / ,
73- } ,
74- } ,
75- ] ,
76- 'variable' : / [ @ $ ] + [ a - z A - Z _ ] \w * (?: [ ? ! ] | \b ) / ,
77- 'symbol' : [
78- {
79- pattern : RegExp ( / ( ^ | [ ^ : ] ) : / . source + symbolName ) ,
80- lookbehind : true ,
81- greedy : true ,
82- } ,
83- {
84- pattern : RegExp ( / ( [ \r \n { ( , ] [ \t ] * ) / . source + symbolName + / (? = : (? ! : ) ) / . source ) ,
85- lookbehind : true ,
86- greedy : true ,
87- } ,
88- ] ,
89- 'method-definition' : {
90- pattern : / ( \b d e f \s + ) \w + (?: \s * \. \s * \w + ) ? / ,
46+ return {
47+ 'comment' : {
48+ pattern : / # .* | ^ = b e g i n \s [ \s \S ] * ?^ = e n d / m,
49+ greedy : true ,
50+ } ,
51+ 'class-name' : {
52+ pattern :
53+ / ( \b (?: c l a s s | m o d u l e ) \s + | \b c a t c h \s + \( ) [ \w . \\ ] + | \b [ A - Z _ ] \w * (? = \s * \. \s * n e w \b ) / ,
9154 lookbehind : true ,
9255 inside : {
93- 'function' : / \b \w + $ / ,
94- 'keyword' : / ^ s e l f \b / ,
95- 'class-name' : / ^ \w + / ,
96- 'punctuation' : / \. / ,
56+ 'punctuation' : / [ . \\ ] / ,
9757 } ,
9858 } ,
99- } ) ;
100-
101- insertBefore ( base , 'string' , {
102- 'string-literal' : [
103- {
104- pattern : RegExp ( / % [ q Q i I w W s ] ? / . source + percentExpression ) ,
105- greedy : true ,
106- inside : {
107- 'interpolation' : interpolation ,
108- 'string' : / [ \s \S ] + / ,
109- } ,
110- } ,
111- {
112- pattern : / ( " | ' ) (?: # \{ [ ^ } ] + \} | # (? ! \{ ) | \\ (?: \r \n | [ \s \S ] ) | (? ! \1) [ ^ \\ # \r \n ] ) * \1/ ,
113- greedy : true ,
114- inside : {
115- 'interpolation' : interpolation ,
116- 'string' : / [ \s \S ] + / ,
59+ 'keyword' :
60+ / \b (?: B E G I N | E N D | a l i a s | a n d | b e g i n | b r e a k | c a s e | c l a s s | d e f | d e f i n e _ m e t h o d | d e f i n e d | d o | e a c h | e l s e | e l s i f | e n d | e n s u r e | e x t e n d | f o r | i f | i n | i n c l u d e | m o d u l e | n e w | n e x t | n i l | n o t | o r | p r e p e n d | p r i v a t e | p r o t e c t e d | p u b l i c | r a i s e | r e d o | r e q u i r e | r e s c u e | r e t r y | r e t u r n | s e l f | s u p e r | t h e n | t h r o w | u n d e f | u n l e s s | u n t i l | w h e n | w h i l e | y i e l d ) \b / ,
61+ 'operator' : / \. { 2 , 3 } | & \. | = = = | < ? = > | [ ! = ] ? ~ | (?: & & | \| \| | < < | > > | \* \* | [ + \- * / % < > ! ^ & | = ] ) = ? | [ ? : ] / ,
62+ 'punctuation' : / [ ( ) { } [ \] . , ; ] / ,
63+ $insertBefore : {
64+ 'operator' : {
65+ 'double-colon' : {
66+ pattern : / : : / ,
67+ alias : 'punctuation' ,
11768 } ,
11869 } ,
119- {
120- pattern : / < < [ - ~ ] ? ( [ a - z _ ] \w * ) [ \r \n ] (?: . * [ \r \n ] ) * ? [ \t ] * \1 / i ,
121- alias : 'heredoc-string' ,
122- greedy : true ,
123- inside : {
124- 'delimiter' : {
125- pattern : / ^ < < [ - ~ ] ? [ a - z _ ] \w * | \b [ a - z _ ] \w * $ / i ,
70+ 'keyword' : {
71+ 'regex-literal' : [
72+ {
73+ pattern : RegExp (
74+ / % r / . source + percentExpression + / [ e g i m n o s u x ] { 0 , 6 } / . source
75+ ) ,
76+ greedy : true ,
12677 inside : {
127- 'symbol ' : / \b \w + / ,
128- 'punctuation ' : / ^ < < [ - ~ ] ? / ,
78+ 'interpolation ' : interpolation ,
79+ 'regex ' : / [ \s \S ] + / ,
12980 } ,
13081 } ,
131- 'interpolation' : interpolation ,
132- 'string' : / [ \s \S ] + / ,
133- } ,
134- } ,
135- {
136- pattern : / < < [ - ~ ] ? ' ( [ a - z _ ] \w * ) ' [ \r \n ] (?: .* [ \r \n ] ) * ?[ \t ] * \1/ i,
137- alias : 'heredoc-string' ,
138- greedy : true ,
139- inside : {
140- 'delimiter' : {
141- pattern : / ^ < < [ - ~ ] ? ' [ a - z _ ] \w * ' | \b [ a - z _ ] \w * $ / i,
82+ {
83+ pattern :
84+ / ( ^ | [ ^ / ] ) \/ (? ! \/ ) (?: \[ [ ^ \r \n \] ] + \] | \\ .| [ ^ [ / \\ \r \n ] ) + \/ [ e g i m n o s u x ] { 0 , 6 } (? = \s * (?: $ | [ \r \n , . ; } ) # ] ) ) / ,
85+ lookbehind : true ,
86+ greedy : true ,
14287 inside : {
143- 'symbol ' : / \b \w + / ,
144- 'punctuation ' : / ^ < < [ - ~ ] ? ' | ' $ / ,
88+ 'interpolation ' : interpolation ,
89+ 'regex ' : / [ \s \S ] + / ,
14590 } ,
14691 } ,
147- 'string' : / [ \s \S ] + / ,
148- } ,
149- } ,
150- ] ,
151- 'command-literal' : [
152- {
153- pattern : RegExp ( / % x / . source + percentExpression ) ,
154- greedy : true ,
155- inside : {
156- 'interpolation' : interpolation ,
157- 'command' : {
158- pattern : / [ \s \S ] + / ,
159- alias : 'string' ,
92+ ] ,
93+ 'variable' : / [ @ $ ] + [ a - z A - Z _ ] \w * (?: [ ? ! ] | \b ) / ,
94+ 'symbol' : [
95+ {
96+ pattern : RegExp ( / ( ^ | [ ^ : ] ) : / . source + symbolName ) ,
97+ lookbehind : true ,
98+ greedy : true ,
99+ } ,
100+ {
101+ pattern : RegExp (
102+ / ( [ \r \n { ( , ] [ \t ] * ) / . source + symbolName + / (? = : (? ! : ) ) / . source
103+ ) ,
104+ lookbehind : true ,
105+ greedy : true ,
106+ } ,
107+ ] ,
108+ 'method-definition' : {
109+ pattern : / ( \b d e f \s + ) \w + (?: \s * \. \s * \w + ) ? / ,
110+ lookbehind : true ,
111+ inside : {
112+ 'function' : / \b \w + $ / ,
113+ 'keyword' : / ^ s e l f \b / ,
114+ 'class-name' : / ^ \w + / ,
115+ 'punctuation' : / \. / ,
160116 } ,
161117 } ,
162118 } ,
163- {
164- pattern : / ` (?: # \{ [ ^ } ] + \} | # (? ! \{ ) | \\ (?: \r \n | [ \s \S ] ) | [ ^ \\ ` # \r \n ] ) * ` / ,
165- greedy : true ,
166- inside : {
167- 'interpolation' : interpolation ,
168- 'command' : {
169- pattern : / [ \s \S ] + / ,
170- alias : 'string' ,
119+ 'string' : {
120+ 'string-literal' : [
121+ {
122+ pattern : RegExp ( / % [ q Q i I w W s ] ? / . source + percentExpression ) ,
123+ greedy : true ,
124+ inside : {
125+ 'interpolation' : interpolation ,
126+ 'string' : / [ \s \S ] + / ,
127+ } ,
171128 } ,
172- } ,
129+ {
130+ pattern :
131+ / ( " | ' ) (?: # \{ [ ^ } ] + \} | # (? ! \{ ) | \\ (?: \r \n | [ \s \S ] ) | (? ! \1) [ ^ \\ # \r \n ] ) * \1/ ,
132+ greedy : true ,
133+ inside : {
134+ 'interpolation' : interpolation ,
135+ 'string' : / [ \s \S ] + / ,
136+ } ,
137+ } ,
138+ {
139+ pattern : / < < [ - ~ ] ? ( [ a - z _ ] \w * ) [ \r \n ] (?: .* [ \r \n ] ) * ?[ \t ] * \1/ i,
140+ alias : 'heredoc-string' ,
141+ greedy : true ,
142+ inside : {
143+ 'delimiter' : {
144+ pattern : / ^ < < [ - ~ ] ? [ a - z _ ] \w * | \b [ a - z _ ] \w * $ / i,
145+ inside : {
146+ 'symbol' : / \b \w + / ,
147+ 'punctuation' : / ^ < < [ - ~ ] ? / ,
148+ } ,
149+ } ,
150+ 'interpolation' : interpolation ,
151+ 'string' : / [ \s \S ] + / ,
152+ } ,
153+ } ,
154+ {
155+ pattern : / < < [ - ~ ] ? ' ( [ a - z _ ] \w * ) ' [ \r \n ] (?: .* [ \r \n ] ) * ?[ \t ] * \1/ i,
156+ alias : 'heredoc-string' ,
157+ greedy : true ,
158+ inside : {
159+ 'delimiter' : {
160+ pattern : / ^ < < [ - ~ ] ? ' [ a - z _ ] \w * ' | \b [ a - z _ ] \w * $ / i,
161+ inside : {
162+ 'symbol' : / \b \w + / ,
163+ 'punctuation' : / ^ < < [ - ~ ] ? ' | ' $ / ,
164+ } ,
165+ } ,
166+ 'string' : / [ \s \S ] + / ,
167+ } ,
168+ } ,
169+ ] ,
170+ 'command-literal' : [
171+ {
172+ pattern : RegExp ( / % x / . source + percentExpression ) ,
173+ greedy : true ,
174+ inside : {
175+ 'interpolation' : interpolation ,
176+ 'command' : {
177+ pattern : / [ \s \S ] + / ,
178+ alias : 'string' ,
179+ } ,
180+ } ,
181+ } ,
182+ {
183+ pattern : / ` (?: # \{ [ ^ } ] + \} | # (? ! \{ ) | \\ (?: \r \n | [ \s \S ] ) | [ ^ \\ ` # \r \n ] ) * ` / ,
184+ greedy : true ,
185+ inside : {
186+ 'interpolation' : interpolation ,
187+ 'command' : {
188+ pattern : / [ \s \S ] + / ,
189+ alias : 'string' ,
190+ } ,
191+ } ,
192+ } ,
193+ ] ,
173194 } ,
174- ] ,
175- } ) ;
176-
177- delete base . string ;
178-
179- insertBefore ( base , 'number' , {
180- 'builtin' :
181- / \b (?: A r r a y | B i g n u m | B i n d i n g | C l a s s | C o n t i n u a t i o n | D i r | E x c e p t i o n | F a l s e C l a s s | F i l e | F i x n u m | F l o a t | H a s h | I O | I n t e g e r | M a t c h D a t a | M e t h o d | M o d u l e | N i l C l a s s | N u m e r i c | O b j e c t | P r o c | R a n g e | R e g e x p | S t a t | S t r i n g | S t r u c t | S y m b o l | T M S | T h r e a d | T h r e a d G r o u p | T i m e | T r u e C l a s s ) \b / ,
182- 'constant' : / \b [ A - Z ] [ A - Z 0 - 9 _ ] * (?: [ ? ! ] | \b ) / ,
183- } ) ;
184-
185- return {
186- 'comment' : {
187- pattern : / # .* | ^ = b e g i n \s [ \s \S ] * ?^ = e n d / m,
188- greedy : true ,
189- } ,
190- 'class-name' : {
191- pattern :
192- / ( \b (?: c l a s s | m o d u l e ) \s + | \b c a t c h \s + \( ) [ \w . \\ ] + | \b [ A - Z _ ] \w * (? = \s * \. \s * n e w \b ) / ,
193- lookbehind : true ,
194- inside : {
195- 'punctuation' : / [ . \\ ] / ,
195+ 'number' : {
196+ 'builtin' :
197+ / \b (?: A r r a y | B i g n u m | B i n d i n g | C l a s s | C o n t i n u a t i o n | D i r | E x c e p t i o n | F a l s e C l a s s | F i l e | F i x n u m | F l o a t | H a s h | I O | I n t e g e r | M a t c h D a t a | M e t h o d | M o d u l e | N i l C l a s s | N u m e r i c | O b j e c t | P r o c | R a n g e | R e g e x p | S t a t | S t r i n g | S t r u c t | S y m b o l | T M S | T h r e a d | T h r e a d G r o u p | T i m e | T r u e C l a s s ) \b / ,
198+ 'constant' : / \b [ A - Z ] [ A - Z 0 - 9 _ ] * (?: [ ? ! ] | \b ) / ,
196199 } ,
197200 } ,
198- 'keyword' :
199- / \b (?: B E G I N | E N D | a l i a s | a n d | b e g i n | b r e a k | c a s e | c l a s s | d e f | d e f i n e _ m e t h o d | d e f i n e d | d o | e a c h | e l s e | e l s i f | e n d | e n s u r e | e x t e n d | f o r | i f | i n | i n c l u d e | m o d u l e | n e w | n e x t | n i l | n o t | o r | p r e p e n d | p r i v a t e | p r o t e c t e d | p u b l i c | r a i s e | r e d o | r e q u i r e | r e s c u e | r e t r y | r e t u r n | s e l f | s u p e r | t h e n | t h r o w | u n d e f | u n l e s s | u n t i l | w h e n | w h i l e | y i e l d ) \b / ,
200- 'operator' : / \. { 2 , 3 } | & \. | = = = | < ? = > | [ ! = ] ? ~ | (?: & & | \| \| | < < | > > | \* \* | [ + \- * / % < > ! ^ & | = ] ) = ? | [ ? : ] / ,
201- 'punctuation' : / [ ( ) { } [ \] . , ; ] / ,
201+ $delete : [ 'function' , 'string' ] ,
202202 } ;
203203 } ,
204204} ;
0 commit comments