CodeMirror.defineMode("htmlmixed",function(config){var htmlMode=CodeMirror.getMode(config,{name:"xml",htmlMode:true});var jsMode=CodeMirror.getMode(config,"javascript");var cssMode=CodeMirror.getMode(config,"css");function html(stream,state){var style=htmlMode.token(stream,state.htmlState);if(style=="tag"&&stream.current()==">"&&state.htmlState.context){if(/^script$/i.test(state.htmlState.context.tagName)){state.token=javascript;state.localState=jsMode.startState(htmlMode.indent(state.htmlState,""));} else if(/^style$/i.test(state.htmlState.context.tagName)){state.token=css;state.localState=cssMode.startState(htmlMode.indent(state.htmlState,""));}} return style;} function maybeBackup(stream,pat,style){var cur=stream.current();var close=cur.search(pat),m;if(close>-1)stream.backUp(cur.length-close);else if(m=cur.match(/<\/?$/)){stream.backUp(cur[0].length);if(!stream.match(pat,false))stream.match(cur[0]);} return style;} function javascript(stream,state){if(stream.match(/^<\/\s*script\s*>/i,false)){state.token=html;state.localState=null;return html(stream,state);} return maybeBackup(stream,/<\/\s*script\s*>/,jsMode.token(stream,state.localState));} function css(stream,state){if(stream.match(/^<\/\s*style\s*>/i,false)){state.token=html;state.localState=null;return html(stream,state);} return maybeBackup(stream,/<\/\s*style\s*>/,cssMode.token(stream,state.localState));} return{startState:function(){var state=htmlMode.startState();return{token:html,localState:null,mode:"html",htmlState:state};},copyState:function(state){if(state.localState) var local=CodeMirror.copyState(state.token==css?cssMode:jsMode,state.localState);return{token:state.token,localState:local,mode:state.mode,htmlState:CodeMirror.copyState(htmlMode,state.htmlState)};},token:function(stream,state){return state.token(stream,state);},indent:function(state,textAfter){if(state.token==html||/^\s*<\//.test(textAfter)) return htmlMode.indent(state.htmlState,textAfter);else if(state.token==javascript) return jsMode.indent(state.localState,textAfter);else return cssMode.indent(state.localState,textAfter);},electricChars:"/{}:",innerMode:function(state){var mode=state.token==html?htmlMode:state.token==javascript?jsMode:cssMode;return{state:state.localState||state.htmlState,mode:mode};}};},"xml","javascript","css");CodeMirror.defineMIME("text/html","htmlmixed");