Skip to content

Commit 42bcd3f

Browse files
whalefoodmarijnh
authored andcommitted
Added a mode for Ejs
1 parent 791bf1b commit 42bcd3f

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed

index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ <h2 style="margin-top: 0">Supported modes:</h2>
4040
<li><a href="mode/coffeescript/index.html">CoffeeScript</a></li>
4141
<li><a href="mode/css/index.html">CSS</a></li>
4242
<li><a href="mode/diff/index.html">diff</a></li>
43+
<li><a href="mode/ejs/index.html">Ejs</a></li>
4344
<li><a href="mode/groovy/index.html">Groovy</a></li>
4445
<li><a href="mode/haskell/index.html">Haskell</a></li>
4546
<li><a href="mode/htmlmixed/index.html">HTML mixed-mode</a></li>

mode/ejs/ejs.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
CodeMirror.defineMode("ejs", function(config, parserConfig) {
2+
var htmlMixedMode = CodeMirror.getMode(config, "htmlmixed");
3+
var serversideJsMode = CodeMirror.getMode(config, "javascript");
4+
5+
function clientSide(stream, state) {
6+
if (stream.match(/^<%/i, false)) {
7+
state.token=serversideJavascript;
8+
return serversideJsMode.token(stream, state.jsState);
9+
}
10+
else
11+
return htmlMixedMode.token(stream, state.htmlState);
12+
}
13+
14+
function serversideJavascript(stream, state) {
15+
if (stream.match(/^%>/i, false)) {
16+
state.token=clientSide;
17+
return htmlMixedMode.token(stream, state.htmlState);
18+
}
19+
else
20+
return serversideJsMode.token(stream, state.jsState);
21+
}
22+
23+
24+
return {
25+
startState: function() {
26+
return {
27+
token : clientSide,
28+
htmlState : htmlMixedMode.startState(),
29+
jsState : serversideJsMode.startState()
30+
}
31+
},
32+
33+
token: function(stream, state) {
34+
return state.token(stream, state);
35+
},
36+
37+
indent: function(state, textAfter) {
38+
if (state.token == clientSide)
39+
return htmlMixedMode.indent(state.htmlState, textAfter);
40+
else
41+
return serversideJsMode.indent(state.jsState, textAfter);
42+
},
43+
44+
copyState: function(state) {
45+
return {
46+
token : state.token,
47+
htmlState : CodeMirror.copyState(htmlMixedMode, state.htmlState),
48+
jsState : CodeMirror.copyState(serversideJsMode, state.jsState)
49+
}
50+
},
51+
52+
53+
electricChars: "/{}:"
54+
}
55+
});
56+
57+
CodeMirror.defineMIME("application/x-ejs", "ejs");

mode/ejs/index.html

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<!doctype html>
2+
<html>
3+
<head>
4+
<title>CodeMirror 2: Ejs mode</title>
5+
<link rel="stylesheet" href="../../lib/codemirror.css">
6+
<script src="../../lib/codemirror.js"></script>
7+
<script src="../xml/xml.js"></script>
8+
<script src="../javascript/javascript.js"></script>
9+
<script src="../css/css.js"></script>
10+
<script src="../htmlmixed/htmlmixed.js"></script>
11+
<script src="ejs.js"></script>
12+
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
13+
<link rel="stylesheet" href="../../doc/docs.css">
14+
</head>
15+
<body>
16+
<h1>CodeMirror 2: Ejs mode</h1>
17+
18+
<form><textarea id="code" name="code">
19+
<%
20+
function hello(who) {
21+
return "Hello " + who;
22+
}
23+
%>
24+
<p>The program says <%= hello("World") %>.</p>
25+
<script>
26+
alert("And here is some JS code"); // also colored
27+
</script>
28+
</textarea></form>
29+
30+
<script>
31+
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
32+
lineNumbers: true,
33+
matchBrackets: true,
34+
mode: "application/x-ejs",
35+
indentUnit: 4,
36+
indentWithTabs: true,
37+
enterMode: "keep",
38+
tabMode: "shift"
39+
});
40+
</script>
41+
42+
<p>Simple HTML/EJS mode. Depends on XML,
43+
JavaScript, CSS and HtmlMixed modes.</p>
44+
45+
<p><strong>MIME types defined:</strong> <code>application/x-ejs</code></p>
46+
</body>
47+
</html>

0 commit comments

Comments
 (0)