mllike.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. // CodeMirror, copyright (c) by Marijn Haverbeke and others
  2. // Distributed under an MIT license: http://codemirror.net/LICENSE
  3. (function(mod) {
  4. if (typeof exports == "object" && typeof module == "object") // CommonJS
  5. mod(require("../../lib/codemirror"));
  6. else if (typeof define == "function" && define.amd) // AMD
  7. define(["../../lib/codemirror"], mod);
  8. else // Plain browser env
  9. mod(CodeMirror);
  10. })(function(CodeMirror) {
  11. "use strict";
  12. CodeMirror.defineMode('mllike', function(_config, parserConfig) {
  13. var words = {
  14. 'as': 'keyword',
  15. 'do': 'keyword',
  16. 'else': 'keyword',
  17. 'end': 'keyword',
  18. 'exception': 'keyword',
  19. 'fun': 'keyword',
  20. 'functor': 'keyword',
  21. 'if': 'keyword',
  22. 'in': 'keyword',
  23. 'include': 'keyword',
  24. 'let': 'keyword',
  25. 'of': 'keyword',
  26. 'open': 'keyword',
  27. 'rec': 'keyword',
  28. 'struct': 'keyword',
  29. 'then': 'keyword',
  30. 'type': 'keyword',
  31. 'val': 'keyword',
  32. 'while': 'keyword',
  33. 'with': 'keyword'
  34. };
  35. var extraWords = parserConfig.extraWords || {};
  36. for (var prop in extraWords) {
  37. if (extraWords.hasOwnProperty(prop)) {
  38. words[prop] = parserConfig.extraWords[prop];
  39. }
  40. }
  41. function tokenBase(stream, state) {
  42. var ch = stream.next();
  43. if (ch === '"') {
  44. state.tokenize = tokenString;
  45. return state.tokenize(stream, state);
  46. }
  47. if (ch === '{') {
  48. if (stream.eat('|')) {
  49. state.longString = true;
  50. state.tokenize = tokenLongString;
  51. return state.tokenize(stream, state);
  52. }
  53. }
  54. if (ch === '(') {
  55. if (stream.eat('*')) {
  56. state.commentLevel++;
  57. state.tokenize = tokenComment;
  58. return state.tokenize(stream, state);
  59. }
  60. }
  61. if (ch === '~' || ch === '?') {
  62. stream.eatWhile(/\w/);
  63. return 'variable-2';
  64. }
  65. if (ch === '`') {
  66. stream.eatWhile(/\w/);
  67. return 'quote';
  68. }
  69. if (ch === '/' && parserConfig.slashComments && stream.eat('/')) {
  70. stream.skipToEnd();
  71. return 'comment';
  72. }
  73. if (/\d/.test(ch)) {
  74. if (ch === '0' && stream.eat(/[bB]/)) {
  75. stream.eatWhile(/[01]/);
  76. } if (ch === '0' && stream.eat(/[xX]/)) {
  77. stream.eatWhile(/[0-9a-fA-F]/)
  78. } if (ch === '0' && stream.eat(/[oO]/)) {
  79. stream.eatWhile(/[0-7]/);
  80. } else {
  81. stream.eatWhile(/[\d_]/);
  82. if (stream.eat('.')) {
  83. stream.eatWhile(/[\d]/);
  84. }
  85. if (stream.eat(/[eE]/)) {
  86. stream.eatWhile(/[\d\-+]/);
  87. }
  88. }
  89. return 'number';
  90. }
  91. if ( /[+\-*&%=<>!?|@\.~:]/.test(ch)) {
  92. return 'operator';
  93. }
  94. if (/[\w\xa1-\uffff]/.test(ch)) {
  95. stream.eatWhile(/[\w\xa1-\uffff]/);
  96. var cur = stream.current();
  97. return words.hasOwnProperty(cur) ? words[cur] : 'variable';
  98. }
  99. return null
  100. }
  101. function tokenString(stream, state) {
  102. var next, end = false, escaped = false;
  103. while ((next = stream.next()) != null) {
  104. if (next === '"' && !escaped) {
  105. end = true;
  106. break;
  107. }
  108. escaped = !escaped && next === '\\';
  109. }
  110. if (end && !escaped) {
  111. state.tokenize = tokenBase;
  112. }
  113. return 'string';
  114. };
  115. function tokenComment(stream, state) {
  116. var prev, next;
  117. while(state.commentLevel > 0 && (next = stream.next()) != null) {
  118. if (prev === '(' && next === '*') state.commentLevel++;
  119. if (prev === '*' && next === ')') state.commentLevel--;
  120. prev = next;
  121. }
  122. if (state.commentLevel <= 0) {
  123. state.tokenize = tokenBase;
  124. }
  125. return 'comment';
  126. }
  127. function tokenLongString(stream, state) {
  128. var prev, next;
  129. while (state.longString && (next = stream.next()) != null) {
  130. if (prev === '|' && next === '}') state.longString = false;
  131. prev = next;
  132. }
  133. if (!state.longString) {
  134. state.tokenize = tokenBase;
  135. }
  136. return 'string';
  137. }
  138. return {
  139. startState: function() {return {tokenize: tokenBase, commentLevel: 0, longString: false};},
  140. token: function(stream, state) {
  141. if (stream.eatSpace()) return null;
  142. return state.tokenize(stream, state);
  143. },
  144. blockCommentStart: "(*",
  145. blockCommentEnd: "*)",
  146. lineComment: parserConfig.slashComments ? "//" : null
  147. };
  148. });
  149. CodeMirror.defineMIME('text/x-ocaml', {
  150. name: 'mllike',
  151. extraWords: {
  152. 'and': 'keyword',
  153. 'assert': 'keyword',
  154. 'begin': 'keyword',
  155. 'class': 'keyword',
  156. 'constraint': 'keyword',
  157. 'done': 'keyword',
  158. 'downto': 'keyword',
  159. 'external': 'keyword',
  160. 'function': 'keyword',
  161. 'initializer': 'keyword',
  162. 'lazy': 'keyword',
  163. 'match': 'keyword',
  164. 'method': 'keyword',
  165. 'module': 'keyword',
  166. 'mutable': 'keyword',
  167. 'new': 'keyword',
  168. 'nonrec': 'keyword',
  169. 'object': 'keyword',
  170. 'private': 'keyword',
  171. 'sig': 'keyword',
  172. 'to': 'keyword',
  173. 'try': 'keyword',
  174. 'value': 'keyword',
  175. 'virtual': 'keyword',
  176. 'when': 'keyword',
  177. // builtins
  178. 'raise': 'builtin',
  179. 'failwith': 'builtin',
  180. 'true': 'builtin',
  181. 'false': 'builtin',
  182. // Pervasives builtins
  183. 'asr': 'builtin',
  184. 'land': 'builtin',
  185. 'lor': 'builtin',
  186. 'lsl': 'builtin',
  187. 'lsr': 'builtin',
  188. 'lxor': 'builtin',
  189. 'mod': 'builtin',
  190. 'or': 'builtin',
  191. // More Pervasives
  192. 'raise_notrace': 'builtin',
  193. 'trace': 'builtin',
  194. 'exit': 'builtin',
  195. 'print_string': 'builtin',
  196. 'print_endline': 'builtin',
  197. 'int': 'type',
  198. 'float': 'type',
  199. 'bool': 'type',
  200. 'char': 'type',
  201. 'string': 'type',
  202. 'unit': 'type',
  203. // Modules
  204. 'List': 'builtin'
  205. }
  206. });
  207. CodeMirror.defineMIME('text/x-fsharp', {
  208. name: 'mllike',
  209. extraWords: {
  210. 'abstract': 'keyword',
  211. 'assert': 'keyword',
  212. 'base': 'keyword',
  213. 'begin': 'keyword',
  214. 'class': 'keyword',
  215. 'default': 'keyword',
  216. 'delegate': 'keyword',
  217. 'do!': 'keyword',
  218. 'done': 'keyword',
  219. 'downcast': 'keyword',
  220. 'downto': 'keyword',
  221. 'elif': 'keyword',
  222. 'extern': 'keyword',
  223. 'finally': 'keyword',
  224. 'for': 'keyword',
  225. 'function': 'keyword',
  226. 'global': 'keyword',
  227. 'inherit': 'keyword',
  228. 'inline': 'keyword',
  229. 'interface': 'keyword',
  230. 'internal': 'keyword',
  231. 'lazy': 'keyword',
  232. 'let!': 'keyword',
  233. 'match': 'keyword',
  234. 'member': 'keyword',
  235. 'module': 'keyword',
  236. 'mutable': 'keyword',
  237. 'namespace': 'keyword',
  238. 'new': 'keyword',
  239. 'null': 'keyword',
  240. 'override': 'keyword',
  241. 'private': 'keyword',
  242. 'public': 'keyword',
  243. 'return!': 'keyword',
  244. 'return': 'keyword',
  245. 'select': 'keyword',
  246. 'static': 'keyword',
  247. 'to': 'keyword',
  248. 'try': 'keyword',
  249. 'upcast': 'keyword',
  250. 'use!': 'keyword',
  251. 'use': 'keyword',
  252. 'void': 'keyword',
  253. 'when': 'keyword',
  254. 'yield!': 'keyword',
  255. 'yield': 'keyword',
  256. // Reserved words
  257. 'atomic': 'keyword',
  258. 'break': 'keyword',
  259. 'checked': 'keyword',
  260. 'component': 'keyword',
  261. 'const': 'keyword',
  262. 'constraint': 'keyword',
  263. 'constructor': 'keyword',
  264. 'continue': 'keyword',
  265. 'eager': 'keyword',
  266. 'event': 'keyword',
  267. 'external': 'keyword',
  268. 'fixed': 'keyword',
  269. 'method': 'keyword',
  270. 'mixin': 'keyword',
  271. 'object': 'keyword',
  272. 'parallel': 'keyword',
  273. 'process': 'keyword',
  274. 'protected': 'keyword',
  275. 'pure': 'keyword',
  276. 'sealed': 'keyword',
  277. 'tailcall': 'keyword',
  278. 'trait': 'keyword',
  279. 'virtual': 'keyword',
  280. 'volatile': 'keyword',
  281. // builtins
  282. 'List': 'builtin',
  283. 'Seq': 'builtin',
  284. 'Map': 'builtin',
  285. 'Set': 'builtin',
  286. 'Option': 'builtin',
  287. 'int': 'builtin',
  288. 'string': 'builtin',
  289. 'not': 'builtin',
  290. 'true': 'builtin',
  291. 'false': 'builtin',
  292. 'raise': 'builtin',
  293. 'failwith': 'builtin'
  294. },
  295. slashComments: true
  296. });
  297. CodeMirror.defineMIME('text/x-sml', {
  298. name: 'mllike',
  299. extraWords: {
  300. 'abstype': 'keyword',
  301. 'and': 'keyword',
  302. 'andalso': 'keyword',
  303. 'case': 'keyword',
  304. 'datatype': 'keyword',
  305. 'fn': 'keyword',
  306. 'handle': 'keyword',
  307. 'infix': 'keyword',
  308. 'infixr': 'keyword',
  309. 'local': 'keyword',
  310. 'nonfix': 'keyword',
  311. 'op': 'keyword',
  312. 'orelse': 'keyword',
  313. 'raise': 'keyword',
  314. 'withtype': 'keyword',
  315. 'eqtype': 'keyword',
  316. 'sharing': 'keyword',
  317. 'sig': 'keyword',
  318. 'signature': 'keyword',
  319. 'structure': 'keyword',
  320. 'where': 'keyword',
  321. 'true': 'keyword',
  322. 'false': 'keyword',
  323. // types
  324. 'int': 'builtin',
  325. 'real': 'builtin',
  326. 'string': 'builtin',
  327. 'char': 'builtin',
  328. 'bool': 'builtin'
  329. },
  330. slashComments: true
  331. });
  332. });