--- /dev/null
+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"});