File modules/editor/codemirror/mode/pig/pig.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 /* 5 * Pig Latin Mode for CodeMirror 2 6 * @author Prasanth Jayachandran 7 * @link https://github.com/prasanthj/pig-codemirror-2 8 * This implementation is adapted from PL/SQL mode in CodeMirror 2. 9 */ 10 (function(mod) { 11 if (typeof exports == "object" && typeof module == "object") // CommonJS 12 mod(require("../../lib/codemirror")); 13 else if (typeof define == "function" && define.amd) // AMD 14 define(["../../lib/codemirror"], mod); 15 else // Plain browser env 16 mod(CodeMirror); 17 })(function(CodeMirror) { 18 "use strict"; 19 20 CodeMirror.defineMode("pig", function(_config, parserConfig) { 21 var keywords = parserConfig.keywords, 22 builtins = parserConfig.builtins, 23 types = parserConfig.types, 24 multiLineStrings = parserConfig.multiLineStrings; 25 26 var isOperatorChar = /[*+\-%<>=&?:\/!|]/; 27 28 function chain(stream, state, f) { 29 state.tokenize = f; 30 return f(stream, state); 31 } 32 33 function tokenComment(stream, state) { 34 var isEnd = false; 35 var ch; 36 while(ch = stream.next()) { 37 if(ch == "/" && isEnd) { 38 state.tokenize = tokenBase; 39 break; 40 } 41 isEnd = (ch == "*"); 42 } 43 return "comment"; 44 } 45 46 function tokenString(quote) { 47 return function(stream, state) { 48 var escaped = false, next, end = false; 49 while((next = stream.next()) != null) { 50 if (next == quote && !escaped) { 51 end = true; break; 52 } 53 escaped = !escaped && next == "\\"; 54 } 55 if (end || !(escaped || multiLineStrings)) 56 state.tokenize = tokenBase; 57 return "error"; 58 }; 59 } 60 61 62 function tokenBase(stream, state) { 63 var ch = stream.next(); 64 65 // is a start of string? 66 if (ch == '"' || ch == "'") 67 return chain(stream, state, tokenString(ch)); 68 // is it one of the special chars 69 else if(/[\[\]{}\(\),;\.]/.test(ch)) 70 return null; 71 // is it a number? 72 else if(/\d/.test(ch)) { 73 stream.eatWhile(/[\w\.]/); 74 return "number"; 75 } 76 // multi line comment or operator 77 else if (ch == "/") { 78 if (stream.eat("*")) { 79 return chain(stream, state, tokenComment); 80 } 81 else { 82 stream.eatWhile(isOperatorChar); 83 return "operator"; 84 } 85 } 86 // single line comment or operator 87 else if (ch=="-") { 88 if(stream.eat("-")){ 89 stream.skipToEnd(); 90 return "comment"; 91 } 92 else { 93 stream.eatWhile(isOperatorChar); 94 return "operator"; 95 } 96 } 97 // is it an operator 98 else if (isOperatorChar.test(ch)) { 99 stream.eatWhile(isOperatorChar); 100 return "operator"; 101 } 102 else { 103 // get the while word 104 stream.eatWhile(/[\w\$_]/); 105 // is it one of the listed keywords? 106 if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { 107 //keywords can be used as variables like flatten(group), group.$0 etc.. 108 if (!stream.eat(")") && !stream.eat(".")) 109 return "keyword"; 110 } 111 // is it one of the builtin functions? 112 if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) 113 return "variable-2"; 114 // is it one of the listed types? 115 if (types && types.propertyIsEnumerable(stream.current().toUpperCase())) 116 return "variable-3"; 117 // default is a 'variable' 118 return "variable"; 119 } 120 } 121 122 // Interface 123 return { 124 startState: function() { 125 return { 126 tokenize: tokenBase, 127 startOfLine: true 128 }; 129 }, 130 131 token: function(stream, state) { 132 if(stream.eatSpace()) return null; 133 var style = state.tokenize(stream, state); 134 return style; 135 } 136 }; 137 }); 138 139 (function() { 140 function keywords(str) { 141 var obj = {}, words = str.split(" "); 142 for (var i = 0; i < words.length; ++i) obj[words[i]] = true; 143 return obj; 144 } 145 146 // builtin funcs taken from trunk revision 1303237 147 var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " 148 + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS " 149 + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG " 150 + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN " 151 + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER " 152 + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS " 153 + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA " 154 + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE " 155 + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG " 156 + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; 157 158 // taken from QueryLexer.g 159 var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " 160 + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " 161 + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE " 162 + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " 163 + "NEQ MATCHES TRUE FALSE DUMP"; 164 165 // data types 166 var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP "; 167 168 CodeMirror.defineMIME("text/x-pig", { 169 name: "pig", 170 builtins: keywords(pBuiltins), 171 keywords: keywords(pKeywords), 172 types: keywords(pTypes) 173 }); 174 175 CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" ")); 176 }()); 177 178 });
Download modules/editor/codemirror/mode/pig/pig.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.