mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-25 15:38:40 +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.
103 lines
3.6 KiB
JavaScript
103 lines
3.6 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";
|
|
|
|
function forEach(arr, f) {
|
|
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
|
|
}
|
|
|
|
function arrayContains(arr, item) {
|
|
if (!Array.prototype.indexOf) {
|
|
var i = arr.length;
|
|
while (i--) {
|
|
if (arr[i] === item) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
return arr.indexOf(item) != -1;
|
|
}
|
|
|
|
function scriptHint(editor, _keywords, getToken) {
|
|
// Find the token at the cursor
|
|
var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token;
|
|
// If it's not a 'word-style' token, ignore the token.
|
|
|
|
if (!/^[\w$_]*$/.test(token.string)) {
|
|
token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state,
|
|
className: token.string == ":" ? "python-type" : null};
|
|
}
|
|
|
|
if (!context) var context = [];
|
|
context.push(tprop);
|
|
|
|
var completionList = getCompletions(token, context);
|
|
completionList = completionList.sort();
|
|
|
|
return {list: completionList,
|
|
from: CodeMirror.Pos(cur.line, token.start),
|
|
to: CodeMirror.Pos(cur.line, token.end)};
|
|
}
|
|
|
|
function pythonHint(editor) {
|
|
return scriptHint(editor, pythonKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
|
|
}
|
|
CodeMirror.registerHelper("hint", "python", pythonHint);
|
|
|
|
var pythonKeywords = "and del from not while as elif global or with assert else if pass yield"
|
|
+ "break except import print class exec in raise continue finally is return def for lambda try";
|
|
var pythonKeywordsL = pythonKeywords.split(" ");
|
|
var pythonKeywordsU = pythonKeywords.toUpperCase().split(" ");
|
|
|
|
var pythonBuiltins = "abs divmod input open staticmethod all enumerate int ord str "
|
|
+ "any eval isinstance pow sum basestring execfile issubclass print super"
|
|
+ "bin file iter property tuple bool filter len range type"
|
|
+ "bytearray float list raw_input unichr callable format locals reduce unicode"
|
|
+ "chr frozenset long reload vars classmethod getattr map repr xrange"
|
|
+ "cmp globals max reversed zip compile hasattr memoryview round __import__"
|
|
+ "complex hash min set apply delattr help next setattr buffer"
|
|
+ "dict hex object slice coerce dir id oct sorted intern ";
|
|
var pythonBuiltinsL = pythonBuiltins.split(" ").join("() ").split(" ");
|
|
var pythonBuiltinsU = pythonBuiltins.toUpperCase().split(" ").join("() ").split(" ");
|
|
|
|
function getCompletions(token, context) {
|
|
var found = [], start = token.string;
|
|
function maybeAdd(str) {
|
|
if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);
|
|
}
|
|
|
|
function gatherCompletions(_obj) {
|
|
forEach(pythonBuiltinsL, maybeAdd);
|
|
forEach(pythonBuiltinsU, maybeAdd);
|
|
forEach(pythonKeywordsL, maybeAdd);
|
|
forEach(pythonKeywordsU, maybeAdd);
|
|
}
|
|
|
|
if (context) {
|
|
// If this is a property, see if it belongs to some object we can
|
|
// find in the current environment.
|
|
var obj = context.pop(), base;
|
|
|
|
if (obj.type == "variable")
|
|
base = obj.string;
|
|
else if(obj.type == "variable-3")
|
|
base = ":" + obj.string;
|
|
|
|
while (base != null && context.length)
|
|
base = base[context.pop().string];
|
|
if (base != null) gatherCompletions(base);
|
|
}
|
|
return found;
|
|
}
|
|
});
|