cal.js 2.6 KB

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