File modules/editor/codemirror/mode/pegjs/pegjs.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("../javascript/javascript")); 7 else if (typeof define == "function" && define.amd) // AMD 8 define(["../../lib/codemirror", "../javascript/javascript"], mod); 9 else // Plain browser env 10 mod(CodeMirror); 11 })(function(CodeMirror) { 12 "use strict"; 13 14 CodeMirror.defineMode("pegjs", function (config) { 15 var jsMode = CodeMirror.getMode(config, "javascript"); 16 17 function identifier(stream) { 18 return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/); 19 } 20 21 return { 22 startState: function () { 23 return { 24 inString: false, 25 stringType: null, 26 inComment: false, 27 inCharacterClass: false, 28 braced: 0, 29 lhs: true, 30 localState: null 31 }; 32 }, 33 token: function (stream, state) { 34 if (stream) 35 36 //check for state changes 37 if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) { 38 state.stringType = stream.peek(); 39 stream.next(); // Skip quote 40 state.inString = true; // Update state 41 } 42 if (!state.inString && !state.inComment && stream.match(/^\/\*/)) { 43 state.inComment = true; 44 } 45 46 //return state 47 if (state.inString) { 48 while (state.inString && !stream.eol()) { 49 if (stream.peek() === state.stringType) { 50 stream.next(); // Skip quote 51 state.inString = false; // Clear flag 52 } else if (stream.peek() === '\\') { 53 stream.next(); 54 stream.next(); 55 } else { 56 stream.match(/^.[^\\\"\']*/); 57 } 58 } 59 return state.lhs ? "property string" : "string"; // Token style 60 } else if (state.inComment) { 61 while (state.inComment && !stream.eol()) { 62 if (stream.match(/\*\//)) { 63 state.inComment = false; // Clear flag 64 } else { 65 stream.match(/^.[^\*]*/); 66 } 67 } 68 return "comment"; 69 } else if (state.inCharacterClass) { 70 while (state.inCharacterClass && !stream.eol()) { 71 if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { 72 state.inCharacterClass = false; 73 } 74 } 75 } else if (stream.peek() === '[') { 76 stream.next(); 77 state.inCharacterClass = true; 78 return 'bracket'; 79 } else if (stream.match(/^\/\//)) { 80 stream.skipToEnd(); 81 return "comment"; 82 } else if (state.braced || stream.peek() === '{') { 83 if (state.localState === null) { 84 state.localState = CodeMirror.startState(jsMode); 85 } 86 var token = jsMode.token(stream, state.localState); 87 var text = stream.current(); 88 if (!token) { 89 for (var i = 0; i < text.length; i++) { 90 if (text[i] === '{') { 91 state.braced++; 92 } else if (text[i] === '}') { 93 state.braced--; 94 } 95 }; 96 } 97 return token; 98 } else if (identifier(stream)) { 99 if (stream.peek() === ':') { 100 return 'variable'; 101 } 102 return 'variable-2'; 103 } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) { 104 stream.next(); 105 return 'bracket'; 106 } else if (!stream.eatSpace()) { 107 stream.next(); 108 } 109 return null; 110 } 111 }; 112 }, "javascript"); 113 114 });
Downloadmodules/editor/codemirror/mode/pegjs/pegjs.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.