annotate .cms/lib/codemirror/mode/pig/pig.js @ 0:78edf6b517a0 draft

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