1{"version":3,"sources":["../../node_modules/codemirror/mode/velocity/velocity.js"],"names":["mod","exports","module","require","define","amd","CodeMirror","defineMode","parseWords","str","obj","words","split","i","length","keywords","functions","specials","isOperatorChar","chain","stream","state","f","tokenize","tokenBase","beforeParams","ch","next","inString","inParams","lastTokenWasBuiltin","tokenString","test","eatWhile","eat","tokenComment","match","tokenUnparsed","skipToEnd","propertyIsEnumerable","current","word","peek","toLowerCase","pos","string","charAt","quote","escaped","end","maybeEnd","startState","token","eatSpace","blockCommentStart","blockCommentEnd","lineComment","fold","defineMIME"],"mappings":"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","file":"velocity.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\nCodeMirror.defineMode(\"velocity\", function() {\n    function parseWords(str) {\n        var obj = {}, words = str.split(\" \");\n        for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n        return obj;\n    }\n\n    var keywords = parseWords(\"#end #else #break #stop #[[ #]] \" +\n                              \"#{end} #{else} #{break} #{stop}\");\n    var functions = parseWords(\"#if #elseif #foreach #set #include #parse #macro #define #evaluate \" +\n                               \"#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}\");\n    var specials = parseWords(\"$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent\");\n    var isOperatorChar = /[+\\-*&%=<>!?:\\/|]/;\n\n    function chain(stream, state, f) {\n        state.tokenize = f;\n        return f(stream, state);\n    }\n    function tokenBase(stream, state) {\n        var beforeParams = state.beforeParams;\n        state.beforeParams = false;\n        var ch = stream.next();\n        // start of unparsed string?\n        if ((ch == \"'\") && !state.inString && state.inParams) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenString(ch));\n        }\n        // start of parsed string?\n        else if ((ch == '\"')) {\n            state.lastTokenWasBuiltin = false;\n            if (state.inString) {\n                state.inString = false;\n                return \"string\";\n            }\n            else if (state.inParams)\n                return chain(stream, state, tokenString(ch));\n        }\n        // is it one of the special signs []{}().,;? Seperator?\n        else if (/[\\[\\]{}\\(\\),;\\.]/.test(ch)) {\n            if (ch == \"(\" && beforeParams)\n                state.inParams = true;\n            else if (ch == \")\") {\n                state.inParams = false;\n                state.lastTokenWasBuiltin = true;\n            }\n            return null;\n        }\n        // start of a number value?\n        else if (/\\d/.test(ch)) {\n            state.lastTokenWasBuiltin = false;\n            stream.eatWhile(/[\\w\\.]/);\n            return \"number\";\n        }\n        // multi line comment?\n        else if (ch == \"#\" && stream.eat(\"*\")) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenComment);\n        }\n        // unparsed content?\n        else if (ch == \"#\" && stream.match(/ *\\[ *\\[/)) {\n            state.lastTokenWasBuiltin = false;\n            return chain(stream, state, tokenUnparsed);\n        }\n        // single line comment?\n        else if (ch == \"#\" && stream.eat(\"#\")) {\n            state.lastTokenWasBuiltin = false;\n            stream.skipToEnd();\n            return \"comment\";\n        }\n        // variable?\n        else if (ch == \"$\") {\n            stream.eatWhile(/[\\w\\d\\$_\\.{}-]/);\n            // is it one of the specials?\n            if (specials && specials.propertyIsEnumerable(stream.current())) {\n                return \"keyword\";\n            }\n            else {\n                state.lastTokenWasBuiltin = true;\n                state.beforeParams = true;\n                return \"builtin\";\n            }\n        }\n        // is it a operator?\n        else if (isOperatorChar.test(ch)) {\n            state.lastTokenWasBuiltin = false;\n            stream.eatWhile(isOperatorChar);\n            return \"operator\";\n        }\n        else {\n            // get the whole word\n            stream.eatWhile(/[\\w\\$_{}@]/);\n            var word = stream.current();\n            // is it one of the listed keywords?\n            if (keywords && keywords.propertyIsEnumerable(word))\n                return \"keyword\";\n            // is it one of the listed functions?\n            if (functions && functions.propertyIsEnumerable(word) ||\n                    (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()==\"(\") &&\n                     !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) {\n                state.beforeParams = true;\n                state.lastTokenWasBuiltin = false;\n                return \"keyword\";\n            }\n            if (state.inString) {\n                state.lastTokenWasBuiltin = false;\n                return \"string\";\n            }\n            if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)==\".\" && state.lastTokenWasBuiltin)\n                return \"builtin\";\n            // default: just a \"word\"\n            state.lastTokenWasBuiltin = false;\n            return null;\n        }\n    }\n\n    function tokenString(quote) {\n        return function(stream, state) {\n            var escaped = false, next, end = false;\n            while ((next = stream.next()) != null) {\n                if ((next == quote) && !escaped) {\n                    end = true;\n                    break;\n                }\n                if (quote=='\"' && stream.peek() == '$' && !escaped) {\n                    state.inString = true;\n                    end = true;\n                    break;\n                }\n                escaped = !escaped && next == \"\\\\\";\n            }\n            if (end) state.tokenize = tokenBase;\n            return \"string\";\n        };\n    }\n\n    function tokenComment(stream, state) {\n        var maybeEnd = false, ch;\n        while (ch = stream.next()) {\n            if (ch == \"#\" && maybeEnd) {\n                state.tokenize = tokenBase;\n                break;\n            }\n            maybeEnd = (ch == \"*\");\n        }\n        return \"comment\";\n    }\n\n    function tokenUnparsed(stream, state) {\n        var maybeEnd = 0, ch;\n        while (ch = stream.next()) {\n            if (ch == \"#\" && maybeEnd == 2) {\n                state.tokenize = tokenBase;\n                break;\n            }\n            if (ch == \"]\")\n                maybeEnd++;\n            else if (ch != \" \")\n                maybeEnd = 0;\n        }\n        return \"meta\";\n    }\n    // Interface\n\n    return {\n        startState: function() {\n            return {\n                tokenize: tokenBase,\n                beforeParams: false,\n                inParams: false,\n                inString: false,\n                lastTokenWasBuiltin: false\n            };\n        },\n\n        token: function(stream, state) {\n            if (stream.eatSpace()) return null;\n            return state.tokenize(stream, state);\n        },\n        blockCommentStart: \"#*\",\n        blockCommentEnd: \"*#\",\n        lineComment: \"##\",\n        fold: \"velocity\"\n    };\n});\n\nCodeMirror.defineMIME(\"text/velocity\", \"velocity\");\n\n});\n"]}