1
0
mirror of synced 2025-12-08 15:04:16 +08:00

Compare commits

...

17 Commits

Author SHA1 Message Date
Jamie Peabody
94bee71aea chore(release): 4.3.6 2021-11-21 13:08:27 +00:00
Jamie Peabody
08e7b9735a ci: update tag latest 2021-11-21 13:06:51 +00:00
Jamie Peabody
26cb3f7220 ci: update tag latest 2021-11-21 13:01:09 +00:00
Jamie Peabody
97dc439cd4 ci: use token 2021-11-21 12:56:32 +00:00
Jamie Peabody
51189f2155 ci: use token 2021-11-21 12:52:50 +00:00
Jamie Peabody
c8e0b8e88a ci: use token 2021-11-21 12:43:01 +00:00
Jamie Peabody
7732f9fab5 ci: update publish CI 2021-11-21 12:29:39 +00:00
Jamie Peabody
e1763b3b9d ci: update publish CI 2021-11-21 12:27:48 +00:00
Jamie Peabody
0de9e87df8 ci: added standard-version 2021-11-21 12:22:50 +00:00
Jamie Peabody
aa4d934cdd chore: removed bower.json 2021-11-21 12:21:11 +00:00
Jamie Peabody
a92b408ce5 chore(ci): added git-conventional-commits 2021-11-21 11:00:15 +00:00
Jamie Peabody
ca1df3e4d4 chore(docs): added contributing.md 2021-11-21 10:59:43 +00:00
Jamie Peabody
addc610457 chore(ci): added workflows 2021-11-21 10:59:22 +00:00
Jamie Peabody
623a93b838 fix build 2021-10-03 16:56:35 +01:00
Jamie Peabody
615e1afd97 patch(#139): fixes inline diff rendering issue with whitespace (#158)
Co-authored-by: Jamie Peabody <jpeabody@axway.com>
2021-10-03 16:49:44 +01:00
Jamie Peabody
b9bc901dd2 patch(#152): fixes resize issue when using zoom 2021-10-02 14:19:15 +01:00
Jamie Peabody
b49c9ce40f Updated README.md
Fixed tgz installation instructions.
2021-09-30 08:05:07 +01:00
15 changed files with 355 additions and 73 deletions

3
.git-hooks/commit-msg Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/sh
npx git-conventional-commits commit-msg-hook "$1"

48
.github/workflows/npm-publish.yaml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: Publish to npm
on:
workflow_dispatch:
inputs:
tag:
description: 'NPM Tag'
required: false
default: 'next'
jobs:
tag-and-publish:
runs-on: ubuntu-latest
steps:
- name: Setup node
uses: actions/setup-node@v1
with:
node-version: 14
registry-url: https://registry.npmjs.org
- name: Git checkout
uses: actions/checkout@v2
- name: Install dependencies
run: npm install
env:
CI: true
- name: Test
run: npm run test
- name: Build
run: npm run build:dist
- name: Release
uses: oleksiyrudenko/gha-git-credentials@v2.1
with:
token: '${{ secrets.CI_TOKEN }}'
name: 'Jamie Peabody'
email: 'jamie.peabody@gmail.com'
- run: npm run release
- run: git push --follow-tags origin master
- name: Publish
run: npm publish --access public --tag ${{ github.event.inputs.tag }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

34
.github/workflows/npm-release.yaml vendored Normal file
View File

@@ -0,0 +1,34 @@
name: Release latest on npm
on:
workflow_dispatch:
inputs:
jobs:
tag-and-publish:
runs-on: ubuntu-latest
steps:
- name: Setup node
uses: actions/setup-node@v1
with:
node-version: 10
registry-url: https://registry.npmjs.org
- name: Git checkout
uses: actions/checkout@v2
- name: Get package version
run: |
export VERSION=`cat package.json | grep '"version"' | sed -E 's/\s+"version": "(.*)",/\1/'`
echo "PKG_VERSION=$VERSION" >> $GITHUB_ENV
- name: Update dist-tag
run: npm dist-tag add mergely@${PKG_VERSION} latest
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Remove 'next' dist-tag
run: npm dist-tag rm mergely next
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

41
.github/workflows/run-tests.yaml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Run tests
# on: [push, pull_request]
on:
push:
branches-ignore:
- 'master'
tags-ignore:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x] #, 12.x, 14.x, 15.x
name: Node.js ${{ matrix.node-version }}
steps:
- name: Git checkout
uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm install
env:
CI: true
- name: Test
run: npm run test
- name: Build
run: npm run build:dist

46
.versionrc Normal file
View File

@@ -0,0 +1,46 @@
{
"types": [
{
"type": "feat",
"section": "Features"
},
{
"type": "fix",
"section": "Bug Fixes"
},
{
"type": "chore",
"section": "General",
"hidden": false
},
{
"type": "style",
"section": "General",
"hidden": false
},
{
"type": "refactor",
"section": "General",
"hidden": false
},
{
"type": "perf",
"section": "General",
"hidden": false
},
{
"type": "test",
"section": "General",
"hidden": false
},
{
"type": "docs",
"section": "Documentation",
"hidden": false
},
{
"type": "ci",
"hidden": true
}
]
}

18
CHANGELOG.md Normal file
View File

@@ -0,0 +1,18 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### 4.3.6 (2021-11-21)
### [4.3.5](https://github.com/wickedest/Mergely/compare/v4.0.13...v4.3.5) (2021-11-21)
### Features
* **#132:** added option to ignore accented characters ([#136](https://github.com/wickedest/Mergely/issues/136)) ([5a0cd15](https://github.com/wickedest/Mergely/commit/5a0cd15ddd54fdd60b42247e6f373a6a8e47d25d)), closes [#132](https://github.com/wickedest/Mergely/issues/132) [#132](https://github.com/wickedest/Mergely/issues/132)
* **#137:** added 'summary' method ([4610ed3](https://github.com/wickedest/Mergely/commit/4610ed353557300e45d98e31cf384bc996dbac58)), closes [#137](https://github.com/wickedest/Mergely/issues/137)
### General
* updated dependencies ([85b02ad](https://github.com/wickedest/Mergely/commit/85b02add899b90e4d6ced4474cfdee98838d272a))

View File

@@ -1,5 +1,14 @@
# Changes
## 4.3.5
* patch: fixed issue with build
## 4.3.4
* patch: Fixes inline diff rendering issue with whitespace [#139](https://github.com/wickedest/Mergely/issues/139).
## 4.3.3
* patch: Fixes resize issue when using zoom [#152](https://github.com/wickedest/Mergely/issues/152).
## 4.3.2
* patch: Reset the current change position when [setValue](https://mergely.com/doc##options_callbacks), [clear](https://mergely.com/doc#clear), [lhs](https://mergely.com/doc#lhs) or [rhs](https://mergely.com/doc#rhs) are called.

11
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,11 @@
# Contributing to Mergely
## Testing
```bash
npm run test
```
## Conventional commits
Mergely is using [conventional commits](https://www.conventionalcommits.org/en/v1.0.0).

View File

@@ -25,8 +25,8 @@ Unpack mergely.tgz into a folder, for example, `./lib`, and add the following to
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/codemirror.min.js"></script>
<link rel="stylesheet" media="all" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/codemirror.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/addon/search/searchcursor.min.js"></script>
<script src="lib/mergely/lib/mergely.js" type="text/javascript"></script>
<link rel="stylesheet" media="all" href="lib/mergely/lib/mergely.css" />
<script src="package/lib/mergely.js" type="text/javascript"></script>
<link rel="stylesheet" media="all" href="package/lib/mergely.css" />
```
Create a div for the editor in `<body>`.

View File

@@ -1,36 +0,0 @@
{
"name": "Mergely",
"version": "4.0.0",
"homepage": "https://github.com/wickedest/Mergely",
"description": "Merge and diff documents online",
"main": [
"lib/mergely.js",
"lib/mergely.css"
],
"keywords": [
"merge",
"diff"
],
"ignore": [
"LICENSE.html",
"README.md",
"doc",
"editor",
"examples",
"test"
],
"license": [
"GPL",
"LGPL",
"MPL"
],
"repository": {
"type": "git",
"url": "git://github.com/wickedest/Mergely"
},
"dependencies": {
"mergely": "https://github.com/wickedest/Mergely.git#3.4.3",
"jquery": "<=2.1.3",
"codemirror": "<=5.11.0"
}
}

1
commitlint.config.js Normal file
View File

@@ -0,0 +1 @@
module.exports = {extends: ['@commitlint/config-conventional']};

View File

@@ -2,18 +2,29 @@ require('codemirror/addon/selection/mark-selection.js');
require('codemirror/lib/codemirror.css');
require('../src/mergely.css');
var lhs = `\
the quick red fox
jumped over the hairy dog
`;
var rhs = `\
the quick brown fox
jumped over the lazy dog
`;
$(document).ready(function () {
$('#mergely').mergely({
license: 'lgpl',
ignorews: true,
cmsettings: {
readOnly: false
},
_debug: '',
lhs: function(setValue) {
setValue('the quick red fox\njumped over the hairy dog');
setValue(lhs);
},
rhs: function(setValue) {
setValue('the quick brown fox\njumped over the lazy dog');
setValue(rhs);
}
});
});

View File

@@ -0,0 +1,38 @@
{
"convention" : {
"commitTypes": [
"build",
"chore",
"ci",
"docs",
"style",
"refactor",
"perf",
"test"
],
"commitScopes": [],
"releaseTagGlobPattern": "v[0-9].*",
"issueRegexPattern": "(^|\\s)#\\d+(\\s|$)"
},
"changelog" : {
"commitTypes": [
"feat",
"fix",
"perf",
"merge"
],
"commitIgnoreRegexPattern": "^WIP ",
"headlines": {
"feat": "Features",
"fix": "Bug Fixes",
"perf": "Performance Improvements",
"merge": "Merged Branches",
"breakingChange": "BREAKING CHANGES"
},
"commitUrl": "https://github.com/wickedest/Mergely/commit/%commit%",
"commitRangeUrl": "https://github.com/wickedest/Mergely/compare/%from%...%to%?diff=split",
"issueUrl": "https://github.com/wickedest/Mergely/issues/%issue%"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "mergely",
"version": "4.3.2",
"version": "4.3.6",
"description": "A javascript UI for diff/merge",
"directories": {
"doc": "doc",
@@ -36,6 +36,8 @@
"devDependencies": {
"@babel/core": "^7.1.6",
"@babel/preset-env": "^7.1.6",
"@commitlint/config-conventional": "^15.0.0",
"@commitlint/prompt-cli": "^15.0.0",
"@webpack-cli/init": "^1.0.1",
"babel-loader": "^8.0.4",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
@@ -44,6 +46,7 @@
"copy-webpack-plugin": "^6.2.1",
"css-loader": "^5.0.0",
"file-loader": "^6.1.1",
"git-conventional-commits": "^1.1.0",
"html-webpack-plugin": "^4.5.0",
"image-webpack-loader": "^7.0.1",
"jquery": "^3.5.1",
@@ -55,15 +58,18 @@
"karma-mocha-reporter": "^2.2.5",
"karma-webpack": "^4.0.2",
"mocha": "^8.1.3",
"standard-version": "^9.3.2",
"style-loader": "^2.0.0",
"webpack": "^4.44.2",
"webpack-cli": "^4.0.0",
"webpack-dev-server": "^3.11.0"
},
"scripts": {
"build": "rm -rf lib && webpack --config ./webpack.prod.js",
"build": "npm run test && npm run build:dist",
"build:dist": "rm -rf lib && webpack --config ./webpack.prod.js",
"start": "webpack serve --config webpack.dev.js",
"test": "karma start",
"test:chrome": "karma start --browsers Chrome --singleRun=false"
"test:chrome": "karma start --browsers Chrome --singleRun=false",
"release": "standard-version -a"
}
}

View File

@@ -42,45 +42,85 @@ Mgly.sizeOf = function(obj) {
};
Mgly.LCS = function(x, y, options) {
this.x = (x && x.replace(/[ ]{1}/g, '\n')) || '';
this.y = (y && y.replace(/[ ]{1}/g, '\n')) || '';
function getPositionOfWords(text, options) {
var exp = new RegExp(/\w+/g);
var map = {};
var match;
var item = 0;
var p0 = 0;
var p1;
var ws0;
while ((match = exp.exec(text))) {
// if previous ws, then calculate whether not not this should be
// included as part of the diff
if (!options.ignorews && ws0 && ws0 <= match.index - 1) {
map[ item++ ] = {
p0: ws0,
p1: match.index - 1,
ws0,
word: text.slice(ws0, match.index)
};
}
// add the words to be matched in diff
p0 = match.index;
p1 = p0 + match[0].length - 1;
ws0 = p1 + 2;
map[ item++ ] = {
p0,
p1,
ws0,
word: text.slice(p0, p1 + 1)
};
}
return map;
}
this.options = options;
if (options.ignorews) {
this.xmap = getPositionOfWords(x, this.options);
this.ymap = getPositionOfWords(y, this.options);
var xmap = this.xmap;
this.x = Object.keys(xmap).map(function (i) { return xmap[i].word; });
var ymap = this.ymap;
this.y = Object.keys(ymap).map(function (i) { return ymap[i].word; });
} else {
this.x = x.split('');
this.y = y.split('');
}
};
jQuery.extend(Mgly.LCS.prototype, {
clear: function() { this.ready = 0; },
diff: function(added, removed) {
var d = new Mgly.diff(this.x, this.y, {
ignorews: false,
ignorews: !!this.options.ignorews,
ignoreaccents: !!this.options.ignoreaccents
});
var changes = Mgly.DiffParser(d.normal_form());
var li = 0, lj = 0;
for (var i = 0; i < changes.length; ++i) {
var change = changes[i];
if (change.op != 'a') {
// find the starting index of the line
li = d.getLines('lhs').slice(0, change['lhs-line-from']).join(' ').length;
// get the index of the the span of the change
lj = change['lhs-line-to'] + 1;
// get the changed text
var lchange = d.getLines('lhs').slice(change['lhs-line-from'], lj).join(' ');
if (change.op == 'd') lchange += ' ';// include the leading space
else if (li > 0 && change.op == 'c') li += 1; // ignore leading space if not first word
// output the changed index and text
removed(li, li + lchange.length);
}
if (change.op != 'd') {
// find the starting index of the line
li = d.getLines('rhs').slice(0, change['rhs-line-from']).join(' ').length;
// get the index of the the span of the change
lj = change['rhs-line-to'] + 1;
// get the changed text
var rchange = d.getLines('rhs').slice(change['rhs-line-from'], lj).join(' ');
if (change.op == 'a') rchange += ' ';// include the leading space
else if (li > 0 && change.op == 'c') li += 1; // ignore leading space if not first word
// output the changed index and text
added(li, li + rchange.length);
if (this.options.ignorews) {
if (change.op != 'a') {
var from = this.xmap[change['lhs-line-from']].p0;
var to = this.xmap[change['lhs-line-to']].p1 + 1;
removed(from, to);
}
if (change.op !== 'd') {
var from = this.ymap[change['rhs-line-from']].p0;
var to = this.ymap[change['rhs-line-to']].p1 + 1;
added(from, to);
}
} else {
if (change.op != 'a') {
var from = change['lhs-line-from'];
var to = change['lhs-line-to'] + 1;
removed(from, to);
}
if (change.op !== 'd') {
var from = change['rhs-line-from'];
var to = change['rhs-line-to'] + 1;
added(from, to);
}
}
}
}
@@ -91,8 +131,16 @@ Mgly.CodeifyText = function(settings) {
this._diff_codes = {};
this.ctxs = {};
jQuery.extend(this, settings);
this.lhs = settings.lhs.split('\n');
this.rhs = settings.rhs.split('\n');
if (typeof settings.lhs === 'string') {
this.lhs = settings.lhs.split('\n');
} else {
this.lhs = settings.lhs;
}
if (typeof settings.rhs === 'string') {
this.rhs = settings.rhs.split('\n');
} else {
this.rhs = settings.rhs;
}
};
jQuery.extend(Mgly.CodeifyText.prototype, {
@@ -663,6 +711,8 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
}
},
resize: function() {
// recalculate line height as it may be zoomed
this.em_height = null;
this.settings.resize();
this._changing(this.id + '-lhs', this.id + '-rhs');
this._set_top_offset(this.id + '-lhs');
@@ -824,6 +874,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
var sz_timeout1 = null;
var sz = function(init) {
if (self.settings.resize) self.settings.resize(init);
self.resize();
self.editor[self.id + '-lhs'].refresh();
self.editor[self.id + '-rhs'].refresh();
};
@@ -1428,7 +1479,8 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
lhs_line = led.getLine( j );
rhs_line = red.getLine( k );
var lcs = new Mgly.LCS(lhs_line, rhs_line, {
ignoreaccents: !!this.settings.ignoreaccents
ignoreaccents: !!this.settings.ignoreaccents,
ignorews: !!this.settings.ignorews
});
lcs.diff(
function added (from, to) {