UNPKG

2.67 kBJavaScriptView Raw
1/*
2Language: C/AL
3Author: Kenneth Fuglsang Christensen <kfuglsang@gmail.com>
4Description: Provides highlighting of Microsoft Dynamics NAV C/AL code files
5Website: https://docs.microsoft.com/en-us/dynamics-nav/programming-in-c-al
6*/
7
8/** @type LanguageFn */
9function 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', // not a string technically but makes sense to be highlighted in the same style
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
159module.exports = cal;