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
|