@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.
@@ -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;AAG1C,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"}
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"}
@@ -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;AAoHnE;;;;;;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"}
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 ["&amp;", 1];
24898
+ }
24899
+ if (c === "<") return ["&lt;", 1];
24900
+ if (c === ">") return ["&gt;", 1];
24901
+ if (c === '"') return ["&quot;", 1];
24902
+ if (c === "'") return ["&#39;", 1];
24903
+ if (c === "-" && flags.dash) return ["&#45;", 1];
24904
+ if (c === " " && previous === " " && flags.nbsp) return ["&#160;", 1];
24905
+ if (c === "\n" && flags.raw) return ["&#10;", 1];
24906
+ if (c === "\r" && flags.raw) return ["&#13;", 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. &Ccedil;
24912
+ * &#[0-9]*; e.g. &#38;
24913
+ * &#x[0-9a-fA-F]*; e.g. &#x6C34;
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 RE_DQUOTE = new RegExp('"', "g");
24857
- var RE_SQUOTE = new RegExp("'", "g");
24858
- var RE_AMP_NONENTITY = /&(?![A-Za-z]+;|#[0-9]+;|#x[0-9A-Fa-f]+;)/g;
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
- let r = s.replace(RE_AMP_NONENTITY, "&amp;");
24861
- r = r.replace(/</g, "&lt;");
24862
- r = r.replace(/>/g, "&gt;");
24863
- r = r.replace(RE_DQUOTE, "&quot;");
24864
- r = r.replace(RE_SQUOTE, "&#39;");
24865
- return r;
24986
+ return gvXmlEscape(s, FLAGS_BASE);
24866
24987
  }
24867
24988
  function escapeXmlTitle(s) {
24868
- let r = escapeXml(s);
24869
- r = r.replace(/-/g, "&#45;");
24870
- r = r.replace(/ {2,}/g, (m) => " " + "&#160;".repeat(m.length - 1));
24871
- return r;
24989
+ return gvXmlEscape(s, FLAGS_TITLE);
24872
24990
  }
24873
24991
  function escapeXmlText(s) {
24874
- let r = escapeXml(s);
24875
- r = r.replace(/-/g, "&#45;");
24876
- r = r.replace(/\n/g, "&#10;");
24877
- r = r.replace(/\r/g, "&#13;");
24878
- r = r.replace(/ {2,}/g, (m) => " " + "&#160;".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(interpretCRNL(tooltip), n);
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(interpretCRNL(s), obj);
27690
+ return substObjAnchor(preprocessTooltip(s), obj);
27578
27691
  }
27579
27692
  function textOf(lp) {
27580
27693
  return lp?.text ?? null;