##// END OF EJS Templates
js: updated mergely to 3.4.1
marcink -
r347:99b6d323 default
parent child Browse files
Show More
@@ -1,4 +1,3 b''
1
2 /* required */
1 /* required */
3 .mergely-column textarea { width: 80px; height: 200px; }
2 .mergely-column textarea { width: 80px; height: 200px; }
4 .mergely-column { float: left; }
3 .mergely-column { float: left; }
@@ -12,17 +11,19 b''
12 .mergely-column { border: 1px solid #ccc; }
11 .mergely-column { border: 1px solid #ccc; }
13 .mergely-active { border: 1px solid #a3d1ff; }
12 .mergely-active { border: 1px solid #a3d1ff; }
14
13
15 .mergely.a.rhs.start { border-top: 1px solid #ddffdd; }
14 .mergely.a,.mergely.d,.mergely.c { color: #000; }
16 .mergely.a.lhs.start.end,
17 .mergely.a.rhs.end { border-bottom: 1px solid #ddffdd; }
18 .mergely.a.rhs { background-color: #ddffdd; }
19 .mergely.a.lhs.start.end.first { border-bottom: 0; border-top: 1px solid #ddffdd; }
20
15
21 .mergely.d.lhs { background-color: #edc0c0; }
16 .mergely.a.rhs.start { border-top: 1px solid #a3d1ff; }
17 .mergely.a.lhs.start.end,
18 .mergely.a.rhs.end { border-bottom: 1px solid #a3d1ff; }
19 .mergely.a.rhs { background-color: #ddeeff; }
20 .mergely.a.lhs.start.end.first { border-bottom: 0; border-top: 1px solid #a3d1ff; }
21
22 .mergely.d.lhs { background-color: #ffe9e9; }
22 .mergely.d.lhs.end,
23 .mergely.d.lhs.end,
23 .mergely.d.rhs.start.end { border-bottom: 1px solid #ffdddd; }
24 .mergely.d.rhs.start.end { border-bottom: 1px solid #f8e8e8; }
24 .mergely.d.rhs.start.end.first { border-bottom: 0; border-top: 1px solid #ffdddd; }
25 .mergely.d.rhs.start.end.first { border-bottom: 0; border-top: 1px solid #f8e8e8; }
25 .mergely.d.lhs.start { border-top: 1px solid #ffdddd; }
26 .mergely.d.lhs.start { border-top: 1px solid #f8e8e8; }
26
27
27 .mergely.c.lhs,
28 .mergely.c.lhs,
28 .mergely.c.rhs { background-color: #fafafa; }
29 .mergely.c.rhs { background-color: #fafafa; }
@@ -31,11 +32,19 b''
31 .mergely.c.lhs.end,
32 .mergely.c.lhs.end,
32 .mergely.c.rhs.end { border-bottom: 1px solid #a3a3a3; }
33 .mergely.c.rhs.end { border-bottom: 1px solid #a3a3a3; }
33
34
34 .mergely.ch.a.rhs { background-color: #ddffdd; }
35 .mergely.ch.a.rhs { background-color: #ddeeff; }
35 .mergely.ch.d.lhs { background-color: #ffdddd; }
36 .mergely.ch.d.lhs { background-color: #ffe9e9; text-decoration: line-through; color: red !important; }
36
37
37
38 .mergely-margin #compare-lhs-margin,
38 .mergely-margin #compare-lhs-margin,
39 .mergely-margin #compare-rhs-margin {
39 .mergely-margin #compare-rhs-margin {
40 cursor: pointer
40 cursor: pointer
41 }
41 }
42
43 .mergely.current.start { border-top: 1px solid #000 !important; }
44 .mergely.current.end { border-bottom: 1px solid #000 !important; }
45 .mergely.current.lhs.a.start.end,
46 .mergely.current.rhs.d.start.end { border-top: 0 !important; }
47 .mergely.current.CodeMirror-linenumber { color: #F9F9F9; font-weight: bold; background-color: #777; }
48
49 .CodeMirror-linenumber { cursor: pointer; }
50 .CodeMirror-code { color: #717171; } No newline at end of file
@@ -297,15 +297,15 b' jQuery.extend(Mgly.diff.prototype, {'
297 },
297 },
298 _optimize: function(ctx) {
298 _optimize: function(ctx) {
299 var start = 0, end = 0;
299 var start = 0, end = 0;
300 while (start < ctx.length) {
300 while (start < ctx.codes.length) {
301 while ((start < ctx.length) && (ctx.modified[start] == undefined || ctx.modified[start] == false)) {
301 while ((start < ctx.codes.length) && (ctx.modified[start] == undefined || ctx.modified[start] == false)) {
302 start++;
302 start++;
303 }
303 }
304 end = start;
304 end = start;
305 while ((end < ctx.length) && (ctx.modified[end] == true)) {
305 while ((end < ctx.codes.length) && (ctx.modified[end] == true)) {
306 end++;
306 end++;
307 }
307 }
308 if ((end < ctx.length) && (ctx.ctx[start] == ctx.codes[end])) {
308 if ((end < ctx.codes.length) && (ctx.codes[start] == ctx.codes[end])) {
309 ctx.modified[start] = false;
309 ctx.modified[start] = false;
310 ctx.modified[end] = true;
310 ctx.modified[end] = true;
311 }
311 }
@@ -438,8 +438,7 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
438 if (this.resized) this.resized();
438 if (this.resized) this.resized();
439 },
439 },
440 _debug: '', //scroll,draw,calc,diff,markup,change
440 _debug: '', //scroll,draw,calc,diff,markup,change
441 resized: function() { },
441 resized: function() { }
442 finished: function () { }
443 };
442 };
444 var cmsettings = {
443 var cmsettings = {
445 mode: 'text/plain',
444 mode: 'text/plain',
@@ -497,7 +496,7 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
497 if (direction == 'next') {
496 if (direction == 'next') {
498 this._current_diff = Math.min(++this._current_diff, this.changes.length - 1);
497 this._current_diff = Math.min(++this._current_diff, this.changes.length - 1);
499 }
498 }
500 else {
499 else if (direction == 'prev') {
501 this._current_diff = Math.max(--this._current_diff, 0);
500 this._current_diff = Math.max(--this._current_diff, 0);
502 }
501 }
503 this._scroll_to_change(this.changes[this._current_diff]);
502 this._scroll_to_change(this.changes[this._current_diff]);
@@ -540,10 +539,10 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
540 if (this.settings.hasOwnProperty('sidebar')) {
539 if (this.settings.hasOwnProperty('sidebar')) {
541 // dynamically enable sidebars
540 // dynamically enable sidebars
542 if (this.settings.sidebar) {
541 if (this.settings.sidebar) {
543 jQuery(this.element).find('.mergely-margin').css({display: 'block'});
542 this.element.find('.mergely-margin').css({display: 'block'});
544 }
543 }
545 else {
544 else {
546 jQuery(this.element).find('.mergely-margin').css({display: 'none'});
545 this.element.find('.mergely-margin').css({display: 'none'});
547 }
546 }
548 }
547 }
549 var le, re;
548 var le, re;
@@ -690,12 +689,12 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
690 jQuery('<style type="text/css">' + cmstyle + '</style>').appendTo('head');
689 jQuery('<style type="text/css">' + cmstyle + '</style>').appendTo('head');
691
690
692 //bind
691 //bind
693 var rhstx = jQuery('#' + this.id + '-rhs').get(0);
692 var rhstx = this.element.find('#' + this.id + '-rhs').get(0);
694 if (!rhstx) {
693 if (!rhstx) {
695 console.error('rhs textarea not defined - Mergely not initialized properly');
694 console.error('rhs textarea not defined - Mergely not initialized properly');
696 return;
695 return;
697 }
696 }
698 var lhstx = jQuery('#' + this.id + '-lhs').get(0);
697 var lhstx = this.element.find('#' + this.id + '-lhs').get(0);
699 if (!rhstx) {
698 if (!rhstx) {
700 console.error('lhs textarea not defined - Mergely not initialized properly');
699 console.error('lhs textarea not defined - Mergely not initialized properly');
701 return;
700 return;
@@ -728,6 +727,38 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
728 );
727 );
729 sz(true);
728 sz(true);
730 }
729 }
730
731 // scrollToDiff() from gutter
732 function gutterClicked(side, line, ev) {
733 // The "Merge left/right" buttons are also located in the gutter.
734 // Don't interfere with them:
735 if (ev.target && (jQuery(ev.target).closest('.merge-button').length > 0)) {
736 return;
737 }
738
739 // See if the user clicked the line number of a difference:
740 var i, change;
741 for (i = 0; i < this.changes.length; i++) {
742 change = this.changes[i];
743 if (line >= change[side+'-line-from'] && line <= change[side+'-line-to']) {
744 this._current_diff = i;
745 // I really don't like this here - something about gutterClick does not
746 // like mutating editor here. Need to trigger the scroll to diff from
747 // a timeout.
748 setTimeout(function() { this.scrollToDiff(); }.bind(this), 10);
749 break;
750 }
751 }
752 }
753
754 this.editor[this.id + '-lhs'].on('gutterClick', function(cm, n, gutterClass, ev) {
755 gutterClicked.call(this, 'lhs', n, ev);
756 }.bind(this));
757
758 this.editor[this.id + '-rhs'].on('gutterClick', function(cm, n, gutterClass, ev) {
759 gutterClicked.call(this, 'rhs', n, ev);
760 }.bind(this));
761
731 //bind
762 //bind
732 var setv;
763 var setv;
733 if (this.settings.lhs) {
764 if (this.settings.lhs) {
@@ -745,23 +776,10 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
745 var self = this;
776 var self = this;
746 var led = self.editor[self.id+'-lhs'];
777 var led = self.editor[self.id+'-lhs'];
747 var red = self.editor[self.id+'-rhs'];
778 var red = self.editor[self.id+'-rhs'];
748
749 var yref = led.getScrollerElement().offsetHeight * 0.5; // center between >0 and 1/2
750
751 // set cursors
779 // set cursors
752 led.setCursor(Math.max(change["lhs-line-from"],0), 0); // use led.getCursor().ch ?
780 led.setCursor(Math.max(change["lhs-line-from"],0), 0); // use led.getCursor().ch ?
753 red.setCursor(Math.max(change["rhs-line-from"],0), 0);
781 red.setCursor(Math.max(change["rhs-line-from"],0), 0);
754
782 led.scrollIntoView({line: change["lhs-line-to"]});
755 // using directly CodeMirror breaks canvas alignment
756 // var ly = led.charCoords({line: Math.max(change["lhs-line-from"],0), ch: 0}, "local").top;
757
758 // calculate scroll offset for current change. Warning: returns relative y position so we scroll to 0 first.
759 led.scrollTo(null, 0);
760 red.scrollTo(null, 0);
761 self._calculate_offsets(self.id+'-lhs', self.id+'-rhs', [change]);
762 led.scrollTo(null, Math.max(change["lhs-y-start"]-yref, 0));
763 red.scrollTo(null, Math.max(change["rhs-y-start"]-yref, 0));
764 // right pane should simply follows
765 },
783 },
766
784
767 _scrolling: function(editor_name) {
785 _scrolling: function(editor_name) {
@@ -922,13 +940,11 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
922 this.trace('change', 'diff time', timer.stop());
940 this.trace('change', 'diff time', timer.stop());
923 this.changes = Mgly.DiffParser(d.normal_form());
941 this.changes = Mgly.DiffParser(d.normal_form());
924 this.trace('change', 'parse time', timer.stop());
942 this.trace('change', 'parse time', timer.stop());
925
926 if (this._current_diff === undefined && this.changes.length) {
943 if (this._current_diff === undefined && this.changes.length) {
927 // go to first difference on start-up
944 // go to first difference on start-up
928 this._current_diff = 0;
945 this._current_diff = 0;
929 this._scroll_to_change(this.changes[0]);
946 this._scroll_to_change(this.changes[0]);
930 }
947 }
931
932 this.trace('change', 'scroll_to_change time', timer.stop());
948 this.trace('change', 'scroll_to_change time', timer.stop());
933 this._calculate_offsets(editor_name1, editor_name2, this.changes);
949 this._calculate_offsets(editor_name1, editor_name2, this.changes);
934 this.trace('change', 'offsets time', timer.stop());
950 this.trace('change', 'offsets time', timer.stop());
@@ -992,7 +1008,7 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
992
1008
993 // this is the distance from the top of the screen to the top of the
1009 // this is the distance from the top of the screen to the top of the
994 // content of the first codemirror editor
1010 // content of the first codemirror editor
995 var topnode = jQuery('#' + this.id + ' .CodeMirror-measure').first();
1011 var topnode = this.element.find('.CodeMirror-measure').first();
996 var top_offset = topnode.offset().top - 4;
1012 var top_offset = topnode.offset().top - 4;
997 if(!top_offset) return false;
1013 if(!top_offset) return false;
998
1014
@@ -1121,11 +1137,12 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1121 return changes;
1137 return changes;
1122 },
1138 },
1123 _markup_changes: function (editor_name1, editor_name2, changes) {
1139 _markup_changes: function (editor_name1, editor_name2, changes) {
1124 jQuery('.merge-button').remove(); // clear
1140 this.element.find('.merge-button').remove(); //clear
1125
1141
1126 var self = this;
1142 var self = this;
1127 var led = this.editor[editor_name1];
1143 var led = this.editor[editor_name1];
1128 var red = this.editor[editor_name2];
1144 var red = this.editor[editor_name2];
1145 var current_diff = this._current_diff;
1129
1146
1130 var timer = new Mgly.Timer();
1147 var timer = new Mgly.Timer();
1131 led.operation(function() {
1148 led.operation(function() {
@@ -1140,6 +1157,12 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1140 led.addLineClass(llf, 'background', 'start');
1157 led.addLineClass(llf, 'background', 'start');
1141 led.addLineClass(llt, 'background', 'end');
1158 led.addLineClass(llt, 'background', 'end');
1142
1159
1160 if (current_diff == i) {
1161 if (llf != llt) {
1162 led.addLineClass(llf, 'background', 'current');
1163 }
1164 led.addLineClass(llt, 'background', 'current');
1165 }
1143 if (llf == 0 && llt == 0 && rlf == 0) {
1166 if (llf == 0 && llt == 0 && rlf == 0) {
1144 led.addLineClass(llf, 'background', clazz.join(' '));
1167 led.addLineClass(llf, 'background', clazz.join(' '));
1145 led.addLineClass(llf, 'background', 'first');
1168 led.addLineClass(llf, 'background', 'first');
@@ -1186,6 +1209,12 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1186 red.addLineClass(rlf, 'background', 'start');
1209 red.addLineClass(rlf, 'background', 'start');
1187 red.addLineClass(rlt, 'background', 'end');
1210 red.addLineClass(rlt, 'background', 'end');
1188
1211
1212 if (current_diff == i) {
1213 if (rlf != rlt) {
1214 red.addLineClass(rlf, 'background', 'current');
1215 }
1216 red.addLineClass(rlt, 'background', 'current');
1217 }
1189 if (rlf == 0 && rlt == 0 && llf == 0) {
1218 if (rlf == 0 && rlt == 0 && llf == 0) {
1190 red.addLineClass(rlf, 'background', clazz.join(' '));
1219 red.addLineClass(rlf, 'background', clazz.join(' '));
1191 red.addLineClass(rlf, 'background', 'first');
1220 red.addLineClass(rlf, 'background', 'first');
@@ -1286,11 +1315,12 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1286 self.chfns[self.id + '-rhs'].push(m[0].markText(m[1], m[2], m[3]));
1315 self.chfns[self.id + '-rhs'].push(m[0].markText(m[1], m[2], m[3]));
1287 }
1316 }
1288 });
1317 });
1318
1289 this.trace('change', 'LCS markup time', timer.stop());
1319 this.trace('change', 'LCS markup time', timer.stop());
1290
1320
1291 // merge buttons
1321 // merge buttons
1292 var ed = {lhs:led, rhs:red};
1322 var ed = {lhs:led, rhs:red};
1293 jQuery('.merge-button').on('click', function(ev){
1323 this.element.find('.merge-button').on('click', function(ev){
1294 // side of mouseenter
1324 // side of mouseenter
1295 var side = 'rhs';
1325 var side = 'rhs';
1296 var oside = 'lhs';
1326 var oside = 'lhs';
@@ -1314,6 +1344,35 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1314 self._merge_change(change, side, oside);
1344 self._merge_change(change, side, oside);
1315 return false;
1345 return false;
1316 });
1346 });
1347
1348 // gutter markup
1349 var lhsLineNumbers = $('#mergely-lhs ~ .CodeMirror').find('.CodeMirror-linenumber');
1350 var rhsLineNumbers = $('#mergely-rhs ~ .CodeMirror').find('.CodeMirror-linenumber');
1351 rhsLineNumbers.removeClass('mergely current');
1352 lhsLineNumbers.removeClass('mergely current');
1353 for (var i = 0; i < changes.length; ++i) {
1354 if (current_diff == i && change.op !== 'd') {
1355 var change = changes[i];
1356 var j, jf = change['rhs-line-from'], jt = change['rhs-line-to'] + 1;
1357 for (j = jf; j < jt; j++) {
1358 var n = (j + 1).toString();
1359 rhsLineNumbers
1360 .filter(function(i, node) { return $(node).text() === n; })
1361 .addClass('mergely current');
1362 }
1363 }
1364 if (current_diff == i && change.op !== 'a') {
1365 var change = changes[i];
1366 jf = change['lhs-line-from'], jt = change['lhs-line-to'] + 1;
1367 for (j = jf; j < jt; j++) {
1368 var n = (j + 1).toString();
1369 lhsLineNumbers
1370 .filter(function(i, node) { return $(node).text() === n; })
1371 .addClass('mergely current');
1372 }
1373 }
1374 }
1375
1317 this.trace('change', 'markup buttons time', timer.stop());
1376 this.trace('change', 'markup buttons time', timer.stop());
1318 },
1377 },
1319 _merge_change : function(change, side, oside) {
1378 _merge_change : function(change, side, oside) {
@@ -1373,8 +1432,8 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1373 var gutter_height = jQuery(this.editor[editor_name1].getScrollerElement()).children(':first-child').height();
1432 var gutter_height = jQuery(this.editor[editor_name1].getScrollerElement()).children(':first-child').height();
1374 var dcanvas = document.getElementById(editor_name1 + '-' + editor_name2 + '-canvas');
1433 var dcanvas = document.getElementById(editor_name1 + '-' + editor_name2 + '-canvas');
1375 if (dcanvas == undefined) throw 'Failed to find: ' + editor_name1 + '-' + editor_name2 + '-canvas';
1434 if (dcanvas == undefined) throw 'Failed to find: ' + editor_name1 + '-' + editor_name2 + '-canvas';
1376 var clhs = jQuery('#' + this.id + '-lhs-margin');
1435 var clhs = this.element.find('#' + this.id + '-lhs-margin');
1377 var crhs = jQuery('#' + this.id + '-rhs-margin');
1436 var crhs = this.element.find('#' + this.id + '-rhs-margin');
1378 return {
1437 return {
1379 visible_page_height: visible_page_height,
1438 visible_page_height: visible_page_height,
1380 gutter_height: gutter_height,
1439 gutter_height: gutter_height,
@@ -1405,7 +1464,7 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1405 this.trace('draw', 'lhs-scroller-top', ex.lhs_scroller.scrollTop());
1464 this.trace('draw', 'lhs-scroller-top', ex.lhs_scroller.scrollTop());
1406 this.trace('draw', 'rhs-scroller-top', ex.rhs_scroller.scrollTop());
1465 this.trace('draw', 'rhs-scroller-top', ex.rhs_scroller.scrollTop());
1407
1466
1408 jQuery.each(jQuery.find('#' + this.id + ' canvas'), function () {
1467 jQuery.each(this.element.find('canvas'), function () {
1409 jQuery(this).get(0).height = ex.visible_page_height;
1468 jQuery(this).get(0).height = ex.visible_page_height;
1410 });
1469 });
1411
1470
@@ -1427,6 +1486,10 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1427 var vp = this._get_viewport(editor_name1, editor_name2);
1486 var vp = this._get_viewport(editor_name1, editor_name2);
1428 for (var i = 0; i < changes.length; ++i) {
1487 for (var i = 0; i < changes.length; ++i) {
1429 var change = changes[i];
1488 var change = changes[i];
1489 var fill = this.settings.fgcolor[change['op']];
1490 if (this._current_diff==i) {
1491 fill = '#000';
1492 }
1430
1493
1431 this.trace('draw', change);
1494 this.trace('draw', change);
1432 // margin indicators
1495 // margin indicators
@@ -1437,14 +1500,14 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1437 this.trace('draw', 'marker calculated', lhs_y_start, lhs_y_end, rhs_y_start, rhs_y_end);
1500 this.trace('draw', 'marker calculated', lhs_y_start, lhs_y_end, rhs_y_start, rhs_y_end);
1438
1501
1439 ctx_lhs.beginPath();
1502 ctx_lhs.beginPath();
1440 ctx_lhs.fillStyle = this.settings.fgcolor[(this._current_diff==i?'c':'')+change['op']];
1503 ctx_lhs.fillStyle = fill;
1441 ctx_lhs.strokeStyle = '#000';
1504 ctx_lhs.strokeStyle = '#000';
1442 ctx_lhs.lineWidth = 0.5;
1505 ctx_lhs.lineWidth = 0.5;
1443 ctx_lhs.fillRect(1.5, lhs_y_start, 4.5, Math.max(lhs_y_end - lhs_y_start, 5));
1506 ctx_lhs.fillRect(1.5, lhs_y_start, 4.5, Math.max(lhs_y_end - lhs_y_start, 5));
1444 ctx_lhs.strokeRect(1.5, lhs_y_start, 4.5, Math.max(lhs_y_end - lhs_y_start, 5));
1507 ctx_lhs.strokeRect(1.5, lhs_y_start, 4.5, Math.max(lhs_y_end - lhs_y_start, 5));
1445
1508
1446 ctx_rhs.beginPath();
1509 ctx_rhs.beginPath();
1447 ctx_rhs.fillStyle = this.settings.fgcolor[(this._current_diff==i?'c':'')+change['op']];
1510 ctx_rhs.fillStyle = fill;
1448 ctx_rhs.strokeStyle = '#000';
1511 ctx_rhs.strokeStyle = '#000';
1449 ctx_rhs.lineWidth = 0.5;
1512 ctx_rhs.lineWidth = 0.5;
1450 ctx_rhs.fillRect(1.5, rhs_y_start, 4.5, Math.max(rhs_y_end - rhs_y_start, 5));
1513 ctx_rhs.fillRect(1.5, rhs_y_start, 4.5, Math.max(rhs_y_end - rhs_y_start, 5));
@@ -1463,7 +1526,7 b' jQuery.extend(Mgly.CodeMirrorDiffView.pr'
1463
1526
1464 // draw left box
1527 // draw left box
1465 ctx.beginPath();
1528 ctx.beginPath();
1466 ctx.strokeStyle = this.settings.fgcolor[(this._current_diff==i?'c':'')+change['op']];
1529 ctx.strokeStyle = fill;
1467 ctx.lineWidth = (this._current_diff==i) ? 1.5 : 1;
1530 ctx.lineWidth = (this._current_diff==i) ? 1.5 : 1;
1468
1531
1469 var rectWidth = this.draw_lhs_width;
1532 var rectWidth = this.draw_lhs_width;
General Comments 0
You need to be logged in to leave comments. Login now