@knowvah/dot-engine 2.6.8 → 2.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/subst.d.ts +8 -0
- package/dist/common/subst.d.ts.map +1 -1
- package/dist/gvc/anchor.d.ts.map +1 -1
- package/dist/index.js +134 -21
- package/dist/index.js.map +3 -3
- package/dist/render/xml-escape.d.ts +8 -6
- package/dist/render/xml-escape.d.ts.map +1 -1
- package/dist/render.js +134 -21
- package/dist/render.js.map +3 -3
- package/package.json +1 -1
- package/src/common/poly-gencode.ts +2 -2
- package/src/common/subst.ts +12 -0
- package/src/gvc/anchor.ts +6 -5
- package/src/render/xml-escape.ts +23 -33
package/dist/common/subst.d.ts
CHANGED
|
@@ -28,4 +28,12 @@ export declare function substObjAnchor(str: string, obj: GraphObj): string;
|
|
|
28
28
|
* @see lib/common/emit.c:interpretCRNL
|
|
29
29
|
*/
|
|
30
30
|
export declare function interpretCRNL(str: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Tooltip preprocessing: decode HTML entities to UTF-8, then interpret
|
|
33
|
+
* \n \l \r. C picks latin1ToUTF8 or htmlEntityUTF8 by GD_charset; both decode
|
|
34
|
+
* entities via htmlEntity, and the port's Latin-1 bytes are already decoded
|
|
35
|
+
* at input, so one branch serves both (as in make_label).
|
|
36
|
+
* @see lib/common/emit.c:preprocessTooltip
|
|
37
|
+
*/
|
|
38
|
+
export declare function preprocessTooltip(s: string): string;
|
|
31
39
|
//# sourceMappingURL=subst.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subst.d.ts","sourceRoot":"","sources":["../../src/common/subst.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"subst.d.ts","sourceRoot":"","sources":["../../src/common/subst.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI1C,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AA2D3C;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAG,MAAM,CAalF;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,MAAM,CAEjE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBjD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
package/dist/gvc/anchor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../src/gvc/anchor.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAU,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,oBAAoB,CAAC;AAM/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAY,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../src/gvc/anchor.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAU,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,oBAAoB,CAAC;AAM/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAY,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAqHnE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAM1E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,KAAK,EACR,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,QAAQ,GACZ,IAAI,CAoBN;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,EAAE,EAAE,MAAM,GACT,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAK/E;AAqBD;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IAAG,EAAE,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;CAAE;AAEtG;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,CAKzD;AAoGD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAsB3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAanE;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAG9E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQrF;AA4FD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE,CAIrF"}
|
package/dist/index.js
CHANGED
|
@@ -17989,6 +17989,9 @@ function interpretCRNL(str) {
|
|
|
17989
17989
|
}
|
|
17990
17990
|
return out;
|
|
17991
17991
|
}
|
|
17992
|
+
function preprocessTooltip(s) {
|
|
17993
|
+
return interpretCRNL(htmlEntityUTF8(s));
|
|
17994
|
+
}
|
|
17992
17995
|
|
|
17993
17996
|
// src/common/make-label.ts
|
|
17994
17997
|
var DEFAULT_FONTSIZE2 = 14;
|
|
@@ -24852,31 +24855,141 @@ function stripedBox(job, pts, clrs, rotate, renderer) {
|
|
|
24852
24855
|
return error;
|
|
24853
24856
|
}
|
|
24854
24857
|
|
|
24858
|
+
// src/util/xml.ts
|
|
24859
|
+
function gvXmlEscape(s, flags) {
|
|
24860
|
+
return XmlEscaper.escape(s, flags);
|
|
24861
|
+
}
|
|
24862
|
+
var XmlEscaper = class _XmlEscaper {
|
|
24863
|
+
static escape(s, flags) {
|
|
24864
|
+
let result = "";
|
|
24865
|
+
let previous = "";
|
|
24866
|
+
let pos = 0;
|
|
24867
|
+
while (pos < s.length) {
|
|
24868
|
+
const prev = s[pos];
|
|
24869
|
+
const [fragment, consumed] = _XmlEscaper.core(previous, s, pos, flags);
|
|
24870
|
+
result += fragment;
|
|
24871
|
+
previous = prev;
|
|
24872
|
+
pos += consumed;
|
|
24873
|
+
}
|
|
24874
|
+
return result;
|
|
24875
|
+
}
|
|
24876
|
+
/**
|
|
24877
|
+
* Escape one character/codepoint at s[pos].
|
|
24878
|
+
* Returns [escaped_fragment, characters_consumed].
|
|
24879
|
+
* Delegates to focused helpers to stay within CCN limit.
|
|
24880
|
+
* @see lib/util/xml.c:xml_core
|
|
24881
|
+
*/
|
|
24882
|
+
static core(previous, s, pos, flags) {
|
|
24883
|
+
const special = _XmlEscaper.coreSpecial(previous, s, pos, flags);
|
|
24884
|
+
if (special !== null) return special;
|
|
24885
|
+
const code = s.charCodeAt(pos);
|
|
24886
|
+
if (code > 127 && flags.utf8) return _XmlEscaper.utf8Entity(s, pos);
|
|
24887
|
+
return [s[pos], 1];
|
|
24888
|
+
}
|
|
24889
|
+
/**
|
|
24890
|
+
* Handle all the fixed-escape cases (& < > - space " ' \n \r).
|
|
24891
|
+
* Returns null when none of those cases applies.
|
|
24892
|
+
* @see lib/util/xml.c:xml_core
|
|
24893
|
+
*/
|
|
24894
|
+
static coreSpecial(previous, s, pos, flags) {
|
|
24895
|
+
const c = s[pos];
|
|
24896
|
+
if (c === "&" && (flags.raw || !_XmlEscaper.isEntity(s, pos))) {
|
|
24897
|
+
return ["&", 1];
|
|
24898
|
+
}
|
|
24899
|
+
if (c === "<") return ["<", 1];
|
|
24900
|
+
if (c === ">") return [">", 1];
|
|
24901
|
+
if (c === '"') return [""", 1];
|
|
24902
|
+
if (c === "'") return ["'", 1];
|
|
24903
|
+
if (c === "-" && flags.dash) return ["-", 1];
|
|
24904
|
+
if (c === " " && previous === " " && flags.nbsp) return [" ", 1];
|
|
24905
|
+
if (c === "\n" && flags.raw) return [" ", 1];
|
|
24906
|
+
if (c === "\r" && flags.raw) return [" ", 1];
|
|
24907
|
+
return null;
|
|
24908
|
+
}
|
|
24909
|
+
/**
|
|
24910
|
+
* Return true if s[pos] (which is '&') starts a valid XML entity:
|
|
24911
|
+
* &[A-Za-z]+; e.g. Ç
|
|
24912
|
+
* &#[0-9]*; e.g. &
|
|
24913
|
+
* &#x[0-9a-fA-F]*; e.g. 水
|
|
24914
|
+
* @see lib/util/xml.c:xml_isentity
|
|
24915
|
+
*/
|
|
24916
|
+
static isEntity(s, pos) {
|
|
24917
|
+
let i = pos + 1;
|
|
24918
|
+
if (i >= s.length || s[i] === ";") return false;
|
|
24919
|
+
i = s[i] === "#" ? _XmlEscaper.scanNumericRef(s, i) : _XmlEscaper.scanNamedRef(s, i);
|
|
24920
|
+
return i < s.length && s[i] === ";";
|
|
24921
|
+
}
|
|
24922
|
+
/** Scan a numeric entity body starting just after the '#'. */
|
|
24923
|
+
static scanNumericRef(s, hashPos) {
|
|
24924
|
+
let i = hashPos + 1;
|
|
24925
|
+
if (i < s.length && (s[i] === "x" || s[i] === "X")) {
|
|
24926
|
+
i++;
|
|
24927
|
+
while (i < s.length && _XmlEscaper.isXDigit(s[i])) i++;
|
|
24928
|
+
} else {
|
|
24929
|
+
while (i < s.length && _XmlEscaper.isDecDigit(s[i])) i++;
|
|
24930
|
+
}
|
|
24931
|
+
return i;
|
|
24932
|
+
}
|
|
24933
|
+
/** Scan a named entity body (alpha chars after the '&'). */
|
|
24934
|
+
static scanNamedRef(s, start) {
|
|
24935
|
+
let i = start;
|
|
24936
|
+
while (i < s.length && _XmlEscaper.isAlpha(s[i])) i++;
|
|
24937
|
+
return i;
|
|
24938
|
+
}
|
|
24939
|
+
/**
|
|
24940
|
+
* Emit &#xNNNN; for the Unicode code point at s[pos]. JS strings are
|
|
24941
|
+
* UTF-16, so the code point (what C decodes from UTF-8) comes from
|
|
24942
|
+
* codePointAt, and an astral character consumes two units.
|
|
24943
|
+
* @see lib/util/xml.c:xml_core (UTF-8 block)
|
|
24944
|
+
*/
|
|
24945
|
+
static utf8Entity(s, pos) {
|
|
24946
|
+
const cp = _XmlEscaper.decodeUtf8(s, pos);
|
|
24947
|
+
const consumed = _XmlEscaper.utf8ByteLen(cp);
|
|
24948
|
+
return [`&#x${cp.toString(16)};`, consumed];
|
|
24949
|
+
}
|
|
24950
|
+
/**
|
|
24951
|
+
* Return the code point at s[pos]. A lone surrogate is the analogue of
|
|
24952
|
+
* malformed UTF-8, where C reports an error and exits (xml.c:135).
|
|
24953
|
+
* @see lib/util/xml.c:xml_core (fprintf + graphviz_exit at xml.c:135)
|
|
24954
|
+
*/
|
|
24955
|
+
static decodeUtf8(s, pos) {
|
|
24956
|
+
const cp = s.codePointAt(pos);
|
|
24957
|
+
if (cp >= 55296 && cp <= 57343) {
|
|
24958
|
+
throw new RenderError(`gvXmlEscape: malformed UTF-8 at position ${pos}`, "RENDER_ERROR");
|
|
24959
|
+
}
|
|
24960
|
+
return cp;
|
|
24961
|
+
}
|
|
24962
|
+
/**
|
|
24963
|
+
* Return how many UTF-16 units encode the code point (C: the UTF-8 byte
|
|
24964
|
+
* length from the leading byte).
|
|
24965
|
+
* @see lib/util/xml.c:xml_core (length computation)
|
|
24966
|
+
*/
|
|
24967
|
+
static utf8ByteLen(cp) {
|
|
24968
|
+
return cp > 65535 ? 2 : 1;
|
|
24969
|
+
}
|
|
24970
|
+
static isDecDigit(c) {
|
|
24971
|
+
return c >= "0" && c <= "9";
|
|
24972
|
+
}
|
|
24973
|
+
static isAlpha(c) {
|
|
24974
|
+
return c >= "a" && c <= "z" || c >= "A" && c <= "Z";
|
|
24975
|
+
}
|
|
24976
|
+
static isXDigit(c) {
|
|
24977
|
+
return _XmlEscaper.isDecDigit(c) || c >= "a" && c <= "f" || c >= "A" && c <= "F";
|
|
24978
|
+
}
|
|
24979
|
+
};
|
|
24980
|
+
|
|
24855
24981
|
// src/render/xml-escape.ts
|
|
24856
|
-
var
|
|
24857
|
-
var
|
|
24858
|
-
var
|
|
24982
|
+
var FLAGS_BASE = { raw: false, dash: false, nbsp: false, utf8: false };
|
|
24983
|
+
var FLAGS_TITLE = { raw: false, dash: true, nbsp: true, utf8: false };
|
|
24984
|
+
var FLAGS_TEXT = { raw: true, dash: true, nbsp: true, utf8: false };
|
|
24859
24985
|
function escapeXml(s) {
|
|
24860
|
-
|
|
24861
|
-
r = r.replace(/</g, "<");
|
|
24862
|
-
r = r.replace(/>/g, ">");
|
|
24863
|
-
r = r.replace(RE_DQUOTE, """);
|
|
24864
|
-
r = r.replace(RE_SQUOTE, "'");
|
|
24865
|
-
return r;
|
|
24986
|
+
return gvXmlEscape(s, FLAGS_BASE);
|
|
24866
24987
|
}
|
|
24867
24988
|
function escapeXmlTitle(s) {
|
|
24868
|
-
|
|
24869
|
-
r = r.replace(/-/g, "-");
|
|
24870
|
-
r = r.replace(/ {2,}/g, (m) => " " + " ".repeat(m.length - 1));
|
|
24871
|
-
return r;
|
|
24989
|
+
return gvXmlEscape(s, FLAGS_TITLE);
|
|
24872
24990
|
}
|
|
24873
24991
|
function escapeXmlText(s) {
|
|
24874
|
-
|
|
24875
|
-
r = r.replace(/-/g, "-");
|
|
24876
|
-
r = r.replace(/\n/g, " ");
|
|
24877
|
-
r = r.replace(/\r/g, " ");
|
|
24878
|
-
r = r.replace(/ {2,}/g, (m) => " " + " ".repeat(m.length - 1));
|
|
24879
|
-
return r;
|
|
24992
|
+
return gvXmlEscape(s, FLAGS_TEXT);
|
|
24880
24993
|
}
|
|
24881
24994
|
|
|
24882
24995
|
// src/gvc/device-cluster.ts
|
|
@@ -25057,7 +25170,7 @@ function anchorAttr(n, key) {
|
|
|
25057
25170
|
return v !== void 0 && v !== "" ? v : void 0;
|
|
25058
25171
|
}
|
|
25059
25172
|
function resolveTooltip(n, tooltip) {
|
|
25060
|
-
if (tooltip !== void 0) return substObjAnchor(
|
|
25173
|
+
if (tooltip !== void 0) return substObjAnchor(preprocessTooltip(tooltip), n);
|
|
25061
25174
|
const label = n.info.label;
|
|
25062
25175
|
return label?.text ?? "";
|
|
25063
25176
|
}
|
|
@@ -27574,7 +27687,7 @@ function subst(s, obj) {
|
|
|
27574
27687
|
return substObjAnchor(s, obj);
|
|
27575
27688
|
}
|
|
27576
27689
|
function tip(s, obj) {
|
|
27577
|
-
return substObjAnchor(
|
|
27690
|
+
return substObjAnchor(preprocessTooltip(s), obj);
|
|
27578
27691
|
}
|
|
27579
27692
|
function textOf(lp) {
|
|
27580
27693
|
return lp?.text ?? null;
|