delphi.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. Language: Delphi
  3. Website: https://www.embarcadero.com/products/delphi
  4. */
  5. /** @type LanguageFn */
  6. function delphi(hljs) {
  7. const KEYWORDS = [
  8. "exports",
  9. "register",
  10. "file",
  11. "shl",
  12. "array",
  13. "record",
  14. "property",
  15. "for",
  16. "mod",
  17. "while",
  18. "set",
  19. "ally",
  20. "label",
  21. "uses",
  22. "raise",
  23. "not",
  24. "stored",
  25. "class",
  26. "safecall",
  27. "var",
  28. "interface",
  29. "or",
  30. "private",
  31. "static",
  32. "exit",
  33. "index",
  34. "inherited",
  35. "to",
  36. "else",
  37. "stdcall",
  38. "override",
  39. "shr",
  40. "asm",
  41. "far",
  42. "resourcestring",
  43. "finalization",
  44. "packed",
  45. "virtual",
  46. "out",
  47. "and",
  48. "protected",
  49. "library",
  50. "do",
  51. "xorwrite",
  52. "goto",
  53. "near",
  54. "function",
  55. "end",
  56. "div",
  57. "overload",
  58. "object",
  59. "unit",
  60. "begin",
  61. "string",
  62. "on",
  63. "inline",
  64. "repeat",
  65. "until",
  66. "destructor",
  67. "write",
  68. "message",
  69. "program",
  70. "with",
  71. "read",
  72. "initialization",
  73. "except",
  74. "default",
  75. "nil",
  76. "if",
  77. "case",
  78. "cdecl",
  79. "in",
  80. "downto",
  81. "threadvar",
  82. "of",
  83. "try",
  84. "pascal",
  85. "const",
  86. "external",
  87. "constructor",
  88. "type",
  89. "public",
  90. "then",
  91. "implementation",
  92. "finally",
  93. "published",
  94. "procedure",
  95. "absolute",
  96. "reintroduce",
  97. "operator",
  98. "as",
  99. "is",
  100. "abstract",
  101. "alias",
  102. "assembler",
  103. "bitpacked",
  104. "break",
  105. "continue",
  106. "cppdecl",
  107. "cvar",
  108. "enumerator",
  109. "experimental",
  110. "platform",
  111. "deprecated",
  112. "unimplemented",
  113. "dynamic",
  114. "export",
  115. "far16",
  116. "forward",
  117. "generic",
  118. "helper",
  119. "implements",
  120. "interrupt",
  121. "iochecks",
  122. "local",
  123. "name",
  124. "nodefault",
  125. "noreturn",
  126. "nostackframe",
  127. "oldfpccall",
  128. "otherwise",
  129. "saveregisters",
  130. "softfloat",
  131. "specialize",
  132. "strict",
  133. "unaligned",
  134. "varargs"
  135. ];
  136. const COMMENT_MODES = [
  137. hljs.C_LINE_COMMENT_MODE,
  138. hljs.COMMENT(/\{/, /\}/, { relevance: 0 }),
  139. hljs.COMMENT(/\(\*/, /\*\)/, { relevance: 10 })
  140. ];
  141. const DIRECTIVE = {
  142. className: 'meta',
  143. variants: [
  144. {
  145. begin: /\{\$/,
  146. end: /\}/
  147. },
  148. {
  149. begin: /\(\*\$/,
  150. end: /\*\)/
  151. }
  152. ]
  153. };
  154. const STRING = {
  155. className: 'string',
  156. begin: /'/,
  157. end: /'/,
  158. contains: [ { begin: /''/ } ]
  159. };
  160. const NUMBER = {
  161. className: 'number',
  162. relevance: 0,
  163. // Source: https://www.freepascal.org/docs-html/ref/refse6.html
  164. variants: [
  165. {
  166. // Hexadecimal notation, e.g., $7F.
  167. begin: '\\$[0-9A-Fa-f]+' },
  168. {
  169. // Octal notation, e.g., &42.
  170. begin: '&[0-7]+' },
  171. {
  172. // Binary notation, e.g., %1010.
  173. begin: '%[01]+' }
  174. ]
  175. };
  176. const CHAR_STRING = {
  177. className: 'string',
  178. begin: /(#\d+)+/
  179. };
  180. const CLASS = {
  181. begin: hljs.IDENT_RE + '\\s*=\\s*class\\s*\\(',
  182. returnBegin: true,
  183. contains: [ hljs.TITLE_MODE ]
  184. };
  185. const FUNCTION = {
  186. className: 'function',
  187. beginKeywords: 'function constructor destructor procedure',
  188. end: /[:;]/,
  189. keywords: 'function constructor|10 destructor|10 procedure|10',
  190. contains: [
  191. hljs.TITLE_MODE,
  192. {
  193. className: 'params',
  194. begin: /\(/,
  195. end: /\)/,
  196. keywords: KEYWORDS,
  197. contains: [
  198. STRING,
  199. CHAR_STRING,
  200. DIRECTIVE
  201. ].concat(COMMENT_MODES)
  202. },
  203. DIRECTIVE
  204. ].concat(COMMENT_MODES)
  205. };
  206. return {
  207. name: 'Delphi',
  208. aliases: [
  209. 'dpr',
  210. 'dfm',
  211. 'pas',
  212. 'pascal'
  213. ],
  214. case_insensitive: true,
  215. keywords: KEYWORDS,
  216. illegal: /"|\$[G-Zg-z]|\/\*|<\/|\|/,
  217. contains: [
  218. STRING,
  219. CHAR_STRING,
  220. hljs.NUMBER_MODE,
  221. NUMBER,
  222. CLASS,
  223. FUNCTION,
  224. DIRECTIVE
  225. ].concat(COMMENT_MODES)
  226. };
  227. }
  228. export { delphi as default };