Skip to content

Commit bb53e29

Browse files
Transform ruby
1 parent 2dc2e32 commit bb53e29

File tree

1 file changed

+138
-138
lines changed

1 file changed

+138
-138
lines changed

src/languages/ruby.js

Lines changed: 138 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,17 @@
1-
import { insertBefore } from '../util/language-util.js';
21
import clike from './clike.js';
32

43
/** @type {import('../types.d.ts').LanguageProto<'ruby'>} */
54
export 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-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/
5344
.source;
5445

55-
insertBefore(base, 'keyword', {
56-
'regex-literal': [
57-
{
58-
pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{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])+\/[egimnosux]{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-zA-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: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,
46+
return {
47+
'comment': {
48+
pattern: /#.*|^=begin\s[\s\S]*?^=end/m,
49+
greedy: true,
50+
},
51+
'class-name': {
52+
pattern:
53+
/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,
9154
lookbehind: true,
9255
inside: {
93-
'function': /\b\w+$/,
94-
'keyword': /^self\b/,
95-
'class-name': /^\w+/,
96-
'punctuation': /\./,
56+
'punctuation': /[.\\]/,
9757
},
9858
},
99-
});
100-
101-
insertBefore(base, 'string', {
102-
'string-literal': [
103-
{
104-
pattern: RegExp(/%[qQiIwWs]?/.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(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\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 + /[egimnosux]{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])+\/[egimnosux]{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-zA-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: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,
110+
lookbehind: true,
111+
inside: {
112+
'function': /\b\w+$/,
113+
'keyword': /^self\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(/%[qQiIwWs]?/.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(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,
182-
'constant': /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/,
183-
});
184-
185-
return {
186-
'comment': {
187-
pattern: /#.*|^=begin\s[\s\S]*?^=end/m,
188-
greedy: true,
189-
},
190-
'class-name': {
191-
pattern:
192-
/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,
193-
lookbehind: true,
194-
inside: {
195-
'punctuation': /[.\\]/,
195+
'number': {
196+
'builtin':
197+
/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,
198+
'constant': /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/,
196199
},
197200
},
198-
'keyword':
199-
/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,
200-
'operator': /\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,
201-
'punctuation': /[(){}[\].,;]/,
201+
$delete: ['function', 'string'],
202202
};
203203
},
204204
};

0 commit comments

Comments
 (0)