15 lines
2.3 KiB
JavaScript
Executable File
15 lines
2.3 KiB
JavaScript
Executable File
|
|
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"); |