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" ) ;
0 commit comments