codemirror-rails 3.14 → 3.15

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +178 -94
  4. data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +3 -3
  5. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +3 -1
  6. data/vendor/assets/javascripts/codemirror/addons/edit/matchtags.js +51 -0
  7. data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +9 -6
  8. data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +9 -4
  9. data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +122 -0
  10. data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +3 -2
  11. data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +24 -17
  12. data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +34 -0
  13. data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +5 -3
  14. data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +7 -3
  15. data/vendor/assets/javascripts/codemirror/addons/hint/pig-hint.js +4 -2
  16. data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +4 -2
  17. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +6 -2
  18. data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +5 -2
  19. data/vendor/assets/javascripts/codemirror/addons/lint/coffeescript-lint.js +3 -2
  20. data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +3 -6
  21. data/vendor/assets/javascripts/codemirror/addons/lint/json-lint.js +3 -2
  22. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +12 -6
  23. data/vendor/assets/javascripts/codemirror/addons/merge/dep/diff_match_patch.js +50 -0
  24. data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +40 -24
  25. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +3 -1
  26. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +3 -1
  27. data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +11 -9
  28. data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +1 -1
  29. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +608 -0
  30. data/vendor/assets/javascripts/codemirror/addons/tern/worker.js +39 -0
  31. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +120 -101
  32. data/vendor/assets/javascripts/codemirror/modes/clike.js +2 -1
  33. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +2 -1
  34. data/vendor/assets/javascripts/codemirror/modes/css.js +33 -16
  35. data/vendor/assets/javascripts/codemirror/modes/groovy.js +2 -1
  36. data/vendor/assets/javascripts/codemirror/modes/jade.js +90 -0
  37. data/vendor/assets/javascripts/codemirror/modes/javascript.js +21 -18
  38. data/vendor/assets/javascripts/codemirror/modes/markdown.js +26 -1
  39. data/vendor/assets/javascripts/codemirror/modes/nginx.js +163 -0
  40. data/vendor/assets/javascripts/codemirror/modes/python.js +19 -2
  41. data/vendor/assets/javascripts/codemirror/modes/rst.js +30 -19
  42. data/vendor/assets/javascripts/codemirror/modes/ruby.js +4 -4
  43. data/vendor/assets/javascripts/codemirror/modes/rust.js +2 -1
  44. data/vendor/assets/javascripts/codemirror/modes/scss_test.js +1 -1
  45. data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +12 -2
  46. data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +170 -0
  47. data/vendor/assets/javascripts/codemirror/modes/sparql.js +4 -2
  48. data/vendor/assets/javascripts/codemirror/modes/vbscript.js +330 -22
  49. data/vendor/assets/javascripts/codemirror/modes/xml.js +18 -3
  50. data/vendor/assets/stylesheets/codemirror.css +10 -0
  51. data/vendor/assets/stylesheets/codemirror/addons/merge/merge.css +39 -29
  52. data/vendor/assets/stylesheets/codemirror/addons/tern/tern.css +85 -0
  53. data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +33 -0
  54. data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +33 -0
  55. data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +33 -0
  56. data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +33 -0
  57. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +1 -1
  58. data/vendor/assets/stylesheets/codemirror/themes/midnight.css +5 -14
  59. data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +33 -0
  60. data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +2 -2
  61. metadata +17 -2
@@ -327,9 +327,11 @@
327
327
  populate(data[tag]);
328
328
 
329
329
  CodeMirror.htmlSchema = data;
330
- CodeMirror.htmlHint = function(cm, options) {
330
+ function htmlHint(cm, options) {
331
331
  var local = {schemaInfo: data};
332
332
  if (options) for (var opt in options) local[opt] = options[opt];
333
- return CodeMirror.xmlHint(cm, local);
334
- };
333
+ return CodeMirror.hint.xml(cm, local);
334
+ }
335
+ CodeMirror.htmlHint = htmlHint; // deprecated
336
+ CodeMirror.registerHelper("hint", "html", htmlHint);
335
337
  })();
@@ -56,11 +56,13 @@
56
56
  to: Pos(cur.line, token.end)};
57
57
  }
58
58
 
59
- CodeMirror.javascriptHint = function(editor, options) {
59
+ function javascriptHint(editor, options) {
60
60
  return scriptHint(editor, javascriptKeywords,
61
61
  function (e, cur) {return e.getTokenAt(cur);},
62
62
  options);
63
63
  };
64
+ CodeMirror.javascriptHint = javascriptHint; // deprecated
65
+ CodeMirror.registerHelper("hint", "javascript", javascriptHint);
64
66
 
65
67
  function getCoffeeScriptToken(editor, cur) {
66
68
  // This getToken, it is for coffeescript, imitates the behavior of
@@ -80,9 +82,11 @@
80
82
  return token;
81
83
  }
82
84
 
83
- CodeMirror.coffeescriptHint = function(editor, options) {
85
+ function coffeescriptHint(editor, options) {
84
86
  return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
85
- };
87
+ }
88
+ CodeMirror.coffeescriptHint = coffeescriptHint; // deprecated
89
+ CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint);
86
90
 
87
91
  var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
88
92
  "toUpperCase toLowerCase split concat match replace search").split(" ");
@@ -41,9 +41,11 @@
41
41
  to: CodeMirror.Pos(cur.line, token.end)};
42
42
  }
43
43
 
44
- CodeMirror.pigHint = function(editor) {
44
+ function pigHint(editor) {
45
45
  return scriptHint(editor, pigKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
46
- };
46
+ }
47
+ CodeMirror.pigHint = pigHint; // deprecated
48
+ CodeMirror.registerHelper("hint", "pig", hinter);
47
49
 
48
50
  var pigKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
49
51
  + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
@@ -41,9 +41,11 @@
41
41
  to: CodeMirror.Pos(cur.line, token.end)};
42
42
  }
43
43
 
44
- CodeMirror.pythonHint = function(editor) {
44
+ function pythonHint(editor) {
45
45
  return scriptHint(editor, pythonKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
46
- };
46
+ }
47
+ CodeMirror.pythonHint = pythonHint; // deprecated
48
+ CodeMirror.registerHelper("hint", "python", pythonHint);
47
49
 
48
50
  var pythonKeywords = "and del from not while as elif global or with assert else if pass yield"
49
51
  + "break except import print class exec in raise continue finally is return def for lambda try";
@@ -4,6 +4,8 @@
4
4
  CodeMirror.showHint = function(cm, getHints, options) {
5
5
  // We want a single cursor position.
6
6
  if (cm.somethingSelected()) return;
7
+ if (getHints == null) getHints = cm.getHelper(cm.getCursor(), "hint");
8
+ if (getHints == null) return;
7
9
 
8
10
  if (cm.state.completionActive) cm.state.completionActive.close();
9
11
 
@@ -25,10 +27,10 @@
25
27
  Completion.prototype = {
26
28
  close: function() {
27
29
  if (!this.active()) return;
30
+ this.cm.state.completionActive = null;
28
31
 
29
32
  if (this.widget) this.widget.close();
30
33
  if (this.onClose) this.onClose();
31
- this.cm.state.completionActive = null;
32
34
  CodeMirror.signal(this.cm, "endCompletion", this.cm);
33
35
  },
34
36
 
@@ -74,12 +76,14 @@
74
76
 
75
77
  function update() {
76
78
  if (isDone()) return;
79
+ CodeMirror.signal(data, "update");
77
80
  if (completion.options.async)
78
81
  completion.getHints(completion.cm, finishUpdate, completion.options);
79
82
  else
80
83
  finishUpdate(completion.getHints(completion.cm, completion.options));
81
84
  }
82
- function finishUpdate(data) {
85
+ function finishUpdate(data_) {
86
+ data = data_;
83
87
  if (isDone()) return;
84
88
  if (!data || !data.list.length) return done();
85
89
  completion.widget.close();
@@ -3,7 +3,7 @@
3
3
 
4
4
  var Pos = CodeMirror.Pos;
5
5
 
6
- CodeMirror.xmlHint = function(cm, options) {
6
+ function getHints(cm, options) {
7
7
  var tags = options && options.schemaInfo;
8
8
  var quote = (options && options.quoteChar) || '"';
9
9
  if (!tags) return;
@@ -61,5 +61,8 @@
61
61
  from: replaceToken ? Pos(cur.line, token.start) : cur,
62
62
  to: replaceToken ? Pos(cur.line, token.end) : cur
63
63
  };
64
- };
64
+ }
65
+
66
+ CodeMirror.xmlHint = getHints; // deprecated
67
+ CodeMirror.registerHelper("hint", "xml", getHints);
65
68
  })();
@@ -1,6 +1,6 @@
1
1
  // Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js
2
2
 
3
- CodeMirror.coffeeValidator = function(text) {
3
+ CodeMirror.registerHelper("lint", "coffeescript", function(text) {
4
4
  var found = [];
5
5
  var parseError = function(err) {
6
6
  var loc = err.lineNumber;
@@ -21,4 +21,5 @@ CodeMirror.coffeeValidator = function(text) {
21
21
  message: e.message});
22
22
  }
23
23
  return found;
24
- };
24
+ });
25
+ CodeMirror.coffeeValidator = CodeMirror.lint.coffeescript; // deprecated
@@ -9,18 +9,15 @@
9
9
  "Unmatched ", " and instead saw", " is not defined",
10
10
  "Unclosed string", "Stopping, unable to continue" ];
11
11
 
12
- function validator(options, text) {
12
+ function validator(text, options) {
13
13
  JSHINT(text, options);
14
14
  var errors = JSHINT.data().errors, result = [];
15
15
  if (errors) parseErrors(errors, result);
16
16
  return result;
17
17
  }
18
18
 
19
- CodeMirror.javascriptValidatorWithOptions = function(options) {
20
- return function(text) { return validator(options, text); };
21
- };
22
-
23
- CodeMirror.javascriptValidator = CodeMirror.javascriptValidatorWithOptions(null);
19
+ CodeMirror.registerHelper("lint", "javascript", validator);
20
+ CodeMirror.javascriptValidator = CodeMirror.lint.javascript; // deprecated
24
21
 
25
22
  function cleanup(error) {
26
23
  // All problems are warnings by default
@@ -1,6 +1,6 @@
1
1
  // Depends on jsonlint.js from https://github.com/zaach/jsonlint
2
2
 
3
- CodeMirror.jsonValidator = function(text) {
3
+ CodeMirror.registerHelper("lint", "json", function(text) {
4
4
  var found = [];
5
5
  jsonlint.parseError = function(str, hash) {
6
6
  var loc = hash.loc;
@@ -11,4 +11,5 @@ CodeMirror.jsonValidator = function(text) {
11
11
  try { jsonlint.parse(text); }
12
12
  catch(e) {}
13
13
  return found;
14
- };
14
+ });
15
+ CodeMirror.jsonValidator = CodeMirror.lint.json; // deprecated
@@ -1,4 +1,5 @@
1
- CodeMirror.validate = (function() {
1
+ (function() {
2
+ "use strict";
2
3
  var GUTTER_ID = "CodeMirror-lint-markers";
3
4
  var SEVERITIES = /^(?:error|warning)$/;
4
5
 
@@ -52,9 +53,11 @@ CodeMirror.validate = (function() {
52
53
  this.onMouseOver = function(e) { onMouseOver(cm, e); };
53
54
  }
54
55
 
55
- function parseOptions(options) {
56
+ function parseOptions(cm, options) {
56
57
  if (options instanceof Function) return {getAnnotations: options};
57
- else if (!options || !options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)");
58
+ if (!options || options === true) options = {};
59
+ if (!options.getAnnotations) options.getAnnotations = cm.getHelper(CodeMirror.Pos(0, 0), "lint");
60
+ if (!options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)");
58
61
  return options;
59
62
  }
60
63
 
@@ -175,7 +178,7 @@ CodeMirror.validate = (function() {
175
178
  }
176
179
  }
177
180
 
178
- CodeMirror.defineOption("lintWith", false, function(cm, val, old) {
181
+ function optionHandler(cm, val, old) {
179
182
  if (old && old != CodeMirror.Init) {
180
183
  clearMarks(cm);
181
184
  cm.off("change", onChange);
@@ -186,12 +189,15 @@ CodeMirror.validate = (function() {
186
189
  if (val) {
187
190
  var gutters = cm.getOption("gutters"), hasLintGutter = false;
188
191
  for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;
189
- var state = cm.state.lint = new LintState(cm, parseOptions(val), hasLintGutter);
192
+ var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
190
193
  cm.on("change", onChange);
191
194
  if (state.options.tooltips != false)
192
195
  CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
193
196
 
194
197
  startLinting(cm);
195
198
  }
196
- });
199
+ }
200
+
201
+ CodeMirror.defineOption("lintWith", false, optionHandler); // deprecated
202
+ CodeMirror.defineOption("lint", false, optionHandler); // deprecated
197
203
  })();
@@ -0,0 +1,50 @@
1
+ // From https://code.google.com/p/google-diff-match-patch/ , licensed under the Apache License 2.0
2
+ (function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32}
3
+ diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,
4
+ b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a};
5
+ diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,
6
+ d):this.diff_bisect_(a,b,d)};
7
+ diff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([0,""]);for(var e=d=b=0,f="",g="";b<a.length;){switch(a[b][0]){case 1:e++;g+=a[b][1];break;case -1:d++;f+=a[b][1];break;case 0:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=d.length}d=e=0;g=f=""}b++}a.pop();return a};
8
+ diff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=f,h=2*f,j=Array(h),i=Array(h),k=0;k<h;k++)j[k]=-1,i[k]=-1;j[g+1]=0;i[g+1]=0;for(var k=d-e,q=0!=k%2,r=0,t=0,p=0,w=0,v=0;v<f&&!((new Date).getTime()>c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]<j[l+1]?j[l+1]:j[l-1]+1;for(var s=m-n;m<d&&s<e&&a.charAt(m)==b.charAt(s);)m++,s++;j[l]=m;if(m>d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l<h&&-1!=i[l])){var u=d-i[l];if(m>=
9
+ u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]<i[l+1]?i[l+1]:i[l-1]+1;for(m=u-n;u<d&&m<e&&a.charAt(d-u-1)==b.charAt(e-m-1);)u++,m++;i[l]=u;if(u>d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l<h&&-1!=j[l])&&(m=j[l],s=g+m-l,u=d-u,m>=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]};
10
+ diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};
11
+ diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf("\n",c);-1==f&&(f=a.length-1);var r=a.substring(c,f+1),c=f+1;(e.hasOwnProperty?e.hasOwnProperty(r):void 0!==e[r])?b+=String.fromCharCode(e[r]):(b+=String.fromCharCode(g),e[r]=g,d[g++]=r)}return b}var d=[],e={};d[0]="";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};
12
+ diff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join("")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};
13
+ diff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};
14
+ diff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;for(var d=0,e=1;;){var f=a.substring(c-e),f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};
15
+ diff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g="",h,j,n,l;-1!=(e=b.indexOf(d,e+1));){var m=f.diff_commonPrefix(a.substring(c),b.substring(e)),s=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<s+m&&(g=b.substring(e-s,e)+b.substring(e,e+m),h=a.substring(0,c-s),j=a.substring(c+m),n=b.substring(0,e-s),l=b.substring(e+m))}return 2*g.length>=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null;
16
+ var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4)),d=c(d,e,Math.ceil(d.length/2)),h;if(!g&&!d)return null;h=d?g?g[4].length>d[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]};
17
+ diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f<a.length;)0==a[f][0]?(c[d++]=f,g=j,h=i,i=j=0,e=a[f][1]):(1==a[f][0]?j+=a[f][1].length:i+=a[f][1].length,e&&(e.length<=Math.max(g,h)&&e.length<=Math.max(j,i))&&(a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,d--,f=0<d?c[d-1]:-1,i=j=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(-1==a[f-1][0]&&1==a[f][0]){b=a[f-1][1];c=a[f][1];
18
+ d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}};
19
+ diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_);
20
+ return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(0==a[c-1][0]&&0==a[c+1][0]){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g)var h=e.substring(e.length-g),d=d.substring(0,d.length-g),e=h+e.substring(0,e.length-g),f=h+f;for(var g=d,h=e,j=f,i=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){var d=d+e.charAt(0),e=e.substring(1)+f.charAt(0),f=f.substring(1),k=b(d,e)+b(e,f);k>=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]=
21
+ h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/;
22
+ diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;f<a.length;){if(0==a[f][0])a[f][1].length<this.Diff_EditCost&&(j||i)?(c[d++]=f,g=j,h=i,e=a[f][1]):(d=0,e=null),j=i=!1;else if(-1==a[f][0]?i=!0:j=!0,e&&(g&&h&&j&&i||e.length<this.Diff_EditCost/2&&3==g+h+j+i))a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,e=null,g&&h?(j=i=!0,d=0):(d--,f=0<d?c[d-1]:-1,j=i=!1),b=!0;f++}b&&this.diff_cleanupMerge(a)};
23
+ diff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([0,""]);for(var b=0,c=0,d=0,e="",f="",g;b<a.length;)switch(a[b][0]){case 1:d++;f+=a[b][1];b++;break;case -1:c++;e+=a[b][1];b++;break;case 0:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&0==a[b-c-d-1][0]?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[0,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-g)+a[b][1],f=f.substring(0,f.length-
24
+ g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[1,f]):0===d?a.splice(b-c,c+d,[-1,e]):a.splice(b-c-d,c+d,[-1,e],[1,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&0==a[b-1][0]?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=""}""===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)0==a[b-1][0]&&0==a[b+1][0]&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,a[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,
25
+ a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};diff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){1!==a[g][0]&&(c+=a[g][1].length);-1!==a[g][0]&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)};
26
+ diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\n/g,g=0;g<a.length;g++){var h=a[g][0],j=a[g][1],j=j.replace(c,"&amp;").replace(d,"&lt;").replace(e,"&gt;").replace(f,"&para;<br>");switch(h){case 1:b[g]='<ins style="background:#e6ffe6;">'+j+"</ins>";break;case -1:b[g]='<del style="background:#ffe6e6;">'+j+"</del>";break;case 0:b[g]="<span>"+j+"</span>"}}return b.join("")};
27
+ diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)-1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][0],g=a[e][1];switch(f){case 1:c+=g.length;break;case -1:d+=g.length;break;case 0:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};
28
+ diff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case 1:b[c]="+"+encodeURI(a[c][1]);break;case -1:b[c]="-"+a[c][1].length;break;case 0:b[c]="="+a[c][1].length}return b.join("\t").replace(/%20/g," ")};
29
+ diff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case "+":try{c[d++]=[1,decodeURI(h)]}catch(j){throw Error("Illegal escape in diff_fromDelta: "+h);}break;case "-":case "=":var i=parseInt(h,10);if(isNaN(i)||0>i)throw Error("Invalid number in diff_fromDelta: "+h);h=a.substring(e,e+=i);"="==f[g].charAt(0)?c[d++]=[0,h]:c[d++]=[-1,h];break;default:if(f[g])throw Error("Invalid diff operation in diff_fromDelta: "+
30
+ f[g]);}}if(e!=a.length)throw Error("Delta length ("+e+") does not equal source text length ("+a.length+").");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error("Null input. (match_main)");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};
31
+ diff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return!f.Match_Distance?g?1:e:e+g/f.Match_Distance}if(b.length>this.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<<b.length-1,h=-1,i,k,q=b.length+a.length,r,t=0;t<b.length;t++){i=0;for(k=q;i<k;)d(t,c+
32
+ k)<=g?i=k:q=k,k=Math.floor((q-i)/2+i);q=k;i=Math.max(1,c-k+1);var p=Math.min(c+k,a.length)+b.length;k=Array(p+2);for(k[p+1]=(1<<t)-1;p>=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h};
33
+ diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};
34
+ diff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([0,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([0,d]);a.start1-=c.length;a.start2-=c.length;a.length1+=
35
+ c.length+d.length;a.length2+=c.length+d.length}};
36
+ diff_match_patch.prototype.patch_make=function(a,b,c){var d;if("string"==typeof a&&"string"==typeof b&&"undefined"==typeof c)d=a,b=this.diff_main(d,b,!0),2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b));else if(a&&"object"==typeof a&&"undefined"==typeof b&&"undefined"==typeof c)b=a,d=this.diff_text1(b);else if("string"==typeof a&&b&&"object"==typeof b&&"undefined"==typeof c)d=a;else if("string"==typeof a&&"string"==typeof b&&c&&"object"==typeof c)d=a,b=c;else throw Error("Unknown call format to patch_make.");
37
+ if(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,j=0;j<b.length;j++){var i=b[j][0],k=b[j][1];!e&&0!==i&&(a.start1=f,a.start2=g);switch(i){case 1:a.diffs[e++]=b[j];a.length2+=k.length;d=d.substring(0,g)+k+d.substring(g);break;case -1:a.length1+=k.length;a.diffs[e++]=b[j];d=d.substring(0,g)+d.substring(g+k.length);break;case 0:k.length<=2*this.Patch_Margin&&e&&b.length!=j+1?(a.diffs[e++]=b[j],a.length1+=k.length,a.length2+=k.length):k.length>=2*this.Patch_Margin&&
38
+ e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};
39
+ diff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),j,i=-1;if(h.length>this.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g);
40
+ if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;i<a[f].diffs.length;i++){var q=a[f].diffs[i];0!==q[0]&&(k=this.diff_xIndex(g,h));1===q[0]?b=b.substring(0,
41
+ j+k)+q[1]+b.substring(j+k):-1===q[0]&&(b=b.substring(0,j+k)+b.substring(j+this.diff_xIndex(g,h+q[1].length)));-1!==q[0]&&(h+=q[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};
42
+ diff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c="",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;var d=a[0],e=d.diffs;if(0==e.length||0!=e[0][0])e.unshift([0,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0,
43
+ c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};
44
+ diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g="";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,j=!0;h.start1=e-g.length;h.start2=f-g.length;""!==g&&(h.length1=h.length2=g.length,h.diffs.push([0,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){var g=d.diffs[0][0],i=d.diffs[0][1];1===g?(h.length2+=i.length,f+=i.length,h.diffs.push(d.diffs.shift()),
45
+ j=!1):-1===g&&1==h.diffs.length&&0==h.diffs[0][0]&&i.length>2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&&
46
+ (h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join("")};
47
+ diff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split("\n");for(var c=0,d=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error("Invalid patch string: "+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);""===e[2]?(f.start1--,f.length1=1):"0"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);""===e[4]?(f.start2--,f.length2=1):"0"==e[4]?f.length2=0:(f.start2--,f.length2=
48
+ parseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error("Illegal escape in patch_fromText: "+g);}if("-"==e)f.diffs.push([-1,g]);else if("+"==e)f.diffs.push([1,g]);else if(" "==e)f.diffs.push([0,g]);else if("@"==e)break;else if(""!==e)throw Error('Invalid patch mode "'+e+'" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};
49
+ diff_match_patch.patch_obj.prototype.toString=function(){var a,b;a=0===this.length1?this.start1+",0":1==this.length1?this.start1+1:this.start1+1+","+this.length1;b=0===this.length2?this.start2+",0":1==this.length2?this.start2+1:this.start2+1+","+this.length2;a=["@@ -"+a+" +"+b+" @@\n"];var c;for(b=0;b<this.diffs.length;b++){switch(this.diffs[b][0]){case 1:c="+";break;case -1:c="-";break;case 0:c=" "}a[b+1]=c+encodeURI(this.diffs[b][1])+"\n"}return a.join("").replace(/%20/g," ")};
50
+ this.diff_match_patch=diff_match_patch;this.DIFF_DELETE=-1;this.DIFF_INSERT=1;this.DIFF_EQUAL=0;})()
@@ -8,18 +8,18 @@
8
8
  this.mv = mv;
9
9
  this.type = type;
10
10
  this.classes = type == "left"
11
- ? {chunk: "CodeMirror-diff-l-chunk",
12
- start: "CodeMirror-diff-l-chunk-start",
13
- end: "CodeMirror-diff-l-chunk-end",
14
- insert: "CodeMirror-diff-l-inserted",
15
- del: "CodeMirror-diff-l-deleted",
16
- connect: "CodeMirror-diff-l-connect"}
17
- : {chunk: "CodeMirror-diff-r-chunk",
18
- start: "CodeMirror-diff-r-chunk-start",
19
- end: "CodeMirror-diff-r-chunk-end",
20
- insert: "CodeMirror-diff-r-inserted",
21
- del: "CodeMirror-diff-r-deleted",
22
- connect: "CodeMirror-diff-r-connect"};
11
+ ? {chunk: "CodeMirror-merge-l-chunk",
12
+ start: "CodeMirror-merge-l-chunk-start",
13
+ end: "CodeMirror-merge-l-chunk-end",
14
+ insert: "CodeMirror-merge-l-inserted",
15
+ del: "CodeMirror-merge-l-deleted",
16
+ connect: "CodeMirror-merge-l-connect"}
17
+ : {chunk: "CodeMirror-merge-r-chunk",
18
+ start: "CodeMirror-merge-r-chunk-start",
19
+ end: "CodeMirror-merge-r-chunk-end",
20
+ insert: "CodeMirror-merge-r-inserted",
21
+ del: "CodeMirror-merge-r-deleted",
22
+ connect: "CodeMirror-merge-r-connect"};
23
23
  }
24
24
 
25
25
  DiffView.prototype = {
@@ -93,7 +93,21 @@
93
93
  var off = getOffsets(editor, type == DIFF_INSERT ? around.edit : around.orig);
94
94
  var offOther = getOffsets(other, type == DIFF_INSERT ? around.orig : around.edit);
95
95
  var ratio = (midY - off.top) / (off.bot - off.top);
96
- other.scrollTo(null, (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top));
96
+ var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top);
97
+
98
+ var botDist, mix;
99
+ // Some careful tweaking to make sure no space is left out of view
100
+ // when scrolling to top or bottom.
101
+ if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) {
102
+ targetPos = targetPos * mix + sInfo.top * (1 - mix);
103
+ } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) {
104
+ var otherInfo = other.getScrollInfo();
105
+ var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos;
106
+ if (botDistOther > botDist && (mix = botDist / halfScreen) < 1)
107
+ targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix);
108
+ }
109
+
110
+ other.scrollTo(sInfo.left, targetPos);
97
111
  other.state.scrollSetAt = now;
98
112
  other.state.scrollSetBy = dv;
99
113
  return true;
@@ -208,8 +222,8 @@
208
222
  var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport();
209
223
  var sTopEdit = dv.edit.getScrollInfo().top, sTopOrig = dv.orig.getScrollInfo().top;
210
224
  iterateChunks(dv.diff, function(topOrig, botOrig, topEdit, botEdit) {
211
- if (topEdit >= vpEdit.to || botEdit < vpEdit.from ||
212
- topOrig >= vpOrig.to || botOrig < vpOrig.from)
225
+ if (topEdit > vpEdit.to || botEdit < vpEdit.from ||
226
+ topOrig > vpOrig.to || botOrig < vpOrig.from)
213
227
  return;
214
228
  var topLpx = dv.orig.heightAtLine(topOrig, "local") - sTopOrig, top = topLpx;
215
229
  if (dv.svg) {
@@ -225,7 +239,7 @@
225
239
  "class", dv.classes.connect);
226
240
  }
227
241
  var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc",
228
- "CodeMirror-diff-copy"));
242
+ "CodeMirror-merge-copy"));
229
243
  copy.title = "Revert chunk";
230
244
  copy.chunk = {topEdit: topEdit, botEdit: botEdit, topOrig: topOrig, botOrig: botOrig};
231
245
  copy.style.top = top + "px";
@@ -250,23 +264,25 @@
250
264
 
251
265
  if (hasLeft) {
252
266
  left = this.left = new DiffView(this, "left");
253
- var leftPane = elt("div", null, "CodeMirror-diff-pane");
267
+ var leftPane = elt("div", null, "CodeMirror-merge-pane");
254
268
  wrap.push(leftPane);
255
269
  wrap.push(buildGap(left));
256
270
  }
257
271
 
258
- var editPane = elt("div", null, "CodeMirror-diff-pane");
272
+ var editPane = elt("div", null, "CodeMirror-merge-pane");
259
273
  wrap.push(editPane);
260
274
 
261
275
  if (hasRight) {
262
276
  right = this.right = new DiffView(this, "right");
263
277
  wrap.push(buildGap(right));
264
- var rightPane = elt("div", null, "CodeMirror-diff-pane");
278
+ var rightPane = elt("div", null, "CodeMirror-merge-pane");
265
279
  wrap.push(rightPane);
266
280
  }
267
281
 
282
+ (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost";
283
+
268
284
  wrap.push(elt("div", null, null, "height: 0; clear: both;"));
269
- var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-diff CodeMirror-diff-" + panes + "pane"));
285
+ var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane"));
270
286
  this.edit = CodeMirror(editPane, copyObj(options));
271
287
 
272
288
  if (left) left.init(leftPane, origLeft, options);
@@ -284,11 +300,11 @@
284
300
  };
285
301
 
286
302
  function buildGap(dv) {
287
- var lock = dv.lockButton = elt("div", null, "CodeMirror-diff-scrolllock");
303
+ var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock");
288
304
  lock.title = "Toggle locked scrolling";
289
- var lockWrap = elt("div", [lock], "CodeMirror-diff-scrolllock-wrap");
305
+ var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap");
290
306
  CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); });
291
- dv.copyButtons = elt("div", null, "CodeMirror-diff-copybuttons-" + dv.type);
307
+ dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type);
292
308
  CodeMirror.on(dv.copyButtons, "click", function(e) {
293
309
  var node = e.target || e.srcElement;
294
310
  if (node.chunk) copyChunk(dv, node.chunk);
@@ -299,7 +315,7 @@
299
315
  dv.svg = svg;
300
316
  if (svg) gapElts.push(svg);
301
317
 
302
- return dv.gap = elt("div", gapElts, "CodeMirror-diff-gap");
318
+ return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap");
303
319
  }
304
320
 
305
321
  MergeView.prototype = {
@@ -43,12 +43,14 @@ StringStream.prototype = {
43
43
  match: function(pattern, consume, caseInsensitive) {
44
44
  if (typeof pattern == "string") {
45
45
  var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
46
- if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
46
+ var substr = this.string.substr(this.pos, pattern.length);
47
+ if (cased(substr) == cased(pattern)) {
47
48
  if (consume !== false) this.pos += pattern.length;
48
49
  return true;
49
50
  }
50
51
  } else {
51
52
  var match = this.string.slice(this.pos).match(pattern);
53
+ if (match && match.index > 0) return null;
52
54
  if (match && consume !== false) this.pos += match[0].length;
53
55
  return match;
54
56
  }
@@ -41,12 +41,14 @@ StringStream.prototype = {
41
41
  match: function(pattern, consume, caseInsensitive) {
42
42
  if (typeof pattern == "string") {
43
43
  var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
44
- if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
44
+ var substr = this.string.substr(this.pos, pattern.length);
45
+ if (cased(substr) == cased(pattern)) {
45
46
  if (consume !== false) this.pos += pattern.length;
46
47
  return true;
47
48
  }
48
49
  } else {
49
50
  var match = this.string.slice(this.pos).match(pattern);
51
+ if (match && match.index > 0) return null;
50
52
  if (match && consume !== false) this.pos += match[0].length;
51
53
  return match;
52
54
  }
@@ -55,11 +55,13 @@
55
55
  cm.removeOverlay(state.overlay);
56
56
  state.overlay = null;
57
57
  }
58
-
59
58
  if (!cm.somethingSelected() && state.showToken) {
60
- var tok = cm.getTokenAt(cm.getCursor()).string;
61
- if (/\w/.test(tok))
62
- cm.addOverlay(state.overlay = makeOverlay(tok, true, state.style));
59
+ var re = state.showToken === true ? /[\w$]/ : state.showToken;
60
+ var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;
61
+ while (start && re.test(line.charAt(start - 1))) --start;
62
+ while (end < line.length && re.test(line.charAt(end))) ++end;
63
+ if (start < end)
64
+ cm.addOverlay(state.overlay = makeOverlay(line.slice(start, end), re, state.style));
63
65
  return;
64
66
  }
65
67
  if (cm.getCursor("head").line != cm.getCursor("anchor").line) return;
@@ -69,15 +71,15 @@
69
71
  });
70
72
  }
71
73
 
72
- function boundariesAround(stream) {
73
- return (stream.start || /.\b./.test(stream.string.slice(stream.start - 1, stream.start + 1))) &&
74
- (stream.pos == stream.string.length || /.\b./.test(stream.string.slice(stream.pos - 1, stream.pos + 1)));
74
+ function boundariesAround(stream, re) {
75
+ return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&
76
+ (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));
75
77
  }
76
78
 
77
- function makeOverlay(query, wordBoundaries, style) {
79
+ function makeOverlay(query, hasBoundary, style) {
78
80
  return {token: function(stream) {
79
81
  if (stream.match(query) &&
80
- (!wordBoundaries || boundariesAround(stream)))
82
+ (!hasBoundary || boundariesAround(stream, hasBoundary)))
81
83
  return style;
82
84
  stream.next();
83
85
  stream.skipTo(query.charAt(0)) || stream.skipToEnd();