aboutsummaryrefslogtreecommitdiff
path: root/imports/codemirror/mode/htmlmixed/htmlmixed.js
diff options
context:
space:
mode:
authorEric Guzman2012-02-16 00:22:43 -0800
committerEric Guzman2012-02-16 00:22:43 -0800
commit82b1a273219f0ae3d119e156c7acccdbe478f441 (patch)
tree74c45e5e3afc6706b2f7a7918807f72c54cdcfc5 /imports/codemirror/mode/htmlmixed/htmlmixed.js
parentaf20ca9b11133dd5cefb9275dbe8fb101c3380d0 (diff)
parent966f0adaf1d4b7f2dd5a6e31643df58bff713884 (diff)
downloadninja-82b1a273219f0ae3d119e156c7acccdbe478f441.tar.gz
Merge branch 'refs/heads/TreeComponents' into PresetsPanel
Diffstat (limited to 'imports/codemirror/mode/htmlmixed/htmlmixed.js')
-rwxr-xr-ximports/codemirror/mode/htmlmixed/htmlmixed.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/imports/codemirror/mode/htmlmixed/htmlmixed.js b/imports/codemirror/mode/htmlmixed/htmlmixed.js
new file mode 100755
index 00000000..a94dc45f
--- /dev/null
+++ b/imports/codemirror/mode/htmlmixed/htmlmixed.js
@@ -0,0 +1,83 @@
1CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
2 var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
3 var jsMode = CodeMirror.getMode(config, "javascript");
4 var cssMode = CodeMirror.getMode(config, "css");
5
6 function html(stream, state) {
7 var style = htmlMode.token(stream, state.htmlState);
8 if (style == "tag" && stream.current() == ">" && state.htmlState.context) {
9 if (/^script$/i.test(state.htmlState.context.tagName)) {
10 state.token = javascript;
11 state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
12 state.mode = "javascript";
13 }
14 else if (/^style$/i.test(state.htmlState.context.tagName)) {
15 state.token = css;
16 state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
17 state.mode = "css";
18 }
19 }
20 return style;
21 }
22 function maybeBackup(stream, pat, style) {
23 var cur = stream.current();
24 var close = cur.search(pat);
25 if (close > -1) stream.backUp(cur.length - close);
26 return style;
27 }
28 function javascript(stream, state) {
29 if (stream.match(/^<\/\s*script\s*>/i, false)) {
30 state.token = html;
31 state.curState = null;
32 state.mode = "html";
33 return html(stream, state);
34 }
35 return maybeBackup(stream, /<\/\s*script\s*>/,
36 jsMode.token(stream, state.localState));
37 }
38 function css(stream, state) {
39 if (stream.match(/^<\/\s*style\s*>/i, false)) {
40 state.token = html;
41 state.localState = null;
42 state.mode = "html";
43 return html(stream, state);
44 }
45 return maybeBackup(stream, /<\/\s*style\s*>/,
46 cssMode.token(stream, state.localState));
47 }
48
49 return {
50 startState: function() {
51 var state = htmlMode.startState();
52 return {token: html, localState: null, mode: "html", htmlState: state};
53 },
54
55 copyState: function(state) {
56 if (state.localState)
57 var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);
58 return {token: state.token, localState: local, mode: state.mode,
59 htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
60 },
61
62 token: function(stream, state) {
63 return state.token(stream, state);
64 },
65
66 indent: function(state, textAfter) {
67 if (state.token == html || /^\s*<\//.test(textAfter))
68 return htmlMode.indent(state.htmlState, textAfter);
69 else if (state.token == javascript)
70 return jsMode.indent(state.localState, textAfter);
71 else
72 return cssMode.indent(state.localState, textAfter);
73 },
74
75 compareStates: function(a, b) {
76 return htmlMode.compareStates(a.htmlState, b.htmlState);
77 },
78
79 electricChars: "/{}:"
80 }
81});
82
83CodeMirror.defineMIME("text/html", "htmlmixed");