codemirror-rails 3.14 → 3.15

Sign up to get free protection for your applications and to get access to all the features.
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();