diff --git a/lib/codemirror.js b/lib/codemirror.js index 05795e244ff5ed561f4ff5cd691aa866c2b4b703..c7fdf633c3307552a894128503b07bbdf674f8b1 100644 --- a/lib/codemirror.js +++ b/lib/codemirror.js @@ -5840,8 +5840,9 @@ if (inner.mode.blankLine) return inner.mode.blankLine(inner.state); } - function readToken(mode, stream, state) { + function readToken(mode, stream, state, inner) { for (var i = 0; i < 10; i++) { + if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode; var style = mode.token(stream, state); if (stream.pos > stream.start) return style; } @@ -5876,6 +5877,7 @@ if (flattenSpans == null) flattenSpans = cm.options.flattenSpans; var curStart = 0, curStyle = null; var stream = new StringStream(text, cm.options.tabSize), style; + var inner = cm.options.addModeClass && [null]; if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses); while (!stream.eol()) { if (stream.pos > cm.options.maxHighlightLength) { @@ -5884,10 +5886,10 @@ stream.pos = text.length; style = null; } else { - style = extractLineClasses(readToken(mode, stream, state), lineClasses); + style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses); } - if (cm.options.addModeClass) { - var mName = CodeMirror.innerMode(mode, state).mode.name; + if (inner) { + var mName = inner[0].name; if (mName) style = "m-" + (style ? mName + " " + style : mName); } if (!flattenSpans || curStyle != style) { diff --git a/mode/htmlmixed/htmlmixed.js b/mode/htmlmixed/htmlmixed.js index 250ef8cd243fcc7155488ff79b54f3f18ce7e4a5..1cc438f013b117784beb76daf1923c8ad927894c 100644 --- a/mode/htmlmixed/htmlmixed.js +++ b/mode/htmlmixed/htmlmixed.js @@ -69,7 +69,7 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) { if (stream.match(/^<\/\s*script\s*>/i, false)) { state.token = html; state.localState = state.localMode = null; - return html(stream, state); + return null; } return maybeBackup(stream, /<\/\s*script\s*>/, state.localMode.token(stream, state.localState)); @@ -78,7 +78,7 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) { if (stream.match(/^<\/\s*style\s*>/i, false)) { state.token = html; state.localState = state.localMode = null; - return html(stream, state); + return null; } return maybeBackup(stream, /<\/\s*style\s*>/, cssMode.token(stream, state.localState)); diff --git a/mode/markdown/markdown.js b/mode/markdown/markdown.js index d64bfdb6b0e7e757cdfeddcc8bb2f823fd4bd9f3..7c87984e2bbf9a2699ce8a3c1109717a58bae20c 100644 --- a/mode/markdown/markdown.js +++ b/mode/markdown/markdown.js @@ -199,15 +199,10 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { } function local(stream, state) { - if (stream.sol() && stream.match(/^```/, true)) { + if (stream.sol() && stream.match("```", false)) { state.localMode = state.localState = null; - state.f = inlineNormal; - state.block = blockNormal; - if (modeCfg.highlightFormatting) state.formatting = "code-block"; - state.code = true; - var returnType = getType(state); - state.code = false; - return returnType; + state.f = state.block = leavingLocal; + return null; } else if (state.localMode) { return state.localMode.token(stream, state.localState); } else { @@ -216,6 +211,17 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { } } + function leavingLocal(stream, state) { + stream.match("```"); + state.block = blockNormal; + state.f = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + state.code = true; + var returnType = getType(state); + state.code = false; + return returnType; + } + // Inline function getType(state) { var styles = []; @@ -736,9 +742,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { state.indentation = adjustedIndentation; if (indentation > 0) return null; } - var result = state.f(stream, state); - if (stream.start == stream.pos) return this.token(stream, state); - else return result; + return state.f(stream, state); }, innerMode: function(state) {