-
Notifications
You must be signed in to change notification settings - Fork 37
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[POLISH] Added example spans on featuretypes demo page and codemirror…
….js for beautification.
- Loading branch information
Ralf Dauenhauer
committed
Dec 10, 2013
1 parent
7188821
commit f52b989
Showing
9 changed files
with
893 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
73 changes: 73 additions & 0 deletions
73
www/static/js/codemirror/mode/htmlembedded/htmlembedded.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
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"}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
CodeMirror.defineMode("htmlmixed", function(config, parserConfig) { | ||
var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true}); | ||
var cssMode = CodeMirror.getMode(config, "css"); | ||
|
||
var scriptTypes = [], scriptTypesConf = parserConfig && parserConfig.scriptTypes; | ||
scriptTypes.push({matches: /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, | ||
mode: CodeMirror.getMode(config, "javascript")}); | ||
if (scriptTypesConf) for (var i = 0; i < scriptTypesConf.length; ++i) { | ||
var conf = scriptTypesConf[i]; | ||
scriptTypes.push({matches: conf.matches, mode: conf.mode && CodeMirror.getMode(config, conf.mode)}); | ||
} | ||
scriptTypes.push({matches: /./, | ||
mode: CodeMirror.getMode(config, "text/plain")}); | ||
|
||
function html(stream, state) { | ||
var tagName = state.htmlState.tagName; | ||
var style = htmlMode.token(stream, state.htmlState); | ||
if (tagName == "script" && /\btag\b/.test(style) && stream.current() == ">") { | ||
// Script block: mode to change to depends on type attribute | ||
var scriptType = stream.string.slice(Math.max(0, stream.pos - 100), stream.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i); | ||
scriptType = scriptType ? scriptType[1] : ""; | ||
if (scriptType && /[\"\']/.test(scriptType.charAt(0))) scriptType = scriptType.slice(1, scriptType.length - 1); | ||
for (var i = 0; i < scriptTypes.length; ++i) { | ||
var tp = scriptTypes[i]; | ||
if (typeof tp.matches == "string" ? scriptType == tp.matches : tp.matches.test(scriptType)) { | ||
if (tp.mode) { | ||
state.token = script; | ||
state.localMode = tp.mode; | ||
state.localState = tp.mode.startState && tp.mode.startState(htmlMode.indent(state.htmlState, "")); | ||
} | ||
break; | ||
} | ||
} | ||
} else if (tagName == "style" && /\btag\b/.test(style) && stream.current() == ">") { | ||
state.token = css; | ||
state.localMode = cssMode; | ||
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.length); | ||
if (!stream.match(pat, false)) stream.match(cur[0]); | ||
} | ||
return style; | ||
} | ||
function script(stream, state) { | ||
if (stream.match(/^<\/\s*script\s*>/i, false)) { | ||
state.token = html; | ||
state.localState = state.localMode = null; | ||
return html(stream, state); | ||
} | ||
return maybeBackup(stream, /<\/\s*script\s*>/, | ||
state.localMode.token(stream, state.localState)); | ||
} | ||
function css(stream, state) { | ||
if (stream.match(/^<\/\s*style\s*>/i, false)) { | ||
state.token = html; | ||
state.localState = state.localMode = 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, localMode: null, localState: null, htmlState: state}; | ||
}, | ||
|
||
copyState: function(state) { | ||
if (state.localState) | ||
var local = CodeMirror.copyState(state.localMode, state.localState); | ||
return {token: state.token, localMode: state.localMode, localState: local, | ||
htmlState: CodeMirror.copyState(htmlMode, state.htmlState)}; | ||
}, | ||
|
||
token: function(stream, state) { | ||
return state.token(stream, state); | ||
}, | ||
|
||
indent: function(state, textAfter) { | ||
if (!state.localMode || /^\s*<\//.test(textAfter)) | ||
return htmlMode.indent(state.htmlState, textAfter); | ||
else if (state.localMode.indent) | ||
return state.localMode.indent(state.localState, textAfter); | ||
else | ||
return CodeMirror.Pass; | ||
}, | ||
|
||
electricChars: "/{}:", | ||
|
||
innerMode: function(state) { | ||
return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode}; | ||
} | ||
}; | ||
}, "xml", "javascript", "css"); | ||
|
||
CodeMirror.defineMIME("text/html", "htmlmixed"); |
Oops, something went wrong.