|
|
CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
|
|
|
|
|
|
//config settings
|
|
|
var scriptStartRegex = parserConfig.scriptStartRegex || /^<%/i,
|
|
|
scriptEndRegex = parserConfig.scriptEndRegex || /^%>/i;
|
|
|
|
|
|
//inner modes
|
|
|
var scriptingMode, htmlMixedMode;
|
|
|
|
|
|
//tokenizer when in html mode
|
|
|
function htmlDispatch(stream, state) {
|
|
|
if (stream.match(scriptStartRegex, false)) {
|
|
|
state.token=scriptingDispatch;
|
|
|
return scriptingMode.token(stream, state.scriptState);
|
|
|
}
|
|
|
else
|
|
|
return htmlMixedMode.token(stream, state.htmlState);
|
|
|
}
|
|
|
|
|
|
//tokenizer when in scripting mode
|
|
|
function scriptingDispatch(stream, state) {
|
|
|
if (stream.match(scriptEndRegex, false)) {
|
|
|
state.token=htmlDispatch;
|
|
|
return htmlMixedMode.token(stream, state.htmlState);
|
|
|
}
|
|
|
else
|
|
|
return scriptingMode.token(stream, state.scriptState);
|
|
|
}
|
|
|
|
|
|
|
|
|
return {
|
|
|
startState: function() {
|
|
|
scriptingMode = scriptingMode || CodeMirror.getMode(config, parserConfig.scriptingModeSpec);
|
|
|
htmlMixedMode = htmlMixedMode || CodeMirror.getMode(config, "htmlmixed");
|
|
|
return {
|
|
|
token : parserConfig.startOpen ? scriptingDispatch : htmlDispatch,
|
|
|
htmlState : CodeMirror.startState(htmlMixedMode),
|
|
|
scriptState : CodeMirror.startState(scriptingMode)
|
|
|
};
|
|
|
},
|
|
|
|
|
|
token: function(stream, state) {
|
|
|
return state.token(stream, state);
|
|
|
},
|
|
|
|
|
|
indent: function(state, textAfter) {
|
|
|
if (state.token == htmlDispatch)
|
|
|
return htmlMixedMode.indent(state.htmlState, textAfter);
|
|
|
else if (scriptingMode.indent)
|
|
|
return scriptingMode.indent(state.scriptState, textAfter);
|
|
|
},
|
|
|
|
|
|
copyState: function(state) {
|
|
|
return {
|
|
|
token : state.token,
|
|
|
htmlState : CodeMirror.copyState(htmlMixedMode, state.htmlState),
|
|
|
scriptState : CodeMirror.copyState(scriptingMode, state.scriptState)
|
|
|
};
|
|
|
},
|
|
|
|
|
|
electricChars: "/{}:",
|
|
|
|
|
|
innerMode: function(state) {
|
|
|
if (state.token == scriptingDispatch) return {state: state.scriptState, mode: scriptingMode};
|
|
|
else return {state: state.htmlState, mode: htmlMixedMode};
|
|
|
}
|
|
|
};
|
|
|
}, "htmlmixed");
|
|
|
|
|
|
CodeMirror.defineMIME("application/x-ejs", { name: "htmlembedded", scriptingModeSpec:"javascript"});
|
|
|
CodeMirror.defineMIME("application/x-aspx", { name: "htmlembedded", scriptingModeSpec:"text/x-csharp"});
|
|
|
CodeMirror.defineMIME("application/x-jsp", { name: "htmlembedded", scriptingModeSpec:"text/x-java"});
|
|
|
CodeMirror.defineMIME("application/x-erb", { name: "htmlembedded", scriptingModeSpec:"ruby"});
|
|
|
|