1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | function cal(hljs) {
|
10 | const regex = hljs.regex;
|
11 | const KEYWORDS = [
|
12 | "div",
|
13 | "mod",
|
14 | "in",
|
15 | "and",
|
16 | "or",
|
17 | "not",
|
18 | "xor",
|
19 | "asserterror",
|
20 | "begin",
|
21 | "case",
|
22 | "do",
|
23 | "downto",
|
24 | "else",
|
25 | "end",
|
26 | "exit",
|
27 | "for",
|
28 | "local",
|
29 | "if",
|
30 | "of",
|
31 | "repeat",
|
32 | "then",
|
33 | "to",
|
34 | "until",
|
35 | "while",
|
36 | "with",
|
37 | "var"
|
38 | ];
|
39 | const LITERALS = 'false true';
|
40 | const COMMENT_MODES = [
|
41 | hljs.C_LINE_COMMENT_MODE,
|
42 | hljs.COMMENT(
|
43 | /\{/,
|
44 | /\}/,
|
45 | { relevance: 0 }
|
46 | ),
|
47 | hljs.COMMENT(
|
48 | /\(\*/,
|
49 | /\*\)/,
|
50 | { relevance: 10 }
|
51 | )
|
52 | ];
|
53 | const STRING = {
|
54 | className: 'string',
|
55 | begin: /'/,
|
56 | end: /'/,
|
57 | contains: [ { begin: /''/ } ]
|
58 | };
|
59 | const CHAR_STRING = {
|
60 | className: 'string',
|
61 | begin: /(#\d+)+/
|
62 | };
|
63 | const DATE = {
|
64 | className: 'number',
|
65 | begin: '\\b\\d+(\\.\\d+)?(DT|D|T)',
|
66 | relevance: 0
|
67 | };
|
68 | const DBL_QUOTED_VARIABLE = {
|
69 | className: 'string',
|
70 | begin: '"',
|
71 | end: '"'
|
72 | };
|
73 |
|
74 | const PROCEDURE = {
|
75 | match: [
|
76 | /procedure/,
|
77 | /\s+/,
|
78 | /[a-zA-Z_][\w@]*/,
|
79 | /\s*/
|
80 | ],
|
81 | scope: {
|
82 | 1: "keyword",
|
83 | 3: "title.function"
|
84 | },
|
85 | contains: [
|
86 | {
|
87 | className: 'params',
|
88 | begin: /\(/,
|
89 | end: /\)/,
|
90 | keywords: KEYWORDS,
|
91 | contains: [
|
92 | STRING,
|
93 | CHAR_STRING,
|
94 | hljs.NUMBER_MODE
|
95 | ]
|
96 | },
|
97 | ...COMMENT_MODES
|
98 | ]
|
99 | };
|
100 |
|
101 | const OBJECT_TYPES = [
|
102 | "Table",
|
103 | "Form",
|
104 | "Report",
|
105 | "Dataport",
|
106 | "Codeunit",
|
107 | "XMLport",
|
108 | "MenuSuite",
|
109 | "Page",
|
110 | "Query"
|
111 | ];
|
112 | const OBJECT = {
|
113 | match: [
|
114 | /OBJECT/,
|
115 | /\s+/,
|
116 | regex.either(...OBJECT_TYPES),
|
117 | /\s+/,
|
118 | /\d+/,
|
119 | /\s+(?=[^\s])/,
|
120 | /.*/,
|
121 | /$/
|
122 | ],
|
123 | relevance: 3,
|
124 | scope: {
|
125 | 1: "keyword",
|
126 | 3: "type",
|
127 | 5: "number",
|
128 | 7: "title"
|
129 | }
|
130 | };
|
131 |
|
132 | const PROPERTY = {
|
133 | match: /[\w]+(?=\=)/,
|
134 | scope: "attribute",
|
135 | relevance: 0
|
136 | };
|
137 |
|
138 | return {
|
139 | name: 'C/AL',
|
140 | case_insensitive: true,
|
141 | keywords: {
|
142 | keyword: KEYWORDS,
|
143 | literal: LITERALS
|
144 | },
|
145 | illegal: /\/\*/,
|
146 | contains: [
|
147 | PROPERTY,
|
148 | STRING,
|
149 | CHAR_STRING,
|
150 | DATE,
|
151 | DBL_QUOTED_VARIABLE,
|
152 | hljs.NUMBER_MODE,
|
153 | OBJECT,
|
154 | PROCEDURE
|
155 | ]
|
156 | };
|
157 | }
|
158 |
|
159 | module.exports = cal;
|