reasonml.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /*
  2. Language: ReasonML
  3. Description: Reason lets you write simple, fast and quality type safe code while leveraging both the JavaScript & OCaml ecosystems.
  4. Website: https://reasonml.github.io
  5. Author: Gidi Meir Morris <oss@gidi.io>
  6. Category: functional
  7. */
  8. function reasonml(hljs) {
  9. function orReValues(ops){
  10. return ops
  11. .map(function(op) {
  12. return op
  13. .split('')
  14. .map(function(char) {
  15. return '\\' + char;
  16. })
  17. .join('');
  18. })
  19. .join('|');
  20. }
  21. var RE_IDENT = '~?[a-z$_][0-9a-zA-Z$_]*';
  22. var RE_MODULE_IDENT = '`?[A-Z$_][0-9a-zA-Z$_]*';
  23. var RE_PARAM_TYPEPARAM = '\'?[a-z$_][0-9a-z$_]*';
  24. var RE_PARAM_TYPE = '\s*:\s*[a-z$_][0-9a-z$_]*(\(\s*(' + RE_PARAM_TYPEPARAM + '\s*(,' + RE_PARAM_TYPEPARAM + ')*)?\s*\))?';
  25. var RE_PARAM = RE_IDENT + '(' + RE_PARAM_TYPE + ')?(' + RE_PARAM_TYPE + ')?';
  26. var RE_OPERATOR = "(" + orReValues(['||', '&&', '++', '**', '+.', '*', '/', '*.', '/.', '...', '|>']) + "|==|===)";
  27. var RE_OPERATOR_SPACED = "\\s+" + RE_OPERATOR + "\\s+";
  28. var KEYWORDS = {
  29. keyword:
  30. 'and as asr assert begin class constraint do done downto else end exception external ' +
  31. 'for fun function functor if in include inherit initializer ' +
  32. 'land lazy let lor lsl lsr lxor match method mod module mutable new nonrec ' +
  33. 'object of open or private rec sig struct then to try type val virtual when while with',
  34. built_in:
  35. 'array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ',
  36. literal:
  37. 'true false'
  38. };
  39. var RE_NUMBER = '\\b(0[xX][a-fA-F0-9_]+[Lln]?|' +
  40. '0[oO][0-7_]+[Lln]?|' +
  41. '0[bB][01_]+[Lln]?|' +
  42. '[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)';
  43. var NUMBER_MODE = {
  44. className: 'number',
  45. relevance: 0,
  46. variants: [
  47. {
  48. begin: RE_NUMBER
  49. },
  50. {
  51. begin: '\\(\\-' + RE_NUMBER + '\\)'
  52. }
  53. ]
  54. };
  55. var OPERATOR_MODE = {
  56. className: 'operator',
  57. relevance: 0,
  58. begin: RE_OPERATOR
  59. };
  60. var LIST_CONTENTS_MODES = [
  61. {
  62. className: 'identifier',
  63. relevance: 0,
  64. begin: RE_IDENT
  65. },
  66. OPERATOR_MODE,
  67. NUMBER_MODE
  68. ];
  69. var MODULE_ACCESS_CONTENTS = [
  70. hljs.QUOTE_STRING_MODE,
  71. OPERATOR_MODE,
  72. {
  73. className: 'module',
  74. begin: "\\b" + RE_MODULE_IDENT, returnBegin: true,
  75. end: "\.",
  76. contains: [
  77. {
  78. className: 'identifier',
  79. begin: RE_MODULE_IDENT,
  80. relevance: 0
  81. }
  82. ]
  83. }
  84. ];
  85. var PARAMS_CONTENTS = [
  86. {
  87. className: 'module',
  88. begin: "\\b" + RE_MODULE_IDENT, returnBegin: true,
  89. end: "\.",
  90. relevance: 0,
  91. contains: [
  92. {
  93. className: 'identifier',
  94. begin: RE_MODULE_IDENT,
  95. relevance: 0
  96. }
  97. ]
  98. }
  99. ];
  100. var PARAMS_MODE = {
  101. begin: RE_IDENT,
  102. end: '(,|\\n|\\))',
  103. relevance: 0,
  104. contains: [
  105. OPERATOR_MODE,
  106. {
  107. className: 'typing',
  108. begin: ':',
  109. end: '(,|\\n)',
  110. returnBegin: true,
  111. relevance: 0,
  112. contains: PARAMS_CONTENTS
  113. }
  114. ]
  115. };
  116. var FUNCTION_BLOCK_MODE = {
  117. className: 'function',
  118. relevance: 0,
  119. keywords: KEYWORDS,
  120. variants: [
  121. {
  122. begin: '\\s(\\(\\.?.*?\\)|' + RE_IDENT + ')\\s*=>',
  123. end: '\\s*=>',
  124. returnBegin: true,
  125. relevance: 0,
  126. contains: [
  127. {
  128. className: 'params',
  129. variants: [
  130. {
  131. begin: RE_IDENT
  132. },
  133. {
  134. begin: RE_PARAM
  135. },
  136. {
  137. begin: /\(\s*\)/,
  138. }
  139. ]
  140. }
  141. ]
  142. },
  143. {
  144. begin: '\\s\\(\\.?[^;\\|]*\\)\\s*=>',
  145. end: '\\s=>',
  146. returnBegin: true,
  147. relevance: 0,
  148. contains: [
  149. {
  150. className: 'params',
  151. relevance: 0,
  152. variants: [
  153. PARAMS_MODE
  154. ]
  155. }
  156. ]
  157. },
  158. {
  159. begin: '\\(\\.\\s' + RE_IDENT + '\\)\\s*=>'
  160. }
  161. ]
  162. };
  163. MODULE_ACCESS_CONTENTS.push(FUNCTION_BLOCK_MODE);
  164. var CONSTRUCTOR_MODE = {
  165. className: 'constructor',
  166. begin: RE_MODULE_IDENT + '\\(',
  167. end: '\\)',
  168. illegal: '\\n',
  169. keywords: KEYWORDS,
  170. contains: [
  171. hljs.QUOTE_STRING_MODE,
  172. OPERATOR_MODE,
  173. {
  174. className: 'params',
  175. begin: '\\b' + RE_IDENT
  176. }
  177. ]
  178. };
  179. var PATTERN_MATCH_BLOCK_MODE = {
  180. className: 'pattern-match',
  181. begin: '\\|',
  182. returnBegin: true,
  183. keywords: KEYWORDS,
  184. end: '=>',
  185. relevance: 0,
  186. contains: [
  187. CONSTRUCTOR_MODE,
  188. OPERATOR_MODE,
  189. {
  190. relevance: 0,
  191. className: 'constructor',
  192. begin: RE_MODULE_IDENT
  193. }
  194. ]
  195. };
  196. var MODULE_ACCESS_MODE = {
  197. className: 'module-access',
  198. keywords: KEYWORDS,
  199. returnBegin: true,
  200. variants: [
  201. {
  202. begin: "\\b(" + RE_MODULE_IDENT + "\\.)+" + RE_IDENT
  203. },
  204. {
  205. begin: "\\b(" + RE_MODULE_IDENT + "\\.)+\\(",
  206. end: "\\)",
  207. returnBegin: true,
  208. contains: [
  209. FUNCTION_BLOCK_MODE,
  210. {
  211. begin: '\\(',
  212. end: '\\)',
  213. skip: true
  214. }
  215. ].concat(MODULE_ACCESS_CONTENTS)
  216. },
  217. {
  218. begin: "\\b(" + RE_MODULE_IDENT + "\\.)+{",
  219. end: "}"
  220. }
  221. ],
  222. contains: MODULE_ACCESS_CONTENTS
  223. };
  224. PARAMS_CONTENTS.push(MODULE_ACCESS_MODE);
  225. return {
  226. name: 'ReasonML',
  227. aliases: ['re'],
  228. keywords: KEYWORDS,
  229. illegal: '(:\\-|:=|\\${|\\+=)',
  230. contains: [
  231. hljs.COMMENT('/\\*', '\\*/', { illegal: '^(\\#,\\/\\/)' }),
  232. {
  233. className: 'character',
  234. begin: '\'(\\\\[^\']+|[^\'])\'',
  235. illegal: '\\n',
  236. relevance: 0
  237. },
  238. hljs.QUOTE_STRING_MODE,
  239. {
  240. className: 'literal',
  241. begin: '\\(\\)',
  242. relevance: 0
  243. },
  244. {
  245. className: 'literal',
  246. begin: '\\[\\|',
  247. end: '\\|\\]',
  248. relevance: 0,
  249. contains: LIST_CONTENTS_MODES
  250. },
  251. {
  252. className: 'literal',
  253. begin: '\\[',
  254. end: '\\]',
  255. relevance: 0,
  256. contains: LIST_CONTENTS_MODES
  257. },
  258. CONSTRUCTOR_MODE,
  259. {
  260. className: 'operator',
  261. begin: RE_OPERATOR_SPACED,
  262. illegal: '\\-\\->',
  263. relevance: 0
  264. },
  265. NUMBER_MODE,
  266. hljs.C_LINE_COMMENT_MODE,
  267. PATTERN_MATCH_BLOCK_MODE,
  268. FUNCTION_BLOCK_MODE,
  269. {
  270. className: 'module-def',
  271. begin: "\\bmodule\\s+" + RE_IDENT + "\\s+" + RE_MODULE_IDENT + "\\s+=\\s+{",
  272. end: "}",
  273. returnBegin: true,
  274. keywords: KEYWORDS,
  275. relevance: 0,
  276. contains: [
  277. {
  278. className: 'module',
  279. relevance: 0,
  280. begin: RE_MODULE_IDENT
  281. },
  282. {
  283. begin: '{',
  284. end: '}',
  285. skip: true
  286. }
  287. ].concat(MODULE_ACCESS_CONTENTS)
  288. },
  289. MODULE_ACCESS_MODE
  290. ]
  291. };
  292. }
  293. module.exports = reasonml;