1{"version":3,"sources":["../../node_modules/codemirror/mode/haml/haml.js"],"names":["mod","exports","module","require","define","amd","CodeMirror","defineMode","config","htmlMode","getMode","name","rubyMode","rubyInQuote","endQuote","stream","state","ch","peek","rubyState","tokenize","length","next","html","ruby","match","skipToEnd","token","previousToken","style","indented","startOfLine","htmlState","startState","copyState","sol","indentation","eatSpace","eol","backUp","defineMIME"],"mappings":"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","file":"haml.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\"), require(\"../ruby/ruby\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\", \"../ruby/ruby\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\n  // full haml mode. This handled embedded ruby and html fragments too\n  CodeMirror.defineMode(\"haml\", function(config) {\n    var htmlMode = CodeMirror.getMode(config, {name: \"htmlmixed\"});\n    var rubyMode = CodeMirror.getMode(config, \"ruby\");\n\n    function rubyInQuote(endQuote) {\n      return function(stream, state) {\n        var ch = stream.peek();\n        if (ch == endQuote && state.rubyState.tokenize.length == 1) {\n          // step out of ruby context as it seems to complete processing all the braces\n          stream.next();\n          state.tokenize = html;\n          return \"closeAttributeTag\";\n        } else {\n          return ruby(stream, state);\n        }\n      };\n    }\n\n    function ruby(stream, state) {\n      if (stream.match(\"-#\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n      return rubyMode.token(stream, state.rubyState);\n    }\n\n    function html(stream, state) {\n      var ch = stream.peek();\n\n      // handle haml declarations. All declarations that cant be handled here\n      // will be passed to html mode\n      if (state.previousToken.style == \"comment\" ) {\n        if (state.indented > state.previousToken.indented) {\n          stream.skipToEnd();\n          return \"commentLine\";\n        }\n      }\n\n      if (state.startOfLine) {\n        if (ch == \"!\" && stream.match(\"!!\")) {\n          stream.skipToEnd();\n          return \"tag\";\n        } else if (stream.match(/^%[\\w:#\\.]+=/)) {\n          state.tokenize = ruby;\n          return \"hamlTag\";\n        } else if (stream.match(/^%[\\w:]+/)) {\n          return \"hamlTag\";\n        } else if (ch == \"/\" ) {\n          stream.skipToEnd();\n          return \"comment\";\n        }\n      }\n\n      if (state.startOfLine || state.previousToken.style == \"hamlTag\") {\n        if ( ch == \"#\" || ch == \".\") {\n          stream.match(/[\\w-#\\.]*/);\n          return \"hamlAttribute\";\n        }\n      }\n\n      // donot handle --> as valid ruby, make it HTML close comment instead\n      if (state.startOfLine && !stream.match(\"-->\", false) && (ch == \"=\" || ch == \"-\" )) {\n        state.tokenize = ruby;\n        return state.tokenize(stream, state);\n      }\n\n      if (state.previousToken.style == \"hamlTag\" ||\n          state.previousToken.style == \"closeAttributeTag\" ||\n          state.previousToken.style == \"hamlAttribute\") {\n        if (ch == \"(\") {\n          state.tokenize = rubyInQuote(\")\");\n          return state.tokenize(stream, state);\n        } else if (ch == \"{\") {\n          if (!stream.match(/^\\{%.*/)) {\n            state.tokenize = rubyInQuote(\"}\");\n            return state.tokenize(stream, state);\n          }\n        }\n      }\n\n      return htmlMode.token(stream, state.htmlState);\n    }\n\n    return {\n      // default to html mode\n      startState: function() {\n        var htmlState = CodeMirror.startState(htmlMode);\n        var rubyState = CodeMirror.startState(rubyMode);\n        return {\n          htmlState: htmlState,\n          rubyState: rubyState,\n          indented: 0,\n          previousToken: { style: null, indented: 0},\n          tokenize: html\n        };\n      },\n\n      copyState: function(state) {\n        return {\n          htmlState : CodeMirror.copyState(htmlMode, state.htmlState),\n          rubyState: CodeMirror.copyState(rubyMode, state.rubyState),\n          indented: state.indented,\n          previousToken: state.previousToken,\n          tokenize: state.tokenize\n        };\n      },\n\n      token: function(stream, state) {\n        if (stream.sol()) {\n          state.indented = stream.indentation();\n          state.startOfLine = true;\n        }\n        if (stream.eatSpace()) return null;\n        var style = state.tokenize(stream, state);\n        state.startOfLine = false;\n        // dont record comment line as we only want to measure comment line with\n        // the opening comment block\n        if (style && style != \"commentLine\") {\n          state.previousToken = { style: style, indented: state.indented };\n        }\n        // if current state is ruby and the previous token is not `,` reset the\n        // tokenize to html\n        if (stream.eol() && state.tokenize == ruby) {\n          stream.backUp(1);\n          var ch = stream.peek();\n          stream.next();\n          if (ch && ch != \",\") {\n            state.tokenize = html;\n          }\n        }\n        // reprocess some of the specific style tag when finish setting previousToken\n        if (style == \"hamlTag\") {\n          style = \"tag\";\n        } else if (style == \"commentLine\") {\n          style = \"comment\";\n        } else if (style == \"hamlAttribute\") {\n          style = \"attribute\";\n        } else if (style == \"closeAttributeTag\") {\n          style = null;\n        }\n        return style;\n      }\n    };\n  }, \"htmlmixed\", \"ruby\");\n\n  CodeMirror.defineMIME(\"text/x-haml\", \"haml\");\n});\n"]}