{"version":3,"file":"velocity-BpfD1zFY.cjs","sources":["../../../node_modules/@codemirror/legacy-modes/mode/velocity.js"],"sourcesContent":["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\nvar keywords = parseWords(\"#end #else #break #stop #[[ #]] \" +\n                          \"#{end} #{else} #{break} #{stop}\");\nvar functions = parseWords(\"#if #elseif #foreach #set #include #parse #macro #define #evaluate \" +\n                           \"#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}\");\nvar 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\");\nvar isOperatorChar = /[+\\-*&%=<>!?:\\/|]/;\n\nfunction chain(stream, state, f) {\n  state.tokenize = f;\n  return f(stream, state);\n}\nfunction 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 []{}().,;? Separator?\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.eat(\"!\");\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\nfunction 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\nfunction 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\nfunction 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\nexport const velocity = {\n  name: \"velocity\",\n\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  languageData: {\n    commentTokens: {line: \"##\", block: {open: \"#*\", close: \"*#\"}}\n  }\n};\n"],"names":["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","velocity","name","startState","token","eatSpace","languageData","commentTokens","line","block","open","close"],"mappings":"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","x_google_ignoreList":[0]}