diff options
Diffstat (limited to 'plugins/LocalFilesEditor/codemirror/mode/htmlmixed')
-rw-r--r-- | plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js | 66 | ||||
-rw-r--r-- | plugins/LocalFilesEditor/codemirror/mode/htmlmixed/index.html | 54 |
2 files changed, 120 insertions, 0 deletions
diff --git a/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js b/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js new file mode 100644 index 000000000..8d7165201 --- /dev/null +++ b/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js @@ -0,0 +1,66 @@ +CodeMirror.defineMode("htmlmixed", function(config, parserConfig) { + 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 == "xml-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 javascript(stream, state) { + if (stream.match(/^<\/\s*script\s*>/i, false)) { + state.token = html; + state.curState = null; + return html(stream, state); + } + return 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 cssMode.token(stream, state.localState); + } + + return { + startState: function() { + var state = htmlMode.startState(); + return {token: html, localState: null, 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, 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: "/{}:" + } +}); + +CodeMirror.defineMIME("text/html", "htmlmixed"); diff --git a/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/index.html b/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/index.html new file mode 100644 index 000000000..c661c98d5 --- /dev/null +++ b/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/index.html @@ -0,0 +1,54 @@ +<!doctype html> +<html> + <head> + <title>CodeMirror 2: HTML mixed mode</title> + <link rel="stylesheet" href="../../lib/codemirror.css"> + <script src="../../lib/codemirror.js"></script> + <script src="../xml/xml.js"></script> + <link rel="stylesheet" href="../xml/xml.css"> + <script src="../javascript/javascript.js"></script> + <link rel="stylesheet" href="../javascript/javascript.css"> + <script src="../css/css.js"></script> + <link rel="stylesheet" href="../css/css.css"> + <script src="htmlmixed.js"></script> + <link rel="stylesheet" href="../../css/docs.css"> + <style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> + </head> + <body> + <h1>CodeMirror 2: HTML mixed mode</h1> + <form><textarea id="code" name="code"> +<html style="color: green"> + <!-- this is a comment --> + <head> + <title>Mixed HTML Example</title> + <style type="text/css"> + h1 {font-family: comic sans; color: #f0f;} + div {background: yellow !important;} + body { + max-width: 50em; + margin: 1em 2em 1em 5em; + } + </style> + </head> + <body> + <h1>Mixed HTML Example</h1> + <script> + function jsFunc(arg1, arg2) { + if (arg1 && arg2) document.body.innerHTML = "achoo"; + } + </script> + </body> +</html> +</textarea></form> + <script> + var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "text/html", tabMode: "indent"}); + </script> + + <p>The HTML mixed mode depends on the XML, JavaScript, and CSS modes.</p> + + <p><strong>MIME types defined:</strong> <code>text/html</code> + (redefined, only takes effect if you load this parser after the + XML parser).</p> + + </body> +</html> |