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.
125 lines
6.0 KiB
125 lines
6.0 KiB
(function (e) { |
|
if (typeof exports === "object" && typeof module === "object") { |
|
e(require("../../lib/codemirror")); |
|
} else if (typeof define === "function" && define.amd) { |
|
define(["../../lib/codemirror"], e); |
|
} else { |
|
e(CodeMirror); |
|
} |
|
})(function (x) { |
|
"use strict"; |
|
|
|
function k(e) { |
|
return new RegExp("^((" + e.join(")|(") + "))\\b"); |
|
} |
|
|
|
var _ = k(["and", "or", "not", "is"]), |
|
v = ["as", "assert", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "lambda", "pass", "raise", "return", "try", "while", "with", "yield", "in"], |
|
z = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "property", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip", "__import__", "NotImplemented", "Ellipsis", "__debug__"]; |
|
|
|
function w(e) { |
|
return e.scopes[e.scopes.length - 1]; |
|
} |
|
|
|
x.registerHelper("hintWords", "python", v.concat(z)); |
|
x.defineMode("python", function (t, l) { |
|
var s = "error", |
|
o = l.delimiters || l.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.\\]/, |
|
a = [l.singleOperators, l.doubleOperators, l.doubleDelimiters, l.tripleDelimiters, l.operators || /^([-+*/%\/&|^]=?|[<>=]+|\/\/=?|\*\*=?|!=|[~!@]|\.\.\.)/]; |
|
|
|
for (var e = 0; e < a.length; e++) { |
|
if (!a[e]) a.splice(e--, 1); |
|
} |
|
|
|
var c, u, f = l.hangingIndent || t.indentUnit, n = v, r = z; |
|
var p = (l.extra_keywords && (n = n.concat(l.extra_keywords)), |
|
l.extra_builtins && (r = r.concat(l.extra_builtins)), |
|
!(l.version && Number(l.version) < 3)); |
|
var d = p ? ( |
|
c = l.identifiers || /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/, |
|
n = n.concat(["nonlocal", "False", "True", "None", "async", "await"]), |
|
r = r.concat(["ascii", "bytes", "exec", "print"]), |
|
new RegExp("^(([rbuf]|(br)|(rb)|(fr)|(rf))?('{3}|\"{3}|['\"]))", "i") |
|
) : ( |
|
c = l.identifiers || /^[_A-Za-z][_A-Za-z0-9]*/, |
|
n = n.concat(["exec", "print"]), |
|
r = r.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile", "file", "intern", "long", "raw_input", "reduce", "reload", "unichr", "unicode", "xrange", "False", "True", "None"]), |
|
new RegExp("^(([rubf]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i") |
|
); |
|
var kRegExp = k(n), m = k(r); |
|
|
|
function i(e, t) { |
|
var n, r = e.sol() && "\\" !== t.lastToken; |
|
if (r) { |
|
t.indent = e.indentation(); |
|
} |
|
if (r && "py" === w(t).type) { |
|
r = w(t).offset; |
|
return e.eatSpace() ? (r < (n = e.indentation()) ? b(t) : (n < r && y(e, t) && "#" !== e.peek() && (t.errorToken = true), null)) : (n = h(e, t), r > 0 && y(e, t) && (n += " " + s), n); |
|
} |
|
return h(e, t); |
|
} |
|
|
|
function h(e, t, n) { |
|
if (e.eatSpace()) return null; |
|
if (!n && e.match(/^#.*/)) return "comment"; |
|
if (e.match(/^[0-9\.]/, false)) { |
|
var r = false; |
|
if (e.match(/^[\d_]*\.\d+(e[\+\-]?\d+)?/i) && (r = true), e.match(/^[\d_]+\.\d*/)) { |
|
return e.eat(/J/i), "number"; |
|
} |
|
} |
|
if (e.match(u)) return s; |
|
if (e.match(a)) return "operator"; |
|
if (e.match(o)) return "punctuation"; |
|
return e.match(c) ? ("def" === t.lastToken || "class" === t.lastToken ? "def" : "variable") : null; |
|
} |
|
|
|
function b(e) { |
|
while ("py" !== w(e).type) { |
|
e.scopes.pop(); |
|
} |
|
e.scopes.push({ offset: w(e).offset + t.indentUnit, type: "py", align: null }); |
|
} |
|
|
|
function y(e, t) { |
|
for (var n = e.indentation(); 1 < t.scopes.length && w(t).offset > n;) { |
|
if ("py" !== w(t).type) return true; |
|
t.scopes.pop(); |
|
} |
|
return w(t).offset !== n; |
|
} |
|
|
|
return { |
|
startState: function (e) { |
|
return { |
|
tokenize: i, |
|
scopes: [{ offset: e || 0, type: "py", align: null }], |
|
indent: e || 0, |
|
lastToken: null, |
|
lambda: false, |
|
dedent: 0 |
|
}; |
|
}, |
|
token: function (e, t) { |
|
var n = t.errorToken, r = g(e, t); |
|
return n && (t.errorToken = false), r && "comment" !== r && (t.lastToken = "keyword" === r || "punctuation" === r ? e.current() : r), "punctuation" === r && (r = null), e.eol() && t.lambda && (t.lambda = false), n ? r + " " + s : r; |
|
}, |
|
indent: function (e, t) { |
|
if (e.tokenize !== i) return e.tokenize.isString ? x.Pass : 0; |
|
var n = w(e); |
|
return n.type === t.charAt(0) || "py" === n.type && !e.dedent && /^(else:|elif |except |finally:)/.test(t) ? n.align - 1 : n.offset; |
|
}, |
|
electricInput: /^\s*([\}\]\)]|else:|elif |except |finally:)$/, |
|
closeBrackets: { triples: "'\"" }, |
|
lineComment: "#", |
|
fold: "indent" |
|
}; |
|
}); |
|
|
|
x.defineMIME("text/x-python", "python"); |
|
x.defineMIME("text/x-cython", { |
|
name: "python", |
|
extra_keywords: "by cdef cimport cpdef ctypedef enum except extern gil include nogil property public readonly struct union DEF IF ELIF ELSE".split(" ") |
|
}); |
|
});
|
|
|