mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-30 01:36:21 +00:00
96d4a3ecf7
Due to historical reasons, the code is in subfolder "1". With SVN removal, we place the code back and remove the annoying "1" folder.
161 lines
5.2 KiB
JavaScript
161 lines
5.2 KiB
JavaScript
// 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("sparql", function(config) {
|
|
var indentUnit = config.indentUnit;
|
|
var curPunc;
|
|
|
|
function wordRegexp(words) {
|
|
return new RegExp("^(?:" + words.join("|") + ")$", "i");
|
|
}
|
|
var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri",
|
|
"isblank", "isliteral", "a"]);
|
|
var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe",
|
|
"ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional",
|
|
"graph", "by", "asc", "desc", "as", "having", "undef", "values", "group",
|
|
"minus", "in", "not", "service", "silent", "using", "insert", "delete", "union",
|
|
"data", "copy", "to", "move", "add", "create", "drop", "clear", "load"]);
|
|
var operatorChars = /[*+\-<>=&|]/;
|
|
|
|
function tokenBase(stream, state) {
|
|
var ch = stream.next();
|
|
curPunc = null;
|
|
if (ch == "$" || ch == "?") {
|
|
stream.match(/^[\w\d]*/);
|
|
return "variable-2";
|
|
}
|
|
else if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) {
|
|
stream.match(/^[^\s\u00a0>]*>?/);
|
|
return "atom";
|
|
}
|
|
else if (ch == "\"" || ch == "'") {
|
|
state.tokenize = tokenLiteral(ch);
|
|
return state.tokenize(stream, state);
|
|
}
|
|
else if (/[{}\(\),\.;\[\]]/.test(ch)) {
|
|
curPunc = ch;
|
|
return null;
|
|
}
|
|
else if (ch == "#") {
|
|
stream.skipToEnd();
|
|
return "comment";
|
|
}
|
|
else if (operatorChars.test(ch)) {
|
|
stream.eatWhile(operatorChars);
|
|
return null;
|
|
}
|
|
else if (ch == ":") {
|
|
stream.eatWhile(/[\w\d\._\-]/);
|
|
return "atom";
|
|
}
|
|
else {
|
|
stream.eatWhile(/[_\w\d]/);
|
|
if (stream.eat(":")) {
|
|
stream.eatWhile(/[\w\d_\-]/);
|
|
return "atom";
|
|
}
|
|
var word = stream.current();
|
|
if (ops.test(word))
|
|
return null;
|
|
else if (keywords.test(word))
|
|
return "keyword";
|
|
else
|
|
return "variable";
|
|
}
|
|
}
|
|
|
|
function tokenLiteral(quote) {
|
|
return function(stream, state) {
|
|
var escaped = false, ch;
|
|
while ((ch = stream.next()) != null) {
|
|
if (ch == quote && !escaped) {
|
|
state.tokenize = tokenBase;
|
|
break;
|
|
}
|
|
escaped = !escaped && ch == "\\";
|
|
}
|
|
return "string";
|
|
};
|
|
}
|
|
|
|
function pushContext(state, type, col) {
|
|
state.context = {prev: state.context, indent: state.indent, col: col, type: type};
|
|
}
|
|
function popContext(state) {
|
|
state.indent = state.context.indent;
|
|
state.context = state.context.prev;
|
|
}
|
|
|
|
return {
|
|
startState: function() {
|
|
return {tokenize: tokenBase,
|
|
context: null,
|
|
indent: 0,
|
|
col: 0};
|
|
},
|
|
|
|
token: function(stream, state) {
|
|
if (stream.sol()) {
|
|
if (state.context && state.context.align == null) state.context.align = false;
|
|
state.indent = stream.indentation();
|
|
}
|
|
if (stream.eatSpace()) return null;
|
|
var style = state.tokenize(stream, state);
|
|
|
|
if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") {
|
|
state.context.align = true;
|
|
}
|
|
|
|
if (curPunc == "(") pushContext(state, ")", stream.column());
|
|
else if (curPunc == "[") pushContext(state, "]", stream.column());
|
|
else if (curPunc == "{") pushContext(state, "}", stream.column());
|
|
else if (/[\]\}\)]/.test(curPunc)) {
|
|
while (state.context && state.context.type == "pattern") popContext(state);
|
|
if (state.context && curPunc == state.context.type) popContext(state);
|
|
}
|
|
else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state);
|
|
else if (/atom|string|variable/.test(style) && state.context) {
|
|
if (/[\}\]]/.test(state.context.type))
|
|
pushContext(state, "pattern", stream.column());
|
|
else if (state.context.type == "pattern" && !state.context.align) {
|
|
state.context.align = true;
|
|
state.context.col = stream.column();
|
|
}
|
|
}
|
|
|
|
return style;
|
|
},
|
|
|
|
indent: function(state, textAfter) {
|
|
var firstChar = textAfter && textAfter.charAt(0);
|
|
var context = state.context;
|
|
if (/[\]\}]/.test(firstChar))
|
|
while (context && context.type == "pattern") context = context.prev;
|
|
|
|
var closing = context && firstChar == context.type;
|
|
if (!context)
|
|
return 0;
|
|
else if (context.type == "pattern")
|
|
return context.col;
|
|
else if (context.align)
|
|
return context.col + (closing ? 0 : 1);
|
|
else
|
|
return context.indent + (closing ? 0 : indentUnit);
|
|
}
|
|
};
|
|
});
|
|
|
|
CodeMirror.defineMIME("application/x-sparql-query", "sparql");
|
|
|
|
});
|