mllike.js 11 KB

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