2890 lines
91 KiB
JavaScript
2890 lines
91 KiB
JavaScript
import { sanitizeUrl } from "@braintree/sanitize-url";
|
||
import { select, curveBasis, curveBasisClosed, curveBasisOpen, curveBumpX, curveBumpY, curveBundle, curveCardinalClosed, curveCardinalOpen, curveCardinal, curveCatmullRomClosed, curveCatmullRomOpen, curveCatmullRom, curveLinear, curveLinearClosed, curveMonotoneX, curveMonotoneY, curveNatural, curveStep, curveStepAfter, curveStepBefore } from "d3";
|
||
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 common$1, e as configKeys } from "./config-389b86ff.js";
|
||
import { s as setupGraphViewbox$1 } from "./setupGraphViewbox-e35e4124.js";
|
||
import { c as commonDb } from "./commonDb-2ace122b.js";
|
||
import memoize from "lodash-es/memoize.js";
|
||
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
|
||
function isNothing(subject) {
|
||
return typeof subject === "undefined" || subject === null;
|
||
}
|
||
function isObject(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;
|
||
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, max) {
|
||
return common.repeat(" ", max - 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 max = data.length;
|
||
return max === 1 && data === "~" || max === 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 max = data.length;
|
||
return max === 4 && (data === "true" || data === "True" || data === "TRUE") || max === 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 max = data.length, index = 0, hasDigits = false, ch;
|
||
if (!max)
|
||
return false;
|
||
ch = data[index];
|
||
if (ch === "-" || ch === "+") {
|
||
ch = data[++index];
|
||
}
|
||
if (ch === "0") {
|
||
if (index + 1 === max)
|
||
return true;
|
||
ch = data[++index];
|
||
if (ch === "b") {
|
||
index++;
|
||
for (; index < max; 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 < max; 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 < max; 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 < max; 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, sign = 1, ch;
|
||
if (value.indexOf("_") !== -1) {
|
||
value = value.replace(/_/g, "");
|
||
}
|
||
ch = value[0];
|
||
if (ch === "-" || ch === "+") {
|
||
if (ch === "-")
|
||
sign = -1;
|
||
value = value.slice(1);
|
||
ch = value[0];
|
||
}
|
||
if (value === "0")
|
||
return 0;
|
||
if (ch === "0") {
|
||
if (value[1] === "b")
|
||
return sign * parseInt(value.slice(2), 2);
|
||
if (value[1] === "x")
|
||
return sign * parseInt(value.slice(2), 16);
|
||
if (value[1] === "o")
|
||
return sign * parseInt(value.slice(2), 8);
|
||
}
|
||
return sign * 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, sign;
|
||
value = data.replace(/_/g, "").toLowerCase();
|
||
sign = value[0] === "-" ? -1 : 1;
|
||
if ("+-".indexOf(value[0]) >= 0) {
|
||
value = value.slice(1);
|
||
}
|
||
if (value === ".inf") {
|
||
return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
|
||
} else if (value === ".nan") {
|
||
return NaN;
|
||
}
|
||
return sign * 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, max = data.length, map2 = BASE64_MAP;
|
||
for (idx = 0; idx < max; 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, ""), max = input.length, map2 = BASE64_MAP, bits = 0, result = [];
|
||
for (idx = 0; idx < max; 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 = max % 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, max = object.length, map2 = BASE64_MAP;
|
||
for (idx = 0; idx < max; 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 = max % 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;
|
||
};
|
||
const d3CurveTypes = {
|
||
curveBasis,
|
||
curveBasisClosed,
|
||
curveBasisOpen,
|
||
curveBumpX,
|
||
curveBumpY,
|
||
curveBundle,
|
||
curveCardinalClosed,
|
||
curveCardinalOpen,
|
||
curveCardinal,
|
||
curveCatmullRomClosed,
|
||
curveCatmullRomOpen,
|
||
curveCatmullRom,
|
||
curveLinear,
|
||
curveLinearClosed,
|
||
curveMonotoneX,
|
||
curveMonotoneY,
|
||
curveNatural,
|
||
curveStep,
|
||
curveStepAfter,
|
||
curveStepBefore
|
||
};
|
||
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(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((point) => {
|
||
totalDistance += distance(point, prevPoint);
|
||
prevPoint = point;
|
||
});
|
||
let remainingDistance = totalDistance / 2;
|
||
let center = void 0;
|
||
prevPoint = void 0;
|
||
points.forEach((point) => {
|
||
if (prevPoint && !center) {
|
||
const vectorDistance = distance(point, prevPoint);
|
||
if (vectorDistance < remainingDistance) {
|
||
remainingDistance -= vectorDistance;
|
||
} else {
|
||
const distanceRatio = remainingDistance / vectorDistance;
|
||
if (distanceRatio <= 0) {
|
||
center = prevPoint;
|
||
}
|
||
if (distanceRatio >= 1) {
|
||
center = { x: point.x, y: point.y };
|
||
}
|
||
if (distanceRatio > 0 && distanceRatio < 1) {
|
||
center = {
|
||
x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,
|
||
y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y
|
||
};
|
||
}
|
||
}
|
||
}
|
||
prevPoint = point;
|
||
});
|
||
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((point) => {
|
||
if (prevPoint && !center) {
|
||
const vectorDistance = distance(point, prevPoint);
|
||
if (vectorDistance < remainingDistance) {
|
||
remainingDistance -= vectorDistance;
|
||
} else {
|
||
const distanceRatio = remainingDistance / vectorDistance;
|
||
if (distanceRatio <= 0) {
|
||
center = prevPoint;
|
||
}
|
||
if (distanceRatio >= 1) {
|
||
center = { x: point.x, y: point.y };
|
||
}
|
||
if (distanceRatio > 0 && distanceRatio < 1) {
|
||
center = {
|
||
x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,
|
||
y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y
|
||
};
|
||
}
|
||
}
|
||
}
|
||
prevPoint = point;
|
||
});
|
||
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((point) => {
|
||
prevPoint = point;
|
||
});
|
||
const distanceToCardinalityPoint = 25 + terminalMarkerSize;
|
||
let remainingDistance = distanceToCardinalityPoint;
|
||
let center;
|
||
prevPoint = void 0;
|
||
points.forEach((point) => {
|
||
if (prevPoint && !center) {
|
||
const vectorDistance = distance(point, prevPoint);
|
||
if (vectorDistance < remainingDistance) {
|
||
remainingDistance -= vectorDistance;
|
||
} else {
|
||
const distanceRatio = remainingDistance / vectorDistance;
|
||
if (distanceRatio <= 0) {
|
||
center = prevPoint;
|
||
}
|
||
if (distanceRatio >= 1) {
|
||
center = { x: point.x, y: point.y };
|
||
}
|
||
if (distanceRatio > 0 && distanceRatio < 1) {
|
||
center = {
|
||
x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,
|
||
y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y
|
||
};
|
||
}
|
||
}
|
||
}
|
||
prevPoint = point;
|
||
});
|
||
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 {
|
||
UnknownDiagramError as U,
|
||
registerDiagram as a,
|
||
getDiagramLoader as b,
|
||
directiveSanitizer as c,
|
||
detectType as d,
|
||
extractFrontMatter as e,
|
||
getStyles$1 as f,
|
||
getDiagram as g,
|
||
getErrorMessage as h,
|
||
isDetailedError as i,
|
||
calculateTextWidth as j,
|
||
calculateTextHeight as k,
|
||
loadRegisteredDiagrams as l,
|
||
getStylesFromArray as m,
|
||
interpolateToCurve as n,
|
||
random as o,
|
||
parseDirective$1 as p,
|
||
getConfig as q,
|
||
registerLazyLoadedDiagrams as r,
|
||
setupGraphViewbox as s,
|
||
parseFontSize as t,
|
||
utils as u,
|
||
generateId as v,
|
||
wrapLabel as w
|
||
};
|
||
//# sourceMappingURL=utils-d5eeff82.js.map
|