1
0
mirror of synced 2025-12-14 10:28:11 +08:00

Compare commits

..

3 Commits

Author SHA1 Message Date
Jamie Peabody
37fedd05c8 v5.0 (#174)
* feat: v5

BREAKING CHANGE: Mergely is no longer a jQuery plugin.

BREAKING CHANGE: Removed `options.autoresize`

BREAKING CHANGE: Removed `options.editor_width`

BREAKING CHANGE: Removed `options.editor_height`

BREAKING CHANGE: Removed `options.fadein`

BREAKING CHANGE: Removed `options.fgcolor`

BREAKING CHANGE: Removed `options.resize`

BREAKING CHANGE: Removed `options.width`

BREAKING CHANGE: Removed `options.height`

BREAKING CHANGE: Removed `options.loaded` callback

BREAKING CHANGE: Removed `options.resized` callback

BREAKING CHANGE: Removed styles `.mergely-resizer`, `.mergely-full-screen-0`, and `.mergely-full-screen-8`

BREAKING CHANGE: Changed default for `options.change_timeout` changed from `150` to `50`.

BREAKING CHANGE: No longer automatically scrolls to first change.

feat: CodeMirror is now an explicit dependency.

feat: No longer necessary to separately require codemirror/addon/search/searchcursor

feat: No longer necessary to separately require codemirror/addon/selection/mark-selection

feat: `mergely.js` is now unminimized, and added new minimized version `mergely.min.js`

feat: Gutter click now scrolls to any line

feat: Mergely now emits `resize` event on resize

feat: The UI is now non-blocking as diff now runs in background

feat: Added support to provide `options.lhs` and `options.rhs` as strings

feat: #16 added titles to editor.mergely.com

fix: #165 block of changes at end of file are now distinguishable

fix: #140 fixed performance issue with large files

fix: Fixed issue where canvas markup was not rendered when `viewport` enabled

fix: Fixed timing issue where swap sides may not work as expected.

fix: Fixed issue where unmarkup did not emit an updated event.

fix: Fixed documentation issue where `merge` incorrectly stated: from the specified `side` to the opposite side.

fix: Fixed performance issue scrolling

fix: Fixed issue where initial render scrolled to first change, showing it at the bottom (as opposed to middle as expected)

fix: Fixed issue where line-diffs failed to diff non-alphanumeric characters

* chore: tweaked no-start/end styles

* feat: dark mode

* chore: updated examples

* chore(ci): updated webpack

* chore(ci): alpha, beta, next branches

* chore(ci): test

* chore(ci): package-lock.json

* chore(ci): ignore alpha, beta, next on branch

* fix: fixes firefox scroll-linked effect issue

* fix: fixes firefox scroll-linked effect issue

* chore: fix css

* chore: debug
2023-04-23 16:29:59 +01:00
Jamie Peabody
f3e90b7588 chore(release): 4.3.9 2022-01-19 21:49:12 +00:00
Jamie Peabody
650daaff63 fix(#161): Fixed issue with options.ignorews (#162) 2022-01-19 21:46:43 +00:00
8 changed files with 50 additions and 29 deletions

View File

@@ -3,7 +3,10 @@ name: Run tests (branch)
on: on:
push: push:
branches-ignore: branches-ignore:
- 'master' - master
- alpha
- beta
- next
tags-ignore: tags-ignore:
- 'v*' - 'v*'

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "mergely", "name": "mergely",
"version": "5.0.0-rc0", "version": "5.0.0-alpha.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "mergely", "name": "mergely",
"version": "5.0.0-rc0", "version": "5.0.0-alpha.2",
"license": "(GPL-3.0 OR LGPL-3.0 OR MPL-1.1 OR SEE LICENSE IN LICENSE)", "license": "(GPL-3.0 OR LGPL-3.0 OR MPL-1.1 OR SEE LICENSE IN LICENSE)",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.1.6", "@babel/core": "^7.1.6",

View File

@@ -1,6 +1,6 @@
{ {
"name": "mergely", "name": "mergely",
"version": "5.0.0-rc0", "version": "5.0.0-alpha.2",
"description": "A javascript UI for diff/merge", "description": "A javascript UI for diff/merge",
"license": "(GPL-3.0 OR LGPL-3.0 OR MPL-1.1 OR SEE LICENSE IN LICENSE)", "license": "(GPL-3.0 OR LGPL-3.0 OR MPL-1.1 OR SEE LICENSE IN LICENSE)",
"author": { "author": {

View File

@@ -44,7 +44,7 @@ CodeMirrorDiffView.prototype.init = function(el, options = {}) {
lineNumbers: this.settings.line_numbers, lineNumbers: this.settings.line_numbers,
gutters: (this.settings.line_numbers && [ 'merge', 'CodeMirror-linenumbers' ]) || [], gutters: (this.settings.line_numbers && [ 'merge', 'CodeMirror-linenumbers' ]) || [],
}; };
this._vdoc = new VDoc(); this._vdoc = new VDoc({ _debug: this.settings._debug });
}; };
CodeMirrorDiffView.prototype.unbind = function() { CodeMirrorDiffView.prototype.unbind = function() {
@@ -290,11 +290,6 @@ CodeMirrorDiffView.prototype.bind = function(container) {
className: container.className className: container.className
}; };
const el = dom.getMergelyContainer({ clazz: container.className }); const el = dom.getMergelyContainer({ clazz: container.className });
// const found = document.getElementById(container.id);
// if (!found) {
// console.error(`Failed to find mergely: #${container.id}`);
// return;
// }
const computedStyle = window.getComputedStyle(container); const computedStyle = window.getComputedStyle(container);
if (!computedStyle.height || computedStyle.height === '0px') { if (!computedStyle.height || computedStyle.height === '0px') {
throw new Error( throw new Error(
@@ -440,7 +435,10 @@ CodeMirrorDiffView.prototype.bind = function(container) {
trace('event#lhs-scroll'); trace('event#lhs-scroll');
} }
} }
this._scrolling({ side: 'lhs' }); // firefox scroll-linked effect render issue
setTimeout(() => {
this._scrolling({ side: 'lhs' });
}, 1);
}); });
this.editor.rhs.on('change', (instance, ev) => { this.editor.rhs.on('change', (instance, ev) => {
if (this.settings._debug) { if (this.settings._debug) {
@@ -459,7 +457,10 @@ CodeMirrorDiffView.prototype.bind = function(container) {
trace('event#rhs-scroll'); trace('event#rhs-scroll');
} }
} }
this._scrolling({ side: 'rhs' }); // firefox scroll-linked effect render issue
setTimeout(() => {
this._scrolling({ side: 'rhs' });
}, 1);
}); });
// resize event handeler // resize event handeler
@@ -560,7 +561,7 @@ CodeMirrorDiffView.prototype._clearMarkup = function () {
traceTimeStart('draw#_clearMarkup'); traceTimeStart('draw#_clearMarkup');
} }
this._vdoc.clear(); this._vdoc.clear();
this._vdoc = new VDoc(); this._vdoc = new VDoc({ _debug: this.settings._debug });
if (this.settings._debug) { if (this.settings._debug) {
traceTimeEnd('draw#_clearMarkup'); traceTimeEnd('draw#_clearMarkup');
} }
@@ -634,7 +635,10 @@ CodeMirrorDiffView.prototype._scrolling = function({ side }) {
const scroller = this.editor[side].getScrollerElement(); const scroller = this.editor[side].getScrollerElement();
const { top } = scroller.getBoundingClientRect(); const { top } = scroller.getBoundingClientRect();
let height; let height;
if (true || this.midway == undefined) { if (scroller.offsetParent === null) {
return;
}
if (this.midway == undefined) {
height = scroller.clientHeight height = scroller.clientHeight
- (scroller.offsetHeight - scroller.offsetParent.offsetHeight); - (scroller.offsetHeight - scroller.offsetParent.offsetHeight);
this.midway = (height / 2.0 + top).toFixed(2); this.midway = (height / 2.0 + top).toFixed(2);
@@ -991,14 +995,10 @@ CodeMirrorDiffView.prototype._markupLineChanges = function (changes) {
} }
} }
led.operation(() => { led.operation(() => {
for (let i = 0; i < changes.length; ++i) { vdoc.update('lhs', led, lhsvp);
vdoc.update('lhs', i, led, lhsvp);
}
}); });
red.operation(() => { red.operation(() => {
for (let i = 0; i < changes.length; ++i) { vdoc.update('rhs', red, rhsvp);
vdoc.update('rhs', i, red, rhsvp);
}
}); });
if (this.settings._debug) { if (this.settings._debug) {
traceTimeEnd('draw#_markupLineChanges'); traceTimeEnd('draw#_markupLineChanges');

View File

@@ -67,7 +67,7 @@ function getColors(el) {
function getMergelyContainer({ clazz = '' }) { function getMergelyContainer({ clazz = '' }) {
const classes = [ 'mergely-editor', clazz ] const classes = [ 'mergely-editor', clazz ]
return htmlToElement(`\ return htmlToElement(`\
<div class="${classes.join(' ')}" style="display:flex;height:100%;position:relative;"></div>`); <div class="${classes.join(' ')}" style="display:flex;height:100%;position:relative;overflow:hidden;"></div>`);
} }
function getMarginTemplate({ id }) { function getMarginTemplate({ id }) {

View File

@@ -17,7 +17,7 @@
} }
.mergely-editor .CodeMirror-selected { .mergely-editor .CodeMirror-selected {
background: #ffcb0f; background: #0f73ff47;
} }
.mergely-splash { .mergely-splash {
@@ -52,8 +52,6 @@
.mergely-editor .merge-button { .mergely-editor .merge-button {
height: 18px; height: 18px;
cursor: pointer; cursor: pointer;
width: 26px;
padding-left: 3px;
} }
/* common stles */ /* common stles */

View File

@@ -114,7 +114,7 @@ class Mergely {
_setOptions(options) { _setOptions(options) {
if (this._options && this._options._debug) { if (this._options && this._options._debug) {
trace('api#options', opts); trace('api#options');
} }
const colors = dom.getColors(this.el); const colors = dom.getColors(this.el);
this._options = { this._options = {
@@ -186,7 +186,7 @@ class Mergely {
diff() { diff() {
if (this._options._debug) { if (this._options._debug) {
trace('api#diff', side); trace('api#diff');
} }
const lhs_text = this.get('lhs'); const lhs_text = this.get('lhs');
const rhs_text = this.get('rhs'); const rhs_text = this.get('rhs');

View File

@@ -1,7 +1,10 @@
const diff = require('./diff'); const diff = require('./diff');
const trace = console.log;
class VDoc { class VDoc {
constructor() { constructor(options) {
this.options = options;
this._lines = { this._lines = {
lhs: {}, lhs: {},
rhs: {} rhs: {}
@@ -13,6 +16,9 @@ class VDoc {
} }
addRender(side, change, changeId, options) { addRender(side, change, changeId, options) {
if (this.options._debug) {
trace('vdoc#addRender', side, changeId, change);
}
const { const {
isCurrent, isCurrent,
lineDiff, lineDiff,
@@ -23,6 +29,9 @@ class VDoc {
const alreadyRendered = !!this._rendered[side][changeId]; const alreadyRendered = !!this._rendered[side][changeId];
if (alreadyRendered) { if (alreadyRendered) {
if (this.options._debug) {
trace('vdoc#addRender (already rendered)', side, changeId, change);
}
return; return;
} }
@@ -116,6 +125,9 @@ class VDoc {
} }
addInlineDiff(change, changeId, { getText, ignorews, ignoreaccents, ignorecase }) { addInlineDiff(change, changeId, { getText, ignorews, ignoreaccents, ignorecase }) {
if (this.options._debug) {
trace('vdoc#addInlineDiff', changeId, change);
}
const { lf, lt, olf, olt } = getExtents('lhs', change); const { lf, lt, olf, olt } = getExtents('lhs', change);
const vdoc = this; const vdoc = this;
@@ -169,6 +181,9 @@ class VDoc {
} }
_setRenderedChange(side, changeId) { _setRenderedChange(side, changeId) {
if (this.options._debug) {
trace('vdoc#_setRenderedChange', side, changeId);
}
return this._rendered[side][changeId] = true; return this._rendered[side][changeId] = true;
} }
@@ -182,8 +197,10 @@ class VDoc {
return line; return line;
} }
update(side, changeId, editor, viewport) { update(side, editor, viewport) {
this._setRenderedChange(side, changeId); if (this.options._debug) {
trace('vdoc#update', side, editor, viewport);
}
const lines = Object.keys(this._lines[side]); const lines = Object.keys(this._lines[side]);
for (let i = 0; i < lines.length; ++i) { for (let i = 0; i < lines.length; ++i) {
const id = lines[i]; const id = lines[i];
@@ -200,6 +217,9 @@ class VDoc {
} }
clear() { clear() {
if (this.options._debug) {
trace('vdoc#clear');
}
for (const lineId in this._lines.lhs) { for (const lineId in this._lines.lhs) {
this._lines.lhs[lineId].clear(); this._lines.lhs[lineId].clear();
} }