1{"version":3,"sources":["../../node_modules/codemirror/mode/python/python.js"],"names":["mod","exports","module","require","define","amd","CodeMirror","wordRegexp","words","RegExp","join","wordOperators","commonKeywords","commonBuiltins","registerHelper","concat","top","state","scopes","length","defineMode","conf","parserConf","ERRORCLASS","delimiters","singleDelimiters","operators","singleOperators","doubleOperators","doubleDelimiters","tripleDelimiters","i","splice","hangingIndent","indentUnit","myKeywords","myBuiltins","extra_keywords","undefined","extra_builtins","py3","version","Number","identifiers","stringPrefixes","keywords","builtins","tokenBase","stream","sol","lastToken","indent","indentation","type","scopeOffset","offset","eatSpace","lineOffset","pushPyScope","dedent","peek","errorToken","style","tokenBaseInner","inFormat","match","floatLiteral","eat","intLiteral","isFmtString","current","toLowerCase","indexOf","tokenize","tokenStringFactory","formatStringFactory","next","delimiter","tokenOuter","charAt","substr","singleline","OUTCLASS","tokenNestedExpr","depth","inner","tokenString","eol","eatWhile","singleLineStringErrors","isString","pop","push","align","pushBracketScope","column","indented","tokenLexer","beginningOfLine","test","lambda","delimiter_index","slice","external","startState","basecolumn","token","addErr","textAfter","Pass","scope","closing","electricInput","closeBrackets","triples","lineComment","fold","defineMIME","str","split","name"],"mappings":"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","file":"python.min.js","sourcesContent":["// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var wordOperators = wordRegexp([\"and\", \"or\", \"not\", \"is\"]);\n  var commonKeywords = [\"as\", \"assert\", \"break\", \"class\", \"continue\",\n                        \"def\", \"del\", \"elif\", \"else\", \"except\", \"finally\",\n                        \"for\", \"from\", \"global\", \"if\", \"import\",\n                        \"lambda\", \"pass\", \"raise\", \"return\",\n                        \"try\", \"while\", \"with\", \"yield\", \"in\"];\n  var commonBuiltins = [\"abs\", \"all\", \"any\", \"bin\", \"bool\", \"bytearray\", \"callable\", \"chr\",\n                        \"classmethod\", \"compile\", \"complex\", \"delattr\", \"dict\", \"dir\", \"divmod\",\n                        \"enumerate\", \"eval\", \"filter\", \"float\", \"format\", \"frozenset\",\n                        \"getattr\", \"globals\", \"hasattr\", \"hash\", \"help\", \"hex\", \"id\",\n                        \"input\", \"int\", \"isinstance\", \"issubclass\", \"iter\", \"len\",\n                        \"list\", \"locals\", \"map\", \"max\", \"memoryview\", \"min\", \"next\",\n                        \"object\", \"oct\", \"open\", \"ord\", \"pow\", \"property\", \"range\",\n                        \"repr\", \"reversed\", \"round\", \"set\", \"setattr\", \"slice\",\n                        \"sorted\", \"staticmethod\", \"str\", \"sum\", \"super\", \"tuple\",\n                        \"type\", \"vars\", \"zip\", \"__import__\", \"NotImplemented\",\n                        \"Ellipsis\", \"__debug__\"];\n  CodeMirror.registerHelper(\"hintWords\", \"python\", commonKeywords.concat(commonBuiltins));\n\n  function top(state) {\n    return state.scopes[state.scopes.length - 1];\n  }\n\n  CodeMirror.defineMode(\"python\", function(conf, parserConf) {\n    var ERRORCLASS = \"error\";\n\n    var delimiters = parserConf.delimiters || parserConf.singleDelimiters || /^[\\(\\)\\[\\]\\{\\}@,:`=;\\.\\\\]/;\n    //               (Backwards-compatibility with old, cumbersome config system)\n    var operators = [parserConf.singleOperators, parserConf.doubleOperators, parserConf.doubleDelimiters, parserConf.tripleDelimiters,\n                     parserConf.operators || /^([-+*/%\\/&|^]=?|[<>=]+|\\/\\/=?|\\*\\*=?|!=|[~!@]|\\.\\.\\.)/]\n    for (var i = 0; i < operators.length; i++) if (!operators[i]) operators.splice(i--, 1)\n\n    var hangingIndent = parserConf.hangingIndent || conf.indentUnit;\n\n    var myKeywords = commonKeywords, myBuiltins = commonBuiltins;\n    if (parserConf.extra_keywords != undefined)\n      myKeywords = myKeywords.concat(parserConf.extra_keywords);\n\n    if (parserConf.extra_builtins != undefined)\n      myBuiltins = myBuiltins.concat(parserConf.extra_builtins);\n\n    var py3 = !(parserConf.version && Number(parserConf.version) < 3)\n    if (py3) {\n      // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator\n      var identifiers = parserConf.identifiers|| /^[_A-Za-z\\u00A1-\\uFFFF][_A-Za-z0-9\\u00A1-\\uFFFF]*/;\n      myKeywords = myKeywords.concat([\"nonlocal\", \"False\", \"True\", \"None\", \"async\", \"await\"]);\n      myBuiltins = myBuiltins.concat([\"ascii\", \"bytes\", \"exec\", \"print\"]);\n      var stringPrefixes = new RegExp(\"^(([rbuf]|(br)|(fr))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n    } else {\n      var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/;\n      myKeywords = myKeywords.concat([\"exec\", \"print\"]);\n      myBuiltins = myBuiltins.concat([\"apply\", \"basestring\", \"buffer\", \"cmp\", \"coerce\", \"execfile\",\n                                      \"file\", \"intern\", \"long\", \"raw_input\", \"reduce\", \"reload\",\n                                      \"unichr\", \"unicode\", \"xrange\", \"False\", \"True\", \"None\"]);\n      var stringPrefixes = new RegExp(\"^(([rubf]|(ur)|(br))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n    }\n    var keywords = wordRegexp(myKeywords);\n    var builtins = wordRegexp(myBuiltins);\n\n    // tokenizers\n    function tokenBase(stream, state) {\n      var sol = stream.sol() && state.lastToken != \"\\\\\"\n      if (sol) state.indent = stream.indentation()\n      // Handle scope changes\n      if (sol && top(state).type == \"py\") {\n        var scopeOffset = top(state).offset;\n        if (stream.eatSpace()) {\n          var lineOffset = stream.indentation();\n          if (lineOffset > scopeOffset)\n            pushPyScope(state);\n          else if (lineOffset < scopeOffset && dedent(stream, state) && stream.peek() != \"#\")\n            state.errorToken = true;\n          return null;\n        } else {\n          var style = tokenBaseInner(stream, state);\n          if (scopeOffset > 0 && dedent(stream, state))\n            style += \" \" + ERRORCLASS;\n          return style;\n        }\n      }\n      return tokenBaseInner(stream, state);\n    }\n\n    function tokenBaseInner(stream, state, inFormat) {\n      if (stream.eatSpace()) return null;\n\n      // Handle Comments\n      if (!inFormat && stream.match(/^#.*/)) return \"comment\";\n\n      // Handle Number Literals\n      if (stream.match(/^[0-9\\.]/, false)) {\n        var floatLiteral = false;\n        // Floats\n        if (stream.match(/^[\\d_]*\\.\\d+(e[\\+\\-]?\\d+)?/i)) { floatLiteral = true; }\n        if (stream.match(/^[\\d_]+\\.\\d*/)) { floatLiteral = true; }\n        if (stream.match(/^\\.\\d+/)) { floatLiteral = true; }\n        if (floatLiteral) {\n          // Float literals may be \"imaginary\"\n          stream.eat(/J/i);\n          return \"number\";\n        }\n        // Integers\n        var intLiteral = false;\n        // Hex\n        if (stream.match(/^0x[0-9a-f_]+/i)) intLiteral = true;\n        // Binary\n        if (stream.match(/^0b[01_]+/i)) intLiteral = true;\n        // Octal\n        if (stream.match(/^0o[0-7_]+/i)) intLiteral = true;\n        // Decimal\n        if (stream.match(/^[1-9][\\d_]*(e[\\+\\-]?[\\d_]+)?/)) {\n          // Decimal literals may be \"imaginary\"\n          stream.eat(/J/i);\n          // TODO - Can you have imaginary longs?\n          intLiteral = true;\n        }\n        // Zero by itself with no other piece of number.\n        if (stream.match(/^0(?![\\dx])/i)) intLiteral = true;\n        if (intLiteral) {\n          // Integer literals may be \"long\"\n          stream.eat(/L/i);\n          return \"number\";\n        }\n      }\n\n      // Handle Strings\n      if (stream.match(stringPrefixes)) {\n        var isFmtString = stream.current().toLowerCase().indexOf('f') !== -1;\n        if (!isFmtString) {\n          state.tokenize = tokenStringFactory(stream.current(), state.tokenize);\n          return state.tokenize(stream, state);\n        } else {\n          state.tokenize = formatStringFactory(stream.current(), state.tokenize);\n          return state.tokenize(stream, state);\n        }\n      }\n\n      for (var i = 0; i < operators.length; i++)\n        if (stream.match(operators[i])) return \"operator\"\n\n      if (stream.match(delimiters)) return \"punctuation\";\n\n      if (state.lastToken == \".\" && stream.match(identifiers))\n        return \"property\";\n\n      if (stream.match(keywords) || stream.match(wordOperators))\n        return \"keyword\";\n\n      if (stream.match(builtins))\n        return \"builtin\";\n\n      if (stream.match(/^(self|cls)\\b/))\n        return \"variable-2\";\n\n      if (stream.match(identifiers)) {\n        if (state.lastToken == \"def\" || state.lastToken == \"class\")\n          return \"def\";\n        return \"variable\";\n      }\n\n      // Handle non-detected items\n      stream.next();\n      return inFormat ? null :ERRORCLASS;\n    }\n\n    function formatStringFactory(delimiter, tokenOuter) {\n      while (\"rubf\".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)\n        delimiter = delimiter.substr(1);\n\n      var singleline = delimiter.length == 1;\n      var OUTCLASS = \"string\";\n\n      function tokenNestedExpr(depth) {\n        return function(stream, state) {\n          var inner = tokenBaseInner(stream, state, true)\n          if (inner == \"punctuation\") {\n            if (stream.current() == \"{\") {\n              state.tokenize = tokenNestedExpr(depth + 1)\n            } else if (stream.current() == \"}\") {\n              if (depth > 1) state.tokenize = tokenNestedExpr(depth - 1)\n              else state.tokenize = tokenString\n            }\n          }\n          return inner\n        }\n      }\n\n      function tokenString(stream, state) {\n        while (!stream.eol()) {\n          stream.eatWhile(/[^'\"\\{\\}\\\\]/);\n          if (stream.eat(\"\\\\\")) {\n            stream.next();\n            if (singleline && stream.eol())\n              return OUTCLASS;\n          } else if (stream.match(delimiter)) {\n            state.tokenize = tokenOuter;\n            return OUTCLASS;\n          } else if (stream.match('{{')) {\n            // ignore {{ in f-str\n            return OUTCLASS;\n          } else if (stream.match('{', false)) {\n            // switch to nested mode\n            state.tokenize = tokenNestedExpr(0)\n            if (stream.current()) return OUTCLASS;\n            else return state.tokenize(stream, state)\n          } else if (stream.match('}}')) {\n            return OUTCLASS;\n          } else if (stream.match('}')) {\n            // single } in f-string is an error\n            return ERRORCLASS;\n          } else {\n            stream.eat(/['\"]/);\n          }\n        }\n        if (singleline) {\n          if (parserConf.singleLineStringErrors)\n            return ERRORCLASS;\n          else\n            state.tokenize = tokenOuter;\n        }\n        return OUTCLASS;\n      }\n      tokenString.isString = true;\n      return tokenString;\n    }\n\n    function tokenStringFactory(delimiter, tokenOuter) {\n      while (\"rubf\".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)\n        delimiter = delimiter.substr(1);\n\n      var singleline = delimiter.length == 1;\n      var OUTCLASS = \"string\";\n\n      function tokenString(stream, state) {\n        while (!stream.eol()) {\n          stream.eatWhile(/[^'\"\\\\]/);\n          if (stream.eat(\"\\\\\")) {\n            stream.next();\n            if (singleline && stream.eol())\n              return OUTCLASS;\n          } else if (stream.match(delimiter)) {\n            state.tokenize = tokenOuter;\n            return OUTCLASS;\n          } else {\n            stream.eat(/['\"]/);\n          }\n        }\n        if (singleline) {\n          if (parserConf.singleLineStringErrors)\n            return ERRORCLASS;\n          else\n            state.tokenize = tokenOuter;\n        }\n        return OUTCLASS;\n      }\n      tokenString.isString = true;\n      return tokenString;\n    }\n\n    function pushPyScope(state) {\n      while (top(state).type != \"py\") state.scopes.pop()\n      state.scopes.push({offset: top(state).offset + conf.indentUnit,\n                         type: \"py\",\n                         align: null})\n    }\n\n    function pushBracketScope(stream, state, type) {\n      var align = stream.match(/^([\\s\\[\\{\\(]|#.*)*$/, false) ? null : stream.column() + 1\n      state.scopes.push({offset: state.indent + hangingIndent,\n                         type: type,\n                         align: align})\n    }\n\n    function dedent(stream, state) {\n      var indented = stream.indentation();\n      while (state.scopes.length > 1 && top(state).offset > indented) {\n        if (top(state).type != \"py\") return true;\n        state.scopes.pop();\n      }\n      return top(state).offset != indented;\n    }\n\n    function tokenLexer(stream, state) {\n      if (stream.sol()) state.beginningOfLine = true;\n\n      var style = state.tokenize(stream, state);\n      var current = stream.current();\n\n      // Handle decorators\n      if (state.beginningOfLine && current == \"@\")\n        return stream.match(identifiers, false) ? \"meta\" : py3 ? \"operator\" : ERRORCLASS;\n\n      if (/\\S/.test(current)) state.beginningOfLine = false;\n\n      if ((style == \"variable\" || style == \"builtin\")\n          && state.lastToken == \"meta\")\n        style = \"meta\";\n\n      // Handle scope changes.\n      if (current == \"pass\" || current == \"return\")\n        state.dedent += 1;\n\n      if (current == \"lambda\") state.lambda = true;\n      if (current == \":\" && !state.lambda && top(state).type == \"py\")\n        pushPyScope(state);\n\n      if (current.length == 1 && !/string|comment/.test(style)) {\n        var delimiter_index = \"[({\".indexOf(current);\n        if (delimiter_index != -1)\n          pushBracketScope(stream, state, \"])}\".slice(delimiter_index, delimiter_index+1));\n\n        delimiter_index = \"])}\".indexOf(current);\n        if (delimiter_index != -1) {\n          if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent\n          else return ERRORCLASS;\n        }\n      }\n      if (state.dedent > 0 && stream.eol() && top(state).type == \"py\") {\n        if (state.scopes.length > 1) state.scopes.pop();\n        state.dedent -= 1;\n      }\n\n      return style;\n    }\n\n    var external = {\n      startState: function(basecolumn) {\n        return {\n          tokenize: tokenBase,\n          scopes: [{offset: basecolumn || 0, type: \"py\", align: null}],\n          indent: basecolumn || 0,\n          lastToken: null,\n          lambda: false,\n          dedent: 0\n        };\n      },\n\n      token: function(stream, state) {\n        var addErr = state.errorToken;\n        if (addErr) state.errorToken = false;\n        var style = tokenLexer(stream, state);\n\n        if (style && style != \"comment\")\n          state.lastToken = (style == \"keyword\" || style == \"punctuation\") ? stream.current() : style;\n        if (style == \"punctuation\") style = null;\n\n        if (stream.eol() && state.lambda)\n          state.lambda = false;\n        return addErr ? style + \" \" + ERRORCLASS : style;\n      },\n\n      indent: function(state, textAfter) {\n        if (state.tokenize != tokenBase)\n          return state.tokenize.isString ? CodeMirror.Pass : 0;\n\n        var scope = top(state), closing = scope.type == textAfter.charAt(0)\n        if (scope.align != null)\n          return scope.align - (closing ? 1 : 0)\n        else\n          return scope.offset - (closing ? hangingIndent : 0)\n      },\n\n      electricInput: /^\\s*[\\}\\]\\)]$/,\n      closeBrackets: {triples: \"'\\\"\"},\n      lineComment: \"#\",\n      fold: \"indent\"\n    };\n    return external;\n  });\n\n  CodeMirror.defineMIME(\"text/x-python\", \"python\");\n\n  var words = function(str) { return str.split(\" \"); };\n\n  CodeMirror.defineMIME(\"text/x-cython\", {\n    name: \"python\",\n    extra_keywords: words(\"by cdef cimport cpdef ctypedef enum except \"+\n                          \"extern gil include nogil property public \"+\n                          \"readonly struct union DEF IF ELIF ELSE\")\n  });\n\n});\n"]}