codemirror-rails 2.24 → 2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/Rakefile +19 -0
- data/codemirror-rails.gemspec +6 -1
- data/lib/codemirror/rails/version.rb +2 -2
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/mailers/.gitkeep +0 -0
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +56 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/lib/assets/.gitkeep +0 -0
- data/test/dummy/log/.gitkeep +0 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/integration/codemirror_rails_integration_test.rb +13 -0
- data/test/test_helper.rb +13 -0
- data/vendor/assets/javascripts/codemirror.js +381 -197
- data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +1 -1
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +649 -94
- data/vendor/assets/javascripts/codemirror/modes/clike.js +53 -7
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +12 -7
- data/vendor/assets/javascripts/codemirror/modes/diff.js +24 -5
- data/vendor/assets/javascripts/codemirror/modes/ecl.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/erlang.js +463 -0
- data/vendor/assets/javascripts/codemirror/modes/gfm.js +38 -2
- data/vendor/assets/javascripts/codemirror/modes/go.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/groovy.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/haxe.js +432 -0
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/less.js +93 -93
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +29 -6
- data/vendor/assets/javascripts/codemirror/modes/mysql.js +6 -8
- data/vendor/assets/javascripts/codemirror/modes/ocaml.js +114 -0
- data/vendor/assets/javascripts/codemirror/modes/pascal.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/pig.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/plsql.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/python.js +13 -16
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +3 -8
- data/vendor/assets/javascripts/codemirror/modes/scheme.js +74 -46
- data/vendor/assets/javascripts/codemirror/modes/shell.js +22 -7
- data/vendor/assets/javascripts/codemirror/modes/stex.js +7 -5
- data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +14 -14
- data/vendor/assets/javascripts/codemirror/modes/vb.js +260 -0
- data/vendor/assets/javascripts/codemirror/modes/verilog.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/xml.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/xquery.js +3 -3
- data/vendor/assets/javascripts/codemirror/utils/closetag.js +24 -34
- data/vendor/assets/javascripts/codemirror/utils/dialog.js +5 -1
- data/vendor/assets/javascripts/codemirror/utils/foldcode.js +10 -5
- data/vendor/assets/javascripts/codemirror/utils/formatting.js +8 -3
- data/vendor/assets/javascripts/codemirror/utils/loadmode.js +2 -1
- data/vendor/assets/javascripts/codemirror/utils/match-highlighter.js +1 -1
- data/vendor/assets/javascripts/codemirror/utils/multiplex.js +81 -0
- data/vendor/assets/javascripts/codemirror/utils/overlay.js +2 -1
- data/vendor/assets/javascripts/codemirror/utils/pig-hint.js +123 -0
- data/vendor/assets/javascripts/codemirror/utils/search.js +16 -12
- data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +1 -1
- data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +4 -0
- data/vendor/assets/javascripts/codemirror/utils/xml-hint.js +137 -0
- data/vendor/assets/stylesheets/codemirror.css +59 -4
- data/vendor/assets/stylesheets/codemirror/modes/tiddlywiki.css +14 -21
- data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +1 -2
- data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +21 -0
- data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +2 -3
- data/vendor/assets/stylesheets/codemirror/themes/night.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +27 -0
- data/vendor/assets/stylesheets/codemirror/utils/dialog.css +4 -0
- metadata +98 -5
- data/vendor/assets/javascripts/codemirror/modes/rpm-spec.css +0 -5
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// released under the MIT license (../../LICENSE) like the rest of CodeMirror
|
|
4
4
|
CodeMirror.tagRangeFinder = function(cm, line, hideEnd) {
|
|
5
5
|
var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
|
|
6
|
-
var nameChar = nameStartChar + "
|
|
6
|
+
var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
|
|
7
7
|
var xmlNAMERegExp = new RegExp("^[" + nameStartChar + "][" + nameChar + "]*");
|
|
8
8
|
|
|
9
9
|
var lineText = cm.getLine(line);
|
|
@@ -110,10 +110,15 @@ CodeMirror.tagRangeFinder = function(cm, line, hideEnd) {
|
|
|
110
110
|
};
|
|
111
111
|
|
|
112
112
|
CodeMirror.braceRangeFinder = function(cm, line, hideEnd) {
|
|
113
|
-
var lineText = cm.getLine(line);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
113
|
+
var lineText = cm.getLine(line), at = lineText.length, startChar, tokenType;
|
|
114
|
+
for (;;) {
|
|
115
|
+
var found = lineText.lastIndexOf("{", at);
|
|
116
|
+
if (found < 0) break;
|
|
117
|
+
tokenType = cm.getTokenAt({line: line, ch: found}).className;
|
|
118
|
+
if (!/^(comment|string)/.test(tokenType)) { startChar = found; break; }
|
|
119
|
+
at = found - 1;
|
|
120
|
+
}
|
|
121
|
+
if (startChar == null || lineText.lastIndexOf("}") > startChar) return;
|
|
117
122
|
var count = 1, lastLine = cm.lineCount(), end;
|
|
118
123
|
outer: for (var i = line + 1; i < lastLine; ++i) {
|
|
119
124
|
var text = cm.getLine(i), pos = 0;
|
|
@@ -84,7 +84,8 @@ CodeMirror.modeExtensions["css"] = {
|
|
|
84
84
|
commentStart: "/*",
|
|
85
85
|
commentEnd: "*/",
|
|
86
86
|
wordWrapChars: [";", "\\{", "\\}"],
|
|
87
|
-
autoFormatLineBreaks: function (text) {
|
|
87
|
+
autoFormatLineBreaks: function (text, startPos, endPos) {
|
|
88
|
+
text = text.substring(startPos, endPos);
|
|
88
89
|
return text.replace(new RegExp("(;|\\{|\\})([^\r\n])", "g"), "$1\n$2");
|
|
89
90
|
}
|
|
90
91
|
};
|
|
@@ -97,6 +98,8 @@ CodeMirror.modeExtensions["javascript"] = {
|
|
|
97
98
|
getNonBreakableBlocks: function (text) {
|
|
98
99
|
var nonBreakableRegexes = [
|
|
99
100
|
new RegExp("for\\s*?\\(([\\s\\S]*?)\\)"),
|
|
101
|
+
new RegExp("\\\\\"([\\s\\S]*?)(\\\\\"|$)"),
|
|
102
|
+
new RegExp("\\\\\'([\\s\\S]*?)(\\\\\'|$)"),
|
|
100
103
|
new RegExp("'([\\s\\S]*?)('|$)"),
|
|
101
104
|
new RegExp("\"([\\s\\S]*?)(\"|$)"),
|
|
102
105
|
new RegExp("//.*([\r\n]|$)")
|
|
@@ -125,7 +128,8 @@ CodeMirror.modeExtensions["javascript"] = {
|
|
|
125
128
|
return nonBreakableBlocks;
|
|
126
129
|
},
|
|
127
130
|
|
|
128
|
-
autoFormatLineBreaks: function (text) {
|
|
131
|
+
autoFormatLineBreaks: function (text, startPos, endPos) {
|
|
132
|
+
text = text.substring(startPos, endPos);
|
|
129
133
|
var curPos = 0;
|
|
130
134
|
var reLinesSplitter = new RegExp("(;|\\{|\\})([^\r\n])", "g");
|
|
131
135
|
var nonBreakableBlocks = this.getNonBreakableBlocks(text);
|
|
@@ -158,7 +162,8 @@ CodeMirror.modeExtensions["xml"] = {
|
|
|
158
162
|
commentEnd: "-->",
|
|
159
163
|
wordWrapChars: [">"],
|
|
160
164
|
|
|
161
|
-
autoFormatLineBreaks: function (text) {
|
|
165
|
+
autoFormatLineBreaks: function (text, startPos, endPos) {
|
|
166
|
+
text = text.substring(startPos, endPos);
|
|
162
167
|
var lines = text.split("\n");
|
|
163
168
|
var reProcessedPortion = new RegExp("(^\\s*?<|^[^<]*?)(.+)(>\\s*?$|[^>]*?$)");
|
|
164
169
|
var reOpenBrackets = new RegExp("<", "g");
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
CodeMirror.requireMode = function(mode, cont) {
|
|
24
|
-
if (
|
|
24
|
+
if (typeof mode != "string") mode = mode.name;
|
|
25
|
+
if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont);
|
|
25
26
|
if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);
|
|
26
27
|
|
|
27
28
|
var script = document.createElement("script");
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
function markDocument(cm, className, minChars) {
|
|
24
24
|
clearMarks(cm);
|
|
25
25
|
minChars = (typeof minChars !== 'undefined' ? minChars : DEFAULT_MIN_CHARS);
|
|
26
|
-
if (cm.somethingSelected() && cm.getSelection().length >= minChars) {
|
|
26
|
+
if (cm.somethingSelected() && cm.getSelection().replace(/^\s+|\s+$/g, "").length >= minChars) {
|
|
27
27
|
var state = getMatchHighlightState(cm);
|
|
28
28
|
var query = cm.getSelection();
|
|
29
29
|
cm.operation(function() {
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
CodeMirror.multiplexingMode = function(outer /*, others */) {
|
|
2
|
+
// Others should be {open, close, mode [, delimStyle]} objects
|
|
3
|
+
var others = Array.prototype.slice.call(arguments, 1);
|
|
4
|
+
var n_others = others.length;
|
|
5
|
+
|
|
6
|
+
function indexOf(string, pattern, from) {
|
|
7
|
+
if (typeof pattern == "string") return string.indexOf(pattern, from);
|
|
8
|
+
var m = pattern.exec(from ? string.slice(from) : string);
|
|
9
|
+
return m ? m.index + from : -1;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
startState: function() {
|
|
14
|
+
return {
|
|
15
|
+
outer: CodeMirror.startState(outer),
|
|
16
|
+
innerActive: null,
|
|
17
|
+
inner: null
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
copyState: function(state) {
|
|
22
|
+
return {
|
|
23
|
+
outer: CodeMirror.copyState(outer, state.outer),
|
|
24
|
+
innerActive: state.innerActive,
|
|
25
|
+
inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
token: function(stream, state) {
|
|
30
|
+
if (!state.innerActive) {
|
|
31
|
+
var cutOff = Infinity, oldContent = stream.string;
|
|
32
|
+
for (var i = 0; i < n_others; ++i) {
|
|
33
|
+
var other = others[i];
|
|
34
|
+
var found = indexOf(oldContent, other.open, stream.pos);
|
|
35
|
+
if (found == stream.pos) {
|
|
36
|
+
stream.match(other.open);
|
|
37
|
+
state.innerActive = other;
|
|
38
|
+
state.inner = CodeMirror.startState(other.mode, outer.indent(state.outer, ""));
|
|
39
|
+
return other.delimStyle;
|
|
40
|
+
} else if (found != -1 && found < cutOff) {
|
|
41
|
+
cutOff = found;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);
|
|
45
|
+
var outerToken = outer.token(stream, state.outer);
|
|
46
|
+
if (cutOff != Infinity) stream.string = oldContent;
|
|
47
|
+
return outerToken;
|
|
48
|
+
} else {
|
|
49
|
+
var curInner = state.innerActive, oldContent = stream.string;
|
|
50
|
+
var found = indexOf(oldContent, curInner.close, stream.pos);
|
|
51
|
+
if (found == stream.pos) {
|
|
52
|
+
stream.match(curInner.close);
|
|
53
|
+
state.innerActive = state.inner = null;
|
|
54
|
+
return curInner.delimStyle;
|
|
55
|
+
}
|
|
56
|
+
if (found > -1) stream.string = oldContent.slice(0, found);
|
|
57
|
+
var innerToken = curInner.mode.token(stream, state.inner);
|
|
58
|
+
if (found > -1) stream.string = oldContent;
|
|
59
|
+
var cur = stream.current(), found = cur.indexOf(curInner.close);
|
|
60
|
+
if (found > -1) stream.backUp(cur.length - found);
|
|
61
|
+
return innerToken;
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
indent: function(state, textAfter) {
|
|
66
|
+
var mode = state.innerActive ? state.innerActive.mode : outer;
|
|
67
|
+
if (!mode.indent) return CodeMirror.Pass;
|
|
68
|
+
return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
compareStates: function(a, b) {
|
|
72
|
+
if (a.innerActive != b.innerActive) return false;
|
|
73
|
+
var mode = a.innerActive || outer;
|
|
74
|
+
if (!mode.compareStates) return CodeMirror.Pass;
|
|
75
|
+
return mode.compareStates(a.innerActive ? a.inner : a.outer,
|
|
76
|
+
b.innerActive ? b.inner : b.outer);
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
electricChars: outer.electricChars
|
|
80
|
+
};
|
|
81
|
+
};
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
// overlay wins, unless the combine argument was true, in which case
|
|
7
7
|
// the styles are combined.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
// overlayParser is the old, deprecated name
|
|
10
|
+
CodeMirror.overlayMode = CodeMirror.overlayParser = function(base, overlay, combine) {
|
|
10
11
|
return {
|
|
11
12
|
startState: function() {
|
|
12
13
|
return {
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
function forEach(arr, f) {
|
|
3
|
+
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
function arrayContains(arr, item) {
|
|
7
|
+
if (!Array.prototype.indexOf) {
|
|
8
|
+
var i = arr.length;
|
|
9
|
+
while (i--) {
|
|
10
|
+
if (arr[i] === item) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return arr.indexOf(item) != -1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function scriptHint(editor, keywords, getToken) {
|
|
20
|
+
// Find the token at the cursor
|
|
21
|
+
var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token;
|
|
22
|
+
// If it's not a 'word-style' token, ignore the token.
|
|
23
|
+
|
|
24
|
+
if (!/^[\w$_]*$/.test(token.string)) {
|
|
25
|
+
token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state,
|
|
26
|
+
className: token.string == ":" ? "pig-type" : null};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!context) var context = [];
|
|
30
|
+
context.push(tprop);
|
|
31
|
+
|
|
32
|
+
var completionList = getCompletions(token, context);
|
|
33
|
+
completionList = completionList.sort();
|
|
34
|
+
//prevent autocomplete for last word, instead show dropdown with one word
|
|
35
|
+
if(completionList.length == 1) {
|
|
36
|
+
completionList.push(" ");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return {list: completionList,
|
|
40
|
+
from: {line: cur.line, ch: token.start},
|
|
41
|
+
to: {line: cur.line, ch: token.end}};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
CodeMirror.pigHint = function(editor) {
|
|
45
|
+
return scriptHint(editor, pigKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function toTitleCase(str) {
|
|
49
|
+
return str.replace(/(?:^|\s)\w/g, function(match) {
|
|
50
|
+
return match.toUpperCase();
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
var pigKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
|
|
55
|
+
+ "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
|
|
56
|
+
+ "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE "
|
|
57
|
+
+ "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE "
|
|
58
|
+
+ "NEQ MATCHES TRUE FALSE";
|
|
59
|
+
var pigKeywordsU = pigKeywords.split(" ");
|
|
60
|
+
var pigKeywordsL = pigKeywords.toLowerCase().split(" ");
|
|
61
|
+
|
|
62
|
+
var pigTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP";
|
|
63
|
+
var pigTypesU = pigTypes.split(" ");
|
|
64
|
+
var pigTypesL = pigTypes.toLowerCase().split(" ");
|
|
65
|
+
|
|
66
|
+
var pigBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL "
|
|
67
|
+
+ "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "
|
|
68
|
+
+ "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG "
|
|
69
|
+
+ "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN "
|
|
70
|
+
+ "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER "
|
|
71
|
+
+ "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS "
|
|
72
|
+
+ "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA "
|
|
73
|
+
+ "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "
|
|
74
|
+
+ "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
|
|
75
|
+
+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER";
|
|
76
|
+
var pigBuiltinsU = pigBuiltins.split(" ").join("() ").split(" ");
|
|
77
|
+
var pigBuiltinsL = pigBuiltins.toLowerCase().split(" ").join("() ").split(" ");
|
|
78
|
+
var pigBuiltinsC = ("BagSize BinStorage Bloom BuildBloom ConstantSize CubeDimensions DoubleAbs "
|
|
79
|
+
+ "DoubleAvg DoubleBase DoubleMax DoubleMin DoubleRound DoubleSum FloatAbs FloatAvg FloatMax "
|
|
80
|
+
+ "FloatMin FloatRound FloatSum GenericInvoker IntAbs IntAvg IntMax IntMin IntSum "
|
|
81
|
+
+ "InvokeForDouble InvokeForFloat InvokeForInt InvokeForLong InvokeForString Invoker "
|
|
82
|
+
+ "IsEmpty JsonLoader JsonMetadata JsonStorage LongAbs LongAvg LongMax LongMin LongSum MapSize "
|
|
83
|
+
+ "MonitoredUDF Nondeterministic OutputSchema PigStorage PigStreaming StringConcat StringMax "
|
|
84
|
+
+ "StringMin StringSize TextLoader TupleSize Utf8StorageConverter").split(" ").join("() ").split(" ");
|
|
85
|
+
|
|
86
|
+
function getCompletions(token, context) {
|
|
87
|
+
var found = [], start = token.string;
|
|
88
|
+
function maybeAdd(str) {
|
|
89
|
+
if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function gatherCompletions(obj) {
|
|
93
|
+
if(obj == ":") {
|
|
94
|
+
forEach(pigTypesL, maybeAdd);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
forEach(pigBuiltinsU, maybeAdd);
|
|
98
|
+
forEach(pigBuiltinsL, maybeAdd);
|
|
99
|
+
forEach(pigBuiltinsC, maybeAdd);
|
|
100
|
+
forEach(pigTypesU, maybeAdd);
|
|
101
|
+
forEach(pigTypesL, maybeAdd);
|
|
102
|
+
forEach(pigKeywordsU, maybeAdd);
|
|
103
|
+
forEach(pigKeywordsL, maybeAdd);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (context) {
|
|
108
|
+
// If this is a property, see if it belongs to some object we can
|
|
109
|
+
// find in the current environment.
|
|
110
|
+
var obj = context.pop(), base;
|
|
111
|
+
|
|
112
|
+
if (obj.className == "pig-word")
|
|
113
|
+
base = obj.string;
|
|
114
|
+
else if(obj.className == "pig-type")
|
|
115
|
+
base = ":" + obj.string;
|
|
116
|
+
|
|
117
|
+
while (base != null && context.length)
|
|
118
|
+
base = base[context.pop().string];
|
|
119
|
+
if (base != null) gatherCompletions(base);
|
|
120
|
+
}
|
|
121
|
+
return found;
|
|
122
|
+
}
|
|
123
|
+
})();
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
function getSearchState(cm) {
|
|
15
15
|
return cm._searchState || (cm._searchState = new SearchState());
|
|
16
16
|
}
|
|
17
|
+
function getSearchCursor(cm, query, pos) {
|
|
18
|
+
// Heuristic: if the query string is all lowercase, do a case insensitive search.
|
|
19
|
+
return cm.getSearchCursor(query, pos, typeof query == "string" && query == query.toLowerCase());
|
|
20
|
+
}
|
|
17
21
|
function dialog(cm, text, shortText, f) {
|
|
18
22
|
if (cm.openDialog) cm.openDialog(text, f);
|
|
19
23
|
else f(prompt(shortText, ""));
|
|
@@ -23,11 +27,11 @@
|
|
|
23
27
|
else if (confirm(shortText)) fs[0]();
|
|
24
28
|
}
|
|
25
29
|
function parseQuery(query) {
|
|
26
|
-
var isRE = query.match(/^\/(.*)
|
|
27
|
-
return isRE ? new RegExp(isRE[1]) : query;
|
|
30
|
+
var isRE = query.match(/^\/(.*)\/([a-z]*)$/);
|
|
31
|
+
return isRE ? new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i") : query;
|
|
28
32
|
}
|
|
29
33
|
var queryDialog =
|
|
30
|
-
'Search: <input type="text" style="width: 10em"
|
|
34
|
+
'Search: <input type="text" style="width: 10em"/> <span style="color: #888">(Use /re/ syntax for regexp search)</span>';
|
|
31
35
|
function doSearch(cm, rev) {
|
|
32
36
|
var state = getSearchState(cm);
|
|
33
37
|
if (state.query) return findNext(cm, rev);
|
|
@@ -36,7 +40,7 @@
|
|
|
36
40
|
if (!query || state.query) return;
|
|
37
41
|
state.query = parseQuery(query);
|
|
38
42
|
if (cm.lineCount() < 2000) { // This is too expensive on big documents.
|
|
39
|
-
for (var cursor =
|
|
43
|
+
for (var cursor = getSearchCursor(cm, query); cursor.findNext();)
|
|
40
44
|
state.marked.push(cm.markText(cursor.from(), cursor.to(), "CodeMirror-searching"));
|
|
41
45
|
}
|
|
42
46
|
state.posFrom = state.posTo = cm.getCursor();
|
|
@@ -46,9 +50,9 @@
|
|
|
46
50
|
}
|
|
47
51
|
function findNext(cm, rev) {cm.operation(function() {
|
|
48
52
|
var state = getSearchState(cm);
|
|
49
|
-
var cursor =
|
|
53
|
+
var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);
|
|
50
54
|
if (!cursor.find(rev)) {
|
|
51
|
-
cursor =
|
|
55
|
+
cursor = getSearchCursor(cm, state.query, rev ? {line: cm.lineCount() - 1} : {line: 0, ch: 0});
|
|
52
56
|
if (!cursor.find(rev)) return;
|
|
53
57
|
}
|
|
54
58
|
cm.setSelection(cursor.from(), cursor.to());
|
|
@@ -63,8 +67,8 @@
|
|
|
63
67
|
})}
|
|
64
68
|
|
|
65
69
|
var replaceQueryDialog =
|
|
66
|
-
'Replace: <input type="text" style="width: 10em"
|
|
67
|
-
var replacementQueryDialog = 'With: <input type="text" style="width: 10em"
|
|
70
|
+
'Replace: <input type="text" style="width: 10em"/> <span style="color: #888">(Use /re/ syntax for regexp search)</span>';
|
|
71
|
+
var replacementQueryDialog = 'With: <input type="text" style="width: 10em"/>';
|
|
68
72
|
var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
|
|
69
73
|
function replace(cm, all) {
|
|
70
74
|
dialog(cm, replaceQueryDialog, "Replace:", function(query) {
|
|
@@ -73,7 +77,7 @@
|
|
|
73
77
|
dialog(cm, replacementQueryDialog, "Replace with:", function(text) {
|
|
74
78
|
if (all) {
|
|
75
79
|
cm.compoundChange(function() { cm.operation(function() {
|
|
76
|
-
for (var cursor =
|
|
80
|
+
for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
|
|
77
81
|
if (typeof query != "string") {
|
|
78
82
|
var match = cm.getRange(cursor.from(), cursor.to()).match(query);
|
|
79
83
|
cursor.replace(text.replace(/\$(\d)/, function(w, i) {return match[i];}));
|
|
@@ -82,13 +86,13 @@
|
|
|
82
86
|
})});
|
|
83
87
|
} else {
|
|
84
88
|
clearSearch(cm);
|
|
85
|
-
var cursor =
|
|
89
|
+
var cursor = getSearchCursor(cm, query, cm.getCursor());
|
|
86
90
|
function advance() {
|
|
87
91
|
var start = cursor.from(), match;
|
|
88
92
|
if (!(match = cursor.findNext())) {
|
|
89
|
-
cursor =
|
|
93
|
+
cursor = getSearchCursor(cm, query);
|
|
90
94
|
if (!(match = cursor.findNext()) ||
|
|
91
|
-
(cursor.from().line == start.line && cursor.from().ch == start.ch)) return;
|
|
95
|
+
(start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;
|
|
92
96
|
}
|
|
93
97
|
cm.setSelection(cursor.from(), cursor.to());
|
|
94
98
|
confirmDialog(cm, doReplaceConfirm, "Replace?",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(function(){
|
|
2
2
|
function SearchCursor(cm, query, pos, caseFold) {
|
|
3
3
|
this.atOccurrence = false; this.cm = cm;
|
|
4
|
-
if (caseFold == null
|
|
4
|
+
if (caseFold == null && typeof query == "string") caseFold = false;
|
|
5
5
|
|
|
6
6
|
pos = pos ? cm.clipPos(pos) : {line: 0, ch: 0};
|
|
7
7
|
this.pos = {from: pos, to: pos};
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
CodeMirror.simpleHint = function(editor, getHints) {
|
|
3
3
|
// We want a single cursor position.
|
|
4
4
|
if (editor.somethingSelected()) return;
|
|
5
|
+
//don't show completion if the token is empty
|
|
6
|
+
var tempToken = editor.getTokenAt(editor.getCursor());
|
|
7
|
+
if(!(/[\S]/gi.test(tempToken.string))) return;
|
|
8
|
+
|
|
5
9
|
var result = getHints(editor);
|
|
6
10
|
if (!result || !result.list.length) return;
|
|
7
11
|
var completions = result.list;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
|
|
2
|
+
(function() {
|
|
3
|
+
|
|
4
|
+
CodeMirror.xmlHints = [];
|
|
5
|
+
|
|
6
|
+
CodeMirror.xmlHint = function(cm, simbol) {
|
|
7
|
+
|
|
8
|
+
if(simbol.length > 0) {
|
|
9
|
+
var cursor = cm.getCursor();
|
|
10
|
+
cm.replaceSelection(simbol);
|
|
11
|
+
cursor = {line: cursor.line, ch: cursor.ch + 1};
|
|
12
|
+
cm.setCursor(cursor);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// dirty hack for simple-hint to receive getHint event on space
|
|
16
|
+
var getTokenAt = editor.getTokenAt;
|
|
17
|
+
|
|
18
|
+
editor.getTokenAt = function() { return 'disabled'; }
|
|
19
|
+
CodeMirror.simpleHint(cm, getHint);
|
|
20
|
+
|
|
21
|
+
editor.getTokenAt = getTokenAt;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
var getHint = function(cm) {
|
|
25
|
+
|
|
26
|
+
var cursor = cm.getCursor();
|
|
27
|
+
|
|
28
|
+
if (cursor.ch > 0) {
|
|
29
|
+
|
|
30
|
+
var text = cm.getRange({line: 0, ch: 0}, cursor);
|
|
31
|
+
var typed = '';
|
|
32
|
+
var simbol = '';
|
|
33
|
+
for(var i = text.length - 1; i >= 0; i--) {
|
|
34
|
+
if(text[i] == ' ' || text[i] == '<') {
|
|
35
|
+
simbol = text[i];
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
typed = text[i] + typed;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
text = text.substr(0, text.length - typed.length);
|
|
44
|
+
|
|
45
|
+
var path = getActiveElement(cm, text) + simbol;
|
|
46
|
+
var hints = CodeMirror.xmlHints[path];
|
|
47
|
+
|
|
48
|
+
if(typeof hints === 'undefined')
|
|
49
|
+
hints = [''];
|
|
50
|
+
else {
|
|
51
|
+
hints = hints.slice(0);
|
|
52
|
+
for (var i = hints.length - 1; i >= 0; i--) {
|
|
53
|
+
if(hints[i].indexOf(typed) != 0)
|
|
54
|
+
hints.splice(i, 1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
list: hints,
|
|
60
|
+
from: { line: cursor.line, ch: cursor.ch - typed.length },
|
|
61
|
+
to: cursor,
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
var getActiveElement = function(codeMirror, text) {
|
|
67
|
+
|
|
68
|
+
var element = '';
|
|
69
|
+
|
|
70
|
+
if(text.length >= 0) {
|
|
71
|
+
|
|
72
|
+
var regex = new RegExp('<([^!?][^\\s/>]*).*?>', 'g');
|
|
73
|
+
|
|
74
|
+
var matches = [];
|
|
75
|
+
var match;
|
|
76
|
+
while ((match = regex.exec(text)) != null) {
|
|
77
|
+
matches.push({
|
|
78
|
+
tag: match[1],
|
|
79
|
+
selfclose: (match[0].substr(-1) === '/>')
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
for (var i = matches.length - 1, skip = 0; i >= 0; i--) {
|
|
84
|
+
|
|
85
|
+
var item = matches[i];
|
|
86
|
+
|
|
87
|
+
if (item.tag[0] == '/')
|
|
88
|
+
{
|
|
89
|
+
skip++;
|
|
90
|
+
}
|
|
91
|
+
else if (item.selfclose == false)
|
|
92
|
+
{
|
|
93
|
+
if (skip > 0)
|
|
94
|
+
{
|
|
95
|
+
skip--;
|
|
96
|
+
}
|
|
97
|
+
else
|
|
98
|
+
{
|
|
99
|
+
element = '<' + item.tag + '>' + element;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
element += getOpenTag(text);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return element;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
var getOpenTag = function(text) {
|
|
111
|
+
|
|
112
|
+
var open = text.lastIndexOf('<');
|
|
113
|
+
var close = text.lastIndexOf('>');
|
|
114
|
+
|
|
115
|
+
if (close < open)
|
|
116
|
+
{
|
|
117
|
+
text = text.substr(open);
|
|
118
|
+
|
|
119
|
+
if(text != '<') {
|
|
120
|
+
|
|
121
|
+
var space = text.indexOf(' ');
|
|
122
|
+
if(space < 0)
|
|
123
|
+
space = text.indexOf('\t');
|
|
124
|
+
if(space < 0)
|
|
125
|
+
space = text.indexOf('\n');
|
|
126
|
+
|
|
127
|
+
if (space < 0)
|
|
128
|
+
space = text.length;
|
|
129
|
+
|
|
130
|
+
return text.substr(0, space);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return '';
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
})();
|