File modules/editor/codemirror/mode/twig/twig.js

Last commit: Sun Dec 17 01:14:09 2017 +0100	Jan Dankert	Integration eines weiteren Code-Editors: Codemirror. Demnächst müssen wir hier mal aufräumen und andere Editoren rauswerfen.
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"), require("../../addon/mode/multiplex")); 7 else if (typeof define == "function" && define.amd) // AMD 8 define(["../../lib/codemirror", "../../addon/mode/multiplex"], mod); 9 else // Plain browser env 10 mod(CodeMirror); 11 })(function(CodeMirror) { 12 "use strict"; 13 14 CodeMirror.defineMode("twig:inner", function() { 15 var keywords = ["and", "as", "autoescape", "endautoescape", "block", "do", "endblock", "else", "elseif", "extends", "for", "endfor", "embed", "endembed", "filter", "endfilter", "flush", "from", "if", "endif", "in", "is", "include", "import", "not", "or", "set", "spaceless", "endspaceless", "with", "endwith", "trans", "endtrans", "blocktrans", "endblocktrans", "macro", "endmacro", "use", "verbatim", "endverbatim"], 16 operator = /^[+\-*&%=<>!?|~^]/, 17 sign = /^[:\[\(\{]/, 18 atom = ["true", "false", "null", "empty", "defined", "divisibleby", "divisible by", "even", "odd", "iterable", "sameas", "same as"], 19 number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; 20 21 keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); 22 atom = new RegExp("((" + atom.join(")|(") + "))\\b"); 23 24 function tokenBase (stream, state) { 25 var ch = stream.peek(); 26 27 //Comment 28 if (state.incomment) { 29 if (!stream.skipTo("#}")) { 30 stream.skipToEnd(); 31 } else { 32 stream.eatWhile(/\#|}/); 33 state.incomment = false; 34 } 35 return "comment"; 36 //Tag 37 } else if (state.intag) { 38 //After operator 39 if (state.operator) { 40 state.operator = false; 41 if (stream.match(atom)) { 42 return "atom"; 43 } 44 if (stream.match(number)) { 45 return "number"; 46 } 47 } 48 //After sign 49 if (state.sign) { 50 state.sign = false; 51 if (stream.match(atom)) { 52 return "atom"; 53 } 54 if (stream.match(number)) { 55 return "number"; 56 } 57 } 58 59 if (state.instring) { 60 if (ch == state.instring) { 61 state.instring = false; 62 } 63 stream.next(); 64 return "string"; 65 } else if (ch == "'" || ch == '"') { 66 state.instring = ch; 67 stream.next(); 68 return "string"; 69 } else if (stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { 70 state.intag = false; 71 return "tag"; 72 } else if (stream.match(operator)) { 73 state.operator = true; 74 return "operator"; 75 } else if (stream.match(sign)) { 76 state.sign = true; 77 } else { 78 if (stream.eat(" ") || stream.sol()) { 79 if (stream.match(keywords)) { 80 return "keyword"; 81 } 82 if (stream.match(atom)) { 83 return "atom"; 84 } 85 if (stream.match(number)) { 86 return "number"; 87 } 88 if (stream.sol()) { 89 stream.next(); 90 } 91 } else { 92 stream.next(); 93 } 94 95 } 96 return "variable"; 97 } else if (stream.eat("{")) { 98 if (stream.eat("#")) { 99 state.incomment = true; 100 if (!stream.skipTo("#}")) { 101 stream.skipToEnd(); 102 } else { 103 stream.eatWhile(/\#|}/); 104 state.incomment = false; 105 } 106 return "comment"; 107 //Open tag 108 } else if (ch = stream.eat(/\{|%/)) { 109 //Cache close tag 110 state.intag = ch; 111 if (ch == "{") { 112 state.intag = "}"; 113 } 114 stream.eat("-"); 115 return "tag"; 116 } 117 } 118 stream.next(); 119 }; 120 121 return { 122 startState: function () { 123 return {}; 124 }, 125 token: function (stream, state) { 126 return tokenBase(stream, state); 127 } 128 }; 129 }); 130 131 CodeMirror.defineMode("twig", function(config, parserConfig) { 132 var twigInner = CodeMirror.getMode(config, "twig:inner"); 133 if (!parserConfig || !parserConfig.base) return twigInner; 134 return CodeMirror.multiplexingMode( 135 CodeMirror.getMode(config, parserConfig.base), { 136 open: /\{[{#%]/, close: /[}#%]\}/, mode: twigInner, parseDelimiters: true 137 } 138 ); 139 }); 140 CodeMirror.defineMIME("text/x-twig", "twig"); 141 });
Download modules/editor/codemirror/mode/twig/twig.js
History Sun, 17 Dec 2017 01:14:09 +0100 Jan Dankert Integration eines weiteren Code-Editors: Codemirror. Demnächst müssen wir hier mal aufräumen und andere Editoren rauswerfen.