123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- // CodeMirror, copyright (c) by Marijn Haverbeke and others
- // Distributed under an MIT license: http://codemirror.net/LICENSE
- ;(function (mod) {
- if (typeof exports == 'object' && typeof module == 'object')
- // CommonJS
- mod(require('../../lib/codemirror'))
- else if (typeof define == 'function' && define.amd)
- // AMD
- define(['../../lib/codemirror'], mod)
- // Plain browser env
- else mod(CodeMirror)
- })(function (CodeMirror) {
- 'use strict'
- CodeMirror.defineMode('elm', function () {
- function switchState(source, setState, f) {
- setState(f)
- return f(source, setState)
- }
- var lowerRE = /[a-z]/
- var upperRE = /[A-Z]/
- var innerRE = /[a-zA-Z0-9_]/
- var digitRE = /[0-9]/
- var hexRE = /[0-9A-Fa-f]/
- var symbolRE = /[-&*+.\\/<>=?^|:]/
- var specialRE = /[(),[\]{}]/
- var spacesRE = /[ \v\f]/ // newlines are handled in tokenizer
- function normal() {
- return function (source, setState) {
- if (source.eatWhile(spacesRE)) {
- return null
- }
- var char = source.next()
- if (specialRE.test(char)) {
- return char === '{' && source.eat('-')
- ? switchState(source, setState, chompMultiComment(1))
- : char === '[' && source.match('glsl|')
- ? switchState(source, setState, chompGlsl)
- : 'builtin'
- }
- if (char === "'") {
- return switchState(source, setState, chompChar)
- }
- if (char === '"') {
- return source.eat('"') ? (source.eat('"') ? switchState(source, setState, chompMultiString) : 'string') : switchState(source, setState, chompSingleString)
- }
- if (upperRE.test(char)) {
- source.eatWhile(innerRE)
- return 'variable-2'
- }
- if (lowerRE.test(char)) {
- var isDef = source.pos === 1
- source.eatWhile(innerRE)
- return isDef ? 'def' : 'variable'
- }
- if (digitRE.test(char)) {
- if (char === '0') {
- if (source.eat(/[xX]/)) {
- source.eatWhile(hexRE) // should require at least 1
- return 'number'
- }
- } else {
- source.eatWhile(digitRE)
- }
- if (source.eat('.')) {
- source.eatWhile(digitRE) // should require at least 1
- }
- if (source.eat(/[eE]/)) {
- source.eat(/[-+]/)
- source.eatWhile(digitRE) // should require at least 1
- }
- return 'number'
- }
- if (symbolRE.test(char)) {
- if (char === '-' && source.eat('-')) {
- source.skipToEnd()
- return 'comment'
- }
- source.eatWhile(symbolRE)
- return 'keyword'
- }
- if (char === '_') {
- return 'keyword'
- }
- return 'error'
- }
- }
- function chompMultiComment(nest) {
- if (nest == 0) {
- return normal()
- }
- return function (source, setState) {
- while (!source.eol()) {
- var char = source.next()
- if (char == '{' && source.eat('-')) {
- ++nest
- } else if (char == '-' && source.eat('}')) {
- --nest
- if (nest === 0) {
- setState(normal())
- return 'comment'
- }
- }
- }
- setState(chompMultiComment(nest))
- return 'comment'
- }
- }
- function chompMultiString(source, setState) {
- while (!source.eol()) {
- var char = source.next()
- if (char === '"' && source.eat('"') && source.eat('"')) {
- setState(normal())
- return 'string'
- }
- }
- return 'string'
- }
- function chompSingleString(source, setState) {
- while (source.skipTo('\\"')) {
- source.next()
- source.next()
- }
- if (source.skipTo('"')) {
- source.next()
- setState(normal())
- return 'string'
- }
- source.skipToEnd()
- setState(normal())
- return 'error'
- }
- function chompChar(source, setState) {
- while (source.skipTo("\\'")) {
- source.next()
- source.next()
- }
- if (source.skipTo("'")) {
- source.next()
- setState(normal())
- return 'string'
- }
- source.skipToEnd()
- setState(normal())
- return 'error'
- }
- function chompGlsl(source, setState) {
- while (!source.eol()) {
- var char = source.next()
- if (char === '|' && source.eat(']')) {
- setState(normal())
- return 'string'
- }
- }
- return 'string'
- }
- var wellKnownWords = {
- case: 1,
- of: 1,
- as: 1,
- if: 1,
- then: 1,
- else: 1,
- let: 1,
- in: 1,
- type: 1,
- alias: 1,
- module: 1,
- where: 1,
- import: 1,
- exposing: 1,
- port: 1,
- }
- return {
- startState: function () {
- return { f: normal() }
- },
- copyState: function (s) {
- return { f: s.f }
- },
- token: function (stream, state) {
- var type = state.f(stream, function (s) {
- state.f = s
- })
- var word = stream.current()
- return wellKnownWords.hasOwnProperty(word) ? 'keyword' : type
- },
- }
- })
- CodeMirror.defineMIME('text/x-elm', 'elm')
- })
|