1{"version":3,"sources":["../../node_modules/codemirror/mode/django/django.js"],"names":["mod","exports","module","require","define","amd","CodeMirror","defineMode","keywords","filters","operators","wordOperators","RegExp","join","tokenBase","stream","state","match","tokenize","inVariable","inTag","inComment","next","inString","delimiter","previousTokenizer","escapeNext","eat","ch","waitDot","peek","waitProperty","Error","waitPipe","waitFilter","eatSpace","foundVariable","keywordMatch","blockCommentTag","inBlockComment","skipToEnd","startState","token","blockCommentStart","blockCommentEnd","config","htmlBase","getMode","djangoInner","overlayMode","defineMIME"],"mappings":"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","file":"django.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\"), require(\"../htmlmixed/htmlmixed\"),\n        require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\",\n            \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineMode(\"django:inner\", function() {\n    var keywords = [\"block\", \"endblock\", \"for\", \"endfor\", \"true\", \"false\", \"filter\", \"endfilter\",\n                    \"loop\", \"none\", \"self\", \"super\", \"if\", \"elif\", \"endif\", \"as\", \"else\", \"import\",\n                    \"with\", \"endwith\", \"without\", \"context\", \"ifequal\", \"endifequal\", \"ifnotequal\",\n                    \"endifnotequal\", \"extends\", \"include\", \"load\", \"comment\", \"endcomment\",\n                    \"empty\", \"url\", \"static\", \"trans\", \"blocktrans\", \"endblocktrans\", \"now\",\n                    \"regroup\", \"lorem\", \"ifchanged\", \"endifchanged\", \"firstof\", \"debug\", \"cycle\",\n                    \"csrf_token\", \"autoescape\", \"endautoescape\", \"spaceless\", \"endspaceless\",\n                    \"ssi\", \"templatetag\", \"verbatim\", \"endverbatim\", \"widthratio\"],\n        filters = [\"add\", \"addslashes\", \"capfirst\", \"center\", \"cut\", \"date\",\n                   \"default\", \"default_if_none\", \"dictsort\",\n                   \"dictsortreversed\", \"divisibleby\", \"escape\", \"escapejs\",\n                   \"filesizeformat\", \"first\", \"floatformat\", \"force_escape\",\n                   \"get_digit\", \"iriencode\", \"join\", \"last\", \"length\",\n                   \"length_is\", \"linebreaks\", \"linebreaksbr\", \"linenumbers\",\n                   \"ljust\", \"lower\", \"make_list\", \"phone2numeric\", \"pluralize\",\n                   \"pprint\", \"random\", \"removetags\", \"rjust\", \"safe\",\n                   \"safeseq\", \"slice\", \"slugify\", \"stringformat\", \"striptags\",\n                   \"time\", \"timesince\", \"timeuntil\", \"title\", \"truncatechars\",\n                   \"truncatechars_html\", \"truncatewords\", \"truncatewords_html\",\n                   \"unordered_list\", \"upper\", \"urlencode\", \"urlize\",\n                   \"urlizetrunc\", \"wordcount\", \"wordwrap\", \"yesno\"],\n        operators = [\"==\", \"!=\", \"<\", \">\", \"<=\", \">=\"],\n        wordOperators = [\"in\", \"not\", \"or\", \"and\"];\n\n    keywords = new RegExp(\"^\\\\b(\" + keywords.join(\"|\") + \")\\\\b\");\n    filters = new RegExp(\"^\\\\b(\" + filters.join(\"|\") + \")\\\\b\");\n    operators = new RegExp(\"^\\\\b(\" + operators.join(\"|\") + \")\\\\b\");\n    wordOperators = new RegExp(\"^\\\\b(\" + wordOperators.join(\"|\") + \")\\\\b\");\n\n    // We have to return \"null\" instead of null, in order to avoid string\n    // styling as the default, when using Django templates inside HTML\n    // element attributes\n    function tokenBase (stream, state) {\n      // Attempt to identify a variable, template or comment tag respectively\n      if (stream.match(\"{{\")) {\n        state.tokenize = inVariable;\n        return \"tag\";\n      } else if (stream.match(\"{%\")) {\n        state.tokenize = inTag;\n        return \"tag\";\n      } else if (stream.match(\"{#\")) {\n        state.tokenize = inComment;\n        return \"comment\";\n      }\n\n      // Ignore completely any stream series that do not match the\n      // Django template opening tags.\n      while (stream.next() != null && !stream.match(/\\{[{%#]/, false)) {}\n      return null;\n    }\n\n    // A string can be included in either single or double quotes (this is\n    // the delimiter). Mark everything as a string until the start delimiter\n    // occurs again.\n    function inString (delimiter, previousTokenizer) {\n      return function (stream, state) {\n        if (!state.escapeNext && stream.eat(delimiter)) {\n          state.tokenize = previousTokenizer;\n        } else {\n          if (state.escapeNext) {\n            state.escapeNext = false;\n          }\n\n          var ch = stream.next();\n\n          // Take into account the backslash for escaping characters, such as\n          // the string delimiter.\n          if (ch == \"\\\\\") {\n            state.escapeNext = true;\n          }\n        }\n\n        return \"string\";\n      };\n    }\n\n    // Apply Django template variable syntax highlighting\n    function inVariable (stream, state) {\n      // Attempt to match a dot that precedes a property\n      if (state.waitDot) {\n        state.waitDot = false;\n\n        if (stream.peek() != \".\") {\n          return \"null\";\n        }\n\n        // Dot followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\".\")) {\n          state.waitProperty = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for property.\");\n        }\n      }\n\n      // Attempt to match a pipe that precedes a filter\n      if (state.waitPipe) {\n        state.waitPipe = false;\n\n        if (stream.peek() != \"|\") {\n          return \"null\";\n        }\n\n        // Pipe followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\"|\")) {\n          state.waitFilter = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for filter.\");\n        }\n      }\n\n      // Highlight properties\n      if (state.waitProperty) {\n        state.waitProperty = false;\n        if (stream.match(/\\b(\\w+)\\b/)) {\n          state.waitDot = true;  // A property can be followed by another property\n          state.waitPipe = true;  // A property can be followed by a filter\n          return \"property\";\n        }\n      }\n\n      // Highlight filters\n      if (state.waitFilter) {\n          state.waitFilter = false;\n        if (stream.match(filters)) {\n          return \"variable-2\";\n        }\n      }\n\n      // Ignore all white spaces\n      if (stream.eatSpace()) {\n        state.waitProperty = false;\n        return \"null\";\n      }\n\n      // Identify numbers\n      if (stream.match(/\\b\\d+(\\.\\d+)?\\b/)) {\n        return \"number\";\n      }\n\n      // Identify strings\n      if (stream.match(\"'\")) {\n        state.tokenize = inString(\"'\", state.tokenize);\n        return \"string\";\n      } else if (stream.match('\"')) {\n        state.tokenize = inString('\"', state.tokenize);\n        return \"string\";\n      }\n\n      // Attempt to find the variable\n      if (stream.match(/\\b(\\w+)\\b/) && !state.foundVariable) {\n        state.waitDot = true;\n        state.waitPipe = true;  // A property can be followed by a filter\n        return \"variable\";\n      }\n\n      // If found closing tag reset\n      if (stream.match(\"}}\")) {\n        state.waitProperty = null;\n        state.waitFilter = null;\n        state.waitDot = null;\n        state.waitPipe = null;\n        state.tokenize = tokenBase;\n        return \"tag\";\n      }\n\n      // If nothing was found, advance to the next character\n      stream.next();\n      return \"null\";\n    }\n\n    function inTag (stream, state) {\n      // Attempt to match a dot that precedes a property\n      if (state.waitDot) {\n        state.waitDot = false;\n\n        if (stream.peek() != \".\") {\n          return \"null\";\n        }\n\n        // Dot followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\".\")) {\n          state.waitProperty = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for property.\");\n        }\n      }\n\n      // Attempt to match a pipe that precedes a filter\n      if (state.waitPipe) {\n        state.waitPipe = false;\n\n        if (stream.peek() != \"|\") {\n          return \"null\";\n        }\n\n        // Pipe followed by a non-word character should be considered an error.\n        if (stream.match(/\\.\\W+/)) {\n          return \"error\";\n        } else if (stream.eat(\"|\")) {\n          state.waitFilter = true;\n          return \"null\";\n        } else {\n          throw Error (\"Unexpected error while waiting for filter.\");\n        }\n      }\n\n      // Highlight properties\n      if (state.waitProperty) {\n        state.waitProperty = false;\n        if (stream.match(/\\b(\\w+)\\b/)) {\n          state.waitDot = true;  // A property can be followed by another property\n          state.waitPipe = true;  // A property can be followed by a filter\n          return \"property\";\n        }\n      }\n\n      // Highlight filters\n      if (state.waitFilter) {\n          state.waitFilter = false;\n        if (stream.match(filters)) {\n          return \"variable-2\";\n        }\n      }\n\n      // Ignore all white spaces\n      if (stream.eatSpace()) {\n        state.waitProperty = false;\n        return \"null\";\n      }\n\n      // Identify numbers\n      if (stream.match(/\\b\\d+(\\.\\d+)?\\b/)) {\n        return \"number\";\n      }\n\n      // Identify strings\n      if (stream.match(\"'\")) {\n        state.tokenize = inString(\"'\", state.tokenize);\n        return \"string\";\n      } else if (stream.match('\"')) {\n        state.tokenize = inString('\"', state.tokenize);\n        return \"string\";\n      }\n\n      // Attempt to match an operator\n      if (stream.match(operators)) {\n        return \"operator\";\n      }\n\n      // Attempt to match a word operator\n      if (stream.match(wordOperators)) {\n        return \"keyword\";\n      }\n\n      // Attempt to match a keyword\n      var keywordMatch = stream.match(keywords);\n      if (keywordMatch) {\n        if (keywordMatch[0] == \"comment\") {\n          state.blockCommentTag = true;\n        }\n        return \"keyword\";\n      }\n\n      // Attempt to match a variable\n      if (stream.match(/\\b(\\w+)\\b/)) {\n        state.waitDot = true;\n        state.waitPipe = true;  // A property can be followed by a filter\n        return \"variable\";\n      }\n\n      // If found closing tag reset\n      if (stream.match(\"%}\")) {\n        state.waitProperty = null;\n        state.waitFilter = null;\n        state.waitDot = null;\n        state.waitPipe = null;\n        // If the tag that closes is a block comment tag, we want to mark the\n        // following code as comment, until the tag closes.\n        if (state.blockCommentTag) {\n          state.blockCommentTag = false;  // Release the \"lock\"\n          state.tokenize = inBlockComment;\n        } else {\n          state.tokenize = tokenBase;\n        }\n        return \"tag\";\n      }\n\n      // If nothing was found, advance to the next character\n      stream.next();\n      return \"null\";\n    }\n\n    // Mark everything as comment inside the tag and the tag itself.\n    function inComment (stream, state) {\n      if (stream.match(/^.*?#\\}/)) state.tokenize = tokenBase\n      else stream.skipToEnd()\n      return \"comment\";\n    }\n\n    // Mark everything as a comment until the `blockcomment` tag closes.\n    function inBlockComment (stream, state) {\n      if (stream.match(/\\{%\\s*endcomment\\s*%\\}/, false)) {\n        state.tokenize = inTag;\n        stream.match(\"{%\");\n        return \"tag\";\n      } else {\n        stream.next();\n        return \"comment\";\n      }\n    }\n\n    return {\n      startState: function () {\n        return {tokenize: tokenBase};\n      },\n      token: function (stream, state) {\n        return state.tokenize(stream, state);\n      },\n      blockCommentStart: \"{% comment %}\",\n      blockCommentEnd: \"{% endcomment %}\"\n    };\n  });\n\n  CodeMirror.defineMode(\"django\", function(config) {\n    var htmlBase = CodeMirror.getMode(config, \"text/html\");\n    var djangoInner = CodeMirror.getMode(config, \"django:inner\");\n    return CodeMirror.overlayMode(htmlBase, djangoInner);\n  });\n\n  CodeMirror.defineMIME(\"text/x-django\", \"django\");\n});\n"]}