@larsgw/formica 0.1.0
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.
- package/.eslintrc.js +16 -0
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/lib/bin/process-resources-index.d.ts +1 -0
- package/lib/bin/process-resources-index.js +142 -0
- package/lib/bin/process-resources.d.ts +1 -0
- package/lib/bin/process-resources.js +594 -0
- package/lib/bin/util.d.ts +16 -0
- package/lib/bin/util.js +125 -0
- package/lib/bin/validate-catalog.d.ts +2 -0
- package/lib/bin/validate-catalog.js +92 -0
- package/lib/bin/validate-resources-text.d.ts +2 -0
- package/lib/bin/validate-resources-text.js +78 -0
- package/lib/catalog/entities.d.ts +12 -0
- package/lib/catalog/entities.js +111 -0
- package/lib/catalog/entity.d.ts +13 -0
- package/lib/catalog/entity.js +103 -0
- package/lib/catalog/index.d.ts +4 -0
- package/lib/catalog/index.js +33 -0
- package/lib/catalog/tables/author.d.ts +4 -0
- package/lib/catalog/tables/author.js +33 -0
- package/lib/catalog/tables/index.d.ts +2 -0
- package/lib/catalog/tables/index.js +13 -0
- package/lib/catalog/tables/place.d.ts +4 -0
- package/lib/catalog/tables/place.js +32 -0
- package/lib/catalog/tables/publisher.d.ts +4 -0
- package/lib/catalog/tables/publisher.js +33 -0
- package/lib/catalog/tables/work.d.ts +5 -0
- package/lib/catalog/tables/work.js +82 -0
- package/lib/catalog/value.d.ts +19 -0
- package/lib/catalog/value.js +49 -0
- package/lib/csv.d.ts +2 -0
- package/lib/csv.js +37 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +6 -0
- package/lib/resources/diff-resource.d.ts +7 -0
- package/lib/resources/diff-resource.js +152 -0
- package/lib/resources/index.d.ts +1 -0
- package/lib/resources/index.js +6 -0
- package/lib/resources/parse-text.d.ts +2 -0
- package/lib/resources/parse-text.js +499 -0
- package/lib/types.d.ts +62 -0
- package/lib/types.js +0 -0
- package/package.json +42 -0
- package/src/bin/process-resources-index.ts +73 -0
- package/src/bin/process-resources.ts +406 -0
- package/src/bin/util.ts +74 -0
- package/src/bin/validate-catalog.ts +37 -0
- package/src/bin/validate-resources-text.ts +25 -0
- package/src/catalog/entities.ts +62 -0
- package/src/catalog/entity.ts +113 -0
- package/src/catalog/index.ts +32 -0
- package/src/catalog/tables/author.ts +13 -0
- package/src/catalog/tables/index.ts +12 -0
- package/src/catalog/tables/place.ts +12 -0
- package/src/catalog/tables/publisher.ts +13 -0
- package/src/catalog/tables/work.ts +62 -0
- package/src/catalog/value.ts +48 -0
- package/src/csv.ts +33 -0
- package/src/index.ts +3 -0
- package/src/module.d.ts +105 -0
- package/src/resources/diff-resource.ts +155 -0
- package/src/resources/index.ts +4 -0
- package/src/resources/parse-text.ts +519 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.Place = void 0;
|
|
19
|
+
var value_1 = require("../value");
|
|
20
|
+
var entity_1 = require("../entity");
|
|
21
|
+
var Place = /** @class */ (function (_super) {
|
|
22
|
+
__extends(Place, _super);
|
|
23
|
+
function Place(values) {
|
|
24
|
+
return _super.call(this, values, {
|
|
25
|
+
name: { required: true, multiple: false },
|
|
26
|
+
qid: { required: false, multiple: false, format: value_1.FORMATS.QID },
|
|
27
|
+
display_name: { required: false, multiple: false }
|
|
28
|
+
}) || this;
|
|
29
|
+
}
|
|
30
|
+
return Place;
|
|
31
|
+
}(entity_1.Entity));
|
|
32
|
+
exports.Place = Place;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.Publisher = void 0;
|
|
19
|
+
var value_1 = require("../value");
|
|
20
|
+
var entity_1 = require("../entity");
|
|
21
|
+
var Publisher = /** @class */ (function (_super) {
|
|
22
|
+
__extends(Publisher, _super);
|
|
23
|
+
function Publisher(values) {
|
|
24
|
+
return _super.call(this, values, {
|
|
25
|
+
name: { required: true, multiple: false },
|
|
26
|
+
qid: { required: false, multiple: false, format: value_1.FORMATS.QID },
|
|
27
|
+
full_name: { required: false, multiple: false },
|
|
28
|
+
long_name: { required: false, multiple: true }
|
|
29
|
+
}) || this;
|
|
30
|
+
}
|
|
31
|
+
return Publisher;
|
|
32
|
+
}(entity_1.Entity));
|
|
33
|
+
exports.Publisher = Publisher;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.Work = void 0;
|
|
19
|
+
var value_1 = require("../value");
|
|
20
|
+
var entity_1 = require("../entity");
|
|
21
|
+
var Work = /** @class */ (function (_super) {
|
|
22
|
+
__extends(Work, _super);
|
|
23
|
+
function Work(values) {
|
|
24
|
+
return _super.call(this, values, {
|
|
25
|
+
id: { required: true, multiple: false, format: value_1.FORMATS.ID },
|
|
26
|
+
title: { required: true, multiple: value_1.CHECK.MULTILANG },
|
|
27
|
+
author: { required: false, multiple: true },
|
|
28
|
+
url: { required: false, multiple: true, format: value_1.FORMATS.URL },
|
|
29
|
+
fulltext_url: { required: false, multiple: true, format: value_1.FORMATS.URL },
|
|
30
|
+
archive_url: { required: false, multiple: true, format: value_1.FORMATS.URL },
|
|
31
|
+
entry_type: { required: true, multiple: false, format: value_1.FORMATS.ENTRY_TYPE },
|
|
32
|
+
date: { required: false, multiple: false, format: value_1.FORMATS.EDTF_0 },
|
|
33
|
+
publisher: { required: false, multiple: true },
|
|
34
|
+
series: { required: false, multiple: false },
|
|
35
|
+
ISSN: { required: false, multiple: false, format: value_1.FORMATS.ISSN_L },
|
|
36
|
+
ISBN: { required: false, multiple: value_1.CHECK.ISBN, format: value_1.FORMATS.ISBN },
|
|
37
|
+
DOI: { required: false, multiple: false, format: value_1.FORMATS.DOI },
|
|
38
|
+
QID: { required: false, multiple: false, format: value_1.FORMATS.QID },
|
|
39
|
+
volume: { required: false, multiple: false },
|
|
40
|
+
issue: { required: false, multiple: false },
|
|
41
|
+
pages: { required: false, multiple: false },
|
|
42
|
+
edition: { required: false, multiple: false },
|
|
43
|
+
language: { required: true, multiple: true, format: value_1.FORMATS.LANGUAGE },
|
|
44
|
+
license: { required: false, multiple: true, format: value_1.FORMATS.LICENSE },
|
|
45
|
+
key_type: { required: true, multiple: true, format: value_1.FORMATS.KEY_TYPE },
|
|
46
|
+
taxon: { required: true, multiple: true },
|
|
47
|
+
scope: { required: false, multiple: true },
|
|
48
|
+
region: { required: true, multiple: true },
|
|
49
|
+
complete: { required: false, multiple: false, format: value_1.FORMATS.COMPLETE },
|
|
50
|
+
target_taxa: { required: false, multiple: true },
|
|
51
|
+
listed_in: { required: false, multiple: true, format: value_1.FORMATS.ID },
|
|
52
|
+
part_of: { required: false, multiple: true, format: value_1.FORMATS.ID },
|
|
53
|
+
version_of: { required: false, multiple: true, format: value_1.FORMATS.ID }
|
|
54
|
+
}) || this;
|
|
55
|
+
}
|
|
56
|
+
Work.prototype.deriveFields = function () {
|
|
57
|
+
if (typeof this.fields.date === 'string') {
|
|
58
|
+
var year = parseInt(this.fields.date.split('-')[0]);
|
|
59
|
+
this.derivedFields.year = year.toString();
|
|
60
|
+
this.derivedFields.decade = (year - (year % 10)).toString();
|
|
61
|
+
}
|
|
62
|
+
if (typeof this.fields.license === 'string' && !this.fields.license.endsWith('?>')) {
|
|
63
|
+
this.derivedFields.access = 'Open license';
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
var info = this.fields.url;
|
|
67
|
+
var content = this.fields.fulltext_url;
|
|
68
|
+
var archive = this.fields.archive_url;
|
|
69
|
+
if (typeof content === 'string') {
|
|
70
|
+
this.derivedFields.access = 'Full text available, no license';
|
|
71
|
+
}
|
|
72
|
+
else if (typeof archive === 'string' && (!(typeof info === 'string') || !archive.endsWith(info))) {
|
|
73
|
+
this.derivedFields.access = 'Archived full text available, no license';
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
this.derivedFields.access = 'No full text available';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
return Work;
|
|
81
|
+
}(entity_1.Entity));
|
|
82
|
+
exports.Work = Work;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const FORMATS: {
|
|
2
|
+
ENTRY_TYPE: string[];
|
|
3
|
+
KEY_TYPE: string[];
|
|
4
|
+
COMPLETE: string[];
|
|
5
|
+
ID: RegExp;
|
|
6
|
+
EDTF_0: RegExp;
|
|
7
|
+
ISSN_L: RegExp;
|
|
8
|
+
ISBN: RegExp;
|
|
9
|
+
DOI: RegExp;
|
|
10
|
+
QID: RegExp;
|
|
11
|
+
URL: RegExp;
|
|
12
|
+
LICENSE(value: SingleValue): true;
|
|
13
|
+
LANGUAGE(value: SingleValue): any;
|
|
14
|
+
};
|
|
15
|
+
export declare const CHECK: {
|
|
16
|
+
MULTILANG(entry: Record<string, Value>): boolean;
|
|
17
|
+
ISBN(entry: Record<string, Value>): boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare function parseValue(value: string, multiple: boolean): Value | null;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseValue = exports.CHECK = exports.FORMATS = void 0;
|
|
4
|
+
var spdxLicenseList = require("spdx-license-list");
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
var ietfTagListFactory = require("ietf-language-tag-regex");
|
|
8
|
+
var ietfTagList = ietfTagListFactory();
|
|
9
|
+
exports.FORMATS = {
|
|
10
|
+
ENTRY_TYPE: ['print', 'online', 'cd'],
|
|
11
|
+
KEY_TYPE: ['key', 'matrix', 'reference', 'gallery', 'checklist', 'supplement', 'collection'],
|
|
12
|
+
COMPLETE: ['TRUE', 'FALSE'],
|
|
13
|
+
ID: /^B\d+$/,
|
|
14
|
+
EDTF_0: /^(\d{4}(-\d{2}(-\d{2}(T\d{2}:\d{2}:\d{2}(Z|[-+]\d{2}(:\d{2})?))?)?)?|\d{4}(-\d{2}(-\d{2})?)?\/(\d{4}(-\d{2}(-\d{2})?)?|\.\.))$/,
|
|
15
|
+
ISSN_L: /^[0-9]{4}-[0-9]{3}[0-9X]$/,
|
|
16
|
+
ISBN: /^(\d{13}|\d{9}[0-9X])$/,
|
|
17
|
+
DOI: /^10\./,
|
|
18
|
+
QID: /^Q[1-9][0-9]*$/,
|
|
19
|
+
URL: /^(ftp|http|https):\/\/((?:[a-z0-9][a-z0-9-_]*?[a-z0-9]?\.)+(?:xn--)?[a-z0-9]+)(:\d*)?((?:\/(?:%\d\d|[!$&'()*+,\-.0-9";=@A-Z_a-z~])*)*)(\?(?:%\d\d|[!$&'()*+,\-./0-9:;=?@A-Z_a-z~])*)?(#(?:%\d\d|[!$&'()*+,\-./0-9:;=?@A-Z_a-z~])*)?/i,
|
|
20
|
+
LICENSE: function (value) { return /^<(public domain|.+\?)>$/.test(value) || !!spdxLicenseList[value]; },
|
|
21
|
+
LANGUAGE: function (value) { return ietfTagList.test(value); }
|
|
22
|
+
};
|
|
23
|
+
exports.CHECK = {
|
|
24
|
+
MULTILANG: function (entry) {
|
|
25
|
+
return entry.language.length > 1;
|
|
26
|
+
},
|
|
27
|
+
ISBN: function (entry) {
|
|
28
|
+
if (entry.ISBN.length < 2) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
var a = entry.ISBN[0].length === 10;
|
|
32
|
+
var b = entry.ISBN[0].length === 13;
|
|
33
|
+
var c = entry.ISBN[1].length === 10;
|
|
34
|
+
var d = entry.ISBN[1].length === 13;
|
|
35
|
+
return (a && d) || (b && c);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
function parseValue(value, multiple) {
|
|
39
|
+
if (value === '') {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
else if (multiple) {
|
|
43
|
+
return value.split('; ');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.parseValue = parseValue;
|
package/lib/csv.d.ts
ADDED
package/lib/csv.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatCsv = exports.parseCsv = void 0;
|
|
4
|
+
function parseCsv(file) {
|
|
5
|
+
var values = file
|
|
6
|
+
.trim()
|
|
7
|
+
.match(/("([^"]|"")*?"|[^,\n]+|(?!$))(,|\n|$)/g);
|
|
8
|
+
if (values === null) {
|
|
9
|
+
throw new TypeError('Failed to parse csv');
|
|
10
|
+
}
|
|
11
|
+
return values.reduce(function (rows, value) {
|
|
12
|
+
var last = rows[rows.length - 1];
|
|
13
|
+
if (value.endsWith('\n')) {
|
|
14
|
+
rows.push([]);
|
|
15
|
+
}
|
|
16
|
+
value = value.replace(/[,\n]$/, '');
|
|
17
|
+
last.push(value.startsWith('"') ? value.replace(/""/g, '"').slice(1, -1) : value);
|
|
18
|
+
return rows;
|
|
19
|
+
}, [[]]);
|
|
20
|
+
}
|
|
21
|
+
exports.parseCsv = parseCsv;
|
|
22
|
+
function formatCsv(table, delimiter) {
|
|
23
|
+
if (delimiter === void 0) { delimiter = ','; }
|
|
24
|
+
return table
|
|
25
|
+
.map(function (row) {
|
|
26
|
+
return row.map(function (value) {
|
|
27
|
+
if (/["\n]/.test(value) || value.includes(delimiter)) {
|
|
28
|
+
return "\"".concat(value.replace(/"/, '"""'), "\"");
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
}).join(delimiter);
|
|
34
|
+
})
|
|
35
|
+
.join('\n') + '\n';
|
|
36
|
+
}
|
|
37
|
+
exports.formatCsv = formatCsv;
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.csv = exports.resources = exports.catalog = void 0;
|
|
4
|
+
exports.catalog = require("./catalog/index");
|
|
5
|
+
exports.resources = require("./resources/index");
|
|
6
|
+
exports.csv = require("./csv");
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.createDiff = exports.ResourceDiffType = void 0;
|
|
13
|
+
var ResourceDiffType;
|
|
14
|
+
(function (ResourceDiffType) {
|
|
15
|
+
ResourceDiffType["Added"] = "+";
|
|
16
|
+
ResourceDiffType["Deleted"] = "-";
|
|
17
|
+
ResourceDiffType["Modified"] = "~";
|
|
18
|
+
ResourceDiffType["Unchanged"] = "=";
|
|
19
|
+
})(ResourceDiffType = exports.ResourceDiffType || (exports.ResourceDiffType = {}));
|
|
20
|
+
function LCS(X, Y) {
|
|
21
|
+
var m = X.length;
|
|
22
|
+
var n = Y.length;
|
|
23
|
+
// Build matrix
|
|
24
|
+
var C = Array(m + 1).fill(0).map(function () { return Array(n + 1).fill(0); });
|
|
25
|
+
for (var i_1 = 0; i_1 < m; i_1++) {
|
|
26
|
+
for (var j_1 = 0; j_1 < n; j_1++) {
|
|
27
|
+
if (X[i_1] === Y[j_1]) {
|
|
28
|
+
C[i_1 + 1][j_1 + 1] = C[i_1][j_1] + 1;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
C[i_1 + 1][j_1 + 1] = Math.max(C[i_1][j_1 + 1], C[i_1 + 1][j_1]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Backtrace
|
|
36
|
+
var diff = [];
|
|
37
|
+
var i = m;
|
|
38
|
+
var j = n;
|
|
39
|
+
while (i + j !== 0) {
|
|
40
|
+
if (X[i - 1] === Y[j - 1]) {
|
|
41
|
+
diff.unshift({
|
|
42
|
+
text: X[i - 1],
|
|
43
|
+
type: ResourceDiffType.Unchanged
|
|
44
|
+
});
|
|
45
|
+
i--, j--;
|
|
46
|
+
}
|
|
47
|
+
else if (i !== 0 && (j === 0 || C[i - 1][j] > C[i][j - 1])) {
|
|
48
|
+
diff.unshift({
|
|
49
|
+
text: X[i - 1],
|
|
50
|
+
type: ResourceDiffType.Added
|
|
51
|
+
});
|
|
52
|
+
i--;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
diff.unshift({
|
|
56
|
+
text: Y[j - 1],
|
|
57
|
+
type: ResourceDiffType.Deleted
|
|
58
|
+
});
|
|
59
|
+
j--;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return diff;
|
|
63
|
+
}
|
|
64
|
+
function gitTokenize(text) {
|
|
65
|
+
if (text.length === 0) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
return text.match(/\S+|\n|[\r\t\f\v \u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/g);
|
|
69
|
+
}
|
|
70
|
+
function createDiff(a, b, tokenize) {
|
|
71
|
+
if (tokenize === void 0) { tokenize = gitTokenize; }
|
|
72
|
+
var X = tokenize(a.trimEnd());
|
|
73
|
+
var Y = tokenize(b.trimEnd());
|
|
74
|
+
// Remove common prefix
|
|
75
|
+
var prefix = [];
|
|
76
|
+
while (X.length && X[0] === Y[0]) {
|
|
77
|
+
prefix.push({
|
|
78
|
+
text: X[0],
|
|
79
|
+
type: ResourceDiffType.Unchanged
|
|
80
|
+
});
|
|
81
|
+
X.shift();
|
|
82
|
+
Y.shift();
|
|
83
|
+
}
|
|
84
|
+
// Remove common suffix
|
|
85
|
+
var suffix = [];
|
|
86
|
+
while (X.length && X[X.length - 1] === Y[Y.length - 1]) {
|
|
87
|
+
suffix.unshift({
|
|
88
|
+
text: X[X.length - 1],
|
|
89
|
+
type: ResourceDiffType.Unchanged
|
|
90
|
+
});
|
|
91
|
+
X.pop();
|
|
92
|
+
Y.pop();
|
|
93
|
+
}
|
|
94
|
+
// Generate word from remains, combine with prefix and suffix, add trailing
|
|
95
|
+
// newline
|
|
96
|
+
var changes = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], prefix, true), LCS(X, Y), true), suffix, true), [
|
|
97
|
+
{ text: '\n', type: ResourceDiffType.Unchanged }
|
|
98
|
+
], false);
|
|
99
|
+
// Convert word diff to line diff
|
|
100
|
+
var lines = [];
|
|
101
|
+
var line = null;
|
|
102
|
+
var deletedNewlines = 0;
|
|
103
|
+
var nextLineNew = false;
|
|
104
|
+
for (var _i = 0, changes_1 = changes; _i < changes_1.length; _i++) {
|
|
105
|
+
var change = changes_1[_i];
|
|
106
|
+
// Start of line
|
|
107
|
+
if (line === null) {
|
|
108
|
+
deletedNewlines = 0;
|
|
109
|
+
line = { text: '', type: change.type };
|
|
110
|
+
}
|
|
111
|
+
// End of line (could be same token)
|
|
112
|
+
if (change.text === '\n') {
|
|
113
|
+
if (change.type === ResourceDiffType.Deleted) {
|
|
114
|
+
// Keep track of deleted newlines. These indicate the merging of
|
|
115
|
+
// lines. To keep the taxon identifiers consistent, it is
|
|
116
|
+
// important that deleted taxa are tracked.
|
|
117
|
+
deletedNewlines++;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// If there is a new newline, there is a new... line. If the current
|
|
121
|
+
// line is not seen as new, the next one should be marked as new.
|
|
122
|
+
if (nextLineNew) {
|
|
123
|
+
line.type = ResourceDiffType.Added;
|
|
124
|
+
nextLineNew = false;
|
|
125
|
+
}
|
|
126
|
+
if (change.type === ResourceDiffType.Added && line.type !== ResourceDiffType.Added) {
|
|
127
|
+
nextLineNew = true;
|
|
128
|
+
}
|
|
129
|
+
// Line ended
|
|
130
|
+
lines.push(line);
|
|
131
|
+
line = null;
|
|
132
|
+
// Add placeholders for deleted lines
|
|
133
|
+
while (deletedNewlines--) {
|
|
134
|
+
lines.push({
|
|
135
|
+
text: '',
|
|
136
|
+
type: ResourceDiffType.Deleted
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
// Added/Deleted/Unchanged on the same line -> line is modified but did
|
|
142
|
+
// already exist.
|
|
143
|
+
if (change.type !== line.type) {
|
|
144
|
+
line.type = ResourceDiffType.Modified;
|
|
145
|
+
}
|
|
146
|
+
if (change.type !== ResourceDiffType.Deleted) {
|
|
147
|
+
line.text += change.text;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return lines;
|
|
151
|
+
}
|
|
152
|
+
exports.createDiff = createDiff;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { parseFile as parseTextFile, parseFileHeader as parseTextFileHeader } from './parse-text';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseTextFileHeader = exports.parseTextFile = void 0;
|
|
4
|
+
var parse_text_1 = require("./parse-text");
|
|
5
|
+
Object.defineProperty(exports, "parseTextFile", { enumerable: true, get: function () { return parse_text_1.parseFile; } });
|
|
6
|
+
Object.defineProperty(exports, "parseTextFileHeader", { enumerable: true, get: function () { return parse_text_1.parseFileHeader; } });
|