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"]}