codemirror-rails 2.24 → 2.32
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
})();
|