-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
lasso.js
169 lines (168 loc) · 5.03 KB
/
lasso.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
Language: Lasso
Author: Eric Knibbe <[email protected]>
Description: Lasso is a language and server platform for database-driven web applications. This definition handles Lasso 9 syntax and LassoScript for Lasso 8.6 and earlier.
Website: http://www.lassosoft.com/What-Is-Lasso
Category: database, web
*/
export default function(hljs) {
const LASSO_IDENT_RE = '[a-zA-Z_][\\w.]*';
const LASSO_ANGLE_RE = '<\\?(lasso(script)?|=)';
const LASSO_CLOSE_RE = '\\]|\\?>';
const LASSO_KEYWORDS = {
$pattern: LASSO_IDENT_RE + '|&[lg]t;',
literal:
'true false none minimal full all void and or not '
+ 'bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft',
built_in:
'array date decimal duration integer map pair string tag xml null '
+ 'boolean bytes keyword list locale queue set stack staticarray '
+ 'local var variable global data self inherited currentcapture givenblock',
keyword:
'cache database_names database_schemanames database_tablenames '
+ 'define_tag define_type email_batch encode_set html_comment handle '
+ 'handle_error header if inline iterate ljax_target link '
+ 'link_currentaction link_currentgroup link_currentrecord link_detail '
+ 'link_firstgroup link_firstrecord link_lastgroup link_lastrecord '
+ 'link_nextgroup link_nextrecord link_prevgroup link_prevrecord log '
+ 'loop namespace_using output_none portal private protect records '
+ 'referer referrer repeating resultset rows search_args '
+ 'search_arguments select sort_args sort_arguments thread_atomic '
+ 'value_list while abort case else fail_if fail_ifnot fail if_empty '
+ 'if_false if_null if_true loop_abort loop_continue loop_count params '
+ 'params_up return return_value run_children soap_definetag '
+ 'soap_lastrequest soap_lastresponse tag_name ascending average by '
+ 'define descending do equals frozen group handle_failure import in '
+ 'into join let match max min on order parent protected provide public '
+ 'require returnhome skip split_thread sum take thread to trait type '
+ 'where with yield yieldhome'
};
const HTML_COMMENT = hljs.COMMENT(
'<!--',
'-->',
{ relevance: 0 }
);
const LASSO_NOPROCESS = {
className: 'meta',
begin: '\\[noprocess\\]',
starts: {
end: '\\[/noprocess\\]',
returnEnd: true,
contains: [ HTML_COMMENT ]
}
};
const LASSO_START = {
className: 'meta',
begin: '\\[/noprocess|' + LASSO_ANGLE_RE
};
const LASSO_DATAMEMBER = {
className: 'symbol',
begin: '\'' + LASSO_IDENT_RE + '\''
};
const LASSO_CODE = [
hljs.C_LINE_COMMENT_MODE,
hljs.C_BLOCK_COMMENT_MODE,
hljs.inherit(hljs.C_NUMBER_MODE, { begin: hljs.C_NUMBER_RE + '|(-?infinity|NaN)\\b' }),
hljs.inherit(hljs.APOS_STRING_MODE, { illegal: null }),
hljs.inherit(hljs.QUOTE_STRING_MODE, { illegal: null }),
{
className: 'string',
begin: '`',
end: '`'
},
{ // variables
variants: [
{ begin: '[#$]' + LASSO_IDENT_RE },
{
begin: '#',
end: '\\d+',
illegal: '\\W'
}
] },
{
className: 'type',
begin: '::\\s*',
end: LASSO_IDENT_RE,
illegal: '\\W'
},
{
className: 'params',
variants: [
{
begin: '-(?!infinity)' + LASSO_IDENT_RE,
relevance: 0
},
{ begin: '(\\.\\.\\.)' }
]
},
{
begin: /(->|\.)\s*/,
relevance: 0,
contains: [ LASSO_DATAMEMBER ]
},
{
className: 'class',
beginKeywords: 'define',
returnEnd: true,
end: '\\(|=>',
contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: LASSO_IDENT_RE + '(=(?!>))?|[-+*/%](?!>)' }) ]
}
];
return {
name: 'Lasso',
aliases: [
'ls',
'lassoscript'
],
case_insensitive: true,
keywords: LASSO_KEYWORDS,
contains: [
{
className: 'meta',
begin: LASSO_CLOSE_RE,
relevance: 0,
starts: { // markup
end: '\\[|' + LASSO_ANGLE_RE,
returnEnd: true,
relevance: 0,
contains: [ HTML_COMMENT ]
}
},
LASSO_NOPROCESS,
LASSO_START,
{
className: 'meta',
begin: '\\[no_square_brackets',
starts: {
end: '\\[/no_square_brackets\\]', // not implemented in the language
keywords: LASSO_KEYWORDS,
contains: [
{
className: 'meta',
begin: LASSO_CLOSE_RE,
relevance: 0,
starts: {
end: '\\[noprocess\\]|' + LASSO_ANGLE_RE,
returnEnd: true,
contains: [ HTML_COMMENT ]
}
},
LASSO_NOPROCESS,
LASSO_START
].concat(LASSO_CODE)
}
},
{
className: 'meta',
begin: '\\[',
relevance: 0
},
{
className: 'meta',
begin: '^#!',
end: 'lasso9$',
relevance: 10
}
].concat(LASSO_CODE)
};
}