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