commitall
This commit is contained in:
243
account/theme/plugins/codemirror/mode/elm/elm.js
vendored
Normal file
243
account/theme/plugins/codemirror/mode/elm/elm.js
vendored
Normal file
@ -0,0 +1,243 @@
|
||||
// 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);
|
||||
else // Plain browser env
|
||||
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");
|
||||
});
|
Reference in New Issue
Block a user