4153 lines
124 KiB
JavaScript
4153 lines
124 KiB
JavaScript
import { l as log$1, a as addDirective, s as setLogLevel$1, g as getConfig$1, b as sanitizeText$1, c as assignWithDepth, d as configKeys, e as common$1, f as select } from "./config-b4fa35bb.js";
|
||
import { s as setupGraphViewbox$1 } from "./setupGraphViewbox-16a0ba81.js";
|
||
import { c as commonDb } from "./commonDb-7f40ab5a.js";
|
||
var dist = {};
|
||
Object.defineProperty(dist, "__esModule", { value: true });
|
||
var sanitizeUrl_1 = dist.sanitizeUrl = void 0;
|
||
var invalidProtocolRegex = /^([^\w]*)(javascript|data|vbscript)/im;
|
||
var htmlEntitiesRegex = /&#(\w+)(^\w|;)?/g;
|
||
var ctrlCharactersRegex = /[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;
|
||
var urlSchemeRegex = /^([^:]+):/gm;
|
||
var relativeFirstCharacters = [".", "/"];
|
||
function isRelativeUrlWithoutProtocol(url) {
|
||
return relativeFirstCharacters.indexOf(url[0]) > -1;
|
||
}
|
||
function decodeHtmlCharacters(str2) {
|
||
return str2.replace(htmlEntitiesRegex, function(match, dec) {
|
||
return String.fromCharCode(dec);
|
||
});
|
||
}
|
||
function sanitizeUrl(url) {
|
||
var sanitizedUrl = decodeHtmlCharacters(url || "").replace(ctrlCharactersRegex, "").trim();
|
||
if (!sanitizedUrl) {
|
||
return "about:blank";
|
||
}
|
||
if (isRelativeUrlWithoutProtocol(sanitizedUrl)) {
|
||
return sanitizedUrl;
|
||
}
|
||
var urlSchemeParseResults = sanitizedUrl.match(urlSchemeRegex);
|
||
if (!urlSchemeParseResults) {
|
||
return sanitizedUrl;
|
||
}
|
||
var urlScheme = urlSchemeParseResults[0];
|
||
if (invalidProtocolRegex.test(urlScheme)) {
|
||
return "about:blank";
|
||
}
|
||
return sanitizedUrl;
|
||
}
|
||
sanitizeUrl_1 = dist.sanitizeUrl = sanitizeUrl;
|
||
const abs = Math.abs;
|
||
const atan2 = Math.atan2;
|
||
const cos = Math.cos;
|
||
const max = Math.max;
|
||
const min = Math.min;
|
||
const sin = Math.sin;
|
||
const sqrt = Math.sqrt;
|
||
const epsilon = 1e-12;
|
||
const pi = Math.PI;
|
||
const halfPi = pi / 2;
|
||
const tau = 2 * pi;
|
||
function acos(x) {
|
||
return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
|
||
}
|
||
function asin(x) {
|
||
return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);
|
||
}
|
||
function Linear(context) {
|
||
this._context = context;
|
||
}
|
||
Linear.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
if (this._line || this._line !== 0 && this._point === 1)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
default:
|
||
this._context.lineTo(x, y);
|
||
break;
|
||
}
|
||
}
|
||
};
|
||
function curveLinear(context) {
|
||
return new Linear(context);
|
||
}
|
||
class Bump {
|
||
constructor(context, x) {
|
||
this._context = context;
|
||
this._x = x;
|
||
}
|
||
areaStart() {
|
||
this._line = 0;
|
||
}
|
||
areaEnd() {
|
||
this._line = NaN;
|
||
}
|
||
lineStart() {
|
||
this._point = 0;
|
||
}
|
||
lineEnd() {
|
||
if (this._line || this._line !== 0 && this._point === 1)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
}
|
||
point(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0: {
|
||
this._point = 1;
|
||
if (this._line)
|
||
this._context.lineTo(x, y);
|
||
else
|
||
this._context.moveTo(x, y);
|
||
break;
|
||
}
|
||
case 1:
|
||
this._point = 2;
|
||
default: {
|
||
if (this._x)
|
||
this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y);
|
||
else
|
||
this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y);
|
||
break;
|
||
}
|
||
}
|
||
this._x0 = x, this._y0 = y;
|
||
}
|
||
}
|
||
function bumpX(context) {
|
||
return new Bump(context, true);
|
||
}
|
||
function bumpY(context) {
|
||
return new Bump(context, false);
|
||
}
|
||
function noop() {
|
||
}
|
||
function point$3(that, x, y) {
|
||
that._context.bezierCurveTo(
|
||
(2 * that._x0 + that._x1) / 3,
|
||
(2 * that._y0 + that._y1) / 3,
|
||
(that._x0 + 2 * that._x1) / 3,
|
||
(that._y0 + 2 * that._y1) / 3,
|
||
(that._x0 + 4 * that._x1 + x) / 6,
|
||
(that._y0 + 4 * that._y1 + y) / 6
|
||
);
|
||
}
|
||
function Basis(context) {
|
||
this._context = context;
|
||
}
|
||
Basis.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._y0 = this._y1 = NaN;
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
switch (this._point) {
|
||
case 3:
|
||
point$3(this, this._x1, this._y1);
|
||
case 2:
|
||
this._context.lineTo(this._x1, this._y1);
|
||
break;
|
||
}
|
||
if (this._line || this._line !== 0 && this._point === 1)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);
|
||
default:
|
||
point$3(this, x, y);
|
||
break;
|
||
}
|
||
this._x0 = this._x1, this._x1 = x;
|
||
this._y0 = this._y1, this._y1 = y;
|
||
}
|
||
};
|
||
function curveBasis(context) {
|
||
return new Basis(context);
|
||
}
|
||
function BasisClosed(context) {
|
||
this._context = context;
|
||
}
|
||
BasisClosed.prototype = {
|
||
areaStart: noop,
|
||
areaEnd: noop,
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
switch (this._point) {
|
||
case 1: {
|
||
this._context.moveTo(this._x2, this._y2);
|
||
this._context.closePath();
|
||
break;
|
||
}
|
||
case 2: {
|
||
this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
|
||
this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
|
||
this._context.closePath();
|
||
break;
|
||
}
|
||
case 3: {
|
||
this.point(this._x2, this._y2);
|
||
this.point(this._x3, this._y3);
|
||
this.point(this._x4, this._y4);
|
||
break;
|
||
}
|
||
}
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._x2 = x, this._y2 = y;
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
this._x3 = x, this._y3 = y;
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
this._x4 = x, this._y4 = y;
|
||
this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6);
|
||
break;
|
||
default:
|
||
point$3(this, x, y);
|
||
break;
|
||
}
|
||
this._x0 = this._x1, this._x1 = x;
|
||
this._y0 = this._y1, this._y1 = y;
|
||
}
|
||
};
|
||
function curveBasisClosed(context) {
|
||
return new BasisClosed(context);
|
||
}
|
||
function BasisOpen(context) {
|
||
this._context = context;
|
||
}
|
||
BasisOpen.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._y0 = this._y1 = NaN;
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
if (this._line || this._line !== 0 && this._point === 3)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6;
|
||
this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0);
|
||
break;
|
||
case 3:
|
||
this._point = 4;
|
||
default:
|
||
point$3(this, x, y);
|
||
break;
|
||
}
|
||
this._x0 = this._x1, this._x1 = x;
|
||
this._y0 = this._y1, this._y1 = y;
|
||
}
|
||
};
|
||
function curveBasisOpen(context) {
|
||
return new BasisOpen(context);
|
||
}
|
||
function Bundle(context, beta) {
|
||
this._basis = new Basis(context);
|
||
this._beta = beta;
|
||
}
|
||
Bundle.prototype = {
|
||
lineStart: function() {
|
||
this._x = [];
|
||
this._y = [];
|
||
this._basis.lineStart();
|
||
},
|
||
lineEnd: function() {
|
||
var x = this._x, y = this._y, j = x.length - 1;
|
||
if (j > 0) {
|
||
var x0 = x[0], y0 = y[0], dx = x[j] - x0, dy = y[j] - y0, i = -1, t;
|
||
while (++i <= j) {
|
||
t = i / j;
|
||
this._basis.point(
|
||
this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
|
||
this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
|
||
);
|
||
}
|
||
}
|
||
this._x = this._y = null;
|
||
this._basis.lineEnd();
|
||
},
|
||
point: function(x, y) {
|
||
this._x.push(+x);
|
||
this._y.push(+y);
|
||
}
|
||
};
|
||
const curveBundle = function custom(beta) {
|
||
function bundle(context) {
|
||
return beta === 1 ? new Basis(context) : new Bundle(context, beta);
|
||
}
|
||
bundle.beta = function(beta2) {
|
||
return custom(+beta2);
|
||
};
|
||
return bundle;
|
||
}(0.85);
|
||
function point$2(that, x, y) {
|
||
that._context.bezierCurveTo(
|
||
that._x1 + that._k * (that._x2 - that._x0),
|
||
that._y1 + that._k * (that._y2 - that._y0),
|
||
that._x2 + that._k * (that._x1 - x),
|
||
that._y2 + that._k * (that._y1 - y),
|
||
that._x2,
|
||
that._y2
|
||
);
|
||
}
|
||
function Cardinal(context, tension) {
|
||
this._context = context;
|
||
this._k = (1 - tension) / 6;
|
||
}
|
||
Cardinal.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
switch (this._point) {
|
||
case 2:
|
||
this._context.lineTo(this._x2, this._y2);
|
||
break;
|
||
case 3:
|
||
point$2(this, this._x1, this._y1);
|
||
break;
|
||
}
|
||
if (this._line || this._line !== 0 && this._point === 1)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
this._x1 = x, this._y1 = y;
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
default:
|
||
point$2(this, x, y);
|
||
break;
|
||
}
|
||
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
|
||
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
||
}
|
||
};
|
||
const curveCardinal = function custom2(tension) {
|
||
function cardinal(context) {
|
||
return new Cardinal(context, tension);
|
||
}
|
||
cardinal.tension = function(tension2) {
|
||
return custom2(+tension2);
|
||
};
|
||
return cardinal;
|
||
}(0);
|
||
function CardinalClosed(context, tension) {
|
||
this._context = context;
|
||
this._k = (1 - tension) / 6;
|
||
}
|
||
CardinalClosed.prototype = {
|
||
areaStart: noop,
|
||
areaEnd: noop,
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
switch (this._point) {
|
||
case 1: {
|
||
this._context.moveTo(this._x3, this._y3);
|
||
this._context.closePath();
|
||
break;
|
||
}
|
||
case 2: {
|
||
this._context.lineTo(this._x3, this._y3);
|
||
this._context.closePath();
|
||
break;
|
||
}
|
||
case 3: {
|
||
this.point(this._x3, this._y3);
|
||
this.point(this._x4, this._y4);
|
||
this.point(this._x5, this._y5);
|
||
break;
|
||
}
|
||
}
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._x3 = x, this._y3 = y;
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
this._context.moveTo(this._x4 = x, this._y4 = y);
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
this._x5 = x, this._y5 = y;
|
||
break;
|
||
default:
|
||
point$2(this, x, y);
|
||
break;
|
||
}
|
||
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
|
||
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
||
}
|
||
};
|
||
const curveCardinalClosed = function custom3(tension) {
|
||
function cardinal(context) {
|
||
return new CardinalClosed(context, tension);
|
||
}
|
||
cardinal.tension = function(tension2) {
|
||
return custom3(+tension2);
|
||
};
|
||
return cardinal;
|
||
}(0);
|
||
function CardinalOpen(context, tension) {
|
||
this._context = context;
|
||
this._k = (1 - tension) / 6;
|
||
}
|
||
CardinalOpen.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
if (this._line || this._line !== 0 && this._point === 3)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
|
||
break;
|
||
case 3:
|
||
this._point = 4;
|
||
default:
|
||
point$2(this, x, y);
|
||
break;
|
||
}
|
||
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
|
||
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
||
}
|
||
};
|
||
const curveCardinalOpen = function custom4(tension) {
|
||
function cardinal(context) {
|
||
return new CardinalOpen(context, tension);
|
||
}
|
||
cardinal.tension = function(tension2) {
|
||
return custom4(+tension2);
|
||
};
|
||
return cardinal;
|
||
}(0);
|
||
function point$1(that, x, y) {
|
||
var x1 = that._x1, y1 = that._y1, x2 = that._x2, y2 = that._y2;
|
||
if (that._l01_a > epsilon) {
|
||
var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);
|
||
x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
|
||
y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
|
||
}
|
||
if (that._l23_a > epsilon) {
|
||
var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m = 3 * that._l23_a * (that._l23_a + that._l12_a);
|
||
x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
|
||
y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
|
||
}
|
||
that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
|
||
}
|
||
function CatmullRom(context, alpha) {
|
||
this._context = context;
|
||
this._alpha = alpha;
|
||
}
|
||
CatmullRom.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;
|
||
this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
switch (this._point) {
|
||
case 2:
|
||
this._context.lineTo(this._x2, this._y2);
|
||
break;
|
||
case 3:
|
||
this.point(this._x2, this._y2);
|
||
break;
|
||
}
|
||
if (this._line || this._line !== 0 && this._point === 1)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
if (this._point) {
|
||
var x23 = this._x2 - x, y23 = this._y2 - y;
|
||
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
|
||
}
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
default:
|
||
point$1(this, x, y);
|
||
break;
|
||
}
|
||
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
|
||
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
|
||
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
|
||
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
||
}
|
||
};
|
||
const curveCatmullRom = function custom5(alpha) {
|
||
function catmullRom(context) {
|
||
return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
|
||
}
|
||
catmullRom.alpha = function(alpha2) {
|
||
return custom5(+alpha2);
|
||
};
|
||
return catmullRom;
|
||
}(0.5);
|
||
function CatmullRomClosed(context, alpha) {
|
||
this._context = context;
|
||
this._alpha = alpha;
|
||
}
|
||
CatmullRomClosed.prototype = {
|
||
areaStart: noop,
|
||
areaEnd: noop,
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
|
||
this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
switch (this._point) {
|
||
case 1: {
|
||
this._context.moveTo(this._x3, this._y3);
|
||
this._context.closePath();
|
||
break;
|
||
}
|
||
case 2: {
|
||
this._context.lineTo(this._x3, this._y3);
|
||
this._context.closePath();
|
||
break;
|
||
}
|
||
case 3: {
|
||
this.point(this._x3, this._y3);
|
||
this.point(this._x4, this._y4);
|
||
this.point(this._x5, this._y5);
|
||
break;
|
||
}
|
||
}
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
if (this._point) {
|
||
var x23 = this._x2 - x, y23 = this._y2 - y;
|
||
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
|
||
}
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._x3 = x, this._y3 = y;
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
this._context.moveTo(this._x4 = x, this._y4 = y);
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
this._x5 = x, this._y5 = y;
|
||
break;
|
||
default:
|
||
point$1(this, x, y);
|
||
break;
|
||
}
|
||
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
|
||
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
|
||
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
|
||
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
||
}
|
||
};
|
||
const curveCatmullRomClosed = function custom6(alpha) {
|
||
function catmullRom(context) {
|
||
return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
|
||
}
|
||
catmullRom.alpha = function(alpha2) {
|
||
return custom6(+alpha2);
|
||
};
|
||
return catmullRom;
|
||
}(0.5);
|
||
function CatmullRomOpen(context, alpha) {
|
||
this._context = context;
|
||
this._alpha = alpha;
|
||
}
|
||
CatmullRomOpen.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;
|
||
this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
if (this._line || this._line !== 0 && this._point === 3)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
if (this._point) {
|
||
var x23 = this._x2 - x, y23 = this._y2 - y;
|
||
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
|
||
}
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
|
||
break;
|
||
case 3:
|
||
this._point = 4;
|
||
default:
|
||
point$1(this, x, y);
|
||
break;
|
||
}
|
||
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
|
||
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
|
||
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
|
||
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
||
}
|
||
};
|
||
const curveCatmullRomOpen = function custom7(alpha) {
|
||
function catmullRom(context) {
|
||
return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
|
||
}
|
||
catmullRom.alpha = function(alpha2) {
|
||
return custom7(+alpha2);
|
||
};
|
||
return catmullRom;
|
||
}(0.5);
|
||
function LinearClosed(context) {
|
||
this._context = context;
|
||
}
|
||
LinearClosed.prototype = {
|
||
areaStart: noop,
|
||
areaEnd: noop,
|
||
lineStart: function() {
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
if (this._point)
|
||
this._context.closePath();
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
if (this._point)
|
||
this._context.lineTo(x, y);
|
||
else
|
||
this._point = 1, this._context.moveTo(x, y);
|
||
}
|
||
};
|
||
function curveLinearClosed(context) {
|
||
return new LinearClosed(context);
|
||
}
|
||
function sign(x) {
|
||
return x < 0 ? -1 : 1;
|
||
}
|
||
function slope3(that, x2, y2) {
|
||
var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);
|
||
return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
|
||
}
|
||
function slope2(that, t) {
|
||
var h = that._x1 - that._x0;
|
||
return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
|
||
}
|
||
function point(that, t0, t1) {
|
||
var x0 = that._x0, y0 = that._y0, x1 = that._x1, y1 = that._y1, dx = (x1 - x0) / 3;
|
||
that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
|
||
}
|
||
function MonotoneX(context) {
|
||
this._context = context;
|
||
}
|
||
MonotoneX.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
switch (this._point) {
|
||
case 2:
|
||
this._context.lineTo(this._x1, this._y1);
|
||
break;
|
||
case 3:
|
||
point(this, this._t0, slope2(this, this._t0));
|
||
break;
|
||
}
|
||
if (this._line || this._line !== 0 && this._point === 1)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
var t1 = NaN;
|
||
x = +x, y = +y;
|
||
if (x === this._x1 && y === this._y1)
|
||
return;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
break;
|
||
case 2:
|
||
this._point = 3;
|
||
point(this, slope2(this, t1 = slope3(this, x, y)), t1);
|
||
break;
|
||
default:
|
||
point(this, this._t0, t1 = slope3(this, x, y));
|
||
break;
|
||
}
|
||
this._x0 = this._x1, this._x1 = x;
|
||
this._y0 = this._y1, this._y1 = y;
|
||
this._t0 = t1;
|
||
}
|
||
};
|
||
function MonotoneY(context) {
|
||
this._context = new ReflectContext(context);
|
||
}
|
||
(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
|
||
MonotoneX.prototype.point.call(this, y, x);
|
||
};
|
||
function ReflectContext(context) {
|
||
this._context = context;
|
||
}
|
||
ReflectContext.prototype = {
|
||
moveTo: function(x, y) {
|
||
this._context.moveTo(y, x);
|
||
},
|
||
closePath: function() {
|
||
this._context.closePath();
|
||
},
|
||
lineTo: function(x, y) {
|
||
this._context.lineTo(y, x);
|
||
},
|
||
bezierCurveTo: function(x1, y1, x2, y2, x, y) {
|
||
this._context.bezierCurveTo(y1, x1, y2, x2, y, x);
|
||
}
|
||
};
|
||
function monotoneX(context) {
|
||
return new MonotoneX(context);
|
||
}
|
||
function monotoneY(context) {
|
||
return new MonotoneY(context);
|
||
}
|
||
function Natural(context) {
|
||
this._context = context;
|
||
}
|
||
Natural.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x = [];
|
||
this._y = [];
|
||
},
|
||
lineEnd: function() {
|
||
var x = this._x, y = this._y, n = x.length;
|
||
if (n) {
|
||
this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
|
||
if (n === 2) {
|
||
this._context.lineTo(x[1], y[1]);
|
||
} else {
|
||
var px = controlPoints(x), py = controlPoints(y);
|
||
for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
|
||
this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
|
||
}
|
||
}
|
||
}
|
||
if (this._line || this._line !== 0 && n === 1)
|
||
this._context.closePath();
|
||
this._line = 1 - this._line;
|
||
this._x = this._y = null;
|
||
},
|
||
point: function(x, y) {
|
||
this._x.push(+x);
|
||
this._y.push(+y);
|
||
}
|
||
};
|
||
function controlPoints(x) {
|
||
var i, n = x.length - 1, m, a = new Array(n), b = new Array(n), r = new Array(n);
|
||
a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
|
||
for (i = 1; i < n - 1; ++i)
|
||
a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
|
||
a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
|
||
for (i = 1; i < n; ++i)
|
||
m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
|
||
a[n - 1] = r[n - 1] / b[n - 1];
|
||
for (i = n - 2; i >= 0; --i)
|
||
a[i] = (r[i] - a[i + 1]) / b[i];
|
||
b[n - 1] = (x[n] + a[n - 1]) / 2;
|
||
for (i = 0; i < n - 1; ++i)
|
||
b[i] = 2 * x[i + 1] - a[i + 1];
|
||
return [a, b];
|
||
}
|
||
function curveNatural(context) {
|
||
return new Natural(context);
|
||
}
|
||
function Step(context, t) {
|
||
this._context = context;
|
||
this._t = t;
|
||
}
|
||
Step.prototype = {
|
||
areaStart: function() {
|
||
this._line = 0;
|
||
},
|
||
areaEnd: function() {
|
||
this._line = NaN;
|
||
},
|
||
lineStart: function() {
|
||
this._x = this._y = NaN;
|
||
this._point = 0;
|
||
},
|
||
lineEnd: function() {
|
||
if (0 < this._t && this._t < 1 && this._point === 2)
|
||
this._context.lineTo(this._x, this._y);
|
||
if (this._line || this._line !== 0 && this._point === 1)
|
||
this._context.closePath();
|
||
if (this._line >= 0)
|
||
this._t = 1 - this._t, this._line = 1 - this._line;
|
||
},
|
||
point: function(x, y) {
|
||
x = +x, y = +y;
|
||
switch (this._point) {
|
||
case 0:
|
||
this._point = 1;
|
||
this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
||
break;
|
||
case 1:
|
||
this._point = 2;
|
||
default: {
|
||
if (this._t <= 0) {
|
||
this._context.lineTo(this._x, y);
|
||
this._context.lineTo(x, y);
|
||
} else {
|
||
var x1 = this._x * (1 - this._t) + x * this._t;
|
||
this._context.lineTo(x1, this._y);
|
||
this._context.lineTo(x1, y);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
this._x = x, this._y = y;
|
||
}
|
||
};
|
||
function curveStep(context) {
|
||
return new Step(context, 0.5);
|
||
}
|
||
function stepBefore(context) {
|
||
return new Step(context, 0);
|
||
}
|
||
function stepAfter(context) {
|
||
return new Step(context, 1);
|
||
}
|
||
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
|
||
function isNothing(subject) {
|
||
return typeof subject === "undefined" || subject === null;
|
||
}
|
||
function isObject$1(subject) {
|
||
return typeof subject === "object" && subject !== null;
|
||
}
|
||
function toArray(sequence) {
|
||
if (Array.isArray(sequence))
|
||
return sequence;
|
||
else if (isNothing(sequence))
|
||
return [];
|
||
return [sequence];
|
||
}
|
||
function extend(target, source) {
|
||
var index, length, key, sourceKeys;
|
||
if (source) {
|
||
sourceKeys = Object.keys(source);
|
||
for (index = 0, length = sourceKeys.length; index < length; index += 1) {
|
||
key = sourceKeys[index];
|
||
target[key] = source[key];
|
||
}
|
||
}
|
||
return target;
|
||
}
|
||
function repeat(string, count) {
|
||
var result = "", cycle;
|
||
for (cycle = 0; cycle < count; cycle += 1) {
|
||
result += string;
|
||
}
|
||
return result;
|
||
}
|
||
function isNegativeZero(number) {
|
||
return number === 0 && Number.NEGATIVE_INFINITY === 1 / number;
|
||
}
|
||
var isNothing_1 = isNothing;
|
||
var isObject_1 = isObject$1;
|
||
var toArray_1 = toArray;
|
||
var repeat_1 = repeat;
|
||
var isNegativeZero_1 = isNegativeZero;
|
||
var extend_1 = extend;
|
||
var common = {
|
||
isNothing: isNothing_1,
|
||
isObject: isObject_1,
|
||
toArray: toArray_1,
|
||
repeat: repeat_1,
|
||
isNegativeZero: isNegativeZero_1,
|
||
extend: extend_1
|
||
};
|
||
function formatError(exception2, compact) {
|
||
var where = "", message = exception2.reason || "(unknown reason)";
|
||
if (!exception2.mark)
|
||
return message;
|
||
if (exception2.mark.name) {
|
||
where += 'in "' + exception2.mark.name + '" ';
|
||
}
|
||
where += "(" + (exception2.mark.line + 1) + ":" + (exception2.mark.column + 1) + ")";
|
||
if (!compact && exception2.mark.snippet) {
|
||
where += "\n\n" + exception2.mark.snippet;
|
||
}
|
||
return message + " " + where;
|
||
}
|
||
function YAMLException$1(reason, mark) {
|
||
Error.call(this);
|
||
this.name = "YAMLException";
|
||
this.reason = reason;
|
||
this.mark = mark;
|
||
this.message = formatError(this, false);
|
||
if (Error.captureStackTrace) {
|
||
Error.captureStackTrace(this, this.constructor);
|
||
} else {
|
||
this.stack = new Error().stack || "";
|
||
}
|
||
}
|
||
YAMLException$1.prototype = Object.create(Error.prototype);
|
||
YAMLException$1.prototype.constructor = YAMLException$1;
|
||
YAMLException$1.prototype.toString = function toString(compact) {
|
||
return this.name + ": " + formatError(this, compact);
|
||
};
|
||
var exception = YAMLException$1;
|
||
function getLine(buffer, lineStart, lineEnd, position, maxLineLength) {
|
||
var head = "";
|
||
var tail = "";
|
||
var maxHalfLength = Math.floor(maxLineLength / 2) - 1;
|
||
if (position - lineStart > maxHalfLength) {
|
||
head = " ... ";
|
||
lineStart = position - maxHalfLength + head.length;
|
||
}
|
||
if (lineEnd - position > maxHalfLength) {
|
||
tail = " ...";
|
||
lineEnd = position + maxHalfLength - tail.length;
|
||
}
|
||
return {
|
||
str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, "→") + tail,
|
||
pos: position - lineStart + head.length
|
||
// relative position
|
||
};
|
||
}
|
||
function padStart(string, max2) {
|
||
return common.repeat(" ", max2 - string.length) + string;
|
||
}
|
||
function makeSnippet(mark, options) {
|
||
options = Object.create(options || null);
|
||
if (!mark.buffer)
|
||
return null;
|
||
if (!options.maxLength)
|
||
options.maxLength = 79;
|
||
if (typeof options.indent !== "number")
|
||
options.indent = 1;
|
||
if (typeof options.linesBefore !== "number")
|
||
options.linesBefore = 3;
|
||
if (typeof options.linesAfter !== "number")
|
||
options.linesAfter = 2;
|
||
var re = /\r?\n|\r|\0/g;
|
||
var lineStarts = [0];
|
||
var lineEnds = [];
|
||
var match;
|
||
var foundLineNo = -1;
|
||
while (match = re.exec(mark.buffer)) {
|
||
lineEnds.push(match.index);
|
||
lineStarts.push(match.index + match[0].length);
|
||
if (mark.position <= match.index && foundLineNo < 0) {
|
||
foundLineNo = lineStarts.length - 2;
|
||
}
|
||
}
|
||
if (foundLineNo < 0)
|
||
foundLineNo = lineStarts.length - 1;
|
||
var result = "", i, line;
|
||
var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;
|
||
var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);
|
||
for (i = 1; i <= options.linesBefore; i++) {
|
||
if (foundLineNo - i < 0)
|
||
break;
|
||
line = getLine(
|
||
mark.buffer,
|
||
lineStarts[foundLineNo - i],
|
||
lineEnds[foundLineNo - i],
|
||
mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),
|
||
maxLineLength
|
||
);
|
||
result = common.repeat(" ", options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + " | " + line.str + "\n" + result;
|
||
}
|
||
line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);
|
||
result += common.repeat(" ", options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + " | " + line.str + "\n";
|
||
result += common.repeat("-", options.indent + lineNoLength + 3 + line.pos) + "^\n";
|
||
for (i = 1; i <= options.linesAfter; i++) {
|
||
if (foundLineNo + i >= lineEnds.length)
|
||
break;
|
||
line = getLine(
|
||
mark.buffer,
|
||
lineStarts[foundLineNo + i],
|
||
lineEnds[foundLineNo + i],
|
||
mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),
|
||
maxLineLength
|
||
);
|
||
result += common.repeat(" ", options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + " | " + line.str + "\n";
|
||
}
|
||
return result.replace(/\n$/, "");
|
||
}
|
||
var snippet = makeSnippet;
|
||
var TYPE_CONSTRUCTOR_OPTIONS = [
|
||
"kind",
|
||
"multi",
|
||
"resolve",
|
||
"construct",
|
||
"instanceOf",
|
||
"predicate",
|
||
"represent",
|
||
"representName",
|
||
"defaultStyle",
|
||
"styleAliases"
|
||
];
|
||
var YAML_NODE_KINDS = [
|
||
"scalar",
|
||
"sequence",
|
||
"mapping"
|
||
];
|
||
function compileStyleAliases(map2) {
|
||
var result = {};
|
||
if (map2 !== null) {
|
||
Object.keys(map2).forEach(function(style) {
|
||
map2[style].forEach(function(alias) {
|
||
result[String(alias)] = style;
|
||
});
|
||
});
|
||
}
|
||
return result;
|
||
}
|
||
function Type$1(tag, options) {
|
||
options = options || {};
|
||
Object.keys(options).forEach(function(name) {
|
||
if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
|
||
throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
|
||
}
|
||
});
|
||
this.options = options;
|
||
this.tag = tag;
|
||
this.kind = options["kind"] || null;
|
||
this.resolve = options["resolve"] || function() {
|
||
return true;
|
||
};
|
||
this.construct = options["construct"] || function(data) {
|
||
return data;
|
||
};
|
||
this.instanceOf = options["instanceOf"] || null;
|
||
this.predicate = options["predicate"] || null;
|
||
this.represent = options["represent"] || null;
|
||
this.representName = options["representName"] || null;
|
||
this.defaultStyle = options["defaultStyle"] || null;
|
||
this.multi = options["multi"] || false;
|
||
this.styleAliases = compileStyleAliases(options["styleAliases"] || null);
|
||
if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
|
||
throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
|
||
}
|
||
}
|
||
var type = Type$1;
|
||
function compileList(schema2, name) {
|
||
var result = [];
|
||
schema2[name].forEach(function(currentType) {
|
||
var newIndex = result.length;
|
||
result.forEach(function(previousType, previousIndex) {
|
||
if (previousType.tag === currentType.tag && previousType.kind === currentType.kind && previousType.multi === currentType.multi) {
|
||
newIndex = previousIndex;
|
||
}
|
||
});
|
||
result[newIndex] = currentType;
|
||
});
|
||
return result;
|
||
}
|
||
function compileMap() {
|
||
var result = {
|
||
scalar: {},
|
||
sequence: {},
|
||
mapping: {},
|
||
fallback: {},
|
||
multi: {
|
||
scalar: [],
|
||
sequence: [],
|
||
mapping: [],
|
||
fallback: []
|
||
}
|
||
}, index, length;
|
||
function collectType(type2) {
|
||
if (type2.multi) {
|
||
result.multi[type2.kind].push(type2);
|
||
result.multi["fallback"].push(type2);
|
||
} else {
|
||
result[type2.kind][type2.tag] = result["fallback"][type2.tag] = type2;
|
||
}
|
||
}
|
||
for (index = 0, length = arguments.length; index < length; index += 1) {
|
||
arguments[index].forEach(collectType);
|
||
}
|
||
return result;
|
||
}
|
||
function Schema$1(definition) {
|
||
return this.extend(definition);
|
||
}
|
||
Schema$1.prototype.extend = function extend2(definition) {
|
||
var implicit = [];
|
||
var explicit = [];
|
||
if (definition instanceof type) {
|
||
explicit.push(definition);
|
||
} else if (Array.isArray(definition)) {
|
||
explicit = explicit.concat(definition);
|
||
} else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {
|
||
if (definition.implicit)
|
||
implicit = implicit.concat(definition.implicit);
|
||
if (definition.explicit)
|
||
explicit = explicit.concat(definition.explicit);
|
||
} else {
|
||
throw new exception("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");
|
||
}
|
||
implicit.forEach(function(type$1) {
|
||
if (!(type$1 instanceof type)) {
|
||
throw new exception("Specified list of YAML types (or a single Type object) contains a non-Type object.");
|
||
}
|
||
if (type$1.loadKind && type$1.loadKind !== "scalar") {
|
||
throw new exception("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");
|
||
}
|
||
if (type$1.multi) {
|
||
throw new exception("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.");
|
||
}
|
||
});
|
||
explicit.forEach(function(type$1) {
|
||
if (!(type$1 instanceof type)) {
|
||
throw new exception("Specified list of YAML types (or a single Type object) contains a non-Type object.");
|
||
}
|
||
});
|
||
var result = Object.create(Schema$1.prototype);
|
||
result.implicit = (this.implicit || []).concat(implicit);
|
||
result.explicit = (this.explicit || []).concat(explicit);
|
||
result.compiledImplicit = compileList(result, "implicit");
|
||
result.compiledExplicit = compileList(result, "explicit");
|
||
result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);
|
||
return result;
|
||
};
|
||
var schema = Schema$1;
|
||
var str = new type("tag:yaml.org,2002:str", {
|
||
kind: "scalar",
|
||
construct: function(data) {
|
||
return data !== null ? data : "";
|
||
}
|
||
});
|
||
var seq = new type("tag:yaml.org,2002:seq", {
|
||
kind: "sequence",
|
||
construct: function(data) {
|
||
return data !== null ? data : [];
|
||
}
|
||
});
|
||
var map = new type("tag:yaml.org,2002:map", {
|
||
kind: "mapping",
|
||
construct: function(data) {
|
||
return data !== null ? data : {};
|
||
}
|
||
});
|
||
var failsafe = new schema({
|
||
explicit: [
|
||
str,
|
||
seq,
|
||
map
|
||
]
|
||
});
|
||
function resolveYamlNull(data) {
|
||
if (data === null)
|
||
return true;
|
||
var max2 = data.length;
|
||
return max2 === 1 && data === "~" || max2 === 4 && (data === "null" || data === "Null" || data === "NULL");
|
||
}
|
||
function constructYamlNull() {
|
||
return null;
|
||
}
|
||
function isNull(object) {
|
||
return object === null;
|
||
}
|
||
var _null = new type("tag:yaml.org,2002:null", {
|
||
kind: "scalar",
|
||
resolve: resolveYamlNull,
|
||
construct: constructYamlNull,
|
||
predicate: isNull,
|
||
represent: {
|
||
canonical: function() {
|
||
return "~";
|
||
},
|
||
lowercase: function() {
|
||
return "null";
|
||
},
|
||
uppercase: function() {
|
||
return "NULL";
|
||
},
|
||
camelcase: function() {
|
||
return "Null";
|
||
},
|
||
empty: function() {
|
||
return "";
|
||
}
|
||
},
|
||
defaultStyle: "lowercase"
|
||
});
|
||
function resolveYamlBoolean(data) {
|
||
if (data === null)
|
||
return false;
|
||
var max2 = data.length;
|
||
return max2 === 4 && (data === "true" || data === "True" || data === "TRUE") || max2 === 5 && (data === "false" || data === "False" || data === "FALSE");
|
||
}
|
||
function constructYamlBoolean(data) {
|
||
return data === "true" || data === "True" || data === "TRUE";
|
||
}
|
||
function isBoolean(object) {
|
||
return Object.prototype.toString.call(object) === "[object Boolean]";
|
||
}
|
||
var bool = new type("tag:yaml.org,2002:bool", {
|
||
kind: "scalar",
|
||
resolve: resolveYamlBoolean,
|
||
construct: constructYamlBoolean,
|
||
predicate: isBoolean,
|
||
represent: {
|
||
lowercase: function(object) {
|
||
return object ? "true" : "false";
|
||
},
|
||
uppercase: function(object) {
|
||
return object ? "TRUE" : "FALSE";
|
||
},
|
||
camelcase: function(object) {
|
||
return object ? "True" : "False";
|
||
}
|
||
},
|
||
defaultStyle: "lowercase"
|
||
});
|
||
function isHexCode(c) {
|
||
return 48 <= c && c <= 57 || 65 <= c && c <= 70 || 97 <= c && c <= 102;
|
||
}
|
||
function isOctCode(c) {
|
||
return 48 <= c && c <= 55;
|
||
}
|
||
function isDecCode(c) {
|
||
return 48 <= c && c <= 57;
|
||
}
|
||
function resolveYamlInteger(data) {
|
||
if (data === null)
|
||
return false;
|
||
var max2 = data.length, index = 0, hasDigits = false, ch;
|
||
if (!max2)
|
||
return false;
|
||
ch = data[index];
|
||
if (ch === "-" || ch === "+") {
|
||
ch = data[++index];
|
||
}
|
||
if (ch === "0") {
|
||
if (index + 1 === max2)
|
||
return true;
|
||
ch = data[++index];
|
||
if (ch === "b") {
|
||
index++;
|
||
for (; index < max2; index++) {
|
||
ch = data[index];
|
||
if (ch === "_")
|
||
continue;
|
||
if (ch !== "0" && ch !== "1")
|
||
return false;
|
||
hasDigits = true;
|
||
}
|
||
return hasDigits && ch !== "_";
|
||
}
|
||
if (ch === "x") {
|
||
index++;
|
||
for (; index < max2; index++) {
|
||
ch = data[index];
|
||
if (ch === "_")
|
||
continue;
|
||
if (!isHexCode(data.charCodeAt(index)))
|
||
return false;
|
||
hasDigits = true;
|
||
}
|
||
return hasDigits && ch !== "_";
|
||
}
|
||
if (ch === "o") {
|
||
index++;
|
||
for (; index < max2; index++) {
|
||
ch = data[index];
|
||
if (ch === "_")
|
||
continue;
|
||
if (!isOctCode(data.charCodeAt(index)))
|
||
return false;
|
||
hasDigits = true;
|
||
}
|
||
return hasDigits && ch !== "_";
|
||
}
|
||
}
|
||
if (ch === "_")
|
||
return false;
|
||
for (; index < max2; index++) {
|
||
ch = data[index];
|
||
if (ch === "_")
|
||
continue;
|
||
if (!isDecCode(data.charCodeAt(index))) {
|
||
return false;
|
||
}
|
||
hasDigits = true;
|
||
}
|
||
if (!hasDigits || ch === "_")
|
||
return false;
|
||
return true;
|
||
}
|
||
function constructYamlInteger(data) {
|
||
var value = data, sign2 = 1, ch;
|
||
if (value.indexOf("_") !== -1) {
|
||
value = value.replace(/_/g, "");
|
||
}
|
||
ch = value[0];
|
||
if (ch === "-" || ch === "+") {
|
||
if (ch === "-")
|
||
sign2 = -1;
|
||
value = value.slice(1);
|
||
ch = value[0];
|
||
}
|
||
if (value === "0")
|
||
return 0;
|
||
if (ch === "0") {
|
||
if (value[1] === "b")
|
||
return sign2 * parseInt(value.slice(2), 2);
|
||
if (value[1] === "x")
|
||
return sign2 * parseInt(value.slice(2), 16);
|
||
if (value[1] === "o")
|
||
return sign2 * parseInt(value.slice(2), 8);
|
||
}
|
||
return sign2 * parseInt(value, 10);
|
||
}
|
||
function isInteger(object) {
|
||
return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 === 0 && !common.isNegativeZero(object));
|
||
}
|
||
var int = new type("tag:yaml.org,2002:int", {
|
||
kind: "scalar",
|
||
resolve: resolveYamlInteger,
|
||
construct: constructYamlInteger,
|
||
predicate: isInteger,
|
||
represent: {
|
||
binary: function(obj) {
|
||
return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1);
|
||
},
|
||
octal: function(obj) {
|
||
return obj >= 0 ? "0o" + obj.toString(8) : "-0o" + obj.toString(8).slice(1);
|
||
},
|
||
decimal: function(obj) {
|
||
return obj.toString(10);
|
||
},
|
||
/* eslint-disable max-len */
|
||
hexadecimal: function(obj) {
|
||
return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1);
|
||
}
|
||
},
|
||
defaultStyle: "decimal",
|
||
styleAliases: {
|
||
binary: [2, "bin"],
|
||
octal: [8, "oct"],
|
||
decimal: [10, "dec"],
|
||
hexadecimal: [16, "hex"]
|
||
}
|
||
});
|
||
var YAML_FLOAT_PATTERN = new RegExp(
|
||
// 2.5e4, 2.5 and integers
|
||
"^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"
|
||
);
|
||
function resolveYamlFloat(data) {
|
||
if (data === null)
|
||
return false;
|
||
if (!YAML_FLOAT_PATTERN.test(data) || // Quick hack to not allow integers end with `_`
|
||
// Probably should update regexp & check speed
|
||
data[data.length - 1] === "_") {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
function constructYamlFloat(data) {
|
||
var value, sign2;
|
||
value = data.replace(/_/g, "").toLowerCase();
|
||
sign2 = value[0] === "-" ? -1 : 1;
|
||
if ("+-".indexOf(value[0]) >= 0) {
|
||
value = value.slice(1);
|
||
}
|
||
if (value === ".inf") {
|
||
return sign2 === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
|
||
} else if (value === ".nan") {
|
||
return NaN;
|
||
}
|
||
return sign2 * parseFloat(value, 10);
|
||
}
|
||
var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;
|
||
function representYamlFloat(object, style) {
|
||
var res;
|
||
if (isNaN(object)) {
|
||
switch (style) {
|
||
case "lowercase":
|
||
return ".nan";
|
||
case "uppercase":
|
||
return ".NAN";
|
||
case "camelcase":
|
||
return ".NaN";
|
||
}
|
||
} else if (Number.POSITIVE_INFINITY === object) {
|
||
switch (style) {
|
||
case "lowercase":
|
||
return ".inf";
|
||
case "uppercase":
|
||
return ".INF";
|
||
case "camelcase":
|
||
return ".Inf";
|
||
}
|
||
} else if (Number.NEGATIVE_INFINITY === object) {
|
||
switch (style) {
|
||
case "lowercase":
|
||
return "-.inf";
|
||
case "uppercase":
|
||
return "-.INF";
|
||
case "camelcase":
|
||
return "-.Inf";
|
||
}
|
||
} else if (common.isNegativeZero(object)) {
|
||
return "-0.0";
|
||
}
|
||
res = object.toString(10);
|
||
return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace("e", ".e") : res;
|
||
}
|
||
function isFloat(object) {
|
||
return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 !== 0 || common.isNegativeZero(object));
|
||
}
|
||
var float = new type("tag:yaml.org,2002:float", {
|
||
kind: "scalar",
|
||
resolve: resolveYamlFloat,
|
||
construct: constructYamlFloat,
|
||
predicate: isFloat,
|
||
represent: representYamlFloat,
|
||
defaultStyle: "lowercase"
|
||
});
|
||
var json = failsafe.extend({
|
||
implicit: [
|
||
_null,
|
||
bool,
|
||
int,
|
||
float
|
||
]
|
||
});
|
||
var core = json;
|
||
var YAML_DATE_REGEXP = new RegExp(
|
||
"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"
|
||
);
|
||
var YAML_TIMESTAMP_REGEXP = new RegExp(
|
||
"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$"
|
||
);
|
||
function resolveYamlTimestamp(data) {
|
||
if (data === null)
|
||
return false;
|
||
if (YAML_DATE_REGEXP.exec(data) !== null)
|
||
return true;
|
||
if (YAML_TIMESTAMP_REGEXP.exec(data) !== null)
|
||
return true;
|
||
return false;
|
||
}
|
||
function constructYamlTimestamp(data) {
|
||
var match, year, month, day, hour, minute, second, fraction = 0, delta = null, tz_hour, tz_minute, date;
|
||
match = YAML_DATE_REGEXP.exec(data);
|
||
if (match === null)
|
||
match = YAML_TIMESTAMP_REGEXP.exec(data);
|
||
if (match === null)
|
||
throw new Error("Date resolve error");
|
||
year = +match[1];
|
||
month = +match[2] - 1;
|
||
day = +match[3];
|
||
if (!match[4]) {
|
||
return new Date(Date.UTC(year, month, day));
|
||
}
|
||
hour = +match[4];
|
||
minute = +match[5];
|
||
second = +match[6];
|
||
if (match[7]) {
|
||
fraction = match[7].slice(0, 3);
|
||
while (fraction.length < 3) {
|
||
fraction += "0";
|
||
}
|
||
fraction = +fraction;
|
||
}
|
||
if (match[9]) {
|
||
tz_hour = +match[10];
|
||
tz_minute = +(match[11] || 0);
|
||
delta = (tz_hour * 60 + tz_minute) * 6e4;
|
||
if (match[9] === "-")
|
||
delta = -delta;
|
||
}
|
||
date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));
|
||
if (delta)
|
||
date.setTime(date.getTime() - delta);
|
||
return date;
|
||
}
|
||
function representYamlTimestamp(object) {
|
||
return object.toISOString();
|
||
}
|
||
var timestamp = new type("tag:yaml.org,2002:timestamp", {
|
||
kind: "scalar",
|
||
resolve: resolveYamlTimestamp,
|
||
construct: constructYamlTimestamp,
|
||
instanceOf: Date,
|
||
represent: representYamlTimestamp
|
||
});
|
||
function resolveYamlMerge(data) {
|
||
return data === "<<" || data === null;
|
||
}
|
||
var merge = new type("tag:yaml.org,2002:merge", {
|
||
kind: "scalar",
|
||
resolve: resolveYamlMerge
|
||
});
|
||
var BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";
|
||
function resolveYamlBinary(data) {
|
||
if (data === null)
|
||
return false;
|
||
var code, idx, bitlen = 0, max2 = data.length, map2 = BASE64_MAP;
|
||
for (idx = 0; idx < max2; idx++) {
|
||
code = map2.indexOf(data.charAt(idx));
|
||
if (code > 64)
|
||
continue;
|
||
if (code < 0)
|
||
return false;
|
||
bitlen += 6;
|
||
}
|
||
return bitlen % 8 === 0;
|
||
}
|
||
function constructYamlBinary(data) {
|
||
var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max2 = input.length, map2 = BASE64_MAP, bits = 0, result = [];
|
||
for (idx = 0; idx < max2; idx++) {
|
||
if (idx % 4 === 0 && idx) {
|
||
result.push(bits >> 16 & 255);
|
||
result.push(bits >> 8 & 255);
|
||
result.push(bits & 255);
|
||
}
|
||
bits = bits << 6 | map2.indexOf(input.charAt(idx));
|
||
}
|
||
tailbits = max2 % 4 * 6;
|
||
if (tailbits === 0) {
|
||
result.push(bits >> 16 & 255);
|
||
result.push(bits >> 8 & 255);
|
||
result.push(bits & 255);
|
||
} else if (tailbits === 18) {
|
||
result.push(bits >> 10 & 255);
|
||
result.push(bits >> 2 & 255);
|
||
} else if (tailbits === 12) {
|
||
result.push(bits >> 4 & 255);
|
||
}
|
||
return new Uint8Array(result);
|
||
}
|
||
function representYamlBinary(object) {
|
||
var result = "", bits = 0, idx, tail, max2 = object.length, map2 = BASE64_MAP;
|
||
for (idx = 0; idx < max2; idx++) {
|
||
if (idx % 3 === 0 && idx) {
|
||
result += map2[bits >> 18 & 63];
|
||
result += map2[bits >> 12 & 63];
|
||
result += map2[bits >> 6 & 63];
|
||
result += map2[bits & 63];
|
||
}
|
||
bits = (bits << 8) + object[idx];
|
||
}
|
||
tail = max2 % 3;
|
||
if (tail === 0) {
|
||
result += map2[bits >> 18 & 63];
|
||
result += map2[bits >> 12 & 63];
|
||
result += map2[bits >> 6 & 63];
|
||
result += map2[bits & 63];
|
||
} else if (tail === 2) {
|
||
result += map2[bits >> 10 & 63];
|
||
result += map2[bits >> 4 & 63];
|
||
result += map2[bits << 2 & 63];
|
||
result += map2[64];
|
||
} else if (tail === 1) {
|
||
result += map2[bits >> 2 & 63];
|
||
result += map2[bits << 4 & 63];
|
||
result += map2[64];
|
||
result += map2[64];
|
||
}
|
||
return result;
|
||
}
|
||
function isBinary(obj) {
|
||
return Object.prototype.toString.call(obj) === "[object Uint8Array]";
|
||
}
|
||
var binary = new type("tag:yaml.org,2002:binary", {
|
||
kind: "scalar",
|
||
resolve: resolveYamlBinary,
|
||
construct: constructYamlBinary,
|
||
predicate: isBinary,
|
||
represent: representYamlBinary
|
||
});
|
||
var _hasOwnProperty$3 = Object.prototype.hasOwnProperty;
|
||
var _toString$2 = Object.prototype.toString;
|
||
function resolveYamlOmap(data) {
|
||
if (data === null)
|
||
return true;
|
||
var objectKeys = [], index, length, pair, pairKey, pairHasKey, object = data;
|
||
for (index = 0, length = object.length; index < length; index += 1) {
|
||
pair = object[index];
|
||
pairHasKey = false;
|
||
if (_toString$2.call(pair) !== "[object Object]")
|
||
return false;
|
||
for (pairKey in pair) {
|
||
if (_hasOwnProperty$3.call(pair, pairKey)) {
|
||
if (!pairHasKey)
|
||
pairHasKey = true;
|
||
else
|
||
return false;
|
||
}
|
||
}
|
||
if (!pairHasKey)
|
||
return false;
|
||
if (objectKeys.indexOf(pairKey) === -1)
|
||
objectKeys.push(pairKey);
|
||
else
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
function constructYamlOmap(data) {
|
||
return data !== null ? data : [];
|
||
}
|
||
var omap = new type("tag:yaml.org,2002:omap", {
|
||
kind: "sequence",
|
||
resolve: resolveYamlOmap,
|
||
construct: constructYamlOmap
|
||
});
|
||
var _toString$1 = Object.prototype.toString;
|
||
function resolveYamlPairs(data) {
|
||
if (data === null)
|
||
return true;
|
||
var index, length, pair, keys, result, object = data;
|
||
result = new Array(object.length);
|
||
for (index = 0, length = object.length; index < length; index += 1) {
|
||
pair = object[index];
|
||
if (_toString$1.call(pair) !== "[object Object]")
|
||
return false;
|
||
keys = Object.keys(pair);
|
||
if (keys.length !== 1)
|
||
return false;
|
||
result[index] = [keys[0], pair[keys[0]]];
|
||
}
|
||
return true;
|
||
}
|
||
function constructYamlPairs(data) {
|
||
if (data === null)
|
||
return [];
|
||
var index, length, pair, keys, result, object = data;
|
||
result = new Array(object.length);
|
||
for (index = 0, length = object.length; index < length; index += 1) {
|
||
pair = object[index];
|
||
keys = Object.keys(pair);
|
||
result[index] = [keys[0], pair[keys[0]]];
|
||
}
|
||
return result;
|
||
}
|
||
var pairs = new type("tag:yaml.org,2002:pairs", {
|
||
kind: "sequence",
|
||
resolve: resolveYamlPairs,
|
||
construct: constructYamlPairs
|
||
});
|
||
var _hasOwnProperty$2 = Object.prototype.hasOwnProperty;
|
||
function resolveYamlSet(data) {
|
||
if (data === null)
|
||
return true;
|
||
var key, object = data;
|
||
for (key in object) {
|
||
if (_hasOwnProperty$2.call(object, key)) {
|
||
if (object[key] !== null)
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
function constructYamlSet(data) {
|
||
return data !== null ? data : {};
|
||
}
|
||
var set = new type("tag:yaml.org,2002:set", {
|
||
kind: "mapping",
|
||
resolve: resolveYamlSet,
|
||
construct: constructYamlSet
|
||
});
|
||
var _default = core.extend({
|
||
implicit: [
|
||
timestamp,
|
||
merge
|
||
],
|
||
explicit: [
|
||
binary,
|
||
omap,
|
||
pairs,
|
||
set
|
||
]
|
||
});
|
||
var _hasOwnProperty$1 = Object.prototype.hasOwnProperty;
|
||
var CONTEXT_FLOW_IN = 1;
|
||
var CONTEXT_FLOW_OUT = 2;
|
||
var CONTEXT_BLOCK_IN = 3;
|
||
var CONTEXT_BLOCK_OUT = 4;
|
||
var CHOMPING_CLIP = 1;
|
||
var CHOMPING_STRIP = 2;
|
||
var CHOMPING_KEEP = 3;
|
||
var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
|
||
var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
|
||
var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/;
|
||
var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i;
|
||
var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;
|
||
function _class(obj) {
|
||
return Object.prototype.toString.call(obj);
|
||
}
|
||
function is_EOL(c) {
|
||
return c === 10 || c === 13;
|
||
}
|
||
function is_WHITE_SPACE(c) {
|
||
return c === 9 || c === 32;
|
||
}
|
||
function is_WS_OR_EOL(c) {
|
||
return c === 9 || c === 32 || c === 10 || c === 13;
|
||
}
|
||
function is_FLOW_INDICATOR(c) {
|
||
return c === 44 || c === 91 || c === 93 || c === 123 || c === 125;
|
||
}
|
||
function fromHexCode(c) {
|
||
var lc;
|
||
if (48 <= c && c <= 57) {
|
||
return c - 48;
|
||
}
|
||
lc = c | 32;
|
||
if (97 <= lc && lc <= 102) {
|
||
return lc - 97 + 10;
|
||
}
|
||
return -1;
|
||
}
|
||
function escapedHexLen(c) {
|
||
if (c === 120) {
|
||
return 2;
|
||
}
|
||
if (c === 117) {
|
||
return 4;
|
||
}
|
||
if (c === 85) {
|
||
return 8;
|
||
}
|
||
return 0;
|
||
}
|
||
function fromDecimalCode(c) {
|
||
if (48 <= c && c <= 57) {
|
||
return c - 48;
|
||
}
|
||
return -1;
|
||
}
|
||
function simpleEscapeSequence(c) {
|
||
return c === 48 ? "\0" : c === 97 ? "\x07" : c === 98 ? "\b" : c === 116 ? " " : c === 9 ? " " : c === 110 ? "\n" : c === 118 ? "\v" : c === 102 ? "\f" : c === 114 ? "\r" : c === 101 ? "\x1B" : c === 32 ? " " : c === 34 ? '"' : c === 47 ? "/" : c === 92 ? "\\" : c === 78 ? "
" : c === 95 ? " " : c === 76 ? "\u2028" : c === 80 ? "\u2029" : "";
|
||
}
|
||
function charFromCodepoint(c) {
|
||
if (c <= 65535) {
|
||
return String.fromCharCode(c);
|
||
}
|
||
return String.fromCharCode(
|
||
(c - 65536 >> 10) + 55296,
|
||
(c - 65536 & 1023) + 56320
|
||
);
|
||
}
|
||
var simpleEscapeCheck = new Array(256);
|
||
var simpleEscapeMap = new Array(256);
|
||
for (var i = 0; i < 256; i++) {
|
||
simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
|
||
simpleEscapeMap[i] = simpleEscapeSequence(i);
|
||
}
|
||
function State$1(input, options) {
|
||
this.input = input;
|
||
this.filename = options["filename"] || null;
|
||
this.schema = options["schema"] || _default;
|
||
this.onWarning = options["onWarning"] || null;
|
||
this.legacy = options["legacy"] || false;
|
||
this.json = options["json"] || false;
|
||
this.listener = options["listener"] || null;
|
||
this.implicitTypes = this.schema.compiledImplicit;
|
||
this.typeMap = this.schema.compiledTypeMap;
|
||
this.length = input.length;
|
||
this.position = 0;
|
||
this.line = 0;
|
||
this.lineStart = 0;
|
||
this.lineIndent = 0;
|
||
this.firstTabInLine = -1;
|
||
this.documents = [];
|
||
}
|
||
function generateError(state, message) {
|
||
var mark = {
|
||
name: state.filename,
|
||
buffer: state.input.slice(0, -1),
|
||
// omit trailing \0
|
||
position: state.position,
|
||
line: state.line,
|
||
column: state.position - state.lineStart
|
||
};
|
||
mark.snippet = snippet(mark);
|
||
return new exception(message, mark);
|
||
}
|
||
function throwError(state, message) {
|
||
throw generateError(state, message);
|
||
}
|
||
function throwWarning(state, message) {
|
||
if (state.onWarning) {
|
||
state.onWarning.call(null, generateError(state, message));
|
||
}
|
||
}
|
||
var directiveHandlers = {
|
||
YAML: function handleYamlDirective(state, name, args) {
|
||
var match, major, minor;
|
||
if (state.version !== null) {
|
||
throwError(state, "duplication of %YAML directive");
|
||
}
|
||
if (args.length !== 1) {
|
||
throwError(state, "YAML directive accepts exactly one argument");
|
||
}
|
||
match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);
|
||
if (match === null) {
|
||
throwError(state, "ill-formed argument of the YAML directive");
|
||
}
|
||
major = parseInt(match[1], 10);
|
||
minor = parseInt(match[2], 10);
|
||
if (major !== 1) {
|
||
throwError(state, "unacceptable YAML version of the document");
|
||
}
|
||
state.version = args[0];
|
||
state.checkLineBreaks = minor < 2;
|
||
if (minor !== 1 && minor !== 2) {
|
||
throwWarning(state, "unsupported YAML version of the document");
|
||
}
|
||
},
|
||
TAG: function handleTagDirective(state, name, args) {
|
||
var handle, prefix;
|
||
if (args.length !== 2) {
|
||
throwError(state, "TAG directive accepts exactly two arguments");
|
||
}
|
||
handle = args[0];
|
||
prefix = args[1];
|
||
if (!PATTERN_TAG_HANDLE.test(handle)) {
|
||
throwError(state, "ill-formed tag handle (first argument) of the TAG directive");
|
||
}
|
||
if (_hasOwnProperty$1.call(state.tagMap, handle)) {
|
||
throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
|
||
}
|
||
if (!PATTERN_TAG_URI.test(prefix)) {
|
||
throwError(state, "ill-formed tag prefix (second argument) of the TAG directive");
|
||
}
|
||
try {
|
||
prefix = decodeURIComponent(prefix);
|
||
} catch (err) {
|
||
throwError(state, "tag prefix is malformed: " + prefix);
|
||
}
|
||
state.tagMap[handle] = prefix;
|
||
}
|
||
};
|
||
function captureSegment(state, start, end, checkJson) {
|
||
var _position, _length, _character, _result;
|
||
if (start < end) {
|
||
_result = state.input.slice(start, end);
|
||
if (checkJson) {
|
||
for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
|
||
_character = _result.charCodeAt(_position);
|
||
if (!(_character === 9 || 32 <= _character && _character <= 1114111)) {
|
||
throwError(state, "expected valid JSON character");
|
||
}
|
||
}
|
||
} else if (PATTERN_NON_PRINTABLE.test(_result)) {
|
||
throwError(state, "the stream contains non-printable characters");
|
||
}
|
||
state.result += _result;
|
||
}
|
||
}
|
||
function mergeMappings(state, destination, source, overridableKeys) {
|
||
var sourceKeys, key, index, quantity;
|
||
if (!common.isObject(source)) {
|
||
throwError(state, "cannot merge mappings; the provided source object is unacceptable");
|
||
}
|
||
sourceKeys = Object.keys(source);
|
||
for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
|
||
key = sourceKeys[index];
|
||
if (!_hasOwnProperty$1.call(destination, key)) {
|
||
destination[key] = source[key];
|
||
overridableKeys[key] = true;
|
||
}
|
||
}
|
||
}
|
||
function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startLineStart, startPos) {
|
||
var index, quantity;
|
||
if (Array.isArray(keyNode)) {
|
||
keyNode = Array.prototype.slice.call(keyNode);
|
||
for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
|
||
if (Array.isArray(keyNode[index])) {
|
||
throwError(state, "nested arrays are not supported inside keys");
|
||
}
|
||
if (typeof keyNode === "object" && _class(keyNode[index]) === "[object Object]") {
|
||
keyNode[index] = "[object Object]";
|
||
}
|
||
}
|
||
}
|
||
if (typeof keyNode === "object" && _class(keyNode) === "[object Object]") {
|
||
keyNode = "[object Object]";
|
||
}
|
||
keyNode = String(keyNode);
|
||
if (_result === null) {
|
||
_result = {};
|
||
}
|
||
if (keyTag === "tag:yaml.org,2002:merge") {
|
||
if (Array.isArray(valueNode)) {
|
||
for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
|
||
mergeMappings(state, _result, valueNode[index], overridableKeys);
|
||
}
|
||
} else {
|
||
mergeMappings(state, _result, valueNode, overridableKeys);
|
||
}
|
||
} else {
|
||
if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) {
|
||
state.line = startLine || state.line;
|
||
state.lineStart = startLineStart || state.lineStart;
|
||
state.position = startPos || state.position;
|
||
throwError(state, "duplicated mapping key");
|
||
}
|
||
if (keyNode === "__proto__") {
|
||
Object.defineProperty(_result, keyNode, {
|
||
configurable: true,
|
||
enumerable: true,
|
||
writable: true,
|
||
value: valueNode
|
||
});
|
||
} else {
|
||
_result[keyNode] = valueNode;
|
||
}
|
||
delete overridableKeys[keyNode];
|
||
}
|
||
return _result;
|
||
}
|
||
function readLineBreak(state) {
|
||
var ch;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch === 10) {
|
||
state.position++;
|
||
} else if (ch === 13) {
|
||
state.position++;
|
||
if (state.input.charCodeAt(state.position) === 10) {
|
||
state.position++;
|
||
}
|
||
} else {
|
||
throwError(state, "a line break is expected");
|
||
}
|
||
state.line += 1;
|
||
state.lineStart = state.position;
|
||
state.firstTabInLine = -1;
|
||
}
|
||
function skipSeparationSpace(state, allowComments, checkIndent) {
|
||
var lineBreaks = 0, ch = state.input.charCodeAt(state.position);
|
||
while (ch !== 0) {
|
||
while (is_WHITE_SPACE(ch)) {
|
||
if (ch === 9 && state.firstTabInLine === -1) {
|
||
state.firstTabInLine = state.position;
|
||
}
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
if (allowComments && ch === 35) {
|
||
do {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} while (ch !== 10 && ch !== 13 && ch !== 0);
|
||
}
|
||
if (is_EOL(ch)) {
|
||
readLineBreak(state);
|
||
ch = state.input.charCodeAt(state.position);
|
||
lineBreaks++;
|
||
state.lineIndent = 0;
|
||
while (ch === 32) {
|
||
state.lineIndent++;
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
|
||
throwWarning(state, "deficient indentation");
|
||
}
|
||
return lineBreaks;
|
||
}
|
||
function testDocumentSeparator(state) {
|
||
var _position = state.position, ch;
|
||
ch = state.input.charCodeAt(_position);
|
||
if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) {
|
||
_position += 3;
|
||
ch = state.input.charCodeAt(_position);
|
||
if (ch === 0 || is_WS_OR_EOL(ch)) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
function writeFoldedLines(state, count) {
|
||
if (count === 1) {
|
||
state.result += " ";
|
||
} else if (count > 1) {
|
||
state.result += common.repeat("\n", count - 1);
|
||
}
|
||
}
|
||
function readPlainScalar(state, nodeIndent, withinFlowCollection) {
|
||
var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) {
|
||
return false;
|
||
}
|
||
if (ch === 63 || ch === 45) {
|
||
following = state.input.charCodeAt(state.position + 1);
|
||
if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {
|
||
return false;
|
||
}
|
||
}
|
||
state.kind = "scalar";
|
||
state.result = "";
|
||
captureStart = captureEnd = state.position;
|
||
hasPendingContent = false;
|
||
while (ch !== 0) {
|
||
if (ch === 58) {
|
||
following = state.input.charCodeAt(state.position + 1);
|
||
if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {
|
||
break;
|
||
}
|
||
} else if (ch === 35) {
|
||
preceding = state.input.charCodeAt(state.position - 1);
|
||
if (is_WS_OR_EOL(preceding)) {
|
||
break;
|
||
}
|
||
} else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) {
|
||
break;
|
||
} else if (is_EOL(ch)) {
|
||
_line = state.line;
|
||
_lineStart = state.lineStart;
|
||
_lineIndent = state.lineIndent;
|
||
skipSeparationSpace(state, false, -1);
|
||
if (state.lineIndent >= nodeIndent) {
|
||
hasPendingContent = true;
|
||
ch = state.input.charCodeAt(state.position);
|
||
continue;
|
||
} else {
|
||
state.position = captureEnd;
|
||
state.line = _line;
|
||
state.lineStart = _lineStart;
|
||
state.lineIndent = _lineIndent;
|
||
break;
|
||
}
|
||
}
|
||
if (hasPendingContent) {
|
||
captureSegment(state, captureStart, captureEnd, false);
|
||
writeFoldedLines(state, state.line - _line);
|
||
captureStart = captureEnd = state.position;
|
||
hasPendingContent = false;
|
||
}
|
||
if (!is_WHITE_SPACE(ch)) {
|
||
captureEnd = state.position + 1;
|
||
}
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
captureSegment(state, captureStart, captureEnd, false);
|
||
if (state.result) {
|
||
return true;
|
||
}
|
||
state.kind = _kind;
|
||
state.result = _result;
|
||
return false;
|
||
}
|
||
function readSingleQuotedScalar(state, nodeIndent) {
|
||
var ch, captureStart, captureEnd;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch !== 39) {
|
||
return false;
|
||
}
|
||
state.kind = "scalar";
|
||
state.result = "";
|
||
state.position++;
|
||
captureStart = captureEnd = state.position;
|
||
while ((ch = state.input.charCodeAt(state.position)) !== 0) {
|
||
if (ch === 39) {
|
||
captureSegment(state, captureStart, state.position, true);
|
||
ch = state.input.charCodeAt(++state.position);
|
||
if (ch === 39) {
|
||
captureStart = state.position;
|
||
state.position++;
|
||
captureEnd = state.position;
|
||
} else {
|
||
return true;
|
||
}
|
||
} else if (is_EOL(ch)) {
|
||
captureSegment(state, captureStart, captureEnd, true);
|
||
writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
|
||
captureStart = captureEnd = state.position;
|
||
} else if (state.position === state.lineStart && testDocumentSeparator(state)) {
|
||
throwError(state, "unexpected end of the document within a single quoted scalar");
|
||
} else {
|
||
state.position++;
|
||
captureEnd = state.position;
|
||
}
|
||
}
|
||
throwError(state, "unexpected end of the stream within a single quoted scalar");
|
||
}
|
||
function readDoubleQuotedScalar(state, nodeIndent) {
|
||
var captureStart, captureEnd, hexLength, hexResult, tmp, ch;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch !== 34) {
|
||
return false;
|
||
}
|
||
state.kind = "scalar";
|
||
state.result = "";
|
||
state.position++;
|
||
captureStart = captureEnd = state.position;
|
||
while ((ch = state.input.charCodeAt(state.position)) !== 0) {
|
||
if (ch === 34) {
|
||
captureSegment(state, captureStart, state.position, true);
|
||
state.position++;
|
||
return true;
|
||
} else if (ch === 92) {
|
||
captureSegment(state, captureStart, state.position, true);
|
||
ch = state.input.charCodeAt(++state.position);
|
||
if (is_EOL(ch)) {
|
||
skipSeparationSpace(state, false, nodeIndent);
|
||
} else if (ch < 256 && simpleEscapeCheck[ch]) {
|
||
state.result += simpleEscapeMap[ch];
|
||
state.position++;
|
||
} else if ((tmp = escapedHexLen(ch)) > 0) {
|
||
hexLength = tmp;
|
||
hexResult = 0;
|
||
for (; hexLength > 0; hexLength--) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
if ((tmp = fromHexCode(ch)) >= 0) {
|
||
hexResult = (hexResult << 4) + tmp;
|
||
} else {
|
||
throwError(state, "expected hexadecimal character");
|
||
}
|
||
}
|
||
state.result += charFromCodepoint(hexResult);
|
||
state.position++;
|
||
} else {
|
||
throwError(state, "unknown escape sequence");
|
||
}
|
||
captureStart = captureEnd = state.position;
|
||
} else if (is_EOL(ch)) {
|
||
captureSegment(state, captureStart, captureEnd, true);
|
||
writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
|
||
captureStart = captureEnd = state.position;
|
||
} else if (state.position === state.lineStart && testDocumentSeparator(state)) {
|
||
throwError(state, "unexpected end of the document within a double quoted scalar");
|
||
} else {
|
||
state.position++;
|
||
captureEnd = state.position;
|
||
}
|
||
}
|
||
throwError(state, "unexpected end of the stream within a double quoted scalar");
|
||
}
|
||
function readFlowCollection(state, nodeIndent) {
|
||
var readNext = true, _line, _lineStart, _pos, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = /* @__PURE__ */ Object.create(null), keyNode, keyTag, valueNode, ch;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch === 91) {
|
||
terminator = 93;
|
||
isMapping = false;
|
||
_result = [];
|
||
} else if (ch === 123) {
|
||
terminator = 125;
|
||
isMapping = true;
|
||
_result = {};
|
||
} else {
|
||
return false;
|
||
}
|
||
if (state.anchor !== null) {
|
||
state.anchorMap[state.anchor] = _result;
|
||
}
|
||
ch = state.input.charCodeAt(++state.position);
|
||
while (ch !== 0) {
|
||
skipSeparationSpace(state, true, nodeIndent);
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch === terminator) {
|
||
state.position++;
|
||
state.tag = _tag;
|
||
state.anchor = _anchor;
|
||
state.kind = isMapping ? "mapping" : "sequence";
|
||
state.result = _result;
|
||
return true;
|
||
} else if (!readNext) {
|
||
throwError(state, "missed comma between flow collection entries");
|
||
} else if (ch === 44) {
|
||
throwError(state, "expected the node content, but found ','");
|
||
}
|
||
keyTag = keyNode = valueNode = null;
|
||
isPair = isExplicitPair = false;
|
||
if (ch === 63) {
|
||
following = state.input.charCodeAt(state.position + 1);
|
||
if (is_WS_OR_EOL(following)) {
|
||
isPair = isExplicitPair = true;
|
||
state.position++;
|
||
skipSeparationSpace(state, true, nodeIndent);
|
||
}
|
||
}
|
||
_line = state.line;
|
||
_lineStart = state.lineStart;
|
||
_pos = state.position;
|
||
composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
|
||
keyTag = state.tag;
|
||
keyNode = state.result;
|
||
skipSeparationSpace(state, true, nodeIndent);
|
||
ch = state.input.charCodeAt(state.position);
|
||
if ((isExplicitPair || state.line === _line) && ch === 58) {
|
||
isPair = true;
|
||
ch = state.input.charCodeAt(++state.position);
|
||
skipSeparationSpace(state, true, nodeIndent);
|
||
composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
|
||
valueNode = state.result;
|
||
}
|
||
if (isMapping) {
|
||
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);
|
||
} else if (isPair) {
|
||
_result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));
|
||
} else {
|
||
_result.push(keyNode);
|
||
}
|
||
skipSeparationSpace(state, true, nodeIndent);
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch === 44) {
|
||
readNext = true;
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} else {
|
||
readNext = false;
|
||
}
|
||
}
|
||
throwError(state, "unexpected end of the stream within a flow collection");
|
||
}
|
||
function readBlockScalar(state, nodeIndent) {
|
||
var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch === 124) {
|
||
folding = false;
|
||
} else if (ch === 62) {
|
||
folding = true;
|
||
} else {
|
||
return false;
|
||
}
|
||
state.kind = "scalar";
|
||
state.result = "";
|
||
while (ch !== 0) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
if (ch === 43 || ch === 45) {
|
||
if (CHOMPING_CLIP === chomping) {
|
||
chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP;
|
||
} else {
|
||
throwError(state, "repeat of a chomping mode identifier");
|
||
}
|
||
} else if ((tmp = fromDecimalCode(ch)) >= 0) {
|
||
if (tmp === 0) {
|
||
throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one");
|
||
} else if (!detectedIndent) {
|
||
textIndent = nodeIndent + tmp - 1;
|
||
detectedIndent = true;
|
||
} else {
|
||
throwError(state, "repeat of an indentation width identifier");
|
||
}
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
if (is_WHITE_SPACE(ch)) {
|
||
do {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} while (is_WHITE_SPACE(ch));
|
||
if (ch === 35) {
|
||
do {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} while (!is_EOL(ch) && ch !== 0);
|
||
}
|
||
}
|
||
while (ch !== 0) {
|
||
readLineBreak(state);
|
||
state.lineIndent = 0;
|
||
ch = state.input.charCodeAt(state.position);
|
||
while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) {
|
||
state.lineIndent++;
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
if (!detectedIndent && state.lineIndent > textIndent) {
|
||
textIndent = state.lineIndent;
|
||
}
|
||
if (is_EOL(ch)) {
|
||
emptyLines++;
|
||
continue;
|
||
}
|
||
if (state.lineIndent < textIndent) {
|
||
if (chomping === CHOMPING_KEEP) {
|
||
state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
|
||
} else if (chomping === CHOMPING_CLIP) {
|
||
if (didReadContent) {
|
||
state.result += "\n";
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
if (folding) {
|
||
if (is_WHITE_SPACE(ch)) {
|
||
atMoreIndented = true;
|
||
state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
|
||
} else if (atMoreIndented) {
|
||
atMoreIndented = false;
|
||
state.result += common.repeat("\n", emptyLines + 1);
|
||
} else if (emptyLines === 0) {
|
||
if (didReadContent) {
|
||
state.result += " ";
|
||
}
|
||
} else {
|
||
state.result += common.repeat("\n", emptyLines);
|
||
}
|
||
} else {
|
||
state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
|
||
}
|
||
didReadContent = true;
|
||
detectedIndent = true;
|
||
emptyLines = 0;
|
||
captureStart = state.position;
|
||
while (!is_EOL(ch) && ch !== 0) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
captureSegment(state, captureStart, state.position, false);
|
||
}
|
||
return true;
|
||
}
|
||
function readBlockSequence(state, nodeIndent) {
|
||
var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch;
|
||
if (state.firstTabInLine !== -1)
|
||
return false;
|
||
if (state.anchor !== null) {
|
||
state.anchorMap[state.anchor] = _result;
|
||
}
|
||
ch = state.input.charCodeAt(state.position);
|
||
while (ch !== 0) {
|
||
if (state.firstTabInLine !== -1) {
|
||
state.position = state.firstTabInLine;
|
||
throwError(state, "tab characters must not be used in indentation");
|
||
}
|
||
if (ch !== 45) {
|
||
break;
|
||
}
|
||
following = state.input.charCodeAt(state.position + 1);
|
||
if (!is_WS_OR_EOL(following)) {
|
||
break;
|
||
}
|
||
detected = true;
|
||
state.position++;
|
||
if (skipSeparationSpace(state, true, -1)) {
|
||
if (state.lineIndent <= nodeIndent) {
|
||
_result.push(null);
|
||
ch = state.input.charCodeAt(state.position);
|
||
continue;
|
||
}
|
||
}
|
||
_line = state.line;
|
||
composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
|
||
_result.push(state.result);
|
||
skipSeparationSpace(state, true, -1);
|
||
ch = state.input.charCodeAt(state.position);
|
||
if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) {
|
||
throwError(state, "bad indentation of a sequence entry");
|
||
} else if (state.lineIndent < nodeIndent) {
|
||
break;
|
||
}
|
||
}
|
||
if (detected) {
|
||
state.tag = _tag;
|
||
state.anchor = _anchor;
|
||
state.kind = "sequence";
|
||
state.result = _result;
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
function readBlockMapping(state, nodeIndent, flowIndent) {
|
||
var following, allowCompact, _line, _keyLine, _keyLineStart, _keyPos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = /* @__PURE__ */ Object.create(null), keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch;
|
||
if (state.firstTabInLine !== -1)
|
||
return false;
|
||
if (state.anchor !== null) {
|
||
state.anchorMap[state.anchor] = _result;
|
||
}
|
||
ch = state.input.charCodeAt(state.position);
|
||
while (ch !== 0) {
|
||
if (!atExplicitKey && state.firstTabInLine !== -1) {
|
||
state.position = state.firstTabInLine;
|
||
throwError(state, "tab characters must not be used in indentation");
|
||
}
|
||
following = state.input.charCodeAt(state.position + 1);
|
||
_line = state.line;
|
||
if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) {
|
||
if (ch === 63) {
|
||
if (atExplicitKey) {
|
||
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
|
||
keyTag = keyNode = valueNode = null;
|
||
}
|
||
detected = true;
|
||
atExplicitKey = true;
|
||
allowCompact = true;
|
||
} else if (atExplicitKey) {
|
||
atExplicitKey = false;
|
||
allowCompact = true;
|
||
} else {
|
||
throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line");
|
||
}
|
||
state.position += 1;
|
||
ch = following;
|
||
} else {
|
||
_keyLine = state.line;
|
||
_keyLineStart = state.lineStart;
|
||
_keyPos = state.position;
|
||
if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {
|
||
break;
|
||
}
|
||
if (state.line === _line) {
|
||
ch = state.input.charCodeAt(state.position);
|
||
while (is_WHITE_SPACE(ch)) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
if (ch === 58) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
if (!is_WS_OR_EOL(ch)) {
|
||
throwError(state, "a whitespace character is expected after the key-value separator within a block mapping");
|
||
}
|
||
if (atExplicitKey) {
|
||
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
|
||
keyTag = keyNode = valueNode = null;
|
||
}
|
||
detected = true;
|
||
atExplicitKey = false;
|
||
allowCompact = false;
|
||
keyTag = state.tag;
|
||
keyNode = state.result;
|
||
} else if (detected) {
|
||
throwError(state, "can not read an implicit mapping pair; a colon is missed");
|
||
} else {
|
||
state.tag = _tag;
|
||
state.anchor = _anchor;
|
||
return true;
|
||
}
|
||
} else if (detected) {
|
||
throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key");
|
||
} else {
|
||
state.tag = _tag;
|
||
state.anchor = _anchor;
|
||
return true;
|
||
}
|
||
}
|
||
if (state.line === _line || state.lineIndent > nodeIndent) {
|
||
if (atExplicitKey) {
|
||
_keyLine = state.line;
|
||
_keyLineStart = state.lineStart;
|
||
_keyPos = state.position;
|
||
}
|
||
if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
|
||
if (atExplicitKey) {
|
||
keyNode = state.result;
|
||
} else {
|
||
valueNode = state.result;
|
||
}
|
||
}
|
||
if (!atExplicitKey) {
|
||
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);
|
||
keyTag = keyNode = valueNode = null;
|
||
}
|
||
skipSeparationSpace(state, true, -1);
|
||
ch = state.input.charCodeAt(state.position);
|
||
}
|
||
if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) {
|
||
throwError(state, "bad indentation of a mapping entry");
|
||
} else if (state.lineIndent < nodeIndent) {
|
||
break;
|
||
}
|
||
}
|
||
if (atExplicitKey) {
|
||
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
|
||
}
|
||
if (detected) {
|
||
state.tag = _tag;
|
||
state.anchor = _anchor;
|
||
state.kind = "mapping";
|
||
state.result = _result;
|
||
}
|
||
return detected;
|
||
}
|
||
function readTagProperty(state) {
|
||
var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch !== 33)
|
||
return false;
|
||
if (state.tag !== null) {
|
||
throwError(state, "duplication of a tag property");
|
||
}
|
||
ch = state.input.charCodeAt(++state.position);
|
||
if (ch === 60) {
|
||
isVerbatim = true;
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} else if (ch === 33) {
|
||
isNamed = true;
|
||
tagHandle = "!!";
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} else {
|
||
tagHandle = "!";
|
||
}
|
||
_position = state.position;
|
||
if (isVerbatim) {
|
||
do {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} while (ch !== 0 && ch !== 62);
|
||
if (state.position < state.length) {
|
||
tagName = state.input.slice(_position, state.position);
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} else {
|
||
throwError(state, "unexpected end of the stream within a verbatim tag");
|
||
}
|
||
} else {
|
||
while (ch !== 0 && !is_WS_OR_EOL(ch)) {
|
||
if (ch === 33) {
|
||
if (!isNamed) {
|
||
tagHandle = state.input.slice(_position - 1, state.position + 1);
|
||
if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
|
||
throwError(state, "named tag handle cannot contain such characters");
|
||
}
|
||
isNamed = true;
|
||
_position = state.position + 1;
|
||
} else {
|
||
throwError(state, "tag suffix cannot contain exclamation marks");
|
||
}
|
||
}
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
tagName = state.input.slice(_position, state.position);
|
||
if (PATTERN_FLOW_INDICATORS.test(tagName)) {
|
||
throwError(state, "tag suffix cannot contain flow indicator characters");
|
||
}
|
||
}
|
||
if (tagName && !PATTERN_TAG_URI.test(tagName)) {
|
||
throwError(state, "tag name cannot contain such characters: " + tagName);
|
||
}
|
||
try {
|
||
tagName = decodeURIComponent(tagName);
|
||
} catch (err) {
|
||
throwError(state, "tag name is malformed: " + tagName);
|
||
}
|
||
if (isVerbatim) {
|
||
state.tag = tagName;
|
||
} else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {
|
||
state.tag = state.tagMap[tagHandle] + tagName;
|
||
} else if (tagHandle === "!") {
|
||
state.tag = "!" + tagName;
|
||
} else if (tagHandle === "!!") {
|
||
state.tag = "tag:yaml.org,2002:" + tagName;
|
||
} else {
|
||
throwError(state, 'undeclared tag handle "' + tagHandle + '"');
|
||
}
|
||
return true;
|
||
}
|
||
function readAnchorProperty(state) {
|
||
var _position, ch;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch !== 38)
|
||
return false;
|
||
if (state.anchor !== null) {
|
||
throwError(state, "duplication of an anchor property");
|
||
}
|
||
ch = state.input.charCodeAt(++state.position);
|
||
_position = state.position;
|
||
while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
if (state.position === _position) {
|
||
throwError(state, "name of an anchor node must contain at least one character");
|
||
}
|
||
state.anchor = state.input.slice(_position, state.position);
|
||
return true;
|
||
}
|
||
function readAlias(state) {
|
||
var _position, alias, ch;
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (ch !== 42)
|
||
return false;
|
||
ch = state.input.charCodeAt(++state.position);
|
||
_position = state.position;
|
||
while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
if (state.position === _position) {
|
||
throwError(state, "name of an alias node must contain at least one character");
|
||
}
|
||
alias = state.input.slice(_position, state.position);
|
||
if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {
|
||
throwError(state, 'unidentified alias "' + alias + '"');
|
||
}
|
||
state.result = state.anchorMap[alias];
|
||
skipSeparationSpace(state, true, -1);
|
||
return true;
|
||
}
|
||
function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
|
||
var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, typeList, type2, flowIndent, blockIndent;
|
||
if (state.listener !== null) {
|
||
state.listener("open", state);
|
||
}
|
||
state.tag = null;
|
||
state.anchor = null;
|
||
state.kind = null;
|
||
state.result = null;
|
||
allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext;
|
||
if (allowToSeek) {
|
||
if (skipSeparationSpace(state, true, -1)) {
|
||
atNewLine = true;
|
||
if (state.lineIndent > parentIndent) {
|
||
indentStatus = 1;
|
||
} else if (state.lineIndent === parentIndent) {
|
||
indentStatus = 0;
|
||
} else if (state.lineIndent < parentIndent) {
|
||
indentStatus = -1;
|
||
}
|
||
}
|
||
}
|
||
if (indentStatus === 1) {
|
||
while (readTagProperty(state) || readAnchorProperty(state)) {
|
||
if (skipSeparationSpace(state, true, -1)) {
|
||
atNewLine = true;
|
||
allowBlockCollections = allowBlockStyles;
|
||
if (state.lineIndent > parentIndent) {
|
||
indentStatus = 1;
|
||
} else if (state.lineIndent === parentIndent) {
|
||
indentStatus = 0;
|
||
} else if (state.lineIndent < parentIndent) {
|
||
indentStatus = -1;
|
||
}
|
||
} else {
|
||
allowBlockCollections = false;
|
||
}
|
||
}
|
||
}
|
||
if (allowBlockCollections) {
|
||
allowBlockCollections = atNewLine || allowCompact;
|
||
}
|
||
if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
|
||
if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
|
||
flowIndent = parentIndent;
|
||
} else {
|
||
flowIndent = parentIndent + 1;
|
||
}
|
||
blockIndent = state.position - state.lineStart;
|
||
if (indentStatus === 1) {
|
||
if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) {
|
||
hasContent = true;
|
||
} else {
|
||
if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) {
|
||
hasContent = true;
|
||
} else if (readAlias(state)) {
|
||
hasContent = true;
|
||
if (state.tag !== null || state.anchor !== null) {
|
||
throwError(state, "alias node should not have any properties");
|
||
}
|
||
} else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
|
||
hasContent = true;
|
||
if (state.tag === null) {
|
||
state.tag = "?";
|
||
}
|
||
}
|
||
if (state.anchor !== null) {
|
||
state.anchorMap[state.anchor] = state.result;
|
||
}
|
||
}
|
||
} else if (indentStatus === 0) {
|
||
hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
|
||
}
|
||
}
|
||
if (state.tag === null) {
|
||
if (state.anchor !== null) {
|
||
state.anchorMap[state.anchor] = state.result;
|
||
}
|
||
} else if (state.tag === "?") {
|
||
if (state.result !== null && state.kind !== "scalar") {
|
||
throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
|
||
}
|
||
for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
|
||
type2 = state.implicitTypes[typeIndex];
|
||
if (type2.resolve(state.result)) {
|
||
state.result = type2.construct(state.result);
|
||
state.tag = type2.tag;
|
||
if (state.anchor !== null) {
|
||
state.anchorMap[state.anchor] = state.result;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
} else if (state.tag !== "!") {
|
||
if (_hasOwnProperty$1.call(state.typeMap[state.kind || "fallback"], state.tag)) {
|
||
type2 = state.typeMap[state.kind || "fallback"][state.tag];
|
||
} else {
|
||
type2 = null;
|
||
typeList = state.typeMap.multi[state.kind || "fallback"];
|
||
for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {
|
||
if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {
|
||
type2 = typeList[typeIndex];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (!type2) {
|
||
throwError(state, "unknown tag !<" + state.tag + ">");
|
||
}
|
||
if (state.result !== null && type2.kind !== state.kind) {
|
||
throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type2.kind + '", not "' + state.kind + '"');
|
||
}
|
||
if (!type2.resolve(state.result, state.tag)) {
|
||
throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag");
|
||
} else {
|
||
state.result = type2.construct(state.result, state.tag);
|
||
if (state.anchor !== null) {
|
||
state.anchorMap[state.anchor] = state.result;
|
||
}
|
||
}
|
||
}
|
||
if (state.listener !== null) {
|
||
state.listener("close", state);
|
||
}
|
||
return state.tag !== null || state.anchor !== null || hasContent;
|
||
}
|
||
function readDocument(state) {
|
||
var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch;
|
||
state.version = null;
|
||
state.checkLineBreaks = state.legacy;
|
||
state.tagMap = /* @__PURE__ */ Object.create(null);
|
||
state.anchorMap = /* @__PURE__ */ Object.create(null);
|
||
while ((ch = state.input.charCodeAt(state.position)) !== 0) {
|
||
skipSeparationSpace(state, true, -1);
|
||
ch = state.input.charCodeAt(state.position);
|
||
if (state.lineIndent > 0 || ch !== 37) {
|
||
break;
|
||
}
|
||
hasDirectives = true;
|
||
ch = state.input.charCodeAt(++state.position);
|
||
_position = state.position;
|
||
while (ch !== 0 && !is_WS_OR_EOL(ch)) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
directiveName = state.input.slice(_position, state.position);
|
||
directiveArgs = [];
|
||
if (directiveName.length < 1) {
|
||
throwError(state, "directive name must not be less than one character in length");
|
||
}
|
||
while (ch !== 0) {
|
||
while (is_WHITE_SPACE(ch)) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
if (ch === 35) {
|
||
do {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
} while (ch !== 0 && !is_EOL(ch));
|
||
break;
|
||
}
|
||
if (is_EOL(ch))
|
||
break;
|
||
_position = state.position;
|
||
while (ch !== 0 && !is_WS_OR_EOL(ch)) {
|
||
ch = state.input.charCodeAt(++state.position);
|
||
}
|
||
directiveArgs.push(state.input.slice(_position, state.position));
|
||
}
|
||
if (ch !== 0)
|
||
readLineBreak(state);
|
||
if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {
|
||
directiveHandlers[directiveName](state, directiveName, directiveArgs);
|
||
} else {
|
||
throwWarning(state, 'unknown document directive "' + directiveName + '"');
|
||
}
|
||
}
|
||
skipSeparationSpace(state, true, -1);
|
||
if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) {
|
||
state.position += 3;
|
||
skipSeparationSpace(state, true, -1);
|
||
} else if (hasDirectives) {
|
||
throwError(state, "directives end mark is expected");
|
||
}
|
||
composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
|
||
skipSeparationSpace(state, true, -1);
|
||
if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
|
||
throwWarning(state, "non-ASCII line breaks are interpreted as content");
|
||
}
|
||
state.documents.push(state.result);
|
||
if (state.position === state.lineStart && testDocumentSeparator(state)) {
|
||
if (state.input.charCodeAt(state.position) === 46) {
|
||
state.position += 3;
|
||
skipSeparationSpace(state, true, -1);
|
||
}
|
||
return;
|
||
}
|
||
if (state.position < state.length - 1) {
|
||
throwError(state, "end of the stream or a document separator is expected");
|
||
} else {
|
||
return;
|
||
}
|
||
}
|
||
function loadDocuments(input, options) {
|
||
input = String(input);
|
||
options = options || {};
|
||
if (input.length !== 0) {
|
||
if (input.charCodeAt(input.length - 1) !== 10 && input.charCodeAt(input.length - 1) !== 13) {
|
||
input += "\n";
|
||
}
|
||
if (input.charCodeAt(0) === 65279) {
|
||
input = input.slice(1);
|
||
}
|
||
}
|
||
var state = new State$1(input, options);
|
||
var nullpos = input.indexOf("\0");
|
||
if (nullpos !== -1) {
|
||
state.position = nullpos;
|
||
throwError(state, "null byte is not allowed in input");
|
||
}
|
||
state.input += "\0";
|
||
while (state.input.charCodeAt(state.position) === 32) {
|
||
state.lineIndent += 1;
|
||
state.position += 1;
|
||
}
|
||
while (state.position < state.length - 1) {
|
||
readDocument(state);
|
||
}
|
||
return state.documents;
|
||
}
|
||
function loadAll$1(input, iterator2, options) {
|
||
if (iterator2 !== null && typeof iterator2 === "object" && typeof options === "undefined") {
|
||
options = iterator2;
|
||
iterator2 = null;
|
||
}
|
||
var documents = loadDocuments(input, options);
|
||
if (typeof iterator2 !== "function") {
|
||
return documents;
|
||
}
|
||
for (var index = 0, length = documents.length; index < length; index += 1) {
|
||
iterator2(documents[index]);
|
||
}
|
||
}
|
||
function load$1(input, options) {
|
||
var documents = loadDocuments(input, options);
|
||
if (documents.length === 0) {
|
||
return void 0;
|
||
} else if (documents.length === 1) {
|
||
return documents[0];
|
||
}
|
||
throw new exception("expected a single document in the stream, but found more");
|
||
}
|
||
var loadAll_1 = loadAll$1;
|
||
var load_1 = load$1;
|
||
var loader = {
|
||
loadAll: loadAll_1,
|
||
load: load_1
|
||
};
|
||
var FAILSAFE_SCHEMA = failsafe;
|
||
var load = loader.load;
|
||
const frontMatterRegex = /^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s;
|
||
function extractFrontMatter(text, db) {
|
||
var _a;
|
||
const matches = text.match(frontMatterRegex);
|
||
if (matches) {
|
||
const parsed = load(matches[1], {
|
||
// To keep things simple, only allow strings, arrays, and plain objects.
|
||
// https://www.yaml.org/spec/1.2/spec.html#id2802346
|
||
schema: FAILSAFE_SCHEMA
|
||
});
|
||
if (parsed == null ? void 0 : parsed.title) {
|
||
(_a = db.setDiagramTitle) == null ? void 0 : _a.call(db, parsed.title);
|
||
}
|
||
return text.slice(matches[0].length);
|
||
} else {
|
||
return text;
|
||
}
|
||
}
|
||
const themes = {};
|
||
const getStyles = (type2, userStyles, options) => {
|
||
let diagramStyles = "";
|
||
if (type2 in themes && themes[type2]) {
|
||
diagramStyles = themes[type2](options);
|
||
} else {
|
||
log$1.warn(`No theme found for ${type2}`);
|
||
}
|
||
return ` & {
|
||
font-family: ${options.fontFamily};
|
||
font-size: ${options.fontSize};
|
||
fill: ${options.textColor}
|
||
}
|
||
|
||
/* Classes common for multiple diagrams */
|
||
|
||
& .error-icon {
|
||
fill: ${options.errorBkgColor};
|
||
}
|
||
& .error-text {
|
||
fill: ${options.errorTextColor};
|
||
stroke: ${options.errorTextColor};
|
||
}
|
||
|
||
& .edge-thickness-normal {
|
||
stroke-width: 2px;
|
||
}
|
||
& .edge-thickness-thick {
|
||
stroke-width: 3.5px
|
||
}
|
||
& .edge-pattern-solid {
|
||
stroke-dasharray: 0;
|
||
}
|
||
|
||
& .edge-pattern-dashed{
|
||
stroke-dasharray: 3;
|
||
}
|
||
.edge-pattern-dotted {
|
||
stroke-dasharray: 2;
|
||
}
|
||
|
||
& .marker {
|
||
fill: ${options.lineColor};
|
||
stroke: ${options.lineColor};
|
||
}
|
||
& .marker.cross {
|
||
stroke: ${options.lineColor};
|
||
}
|
||
|
||
& svg {
|
||
font-family: ${options.fontFamily};
|
||
font-size: ${options.fontSize};
|
||
}
|
||
|
||
${diagramStyles}
|
||
|
||
${userStyles}
|
||
`;
|
||
};
|
||
const addStylesForDiagram = (type2, diagramTheme) => {
|
||
themes[type2] = diagramTheme;
|
||
};
|
||
const getStyles$1 = getStyles;
|
||
let currentDirective = {};
|
||
const parseDirective$1 = function(p, statement, context, type2) {
|
||
log$1.debug("parseDirective is being called", statement, context, type2);
|
||
try {
|
||
if (statement !== void 0) {
|
||
statement = statement.trim();
|
||
switch (context) {
|
||
case "open_directive":
|
||
currentDirective = {};
|
||
break;
|
||
case "type_directive":
|
||
if (!currentDirective) {
|
||
throw new Error("currentDirective is undefined");
|
||
}
|
||
currentDirective.type = statement.toLowerCase();
|
||
break;
|
||
case "arg_directive":
|
||
if (!currentDirective) {
|
||
throw new Error("currentDirective is undefined");
|
||
}
|
||
currentDirective.args = JSON.parse(statement);
|
||
break;
|
||
case "close_directive":
|
||
handleDirective(p, currentDirective, type2);
|
||
currentDirective = void 0;
|
||
break;
|
||
}
|
||
}
|
||
} catch (error) {
|
||
log$1.error(
|
||
`Error while rendering sequenceDiagram directive: ${statement} jison context: ${context}`
|
||
);
|
||
log$1.error(error.message);
|
||
}
|
||
};
|
||
const handleDirective = function(p, directive2, type2) {
|
||
log$1.info(`Directive type=${directive2.type} with args:`, directive2.args);
|
||
switch (directive2.type) {
|
||
case "init":
|
||
case "initialize": {
|
||
["config"].forEach((prop) => {
|
||
if (directive2.args[prop] !== void 0) {
|
||
if (type2 === "flowchart-v2") {
|
||
type2 = "flowchart";
|
||
}
|
||
directive2.args[type2] = directive2.args[prop];
|
||
delete directive2.args[prop];
|
||
}
|
||
});
|
||
log$1.info("sanitize in handleDirective", directive2.args);
|
||
directiveSanitizer(directive2.args);
|
||
log$1.info("sanitize in handleDirective (done)", directive2.args);
|
||
addDirective(directive2.args);
|
||
break;
|
||
}
|
||
case "wrap":
|
||
case "nowrap":
|
||
if (p && p["setWrap"]) {
|
||
p.setWrap(directive2.type === "wrap");
|
||
}
|
||
break;
|
||
case "themeCss":
|
||
log$1.warn("themeCss encountered");
|
||
break;
|
||
default:
|
||
log$1.warn(
|
||
`Unhandled directive: source: '%%{${directive2.type}: ${JSON.stringify(
|
||
directive2.args ? directive2.args : {}
|
||
)}}%%`,
|
||
directive2
|
||
);
|
||
break;
|
||
}
|
||
};
|
||
const log = log$1;
|
||
const setLogLevel = setLogLevel$1;
|
||
const getConfig = getConfig$1;
|
||
const sanitizeText = (text) => sanitizeText$1(text, getConfig());
|
||
const setupGraphViewbox = setupGraphViewbox$1;
|
||
const getCommonDb = () => {
|
||
return commonDb;
|
||
};
|
||
const parseDirective = (p, statement, context, type2) => parseDirective$1(p, statement, context, type2);
|
||
const diagrams = {};
|
||
const registerDiagram = (id, diagram, detector) => {
|
||
if (diagrams[id]) {
|
||
throw new Error(`Diagram ${id} already registered.`);
|
||
}
|
||
diagrams[id] = diagram;
|
||
if (detector) {
|
||
addDetector(id, detector);
|
||
}
|
||
addStylesForDiagram(id, diagram.styles);
|
||
if (diagram.injectUtils) {
|
||
diagram.injectUtils(
|
||
log,
|
||
setLogLevel,
|
||
getConfig,
|
||
sanitizeText,
|
||
setupGraphViewbox,
|
||
getCommonDb(),
|
||
parseDirective
|
||
);
|
||
}
|
||
};
|
||
const getDiagram = (name) => {
|
||
if (name in diagrams) {
|
||
return diagrams[name];
|
||
}
|
||
throw new Error(`Diagram ${name} not found.`);
|
||
};
|
||
class UnknownDiagramError extends Error {
|
||
constructor(message) {
|
||
super(message);
|
||
this.name = "UnknownDiagramError";
|
||
}
|
||
}
|
||
const directive$1 = /%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi;
|
||
const anyComment = /\s*%%.*\n/gm;
|
||
const detectors = {};
|
||
const detectType = function(text, config) {
|
||
text = text.replace(frontMatterRegex, "").replace(directive$1, "").replace(anyComment, "\n");
|
||
for (const [key, { detector }] of Object.entries(detectors)) {
|
||
const diagram = detector(text, config);
|
||
if (diagram) {
|
||
return key;
|
||
}
|
||
}
|
||
throw new UnknownDiagramError(
|
||
`No diagram type detected matching given configuration for text: ${text}`
|
||
);
|
||
};
|
||
const registerLazyLoadedDiagrams = (...diagrams2) => {
|
||
for (const { id, detector, loader: loader2 } of diagrams2) {
|
||
addDetector(id, detector, loader2);
|
||
}
|
||
};
|
||
const loadRegisteredDiagrams = async () => {
|
||
log$1.debug(`Loading registered diagrams`);
|
||
const results = await Promise.allSettled(
|
||
Object.entries(detectors).map(async ([key, { detector, loader: loader2 }]) => {
|
||
if (loader2) {
|
||
try {
|
||
getDiagram(key);
|
||
} catch (error) {
|
||
try {
|
||
const { diagram, id } = await loader2();
|
||
registerDiagram(id, diagram, detector);
|
||
} catch (err) {
|
||
log$1.error(`Failed to load external diagram with key ${key}. Removing from detectors.`);
|
||
delete detectors[key];
|
||
throw err;
|
||
}
|
||
}
|
||
}
|
||
})
|
||
);
|
||
const failed = results.filter((result) => result.status === "rejected");
|
||
if (failed.length > 0) {
|
||
log$1.error(`Failed to load ${failed.length} external diagrams`);
|
||
for (const res of failed) {
|
||
log$1.error(res);
|
||
}
|
||
throw new Error(`Failed to load ${failed.length} external diagrams`);
|
||
}
|
||
};
|
||
const addDetector = (key, detector, loader2) => {
|
||
if (detectors[key]) {
|
||
log$1.error(`Detector with key ${key} already exists`);
|
||
} else {
|
||
detectors[key] = { detector, loader: loader2 };
|
||
}
|
||
log$1.debug(`Detector with key ${key} added${loader2 ? " with loader" : ""}`);
|
||
};
|
||
const getDiagramLoader = (key) => {
|
||
return detectors[key].loader;
|
||
};
|
||
var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
|
||
const freeGlobal$1 = freeGlobal;
|
||
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
|
||
var root = freeGlobal$1 || freeSelf || Function("return this")();
|
||
const root$1 = root;
|
||
var Symbol$1 = root$1.Symbol;
|
||
const Symbol$2 = Symbol$1;
|
||
var objectProto$4 = Object.prototype;
|
||
var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
|
||
var nativeObjectToString$1 = objectProto$4.toString;
|
||
var symToStringTag$1 = Symbol$2 ? Symbol$2.toStringTag : void 0;
|
||
function getRawTag(value) {
|
||
var isOwn = hasOwnProperty$3.call(value, symToStringTag$1), tag = value[symToStringTag$1];
|
||
try {
|
||
value[symToStringTag$1] = void 0;
|
||
var unmasked = true;
|
||
} catch (e) {
|
||
}
|
||
var result = nativeObjectToString$1.call(value);
|
||
if (unmasked) {
|
||
if (isOwn) {
|
||
value[symToStringTag$1] = tag;
|
||
} else {
|
||
delete value[symToStringTag$1];
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
var objectProto$3 = Object.prototype;
|
||
var nativeObjectToString = objectProto$3.toString;
|
||
function objectToString(value) {
|
||
return nativeObjectToString.call(value);
|
||
}
|
||
var nullTag = "[object Null]", undefinedTag = "[object Undefined]";
|
||
var symToStringTag = Symbol$2 ? Symbol$2.toStringTag : void 0;
|
||
function baseGetTag(value) {
|
||
if (value == null) {
|
||
return value === void 0 ? undefinedTag : nullTag;
|
||
}
|
||
return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
|
||
}
|
||
function isObject(value) {
|
||
var type2 = typeof value;
|
||
return value != null && (type2 == "object" || type2 == "function");
|
||
}
|
||
var asyncTag = "[object AsyncFunction]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", proxyTag = "[object Proxy]";
|
||
function isFunction(value) {
|
||
if (!isObject(value)) {
|
||
return false;
|
||
}
|
||
var tag = baseGetTag(value);
|
||
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
|
||
}
|
||
var coreJsData = root$1["__core-js_shared__"];
|
||
const coreJsData$1 = coreJsData;
|
||
var maskSrcKey = function() {
|
||
var uid = /[^.]+$/.exec(coreJsData$1 && coreJsData$1.keys && coreJsData$1.keys.IE_PROTO || "");
|
||
return uid ? "Symbol(src)_1." + uid : "";
|
||
}();
|
||
function isMasked(func) {
|
||
return !!maskSrcKey && maskSrcKey in func;
|
||
}
|
||
var funcProto$1 = Function.prototype;
|
||
var funcToString$1 = funcProto$1.toString;
|
||
function toSource(func) {
|
||
if (func != null) {
|
||
try {
|
||
return funcToString$1.call(func);
|
||
} catch (e) {
|
||
}
|
||
try {
|
||
return func + "";
|
||
} catch (e) {
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
||
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
||
var funcProto = Function.prototype, objectProto$2 = Object.prototype;
|
||
var funcToString = funcProto.toString;
|
||
var hasOwnProperty$2 = objectProto$2.hasOwnProperty;
|
||
var reIsNative = RegExp(
|
||
"^" + funcToString.call(hasOwnProperty$2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
|
||
);
|
||
function baseIsNative(value) {
|
||
if (!isObject(value) || isMasked(value)) {
|
||
return false;
|
||
}
|
||
var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
|
||
return pattern.test(toSource(value));
|
||
}
|
||
function getValue(object, key) {
|
||
return object == null ? void 0 : object[key];
|
||
}
|
||
function getNative(object, key) {
|
||
var value = getValue(object, key);
|
||
return baseIsNative(value) ? value : void 0;
|
||
}
|
||
var nativeCreate = getNative(Object, "create");
|
||
const nativeCreate$1 = nativeCreate;
|
||
function hashClear() {
|
||
this.__data__ = nativeCreate$1 ? nativeCreate$1(null) : {};
|
||
this.size = 0;
|
||
}
|
||
function hashDelete(key) {
|
||
var result = this.has(key) && delete this.__data__[key];
|
||
this.size -= result ? 1 : 0;
|
||
return result;
|
||
}
|
||
var HASH_UNDEFINED$1 = "__lodash_hash_undefined__";
|
||
var objectProto$1 = Object.prototype;
|
||
var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
|
||
function hashGet(key) {
|
||
var data = this.__data__;
|
||
if (nativeCreate$1) {
|
||
var result = data[key];
|
||
return result === HASH_UNDEFINED$1 ? void 0 : result;
|
||
}
|
||
return hasOwnProperty$1.call(data, key) ? data[key] : void 0;
|
||
}
|
||
var objectProto = Object.prototype;
|
||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||
function hashHas(key) {
|
||
var data = this.__data__;
|
||
return nativeCreate$1 ? data[key] !== void 0 : hasOwnProperty.call(data, key);
|
||
}
|
||
var HASH_UNDEFINED = "__lodash_hash_undefined__";
|
||
function hashSet(key, value) {
|
||
var data = this.__data__;
|
||
this.size += this.has(key) ? 0 : 1;
|
||
data[key] = nativeCreate$1 && value === void 0 ? HASH_UNDEFINED : value;
|
||
return this;
|
||
}
|
||
function Hash(entries) {
|
||
var index = -1, length = entries == null ? 0 : entries.length;
|
||
this.clear();
|
||
while (++index < length) {
|
||
var entry = entries[index];
|
||
this.set(entry[0], entry[1]);
|
||
}
|
||
}
|
||
Hash.prototype.clear = hashClear;
|
||
Hash.prototype["delete"] = hashDelete;
|
||
Hash.prototype.get = hashGet;
|
||
Hash.prototype.has = hashHas;
|
||
Hash.prototype.set = hashSet;
|
||
function listCacheClear() {
|
||
this.__data__ = [];
|
||
this.size = 0;
|
||
}
|
||
function eq(value, other) {
|
||
return value === other || value !== value && other !== other;
|
||
}
|
||
function assocIndexOf(array, key) {
|
||
var length = array.length;
|
||
while (length--) {
|
||
if (eq(array[length][0], key)) {
|
||
return length;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
var arrayProto = Array.prototype;
|
||
var splice = arrayProto.splice;
|
||
function listCacheDelete(key) {
|
||
var data = this.__data__, index = assocIndexOf(data, key);
|
||
if (index < 0) {
|
||
return false;
|
||
}
|
||
var lastIndex = data.length - 1;
|
||
if (index == lastIndex) {
|
||
data.pop();
|
||
} else {
|
||
splice.call(data, index, 1);
|
||
}
|
||
--this.size;
|
||
return true;
|
||
}
|
||
function listCacheGet(key) {
|
||
var data = this.__data__, index = assocIndexOf(data, key);
|
||
return index < 0 ? void 0 : data[index][1];
|
||
}
|
||
function listCacheHas(key) {
|
||
return assocIndexOf(this.__data__, key) > -1;
|
||
}
|
||
function listCacheSet(key, value) {
|
||
var data = this.__data__, index = assocIndexOf(data, key);
|
||
if (index < 0) {
|
||
++this.size;
|
||
data.push([key, value]);
|
||
} else {
|
||
data[index][1] = value;
|
||
}
|
||
return this;
|
||
}
|
||
function ListCache(entries) {
|
||
var index = -1, length = entries == null ? 0 : entries.length;
|
||
this.clear();
|
||
while (++index < length) {
|
||
var entry = entries[index];
|
||
this.set(entry[0], entry[1]);
|
||
}
|
||
}
|
||
ListCache.prototype.clear = listCacheClear;
|
||
ListCache.prototype["delete"] = listCacheDelete;
|
||
ListCache.prototype.get = listCacheGet;
|
||
ListCache.prototype.has = listCacheHas;
|
||
ListCache.prototype.set = listCacheSet;
|
||
var Map = getNative(root$1, "Map");
|
||
const Map$1 = Map;
|
||
function mapCacheClear() {
|
||
this.size = 0;
|
||
this.__data__ = {
|
||
"hash": new Hash(),
|
||
"map": new (Map$1 || ListCache)(),
|
||
"string": new Hash()
|
||
};
|
||
}
|
||
function isKeyable(value) {
|
||
var type2 = typeof value;
|
||
return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
|
||
}
|
||
function getMapData(map2, key) {
|
||
var data = map2.__data__;
|
||
return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
|
||
}
|
||
function mapCacheDelete(key) {
|
||
var result = getMapData(this, key)["delete"](key);
|
||
this.size -= result ? 1 : 0;
|
||
return result;
|
||
}
|
||
function mapCacheGet(key) {
|
||
return getMapData(this, key).get(key);
|
||
}
|
||
function mapCacheHas(key) {
|
||
return getMapData(this, key).has(key);
|
||
}
|
||
function mapCacheSet(key, value) {
|
||
var data = getMapData(this, key), size = data.size;
|
||
data.set(key, value);
|
||
this.size += data.size == size ? 0 : 1;
|
||
return this;
|
||
}
|
||
function MapCache(entries) {
|
||
var index = -1, length = entries == null ? 0 : entries.length;
|
||
this.clear();
|
||
while (++index < length) {
|
||
var entry = entries[index];
|
||
this.set(entry[0], entry[1]);
|
||
}
|
||
}
|
||
MapCache.prototype.clear = mapCacheClear;
|
||
MapCache.prototype["delete"] = mapCacheDelete;
|
||
MapCache.prototype.get = mapCacheGet;
|
||
MapCache.prototype.has = mapCacheHas;
|
||
MapCache.prototype.set = mapCacheSet;
|
||
var FUNC_ERROR_TEXT = "Expected a function";
|
||
function memoize(func, resolver) {
|
||
if (typeof func != "function" || resolver != null && typeof resolver != "function") {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
var memoized = function() {
|
||
var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
|
||
if (cache.has(key)) {
|
||
return cache.get(key);
|
||
}
|
||
var result = func.apply(this, args);
|
||
memoized.cache = cache.set(key, result) || cache;
|
||
return result;
|
||
};
|
||
memoized.cache = new (memoize.Cache || MapCache)();
|
||
return memoized;
|
||
}
|
||
memoize.Cache = MapCache;
|
||
const d3CurveTypes = {
|
||
curveBasis,
|
||
curveBasisClosed,
|
||
curveBasisOpen,
|
||
curveBumpX: bumpX,
|
||
curveBumpY: bumpY,
|
||
curveBundle,
|
||
curveCardinalClosed,
|
||
curveCardinalOpen,
|
||
curveCardinal,
|
||
curveCatmullRomClosed,
|
||
curveCatmullRomOpen,
|
||
curveCatmullRom,
|
||
curveLinear,
|
||
curveLinearClosed,
|
||
curveMonotoneX: monotoneX,
|
||
curveMonotoneY: monotoneY,
|
||
curveNatural,
|
||
curveStep,
|
||
curveStepAfter: stepAfter,
|
||
curveStepBefore: stepBefore
|
||
};
|
||
const directive = /%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi;
|
||
const directiveWithoutOpen = /\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi;
|
||
const detectInit = function(text, config) {
|
||
const inits = detectDirective(text, /(?:init\b)|(?:initialize\b)/);
|
||
let results = {};
|
||
if (Array.isArray(inits)) {
|
||
const args = inits.map((init) => init.args);
|
||
directiveSanitizer(args);
|
||
results = assignWithDepth(results, [...args]);
|
||
} else {
|
||
results = inits.args;
|
||
}
|
||
if (results) {
|
||
let type2 = detectType(text, config);
|
||
["config"].forEach((prop) => {
|
||
if (results[prop] !== void 0) {
|
||
if (type2 === "flowchart-v2") {
|
||
type2 = "flowchart";
|
||
}
|
||
results[type2] = results[prop];
|
||
delete results[prop];
|
||
}
|
||
});
|
||
}
|
||
return results;
|
||
};
|
||
const detectDirective = function(text, type2 = null) {
|
||
try {
|
||
const commentWithoutDirectives = new RegExp(
|
||
`[%]{2}(?![{]${directiveWithoutOpen.source})(?=[}][%]{2}).*
|
||
`,
|
||
"ig"
|
||
);
|
||
text = text.trim().replace(commentWithoutDirectives, "").replace(/'/gm, '"');
|
||
log$1.debug(
|
||
`Detecting diagram directive${type2 !== null ? " type:" + type2 : ""} based on the text:${text}`
|
||
);
|
||
let match;
|
||
const result = [];
|
||
while ((match = directive.exec(text)) !== null) {
|
||
if (match.index === directive.lastIndex) {
|
||
directive.lastIndex++;
|
||
}
|
||
if (match && !type2 || type2 && match[1] && match[1].match(type2) || type2 && match[2] && match[2].match(type2)) {
|
||
const type22 = match[1] ? match[1] : match[2];
|
||
const args = match[3] ? match[3].trim() : match[4] ? JSON.parse(match[4].trim()) : null;
|
||
result.push({ type: type22, args });
|
||
}
|
||
}
|
||
if (result.length === 0) {
|
||
result.push({ type: text, args: null });
|
||
}
|
||
return result.length === 1 ? result[0] : result;
|
||
} catch (error) {
|
||
log$1.error(
|
||
`ERROR: ${error.message} - Unable to parse directive
|
||
${type2 !== null ? " type:" + type2 : ""} based on the text:${text}`
|
||
);
|
||
return { type: null, args: null };
|
||
}
|
||
};
|
||
const isSubstringInArray = function(str2, arr) {
|
||
for (const [i, element] of arr.entries()) {
|
||
if (element.match(str2)) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
};
|
||
function interpolateToCurve(interpolate, defaultCurve) {
|
||
if (!interpolate) {
|
||
return defaultCurve;
|
||
}
|
||
const curveName = `curve${interpolate.charAt(0).toUpperCase() + interpolate.slice(1)}`;
|
||
return d3CurveTypes[curveName] || defaultCurve;
|
||
}
|
||
function formatUrl(linkStr, config) {
|
||
const url = linkStr.trim();
|
||
if (url) {
|
||
if (config.securityLevel !== "loose") {
|
||
return sanitizeUrl_1(url);
|
||
}
|
||
return url;
|
||
}
|
||
}
|
||
const runFunc = (functionName, ...params) => {
|
||
const arrPaths = functionName.split(".");
|
||
const len = arrPaths.length - 1;
|
||
const fnName = arrPaths[len];
|
||
let obj = window;
|
||
for (let i = 0; i < len; i++) {
|
||
obj = obj[arrPaths[i]];
|
||
if (!obj) {
|
||
return;
|
||
}
|
||
}
|
||
obj[fnName](...params);
|
||
};
|
||
function distance(p1, p2) {
|
||
return p1 && p2 ? Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)) : 0;
|
||
}
|
||
function traverseEdge(points) {
|
||
let prevPoint;
|
||
let totalDistance = 0;
|
||
points.forEach((point2) => {
|
||
totalDistance += distance(point2, prevPoint);
|
||
prevPoint = point2;
|
||
});
|
||
let remainingDistance = totalDistance / 2;
|
||
let center = void 0;
|
||
prevPoint = void 0;
|
||
points.forEach((point2) => {
|
||
if (prevPoint && !center) {
|
||
const vectorDistance = distance(point2, prevPoint);
|
||
if (vectorDistance < remainingDistance) {
|
||
remainingDistance -= vectorDistance;
|
||
} else {
|
||
const distanceRatio = remainingDistance / vectorDistance;
|
||
if (distanceRatio <= 0) {
|
||
center = prevPoint;
|
||
}
|
||
if (distanceRatio >= 1) {
|
||
center = { x: point2.x, y: point2.y };
|
||
}
|
||
if (distanceRatio > 0 && distanceRatio < 1) {
|
||
center = {
|
||
x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point2.x,
|
||
y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point2.y
|
||
};
|
||
}
|
||
}
|
||
}
|
||
prevPoint = point2;
|
||
});
|
||
return center;
|
||
}
|
||
function calcLabelPosition(points) {
|
||
if (points.length === 1) {
|
||
return points[0];
|
||
}
|
||
return traverseEdge(points);
|
||
}
|
||
const calcCardinalityPosition = (isRelationTypePresent, points, initialPosition) => {
|
||
let prevPoint;
|
||
log$1.info(`our points ${JSON.stringify(points)}`);
|
||
if (points[0] !== initialPosition) {
|
||
points = points.reverse();
|
||
}
|
||
const distanceToCardinalityPoint = 25;
|
||
let remainingDistance = distanceToCardinalityPoint;
|
||
let center;
|
||
prevPoint = void 0;
|
||
points.forEach((point2) => {
|
||
if (prevPoint && !center) {
|
||
const vectorDistance = distance(point2, prevPoint);
|
||
if (vectorDistance < remainingDistance) {
|
||
remainingDistance -= vectorDistance;
|
||
} else {
|
||
const distanceRatio = remainingDistance / vectorDistance;
|
||
if (distanceRatio <= 0) {
|
||
center = prevPoint;
|
||
}
|
||
if (distanceRatio >= 1) {
|
||
center = { x: point2.x, y: point2.y };
|
||
}
|
||
if (distanceRatio > 0 && distanceRatio < 1) {
|
||
center = {
|
||
x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point2.x,
|
||
y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point2.y
|
||
};
|
||
}
|
||
}
|
||
}
|
||
prevPoint = point2;
|
||
});
|
||
const d = isRelationTypePresent ? 10 : 5;
|
||
const angle = Math.atan2(points[0].y - center.y, points[0].x - center.x);
|
||
const cardinalityPosition = { x: 0, y: 0 };
|
||
cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2;
|
||
cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2;
|
||
return cardinalityPosition;
|
||
};
|
||
function calcTerminalLabelPosition(terminalMarkerSize, position, _points) {
|
||
let points = JSON.parse(JSON.stringify(_points));
|
||
let prevPoint;
|
||
log$1.info("our points", points);
|
||
if (position !== "start_left" && position !== "start_right") {
|
||
points = points.reverse();
|
||
}
|
||
points.forEach((point2) => {
|
||
prevPoint = point2;
|
||
});
|
||
const distanceToCardinalityPoint = 25 + terminalMarkerSize;
|
||
let remainingDistance = distanceToCardinalityPoint;
|
||
let center;
|
||
prevPoint = void 0;
|
||
points.forEach((point2) => {
|
||
if (prevPoint && !center) {
|
||
const vectorDistance = distance(point2, prevPoint);
|
||
if (vectorDistance < remainingDistance) {
|
||
remainingDistance -= vectorDistance;
|
||
} else {
|
||
const distanceRatio = remainingDistance / vectorDistance;
|
||
if (distanceRatio <= 0) {
|
||
center = prevPoint;
|
||
}
|
||
if (distanceRatio >= 1) {
|
||
center = { x: point2.x, y: point2.y };
|
||
}
|
||
if (distanceRatio > 0 && distanceRatio < 1) {
|
||
center = {
|
||
x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point2.x,
|
||
y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point2.y
|
||
};
|
||
}
|
||
}
|
||
}
|
||
prevPoint = point2;
|
||
});
|
||
const d = 10 + terminalMarkerSize * 0.5;
|
||
const angle = Math.atan2(points[0].y - center.y, points[0].x - center.x);
|
||
const cardinalityPosition = { x: 0, y: 0 };
|
||
cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2;
|
||
cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2;
|
||
if (position === "start_left") {
|
||
cardinalityPosition.x = Math.sin(angle + Math.PI) * d + (points[0].x + center.x) / 2;
|
||
cardinalityPosition.y = -Math.cos(angle + Math.PI) * d + (points[0].y + center.y) / 2;
|
||
}
|
||
if (position === "end_right") {
|
||
cardinalityPosition.x = Math.sin(angle - Math.PI) * d + (points[0].x + center.x) / 2 - 5;
|
||
cardinalityPosition.y = -Math.cos(angle - Math.PI) * d + (points[0].y + center.y) / 2 - 5;
|
||
}
|
||
if (position === "end_left") {
|
||
cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2 - 5;
|
||
cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2 - 5;
|
||
}
|
||
return cardinalityPosition;
|
||
}
|
||
function getStylesFromArray(arr) {
|
||
let style = "";
|
||
let labelStyle = "";
|
||
for (const element of arr) {
|
||
if (element !== void 0) {
|
||
if (element.startsWith("color:") || element.startsWith("text-align:")) {
|
||
labelStyle = labelStyle + element + ";";
|
||
} else {
|
||
style = style + element + ";";
|
||
}
|
||
}
|
||
}
|
||
return { style, labelStyle };
|
||
}
|
||
let cnt = 0;
|
||
const generateId = () => {
|
||
cnt++;
|
||
return "id-" + Math.random().toString(36).substr(2, 12) + "-" + cnt;
|
||
};
|
||
function makeid(length) {
|
||
let result = "";
|
||
const characters = "0123456789abcdef";
|
||
const charactersLength = characters.length;
|
||
for (let i = 0; i < length; i++) {
|
||
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
||
}
|
||
return result;
|
||
}
|
||
const random = (options) => {
|
||
return makeid(options.length);
|
||
};
|
||
const getTextObj = function() {
|
||
return {
|
||
x: 0,
|
||
y: 0,
|
||
fill: void 0,
|
||
anchor: "start",
|
||
style: "#666",
|
||
width: 100,
|
||
height: 100,
|
||
textMargin: 0,
|
||
rx: 0,
|
||
ry: 0,
|
||
valign: void 0
|
||
};
|
||
};
|
||
const drawSimpleText = function(elem, textData) {
|
||
const nText = textData.text.replace(common$1.lineBreakRegex, " ");
|
||
const [, _fontSizePx] = parseFontSize(textData.fontSize);
|
||
const textElem = elem.append("text");
|
||
textElem.attr("x", textData.x);
|
||
textElem.attr("y", textData.y);
|
||
textElem.style("text-anchor", textData.anchor);
|
||
textElem.style("font-family", textData.fontFamily);
|
||
textElem.style("font-size", _fontSizePx);
|
||
textElem.style("font-weight", textData.fontWeight);
|
||
textElem.attr("fill", textData.fill);
|
||
if (textData.class !== void 0) {
|
||
textElem.attr("class", textData.class);
|
||
}
|
||
const span = textElem.append("tspan");
|
||
span.attr("x", textData.x + textData.textMargin * 2);
|
||
span.attr("fill", textData.fill);
|
||
span.text(nText);
|
||
return textElem;
|
||
};
|
||
const wrapLabel = memoize(
|
||
(label, maxWidth, config) => {
|
||
if (!label) {
|
||
return label;
|
||
}
|
||
config = Object.assign(
|
||
{ fontSize: 12, fontWeight: 400, fontFamily: "Arial", joinWith: "<br/>" },
|
||
config
|
||
);
|
||
if (common$1.lineBreakRegex.test(label)) {
|
||
return label;
|
||
}
|
||
const words = label.split(" ");
|
||
const completedLines = [];
|
||
let nextLine = "";
|
||
words.forEach((word, index) => {
|
||
const wordLength = calculateTextWidth(`${word} `, config);
|
||
const nextLineLength = calculateTextWidth(nextLine, config);
|
||
if (wordLength > maxWidth) {
|
||
const { hyphenatedStrings, remainingWord } = breakString(word, maxWidth, "-", config);
|
||
completedLines.push(nextLine, ...hyphenatedStrings);
|
||
nextLine = remainingWord;
|
||
} else if (nextLineLength + wordLength >= maxWidth) {
|
||
completedLines.push(nextLine);
|
||
nextLine = word;
|
||
} else {
|
||
nextLine = [nextLine, word].filter(Boolean).join(" ");
|
||
}
|
||
const currentWord = index + 1;
|
||
const isLastWord = currentWord === words.length;
|
||
if (isLastWord) {
|
||
completedLines.push(nextLine);
|
||
}
|
||
});
|
||
return completedLines.filter((line) => line !== "").join(config.joinWith);
|
||
},
|
||
(label, maxWidth, config) => `${label}${maxWidth}${config.fontSize}${config.fontWeight}${config.fontFamily}${config.joinWith}`
|
||
);
|
||
const breakString = memoize(
|
||
(word, maxWidth, hyphenCharacter = "-", config) => {
|
||
config = Object.assign(
|
||
{ fontSize: 12, fontWeight: 400, fontFamily: "Arial", margin: 0 },
|
||
config
|
||
);
|
||
const characters = [...word];
|
||
const lines = [];
|
||
let currentLine = "";
|
||
characters.forEach((character, index) => {
|
||
const nextLine = `${currentLine}${character}`;
|
||
const lineWidth = calculateTextWidth(nextLine, config);
|
||
if (lineWidth >= maxWidth) {
|
||
const currentCharacter = index + 1;
|
||
const isLastLine = characters.length === currentCharacter;
|
||
const hyphenatedNextLine = `${nextLine}${hyphenCharacter}`;
|
||
lines.push(isLastLine ? nextLine : hyphenatedNextLine);
|
||
currentLine = "";
|
||
} else {
|
||
currentLine = nextLine;
|
||
}
|
||
});
|
||
return { hyphenatedStrings: lines, remainingWord: currentLine };
|
||
},
|
||
(word, maxWidth, hyphenCharacter = "-", config) => `${word}${maxWidth}${hyphenCharacter}${config.fontSize}${config.fontWeight}${config.fontFamily}`
|
||
);
|
||
function calculateTextHeight(text, config) {
|
||
config = Object.assign(
|
||
{ fontSize: 12, fontWeight: 400, fontFamily: "Arial", margin: 15 },
|
||
config
|
||
);
|
||
return calculateTextDimensions(text, config).height;
|
||
}
|
||
function calculateTextWidth(text, config) {
|
||
config = Object.assign({ fontSize: 12, fontWeight: 400, fontFamily: "Arial" }, config);
|
||
return calculateTextDimensions(text, config).width;
|
||
}
|
||
const calculateTextDimensions = memoize(
|
||
(text, config) => {
|
||
config = Object.assign({ fontSize: 12, fontWeight: 400, fontFamily: "Arial" }, config);
|
||
const { fontSize, fontFamily, fontWeight } = config;
|
||
if (!text) {
|
||
return { width: 0, height: 0 };
|
||
}
|
||
const [, _fontSizePx] = parseFontSize(fontSize);
|
||
const fontFamilies = ["sans-serif", fontFamily];
|
||
const lines = text.split(common$1.lineBreakRegex);
|
||
const dims = [];
|
||
const body = select("body");
|
||
if (!body.remove) {
|
||
return { width: 0, height: 0, lineHeight: 0 };
|
||
}
|
||
const g = body.append("svg");
|
||
for (const fontFamily2 of fontFamilies) {
|
||
let cheight = 0;
|
||
const dim = { width: 0, height: 0, lineHeight: 0 };
|
||
for (const line of lines) {
|
||
const textObj = getTextObj();
|
||
textObj.text = line;
|
||
const textElem = drawSimpleText(g, textObj).style("font-size", _fontSizePx).style("font-weight", fontWeight).style("font-family", fontFamily2);
|
||
const bBox = (textElem._groups || textElem)[0][0].getBBox();
|
||
dim.width = Math.round(Math.max(dim.width, bBox.width));
|
||
cheight = Math.round(bBox.height);
|
||
dim.height += cheight;
|
||
dim.lineHeight = Math.round(Math.max(dim.lineHeight, cheight));
|
||
}
|
||
dims.push(dim);
|
||
}
|
||
g.remove();
|
||
const index = isNaN(dims[1].height) || isNaN(dims[1].width) || isNaN(dims[1].lineHeight) || dims[0].height > dims[1].height && dims[0].width > dims[1].width && dims[0].lineHeight > dims[1].lineHeight ? 0 : 1;
|
||
return dims[index];
|
||
},
|
||
(text, config) => `${text}${config.fontSize}${config.fontWeight}${config.fontFamily}`
|
||
);
|
||
const initIdGenerator = class iterator {
|
||
constructor(deterministic, seed) {
|
||
this.deterministic = deterministic;
|
||
this.seed = seed;
|
||
this.count = seed ? seed.length : 0;
|
||
}
|
||
next() {
|
||
if (!this.deterministic) {
|
||
return Date.now();
|
||
}
|
||
return this.count++;
|
||
}
|
||
};
|
||
let decoder;
|
||
const entityDecode = function(html) {
|
||
decoder = decoder || document.createElement("div");
|
||
html = escape(html).replace(/%26/g, "&").replace(/%23/g, "#").replace(/%3B/g, ";");
|
||
decoder.innerHTML = html;
|
||
return unescape(decoder.textContent);
|
||
};
|
||
const directiveSanitizer = (args) => {
|
||
log$1.debug("directiveSanitizer called with", args);
|
||
if (typeof args === "object") {
|
||
if (args.length) {
|
||
args.forEach((arg) => directiveSanitizer(arg));
|
||
} else {
|
||
Object.keys(args).forEach((key) => {
|
||
log$1.debug("Checking key", key);
|
||
if (key.startsWith("__")) {
|
||
log$1.debug("sanitize deleting __ option", key);
|
||
delete args[key];
|
||
}
|
||
if (key.includes("proto")) {
|
||
log$1.debug("sanitize deleting proto option", key);
|
||
delete args[key];
|
||
}
|
||
if (key.includes("constr")) {
|
||
log$1.debug("sanitize deleting constr option", key);
|
||
delete args[key];
|
||
}
|
||
if (key.includes("themeCSS")) {
|
||
log$1.debug("sanitizing themeCss option");
|
||
args[key] = sanitizeCss(args[key]);
|
||
}
|
||
if (key.includes("fontFamily")) {
|
||
log$1.debug("sanitizing fontFamily option");
|
||
args[key] = sanitizeCss(args[key]);
|
||
}
|
||
if (key.includes("altFontFamily")) {
|
||
log$1.debug("sanitizing altFontFamily option");
|
||
args[key] = sanitizeCss(args[key]);
|
||
}
|
||
if (!configKeys.includes(key)) {
|
||
log$1.debug("sanitize deleting option", key);
|
||
delete args[key];
|
||
} else {
|
||
if (typeof args[key] === "object") {
|
||
log$1.debug("sanitize deleting object", key);
|
||
directiveSanitizer(args[key]);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
if (args.themeVariables) {
|
||
const kArr = Object.keys(args.themeVariables);
|
||
for (const k of kArr) {
|
||
const val = args.themeVariables[k];
|
||
if (val && val.match && !val.match(/^[\d "#%(),.;A-Za-z]+$/)) {
|
||
args.themeVariables[k] = "";
|
||
}
|
||
}
|
||
}
|
||
log$1.debug("After sanitization", args);
|
||
};
|
||
const sanitizeCss = (str2) => {
|
||
let startCnt = 0;
|
||
let endCnt = 0;
|
||
for (const element of str2) {
|
||
if (startCnt < endCnt) {
|
||
return "{ /* ERROR: Unbalanced CSS */ }";
|
||
}
|
||
if (element === "{") {
|
||
startCnt++;
|
||
} else if (element === "}") {
|
||
endCnt++;
|
||
}
|
||
}
|
||
if (startCnt !== endCnt) {
|
||
return "{ /* ERROR: Unbalanced CSS */ }";
|
||
}
|
||
return str2;
|
||
};
|
||
function isDetailedError(error) {
|
||
return "str" in error;
|
||
}
|
||
function getErrorMessage(error) {
|
||
if (error instanceof Error) {
|
||
return error.message;
|
||
}
|
||
return String(error);
|
||
}
|
||
const insertTitle = (parent, cssClass, titleTopMargin, title) => {
|
||
if (!title) {
|
||
return;
|
||
}
|
||
const bounds = parent.node().getBBox();
|
||
parent.append("text").text(title).attr("x", bounds.x + bounds.width / 2).attr("y", -titleTopMargin).attr("class", cssClass);
|
||
};
|
||
const parseFontSize = (fontSize) => {
|
||
if (typeof fontSize === "number") {
|
||
return [fontSize, fontSize + "px"];
|
||
}
|
||
const fontSizeNumber = parseInt(fontSize, 10);
|
||
if (Number.isNaN(fontSizeNumber)) {
|
||
return [void 0, void 0];
|
||
} else if (fontSize === String(fontSizeNumber)) {
|
||
return [fontSizeNumber, fontSize + "px"];
|
||
} else {
|
||
return [fontSizeNumber, fontSize];
|
||
}
|
||
};
|
||
const utils = {
|
||
assignWithDepth,
|
||
wrapLabel,
|
||
calculateTextHeight,
|
||
calculateTextWidth,
|
||
calculateTextDimensions,
|
||
detectInit,
|
||
detectDirective,
|
||
isSubstringInArray,
|
||
interpolateToCurve,
|
||
calcLabelPosition,
|
||
calcCardinalityPosition,
|
||
calcTerminalLabelPosition,
|
||
formatUrl,
|
||
getStylesFromArray,
|
||
generateId,
|
||
random,
|
||
runFunc,
|
||
entityDecode,
|
||
initIdGenerator,
|
||
directiveSanitizer,
|
||
sanitizeCss,
|
||
insertTitle,
|
||
parseFontSize
|
||
};
|
||
export {
|
||
isObject as A,
|
||
eq as B,
|
||
memoize as C,
|
||
MapCache as D,
|
||
curveBasis as E,
|
||
random as F,
|
||
getConfig as G,
|
||
setupGraphViewbox as H,
|
||
tau as I,
|
||
pi as J,
|
||
cos as K,
|
||
ListCache as L,
|
||
Map$1 as M,
|
||
sin as N,
|
||
halfPi as O,
|
||
epsilon as P,
|
||
sqrt as Q,
|
||
min as R,
|
||
Symbol$2 as S,
|
||
abs as T,
|
||
UnknownDiagramError as U,
|
||
atan2 as V,
|
||
asin as W,
|
||
acos as X,
|
||
max as Y,
|
||
parseFontSize as Z,
|
||
generateId as _,
|
||
registerDiagram as a,
|
||
getDiagramLoader as b,
|
||
getNative as c,
|
||
detectType as d,
|
||
extractFrontMatter as e,
|
||
root$1 as f,
|
||
getDiagram as g,
|
||
baseGetTag as h,
|
||
isDetailedError as i,
|
||
isFunction as j,
|
||
freeGlobal$1 as k,
|
||
loadRegisteredDiagrams as l,
|
||
directiveSanitizer as m,
|
||
getStyles$1 as n,
|
||
getErrorMessage as o,
|
||
parseDirective$1 as p,
|
||
calculateTextWidth as q,
|
||
registerLazyLoadedDiagrams as r,
|
||
sanitizeUrl_1 as s,
|
||
toSource as t,
|
||
utils as u,
|
||
calculateTextHeight as v,
|
||
wrapLabel as w,
|
||
curveLinear as x,
|
||
getStylesFromArray as y,
|
||
interpolateToCurve as z
|
||
};
|
||
//# sourceMappingURL=utils-872dfc50.js.map
|