summaryrefslogtreecommitdiff
path: root/public/vendor/codemirror/mode/python
diff options
context:
space:
mode:
Diffstat (limited to 'public/vendor/codemirror/mode/python')
-rw-r--r--public/vendor/codemirror/mode/python/python.js48
-rw-r--r--public/vendor/codemirror/mode/python/test.js30
2 files changed, 50 insertions, 28 deletions
diff --git a/public/vendor/codemirror/mode/python/python.js b/public/vendor/codemirror/mode/python/python.js
index 196b026c..ec662b1a 100644
--- a/public/vendor/codemirror/mode/python/python.js
+++ b/public/vendor/codemirror/mode/python/python.js
@@ -32,13 +32,6 @@
"sorted", "staticmethod", "str", "sum", "super", "tuple",
"type", "vars", "zip", "__import__", "NotImplemented",
"Ellipsis", "__debug__"];
- var py2 = {builtins: ["apply", "basestring", "buffer", "cmp", "coerce", "execfile",
- "file", "intern", "long", "raw_input", "reduce", "reload",
- "unichr", "unicode", "xrange", "False", "True", "None"],
- keywords: ["exec", "print"]};
- var py3 = {builtins: ["ascii", "bytes", "exec", "print"],
- keywords: ["nonlocal", "False", "True", "None", "async", "await"]};
-
CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins));
function top(state) {
@@ -53,15 +46,6 @@
var doubleDelimiters = parserConf.doubleDelimiters || /^(\+=|\-=|\*=|%=|\/=|&=|\|=|\^=)/;
var tripleDelimiters = parserConf.tripleDelimiters || /^(\/\/=|>>=|<<=|\*\*=)/;
- if (parserConf.version && parseInt(parserConf.version, 10) == 3) {
- // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator
- var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!@]/;
- var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/;
- } else {
- var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!]/;
- var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/;
- }
-
var hangingIndent = parserConf.hangingIndent || conf.indentUnit;
var myKeywords = commonKeywords, myBuiltins = commonBuiltins;
@@ -71,13 +55,21 @@
if (parserConf.extra_builtins != undefined)
myBuiltins = myBuiltins.concat(parserConf.extra_builtins);
- if (parserConf.version && parseInt(parserConf.version, 10) == 3) {
- myKeywords = myKeywords.concat(py3.keywords);
- myBuiltins = myBuiltins.concat(py3.builtins);
- var stringPrefixes = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i");
+ var py3 = parserConf.version && parseInt(parserConf.version, 10) == 3
+ if (py3) {
+ // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator
+ var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!@]/;
+ var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/;
+ myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]);
+ myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]);
+ var stringPrefixes = new RegExp("^(([rbuf]|(br))?('{3}|\"{3}|['\"]))", "i");
} else {
- myKeywords = myKeywords.concat(py2.keywords);
- myBuiltins = myBuiltins.concat(py2.builtins);
+ var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!]/;
+ var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/;
+ myKeywords = myKeywords.concat(["exec", "print"]);
+ myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile",
+ "file", "intern", "long", "raw_input", "reduce", "reload",
+ "unichr", "unicode", "xrange", "False", "True", "None"]);
var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i");
}
var keywords = wordRegexp(myKeywords);
@@ -249,16 +241,16 @@
}
function tokenLexer(stream, state) {
+ if (stream.sol()) state.beginningOfLine = true;
+
var style = state.tokenize(stream, state);
var current = stream.current();
// Handle decorators
- if (current == "@") {
- if (parserConf.version && parseInt(parserConf.version, 10) == 3)
- return stream.match(identifiers, false) ? "meta" : "operator";
- else
- return stream.match(identifiers, false) ? "meta" : ERRORCLASS;
- }
+ if (state.beginningOfLine && current == "@")
+ return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS;
+
+ if (/\S/.test(current)) state.beginningOfLine = false;
if ((style == "variable" || style == "builtin")
&& state.lastToken == "meta")
diff --git a/public/vendor/codemirror/mode/python/test.js b/public/vendor/codemirror/mode/python/test.js
new file mode 100644
index 00000000..c1a9c6a9
--- /dev/null
+++ b/public/vendor/codemirror/mode/python/test.js
@@ -0,0 +1,30 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function() {
+ var mode = CodeMirror.getMode({indentUnit: 4},
+ {name: "python",
+ version: 3,
+ singleLineStringErrors: false});
+ function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
+
+ // Error, because "foobarhello" is neither a known type or property, but
+ // property was expected (after "and"), and it should be in parentheses.
+ MT("decoratorStartOfLine",
+ "[meta @dec]",
+ "[keyword def] [def function]():",
+ " [keyword pass]");
+
+ MT("decoratorIndented",
+ "[keyword class] [def Foo]:",
+ " [meta @dec]",
+ " [keyword def] [def function]():",
+ " [keyword pass]");
+
+ MT("matmulWithSpace:", "[variable a] [operator @] [variable b]");
+ MT("matmulWithoutSpace:", "[variable a][operator @][variable b]");
+ MT("matmulSpaceBefore:", "[variable a] [operator @][variable b]");
+
+ MT("fValidStringPrefix", "[string f'this is a {formatted} string']");
+ MT("uValidStringPrefix", "[string u'this is an unicode string']");
+})();