Yang UI - new features and fixes
[dlux.git] / modules / yangui-resources / src / main / resources / yangui / assets / js / codemirror / mode / jinja2 / jinja2.js
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 // Distributed under an MIT license: http://codemirror.net/LICENSE
3
4 (function(mod) {
5   if (typeof exports == "object" && typeof module == "object") // CommonJS
6     mod(require("../../lib/codemirror"));
7   else if (typeof define == "function" && define.amd) // AMD
8     define(["../../lib/codemirror"], mod);
9   else // Plain browser env
10     mod(CodeMirror);
11 })(function(CodeMirror) {
12   "use strict";
13
14   CodeMirror.defineMode("jinja2", function() {
15     var keywords = ["and", "as", "block", "endblock", "by", "cycle", "debug", "else", "elif",
16       "extends", "filter", "endfilter", "firstof", "for",
17       "endfor", "if", "endif", "ifchanged", "endifchanged",
18       "ifequal", "endifequal", "ifnotequal",
19       "endifnotequal", "in", "include", "load", "not", "now", "or",
20       "parsed", "regroup", "reversed", "spaceless",
21       "endspaceless", "ssi", "templatetag", "openblock",
22       "closeblock", "openvariable", "closevariable",
23       "openbrace", "closebrace", "opencomment",
24       "closecomment", "widthratio", "url", "with", "endwith",
25       "get_current_language", "trans", "endtrans", "noop", "blocktrans",
26       "endblocktrans", "get_available_languages",
27       "get_current_language_bidi", "plural"],
28     operator = /^[+\-*&%=<>!?|~^]/,
29     sign = /^[:\[\(\{]/,
30     atom = ["true", "false"],
31     number = /^(\d[+\-\*\/])?\d+(\.\d+)?/;
32
33     keywords = new RegExp("((" + keywords.join(")|(") + "))\\b");
34     atom = new RegExp("((" + atom.join(")|(") + "))\\b");
35
36     function tokenBase (stream, state) {
37       var ch = stream.peek();
38
39       //Comment
40       if (state.incomment) {
41         if(!stream.skipTo("#}")) {
42           stream.skipToEnd();
43         } else {
44           stream.eatWhile(/\#|}/);
45           state.incomment = false;
46         }
47         return "comment";
48       //Tag
49       } else if (state.intag) {
50         //After operator
51         if(state.operator) {
52           state.operator = false;
53           if(stream.match(atom)) {
54             return "atom";
55           }
56           if(stream.match(number)) {
57             return "number";
58           }
59         }
60         //After sign
61         if(state.sign) {
62           state.sign = false;
63           if(stream.match(atom)) {
64             return "atom";
65           }
66           if(stream.match(number)) {
67             return "number";
68           }
69         }
70
71         if(state.instring) {
72           if(ch == state.instring) {
73             state.instring = false;
74           }
75           stream.next();
76           return "string";
77         } else if(ch == "'" || ch == '"') {
78           state.instring = ch;
79           stream.next();
80           return "string";
81         } else if(stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) {
82           state.intag = false;
83           return "tag";
84         } else if(stream.match(operator)) {
85           state.operator = true;
86           return "operator";
87         } else if(stream.match(sign)) {
88           state.sign = true;
89         } else {
90           if(stream.eat(" ") || stream.sol()) {
91             if(stream.match(keywords)) {
92               return "keyword";
93             }
94             if(stream.match(atom)) {
95               return "atom";
96             }
97             if(stream.match(number)) {
98               return "number";
99             }
100             if(stream.sol()) {
101               stream.next();
102             }
103           } else {
104             stream.next();
105           }
106
107         }
108         return "variable";
109       } else if (stream.eat("{")) {
110         if (ch = stream.eat("#")) {
111           state.incomment = true;
112           if(!stream.skipTo("#}")) {
113             stream.skipToEnd();
114           } else {
115             stream.eatWhile(/\#|}/);
116             state.incomment = false;
117           }
118           return "comment";
119         //Open tag
120         } else if (ch = stream.eat(/\{|%/)) {
121           //Cache close tag
122           state.intag = ch;
123           if(ch == "{") {
124             state.intag = "}";
125           }
126           stream.eat("-");
127           return "tag";
128         }
129       }
130       stream.next();
131     };
132
133     return {
134       startState: function () {
135         return {tokenize: tokenBase};
136       },
137       token: function (stream, state) {
138         return state.tokenize(stream, state);
139       }
140     };
141   });
142 });