mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
5.0 KiB
157 lines
5.0 KiB
// 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"), require("../clike/clike")); |
|
else if (typeof define == "function" && define.amd) // AMD |
|
define(["../../lib/codemirror", "../clike/clike"], mod); |
|
else // Plain browser env |
|
mod(CodeMirror); |
|
})(function(CodeMirror) { |
|
"use strict"; |
|
|
|
var keywords = ("this super static final const abstract class extends external factory " + |
|
"implements get native operator set typedef with enum throw rethrow " + |
|
"assert break case continue default in return new deferred async await " + |
|
"try catch finally do else for if switch while import library export " + |
|
"part of show hide is as").split(" "); |
|
var blockKeywords = "try catch finally do else for if switch while".split(" "); |
|
var atoms = "true false null".split(" "); |
|
var builtins = "void bool num int double dynamic var String".split(" "); |
|
|
|
function set(words) { |
|
var obj = {}; |
|
for (var i = 0; i < words.length; ++i) obj[words[i]] = true; |
|
return obj; |
|
} |
|
|
|
function pushInterpolationStack(state) { |
|
(state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize); |
|
} |
|
|
|
function popInterpolationStack(state) { |
|
return (state.interpolationStack || (state.interpolationStack = [])).pop(); |
|
} |
|
|
|
function sizeInterpolationStack(state) { |
|
return state.interpolationStack ? state.interpolationStack.length : 0; |
|
} |
|
|
|
CodeMirror.defineMIME("application/dart", { |
|
name: "clike", |
|
keywords: set(keywords), |
|
blockKeywords: set(blockKeywords), |
|
builtin: set(builtins), |
|
atoms: set(atoms), |
|
hooks: { |
|
"@": function(stream) { |
|
stream.eatWhile(/[\w\$_\.]/); |
|
return "meta"; |
|
}, |
|
|
|
// custom string handling to deal with triple-quoted strings and string interpolation |
|
"'": function(stream, state) { |
|
return tokenString("'", stream, state, false); |
|
}, |
|
"\"": function(stream, state) { |
|
return tokenString("\"", stream, state, false); |
|
}, |
|
"r": function(stream, state) { |
|
var peek = stream.peek(); |
|
if (peek == "'" || peek == "\"") { |
|
return tokenString(stream.next(), stream, state, true); |
|
} |
|
return false; |
|
}, |
|
|
|
"}": function(_stream, state) { |
|
// "}" is end of interpolation, if interpolation stack is non-empty |
|
if (sizeInterpolationStack(state) > 0) { |
|
state.tokenize = popInterpolationStack(state); |
|
return null; |
|
} |
|
return false; |
|
}, |
|
|
|
"/": function(stream, state) { |
|
if (!stream.eat("*")) return false |
|
state.tokenize = tokenNestedComment(1) |
|
return state.tokenize(stream, state) |
|
} |
|
} |
|
}); |
|
|
|
function tokenString(quote, stream, state, raw) { |
|
var tripleQuoted = false; |
|
if (stream.eat(quote)) { |
|
if (stream.eat(quote)) tripleQuoted = true; |
|
else return "string"; //empty string |
|
} |
|
function tokenStringHelper(stream, state) { |
|
var escaped = false; |
|
while (!stream.eol()) { |
|
if (!raw && !escaped && stream.peek() == "$") { |
|
pushInterpolationStack(state); |
|
state.tokenize = tokenInterpolation; |
|
return "string"; |
|
} |
|
var next = stream.next(); |
|
if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) { |
|
state.tokenize = null; |
|
break; |
|
} |
|
escaped = !raw && !escaped && next == "\\"; |
|
} |
|
return "string"; |
|
} |
|
state.tokenize = tokenStringHelper; |
|
return tokenStringHelper(stream, state); |
|
} |
|
|
|
function tokenInterpolation(stream, state) { |
|
stream.eat("$"); |
|
if (stream.eat("{")) { |
|
// let clike handle the content of ${...}, |
|
// we take over again when "}" appears (see hooks). |
|
state.tokenize = null; |
|
} else { |
|
state.tokenize = tokenInterpolationIdentifier; |
|
} |
|
return null; |
|
} |
|
|
|
function tokenInterpolationIdentifier(stream, state) { |
|
stream.eatWhile(/[\w_]/); |
|
state.tokenize = popInterpolationStack(state); |
|
return "variable"; |
|
} |
|
|
|
function tokenNestedComment(depth) { |
|
return function (stream, state) { |
|
var ch |
|
while (ch = stream.next()) { |
|
if (ch == "*" && stream.eat("/")) { |
|
if (depth == 1) { |
|
state.tokenize = null |
|
break |
|
} else { |
|
state.tokenize = tokenNestedComment(depth - 1) |
|
return state.tokenize(stream, state) |
|
} |
|
} else if (ch == "/" && stream.eat("*")) { |
|
state.tokenize = tokenNestedComment(depth + 1) |
|
return state.tokenize(stream, state) |
|
} |
|
} |
|
return "comment" |
|
} |
|
} |
|
|
|
CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins)); |
|
|
|
// This is needed to make loading through meta.js work. |
|
CodeMirror.defineMode("dart", function(conf) { |
|
return CodeMirror.getMode(conf, "application/dart"); |
|
}, "clike"); |
|
});
|
|
|