codemirror-rails 2.24 → 2.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +19 -0
  3. data/codemirror-rails.gemspec +6 -1
  4. data/lib/codemirror/rails/version.rb +2 -2
  5. data/test/dummy/README.rdoc +261 -0
  6. data/test/dummy/Rakefile +7 -0
  7. data/test/dummy/app/assets/javascripts/application.js +15 -0
  8. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  9. data/test/dummy/app/controllers/application_controller.rb +3 -0
  10. data/test/dummy/app/helpers/application_helper.rb +2 -0
  11. data/test/dummy/app/mailers/.gitkeep +0 -0
  12. data/test/dummy/app/models/.gitkeep +0 -0
  13. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  14. data/test/dummy/config.ru +4 -0
  15. data/test/dummy/config/application.rb +56 -0
  16. data/test/dummy/config/boot.rb +10 -0
  17. data/test/dummy/config/environment.rb +5 -0
  18. data/test/dummy/config/environments/development.rb +37 -0
  19. data/test/dummy/config/environments/production.rb +67 -0
  20. data/test/dummy/config/environments/test.rb +37 -0
  21. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  22. data/test/dummy/config/initializers/inflections.rb +15 -0
  23. data/test/dummy/config/initializers/mime_types.rb +5 -0
  24. data/test/dummy/config/initializers/secret_token.rb +7 -0
  25. data/test/dummy/config/initializers/session_store.rb +8 -0
  26. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  27. data/test/dummy/config/locales/en.yml +5 -0
  28. data/test/dummy/config/routes.rb +58 -0
  29. data/test/dummy/lib/assets/.gitkeep +0 -0
  30. data/test/dummy/log/.gitkeep +0 -0
  31. data/test/dummy/public/404.html +26 -0
  32. data/test/dummy/public/422.html +26 -0
  33. data/test/dummy/public/500.html +25 -0
  34. data/test/dummy/public/favicon.ico +0 -0
  35. data/test/dummy/script/rails +6 -0
  36. data/test/integration/codemirror_rails_integration_test.rb +13 -0
  37. data/test/test_helper.rb +13 -0
  38. data/vendor/assets/javascripts/codemirror.js +381 -197
  39. data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +1 -1
  40. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +649 -94
  41. data/vendor/assets/javascripts/codemirror/modes/clike.js +53 -7
  42. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +12 -7
  43. data/vendor/assets/javascripts/codemirror/modes/diff.js +24 -5
  44. data/vendor/assets/javascripts/codemirror/modes/ecl.js +2 -2
  45. data/vendor/assets/javascripts/codemirror/modes/erlang.js +463 -0
  46. data/vendor/assets/javascripts/codemirror/modes/gfm.js +38 -2
  47. data/vendor/assets/javascripts/codemirror/modes/go.js +1 -1
  48. data/vendor/assets/javascripts/codemirror/modes/groovy.js +1 -1
  49. data/vendor/assets/javascripts/codemirror/modes/haxe.js +432 -0
  50. data/vendor/assets/javascripts/codemirror/modes/javascript.js +1 -1
  51. data/vendor/assets/javascripts/codemirror/modes/less.js +93 -93
  52. data/vendor/assets/javascripts/codemirror/modes/markdown.js +29 -6
  53. data/vendor/assets/javascripts/codemirror/modes/mysql.js +6 -8
  54. data/vendor/assets/javascripts/codemirror/modes/ocaml.js +114 -0
  55. data/vendor/assets/javascripts/codemirror/modes/pascal.js +1 -1
  56. data/vendor/assets/javascripts/codemirror/modes/pig.js +2 -2
  57. data/vendor/assets/javascripts/codemirror/modes/plsql.js +2 -2
  58. data/vendor/assets/javascripts/codemirror/modes/python.js +13 -16
  59. data/vendor/assets/javascripts/codemirror/modes/ruby.js +3 -8
  60. data/vendor/assets/javascripts/codemirror/modes/scheme.js +74 -46
  61. data/vendor/assets/javascripts/codemirror/modes/shell.js +22 -7
  62. data/vendor/assets/javascripts/codemirror/modes/stex.js +7 -5
  63. data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +14 -14
  64. data/vendor/assets/javascripts/codemirror/modes/vb.js +260 -0
  65. data/vendor/assets/javascripts/codemirror/modes/verilog.js +1 -1
  66. data/vendor/assets/javascripts/codemirror/modes/xml.js +2 -1
  67. data/vendor/assets/javascripts/codemirror/modes/xquery.js +3 -3
  68. data/vendor/assets/javascripts/codemirror/utils/closetag.js +24 -34
  69. data/vendor/assets/javascripts/codemirror/utils/dialog.js +5 -1
  70. data/vendor/assets/javascripts/codemirror/utils/foldcode.js +10 -5
  71. data/vendor/assets/javascripts/codemirror/utils/formatting.js +8 -3
  72. data/vendor/assets/javascripts/codemirror/utils/loadmode.js +2 -1
  73. data/vendor/assets/javascripts/codemirror/utils/match-highlighter.js +1 -1
  74. data/vendor/assets/javascripts/codemirror/utils/multiplex.js +81 -0
  75. data/vendor/assets/javascripts/codemirror/utils/overlay.js +2 -1
  76. data/vendor/assets/javascripts/codemirror/utils/pig-hint.js +123 -0
  77. data/vendor/assets/javascripts/codemirror/utils/search.js +16 -12
  78. data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +1 -1
  79. data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +4 -0
  80. data/vendor/assets/javascripts/codemirror/utils/xml-hint.js +137 -0
  81. data/vendor/assets/stylesheets/codemirror.css +59 -4
  82. data/vendor/assets/stylesheets/codemirror/modes/tiddlywiki.css +14 -21
  83. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +1 -2
  84. data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +21 -0
  85. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +2 -3
  86. data/vendor/assets/stylesheets/codemirror/themes/night.css +1 -1
  87. data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +27 -0
  88. data/vendor/assets/stylesheets/codemirror/utils/dialog.css +4 -0
  89. metadata +98 -5
  90. 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 + "\-\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
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
- var startChar = lineText.lastIndexOf("{");
115
- if (startChar < 0 || lineText.lastIndexOf("}") > startChar) return;
116
- var tokenType = cm.getTokenAt({line: line, ch: startChar}).className;
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 (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont());
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
- CodeMirror.overlayParser = function(base, overlay, combine) {
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"> <span style="color: #888">(Use /re/ syntax for regexp search)</span>';
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 = cm.getSearchCursor(query); cursor.findNext();)
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 = cm.getSearchCursor(state.query, rev ? state.posFrom : state.posTo);
53
+ var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);
50
54
  if (!cursor.find(rev)) {
51
- cursor = cm.getSearchCursor(state.query, rev ? {line: cm.lineCount() - 1} : {line: 0, ch: 0});
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"> <span style="color: #888">(Use /re/ syntax for regexp search)</span>';
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 = cm.getSearchCursor(query); cursor.findNext();) {
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 = cm.getSearchCursor(query, cm.getCursor());
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 = cm.getSearchCursor(query);
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) caseFold = typeof query == "string" && query == query.toLowerCase();
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
+ })();