Path: blob/master/web-gui/buildyourownbotnet/assets/js/codemirror/mode/pig/pig.js
1293 views
/*1* Pig Latin Mode for CodeMirror 22* @author Prasanth Jayachandran3* @link https://github.com/prasanthj/pig-codemirror-24* This implementation is adapted from PL/SQL mode in CodeMirror 2.5*/6CodeMirror.defineMode("pig", function(_config, parserConfig) {7var keywords = parserConfig.keywords,8builtins = parserConfig.builtins,9types = parserConfig.types,10multiLineStrings = parserConfig.multiLineStrings;1112var isOperatorChar = /[*+\-%<>=&?:\/!|]/;1314function chain(stream, state, f) {15state.tokenize = f;16return f(stream, state);17}1819var type;20function ret(tp, style) {21type = tp;22return style;23}2425function tokenComment(stream, state) {26var isEnd = false;27var ch;28while(ch = stream.next()) {29if(ch == "/" && isEnd) {30state.tokenize = tokenBase;31break;32}33isEnd = (ch == "*");34}35return ret("comment", "comment");36}3738function tokenString(quote) {39return function(stream, state) {40var escaped = false, next, end = false;41while((next = stream.next()) != null) {42if (next == quote && !escaped) {43end = true; break;44}45escaped = !escaped && next == "\\";46}47if (end || !(escaped || multiLineStrings))48state.tokenize = tokenBase;49return ret("string", "error");50};51}5253function tokenBase(stream, state) {54var ch = stream.next();5556// is a start of string?57if (ch == '"' || ch == "'")58return chain(stream, state, tokenString(ch));59// is it one of the special chars60else if(/[\[\]{}\(\),;\.]/.test(ch))61return ret(ch);62// is it a number?63else if(/\d/.test(ch)) {64stream.eatWhile(/[\w\.]/);65return ret("number", "number");66}67// multi line comment or operator68else if (ch == "/") {69if (stream.eat("*")) {70return chain(stream, state, tokenComment);71}72else {73stream.eatWhile(isOperatorChar);74return ret("operator", "operator");75}76}77// single line comment or operator78else if (ch=="-") {79if(stream.eat("-")){80stream.skipToEnd();81return ret("comment", "comment");82}83else {84stream.eatWhile(isOperatorChar);85return ret("operator", "operator");86}87}88// is it an operator89else if (isOperatorChar.test(ch)) {90stream.eatWhile(isOperatorChar);91return ret("operator", "operator");92}93else {94// get the while word95stream.eatWhile(/[\w\$_]/);96// is it one of the listed keywords?97if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {98if (stream.eat(")") || stream.eat(".")) {99//keywords can be used as variables like flatten(group), group.$0 etc..100}101else {102return ("keyword", "keyword");103}104}105// is it one of the builtin functions?106if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase()))107{108return ("keyword", "variable-2");109}110// is it one of the listed types?111if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))112return ("keyword", "variable-3");113// default is a 'variable'114return ret("variable", "pig-word");115}116}117118// Interface119return {120startState: function() {121return {122tokenize: tokenBase,123startOfLine: true124};125},126127token: function(stream, state) {128if(stream.eatSpace()) return null;129var style = state.tokenize(stream, state);130return style;131}132};133});134135(function() {136function keywords(str) {137var obj = {}, words = str.split(" ");138for (var i = 0; i < words.length; ++i) obj[words[i]] = true;139return obj;140}141142// builtin funcs taken from trunk revision 1303237143var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL "144+ "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "145+ "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG "146+ "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN "147+ "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER "148+ "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS "149+ "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA "150+ "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "151+ "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "152+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER ";153154// taken from QueryLexer.g155var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "156+ "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "157+ "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE "158+ "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE "159+ "NEQ MATCHES TRUE FALSE DUMP";160161// data types162var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP ";163164CodeMirror.defineMIME("text/x-pig", {165name: "pig",166builtins: keywords(pBuiltins),167keywords: keywords(pKeywords),168types: keywords(pTypes)169});170}());171172173