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.
110 lines
3.0 KiB
JavaScript
110 lines
3.0 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("pascal", function() {
|
|
function words(str) {
|
|
var obj = {}, words = str.split(" ");
|
|
for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
|
|
return obj;
|
|
}
|
|
var keywords = words("and array begin case const div do downto else end file for forward integer " +
|
|
"boolean char function goto if in label mod nil not of or packed procedure " +
|
|
"program record repeat set string then to type until var while with");
|
|
var atoms = {"null": true};
|
|
|
|
var isOperatorChar = /[+\-*&%=<>!?|\/]/;
|
|
|
|
function tokenBase(stream, state) {
|
|
var ch = stream.next();
|
|
if (ch == "#" && state.startOfLine) {
|
|
stream.skipToEnd();
|
|
return "meta";
|
|
}
|
|
if (ch == '"' || ch == "'") {
|
|
state.tokenize = tokenString(ch);
|
|
return state.tokenize(stream, state);
|
|
}
|
|
if (ch == "(" && stream.eat("*")) {
|
|
state.tokenize = tokenComment;
|
|
return tokenComment(stream, state);
|
|
}
|
|
if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
|
|
return null;
|
|
}
|
|
if (/\d/.test(ch)) {
|
|
stream.eatWhile(/[\w\.]/);
|
|
return "number";
|
|
}
|
|
if (ch == "/") {
|
|
if (stream.eat("/")) {
|
|
stream.skipToEnd();
|
|
return "comment";
|
|
}
|
|
}
|
|
if (isOperatorChar.test(ch)) {
|
|
stream.eatWhile(isOperatorChar);
|
|
return "operator";
|
|
}
|
|
stream.eatWhile(/[\w\$_]/);
|
|
var cur = stream.current();
|
|
if (keywords.propertyIsEnumerable(cur)) return "keyword";
|
|
if (atoms.propertyIsEnumerable(cur)) return "atom";
|
|
return "variable";
|
|
}
|
|
|
|
function tokenString(quote) {
|
|
return function(stream, state) {
|
|
var escaped = false, next, end = false;
|
|
while ((next = stream.next()) != null) {
|
|
if (next == quote && !escaped) {end = true; break;}
|
|
escaped = !escaped && next == "\\";
|
|
}
|
|
if (end || !escaped) state.tokenize = null;
|
|
return "string";
|
|
};
|
|
}
|
|
|
|
function tokenComment(stream, state) {
|
|
var maybeEnd = false, ch;
|
|
while (ch = stream.next()) {
|
|
if (ch == ")" && maybeEnd) {
|
|
state.tokenize = null;
|
|
break;
|
|
}
|
|
maybeEnd = (ch == "*");
|
|
}
|
|
return "comment";
|
|
}
|
|
|
|
// Interface
|
|
|
|
return {
|
|
startState: function() {
|
|
return {tokenize: null};
|
|
},
|
|
|
|
token: function(stream, state) {
|
|
if (stream.eatSpace()) return null;
|
|
var style = (state.tokenize || tokenBase)(stream, state);
|
|
if (style == "comment" || style == "meta") return style;
|
|
return style;
|
|
},
|
|
|
|
electricChars: "{}"
|
|
};
|
|
});
|
|
|
|
CodeMirror.defineMIME("text/x-pascal", "pascal");
|
|
|
|
});
|