@knowvah/dot-engine 2.6.5 → 2.6.7

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/render.js CHANGED
@@ -5982,13 +5982,14 @@ function skipSpace(text, i) {
5982
5982
  return j;
5983
5983
  }
5984
5984
  var byteLength = (s) => new TextEncoder().encode(s).length;
5985
- function fedBytes(unit, isText) {
5986
- if (!isText) return byteLength(unit);
5987
- let text = unit.replace(/&([^;&<]*);/g, (m, name) => {
5985
+ function fedText(piece, endsUnit) {
5986
+ const text = piece.replace(/&([^;&<]*);/g, (m, name) => {
5988
5987
  return name.length >= 2 && Object.hasOwn(HTML_ENTITIES, name) ? `&#${HTML_ENTITIES[name]};` : m;
5989
5988
  });
5990
- if (text.endsWith("]")) text = `${text.slice(0, -1)}&#93;`;
5991
- return byteLength(text);
5989
+ return endsUnit && text.endsWith("]") ? `${text.slice(0, -1)}&#93;` : text;
5990
+ }
5991
+ function fedBytes(unit, isText) {
5992
+ return byteLength(isText ? fedText(unit, true) : unit);
5992
5993
  }
5993
5994
  function scanValue(text, j) {
5994
5995
  const q = text[j];
@@ -6090,26 +6091,45 @@ function scanMarkup(text, p) {
6090
6091
  if (c === "!") return { scan: scanDeclaration(text, p), kind: "tag" };
6091
6092
  return { scan: scanStartTag(text, p), kind: "tag" };
6092
6093
  }
6093
- function scanContent(text, base) {
6094
+ var CDATA_OPEN = "<![CDATA[";
6095
+ var CDATA_CLOSE = "]]>";
6096
+ function scanCdata(text, p, base, dataOf, tokens) {
6097
+ const close = text.indexOf(CDATA_CLOSE, p);
6098
+ const end = close < 0 ? text.length : close;
6099
+ if (end > p) tokens.push({ kind: "cdata", start: base + p, end: base + end, data: dataOf(base + p, base + end) });
6100
+ return close < 0 ? -1 : close + CDATA_CLOSE.length;
6101
+ }
6102
+ function scanText(text, p, base, tokens) {
6103
+ const e = text.indexOf("<", p);
6104
+ const end = e < 0 ? text.length : e;
6105
+ tokens.push({ kind: "text", start: base + p, end: base + end });
6106
+ return end;
6107
+ }
6108
+ function scanContent(text, base, inCdata, dataOf) {
6094
6109
  const tokens = [];
6095
6110
  let p = 0;
6111
+ let inSection = inCdata;
6096
6112
  while (p < text.length) {
6113
+ if (inSection || text.startsWith(CDATA_OPEN, p)) {
6114
+ const after2 = scanCdata(text, inSection ? p : p + CDATA_OPEN.length, base, dataOf, tokens);
6115
+ if (after2 < 0) return { tokens, consumed: text.length, inCdata: true };
6116
+ inSection = false;
6117
+ p = after2;
6118
+ continue;
6119
+ }
6097
6120
  if (text[p] !== "<") {
6098
- const e = text.indexOf("<", p);
6099
- const end = e < 0 ? text.length : e;
6100
- tokens.push({ kind: "text", start: base + p, end: base + end });
6101
- p = end;
6121
+ p = scanText(text, p, base, tokens);
6102
6122
  continue;
6103
6123
  }
6104
6124
  const { scan, kind } = scanMarkup(text, p);
6105
- if (scan.kind === "invalid") return { tokens, consumed: p, invalid: base + scan.offset };
6106
- if (scan.kind === "partial") return { tokens, consumed: p };
6125
+ if (scan.kind === "invalid") return { tokens, consumed: p, invalid: base + scan.offset, inCdata: false };
6126
+ if (scan.kind === "partial") return { tokens, consumed: p, inCdata: false };
6107
6127
  const tok = { kind, start: base + p, end: base + scan.end };
6108
6128
  if (scan.dup !== void 0) tok.dup = base + scan.dup;
6109
6129
  tokens.push(tok);
6110
6130
  p = scan.end;
6111
6131
  }
6112
- return { tokens, consumed: p };
6132
+ return { tokens, consumed: p, inCdata: inSection };
6113
6133
  }
6114
6134
  var InputBuffer = class {
6115
6135
  size = 0;
@@ -6160,24 +6180,42 @@ var ExpatFeed = class {
6160
6180
  buffer = new InputBuffer();
6161
6181
  heldStart = 0;
6162
6182
  fedEnd = 0;
6183
+ inCdata = false;
6184
+ /** Source ranges of the text units fed so far: their bytes went through findNext's rewrite. */
6185
+ textUnits = [];
6163
6186
  /** Start of the token expat still holds, or undefined when it holds nothing. */
6164
6187
  get held() {
6165
6188
  return this.heldStart < this.fedEnd ? this.heldStart : void 0;
6166
6189
  }
6167
- /** One `XML_Parse(parser, src[start, end), nbytes, 0)`. */
6168
- feed(start, end, nbytes) {
6169
- this.buffer.append(nbytes);
6190
+ /** One `XML_Parse(parser, src[start, end), nbytes, 0)`; `isText` for a text unit. */
6191
+ feed(start, end, isText) {
6192
+ if (isText) this.textUnits.push([start, end]);
6193
+ this.buffer.append(fedBytes(this.src.slice(start, end), isText));
6170
6194
  this.fedEnd = end;
6171
6195
  if (!this.buffer.enough) return { tokens: [] };
6172
6196
  const text = this.src.slice(this.heldStart, end);
6173
- const scan = scanContent(text, this.heldStart);
6197
+ const scan = scanContent(text, this.heldStart, this.inCdata, (a, b) => this.fedBetween(a, b));
6174
6198
  if (scan.invalid !== void 0) {
6175
6199
  return { tokens: scan.tokens, invalid: { message: XML_ERROR_INVALID_TOKEN, offset: scan.invalid } };
6176
6200
  }
6201
+ this.inCdata = scan.inCdata;
6177
6202
  this.heldStart += scan.consumed;
6178
6203
  this.buffer.consumedTo(byteLength(this.src.slice(this.heldStart, end)), scan.consumed > 0);
6179
6204
  return { tokens: scan.tokens };
6180
6205
  }
6206
+ /** What expat read for source offsets [start, end): text-unit pieces as findNext rewrote them. */
6207
+ fedBetween(start, end) {
6208
+ let out = "";
6209
+ let p = start;
6210
+ for (const [us, ue] of this.textUnits) {
6211
+ if (ue <= p || us >= end) continue;
6212
+ if (us > p) out += this.src.slice(p, us);
6213
+ const e = Math.min(ue, end);
6214
+ out += fedText(this.src.slice(Math.max(us, p), e), e === ue);
6215
+ p = e;
6216
+ }
6217
+ return out + this.src.slice(p, end);
6218
+ }
6181
6219
  };
6182
6220
  var XML_PREDEFINED_ENTITIES = /* @__PURE__ */ new Set(["lt", "gt", "amp", "quot", "apos"]);
6183
6221
  var ENTITY_NAME = /^[A-Za-z_:][\w.:-]*$/;
@@ -6202,6 +6240,46 @@ function parseTagChunk(chunk) {
6202
6240
  return { close, selfClose: !close && body.endsWith("/"), name };
6203
6241
  }
6204
6242
 
6243
+ // src/common/htmltable-lex-chardata.ts
6244
+ var initialCharData = () => ({ inCell: true, xb: "" });
6245
+ function startInCell(name, inCell) {
6246
+ if (name === "TABLE" || name === "TR" || name === "TH") return false;
6247
+ return name === "TD" ? true : inCell;
6248
+ }
6249
+ function endInCell(name, inCell) {
6250
+ if (name === "TABLE") return true;
6251
+ return name === "TD" ? false : inCell;
6252
+ }
6253
+ function tagInCell(st, tag) {
6254
+ const name = tag.name.toUpperCase();
6255
+ if (tag.close) {
6256
+ st.inCell = endInCell(name, st.inCell);
6257
+ return;
6258
+ }
6259
+ st.inCell = startInCell(name, st.inCell);
6260
+ if (tag.selfClose) st.inCell = endInCell(name, st.inCell);
6261
+ }
6262
+ function keepLostText(st, lost) {
6263
+ for (const t of lost) if (t.type === "text") st.xb += t.value;
6264
+ }
6265
+ function releaseXb(st, first) {
6266
+ if (st.xb === "") return;
6267
+ if (first.type === "text") first.value = st.xb + first.value;
6268
+ else if (first.type === "open" && first.tag === "TABLE") first.heldText = st.xb;
6269
+ else return;
6270
+ st.xb = "";
6271
+ }
6272
+ function cleanText(decoded) {
6273
+ return decoded.replace(/[\x00-\x1f]/g, "");
6274
+ }
6275
+ function textTokens(raw) {
6276
+ return charDataTokens(htmlEntityUTF8(raw));
6277
+ }
6278
+ function charDataTokens(decoded) {
6279
+ const clean = cleanText(decoded);
6280
+ return clean.length > 0 ? [{ type: "text", value: clean }] : [];
6281
+ }
6282
+
6205
6283
  // src/common/htmltable-lex-units.ts
6206
6284
  var UNCLOSED_COMMENT = "Warning: Unclosed comment\n";
6207
6285
  var LABEL_CLOSED = "Warning: Label closed before end of HTML element\n";
@@ -6306,20 +6384,17 @@ function parseCloseToken(inner) {
6306
6384
  checkTag(tag);
6307
6385
  return { type: "close", tag: normalizeTag(tag) };
6308
6386
  }
6309
- function cleanText(raw) {
6310
- const isKeep = (c) => c === " " || c === " " || c === "\n" || c === "\r";
6311
- return raw.replace(/[\x00-\x1f\x7f]/g, (c) => isKeep(c) ? c : "");
6312
- }
6313
- function textTokens(raw) {
6314
- const clean = htmlEntityUTF8(cleanText(raw));
6315
- return clean.length > 0 ? [{ type: "text", value: clean }] : [];
6316
- }
6387
+ var EMPTY_ELEMENTS = /* @__PURE__ */ new Set(["BR", "HR", "VR", "IMG"]);
6317
6388
  function tagTokens(text) {
6318
6389
  const inner = text.slice(1, -1).trim();
6319
6390
  if (inner.startsWith("/")) return [parseCloseToken(inner)];
6320
6391
  if (inner.endsWith("/")) {
6321
6392
  const open = parseOpenToken(inner.slice(0, -1).trim());
6322
- return [open, { type: "close", tag: open.tag }];
6393
+ if (EMPTY_ELEMENTS.has(open.tag)) return [open, { type: "close", tag: open.tag }];
6394
+ const close = { type: "close", tag: open.tag };
6395
+ if (open.warnings !== void 0) close.warnings = open.warnings;
6396
+ if (open.warn === true) close.warn = true;
6397
+ return [close];
6323
6398
  }
6324
6399
  return [parseOpenToken(inner)];
6325
6400
  }
@@ -6392,6 +6467,7 @@ function eventTokens(site) {
6392
6467
  const { src, tok, st } = site;
6393
6468
  const text = src.slice(tok.start, tok.end);
6394
6469
  if (tok.kind === "comment" || tok.kind === "pi") return [];
6470
+ if (tok.kind === "cdata") return charDataTokens(tok.data ?? "");
6395
6471
  if (tok.kind === "tag") {
6396
6472
  checkTagToken(site);
6397
6473
  return tagTokens(text);
@@ -6417,7 +6493,13 @@ function absorb(carry, lost) {
6417
6493
  function eventGroups(run, res) {
6418
6494
  const groups = [];
6419
6495
  for (const tok of res.tokens) {
6420
- const tokens = eventTokens({ src: run.src, tok, st: run.st });
6496
+ let tokens = eventTokens({ src: run.src, tok, st: run.st });
6497
+ if (tok.kind === "tag") {
6498
+ const tag = parseTagChunk(run.src.slice(tok.start, tok.end));
6499
+ if (tag !== void 0) tagInCell(run.cd, tag);
6500
+ } else if (!run.cd.inCell) {
6501
+ tokens = [];
6502
+ }
6421
6503
  if (tokens.length > 0) groups.push({ tokens, tok });
6422
6504
  }
6423
6505
  if (res.invalid !== void 0) {
@@ -6428,6 +6510,7 @@ function eventGroups(run, res) {
6428
6510
  }
6429
6511
  function deliver(run, last) {
6430
6512
  const first = last.tokens[0];
6513
+ releaseXb(run.cd, first);
6431
6514
  attachCarry(run.carry, first);
6432
6515
  const info = { src: run.src, pos: last.tok.start, end: last.tok.end, context: run.st.prev + run.st.curr };
6433
6516
  const prev = run.tokens.at(-1);
@@ -6442,7 +6525,10 @@ function deliver(run, last) {
6442
6525
  function runEvents(run, res) {
6443
6526
  const groups = eventGroups(run, res);
6444
6527
  const last = groups.pop();
6445
- for (const g of groups) absorb(run.carry, g.tokens);
6528
+ for (const g of groups) {
6529
+ absorb(run.carry, g.tokens);
6530
+ keepLostText(run.cd, g.tokens);
6531
+ }
6446
6532
  if (last !== void 0) deliver(run, last);
6447
6533
  }
6448
6534
  function appendString(into, more) {
@@ -6473,7 +6559,8 @@ function tokenizeDeferred(src, label = { start: 0, end: src.length }) {
6473
6559
  tokens: [],
6474
6560
  st: { stack: [], prev: "", curr: "" },
6475
6561
  expat: new ExpatFeed(src),
6476
- carry: { warnings: [], warn: false }
6562
+ carry: { warnings: [], warn: false },
6563
+ cd: initialCharData()
6477
6564
  };
6478
6565
  let error;
6479
6566
  try {
@@ -6482,8 +6569,7 @@ function tokenizeDeferred(src, label = { start: 0, end: src.length }) {
6482
6569
  run.st.curr = src.slice(u.start, u.end);
6483
6570
  run.carry.warnings.push(...u.warnings);
6484
6571
  if (u.warn) run.carry.warn = true;
6485
- const nbytes = fedBytes(run.st.curr, !run.st.curr.startsWith("<"));
6486
- runEvents(run, run.expat.feed(u.start, u.end, nbytes));
6572
+ runEvents(run, run.expat.feed(u.start, u.end, !run.st.curr.startsWith("<")));
6487
6573
  }
6488
6574
  const held = run.expat.held;
6489
6575
  if (held !== void 0) error = unfinishedError(run, held);
@@ -6648,7 +6734,8 @@ var tableFont = (fontStack) => {
6648
6734
  var MSG_SYNTAX_ERROR = "syntax error";
6649
6735
  var MSG_TEXT_BEFORE_TABLE = "Syntax error: non-space string used before <TABLE>";
6650
6736
  var MSG_TEXT_AFTER_TABLE = "Syntax error: non-space string used after </TABLE>";
6651
- var nonSpace = (text) => /[^ \t\n\r]/.test(text);
6737
+ var nonSpace = (text) => /[^ ]/.test(text);
6738
+ var heldNonSpace = (tbl) => tbl?.type === "open" && nonSpace(tbl.heldText ?? "");
6652
6739
  var parseError = (s, tok, message) => {
6653
6740
  if (tok !== void 0) emitWarnings(s, tok);
6654
6741
  else emitEof(s);
@@ -6669,41 +6756,29 @@ var applyBrTag = (s, t, fontStack, items) => {
6669
6756
  items.push({ br: true, brAlign: parseAlign(t.attrs["align"] ?? ""), ...fontItemProps(font) });
6670
6757
  consumeClose(s, "BR");
6671
6758
  };
6672
- var applyFontTag = (s, t, fontStack, items) => {
6673
- consume(s);
6674
- const font = fontStack[fontStack.length - 1] ?? {};
6675
- fontStack.push(mergeFontState(font, {
6676
- fontColor: t.attrs["color"],
6677
- fontFace: t.attrs["face"],
6678
- fontSize: num(t.attrs["point-size"])
6679
- }));
6759
+ var parseStyledText = (s, tag, fontStack, items) => {
6680
6760
  const inner = parseText(s, fontStack);
6681
6761
  fontStack.pop();
6682
- items.push(...inner.items);
6683
6762
  const nxt = peek(s);
6684
- if (nxt?.type === "close" && nxt.tag === "FONT") consume(s);
6763
+ if (inner.items.length === 0 || nxt?.type !== "close" || nxt.tag !== tag) {
6764
+ throw parseError(s, nxt, MSG_SYNTAX_ERROR);
6765
+ }
6766
+ items.push(...inner.items);
6767
+ consume(s);
6685
6768
  };
6686
- var applyInlineTag = (s, t, fontStack, items) => {
6769
+ var applyStyleTag = (s, t, fontStack, items) => {
6687
6770
  consume(s);
6688
- const font = fontStack[fontStack.length - 1] ?? {};
6689
- fontStack.push(mergeFontState(font, inlineFontState(t.tag, t.attrs)));
6690
- const inner = parseText(s, fontStack);
6691
- fontStack.pop();
6692
- items.push(...inner.items);
6693
- const nxt = peek(s);
6694
- if (nxt?.type === "close" && nxt.tag === t.tag) consume(s);
6771
+ const own = t.tag === "FONT" ? { fontColor: t.attrs["color"], fontFace: t.attrs["face"], fontSize: num(t.attrs["point-size"]) } : inlineFontState(t.tag, t.attrs);
6772
+ fontStack.push(mergeFontState(fontStack[fontStack.length - 1] ?? {}, own));
6773
+ parseStyledText(s, t.tag, fontStack, items);
6695
6774
  };
6696
6775
  var applyOpenTag = (s, t, fontStack, items) => {
6697
6776
  if (t.tag === "BR") {
6698
6777
  applyBrTag(s, t, fontStack, items);
6699
6778
  return true;
6700
6779
  }
6701
- if (t.tag === "FONT") {
6702
- applyFontTag(s, t, fontStack, items);
6703
- return true;
6704
- }
6705
- if (isInlineTag(t.tag)) {
6706
- applyInlineTag(s, t, fontStack, items);
6780
+ if (t.tag === "FONT" || isInlineTag(t.tag)) {
6781
+ applyStyleTag(s, t, fontStack, items);
6707
6782
  return true;
6708
6783
  }
6709
6784
  return false;
@@ -6746,7 +6821,7 @@ var parseFontTable = (s, open, fontStack) => {
6746
6821
  fontStack.push(wrapperFont(open, fontStack));
6747
6822
  const textBefore = skipStrings(s);
6748
6823
  const tblTok = peek(s);
6749
- if (textBefore && tblTok !== void 0) throw parseError(s, tblTok, MSG_TEXT_BEFORE_TABLE);
6824
+ if ((textBefore || heldNonSpace(tblTok)) && tblTok !== void 0) throw parseError(s, tblTok, MSG_TEXT_BEFORE_TABLE);
6750
6825
  const table = parseTable(s, fontStack);
6751
6826
  const textAfter = skipStrings(s);
6752
6827
  const close = peek(s);
@@ -6775,7 +6850,7 @@ var parseImgContent = (s, t, cellAttrs) => {
6775
6850
  };
6776
6851
  var scanCellTable = (s, t, fontStack, st) => {
6777
6852
  if (st.kind === "image" || st.kind === "table") throw parseError(s, t, MSG_SYNTAX_ERROR);
6778
- if (st.textNonSpace) throw parseError(s, t, MSG_TEXT_BEFORE_TABLE);
6853
+ if (st.textNonSpace || heldNonSpace(t)) throw parseError(s, t, MSG_TEXT_BEFORE_TABLE);
6779
6854
  const tbl = parseTable(s, fontStack);
6780
6855
  st.kind = "table";
6781
6856
  return [tbl];
@@ -6930,14 +7005,14 @@ var consumeRowHr = (s, rows) => {
6930
7005
  var findFirstRealToken = (tokens, start) => {
6931
7006
  for (let i = start; i < tokens.length; i++) {
6932
7007
  const tk = tokens[i];
6933
- if (tk.type !== "text" || tk.value.trim() !== "") return tk;
7008
+ if (tk.type !== "text" || nonSpace(tk.value)) return tk;
6934
7009
  }
6935
7010
  return void 0;
6936
7011
  };
6937
7012
  var skipLeadingWs = (s) => {
6938
7013
  while (true) {
6939
7014
  const nxt = peek(s);
6940
- if (!nxt || nxt.type !== "text" || nxt.value.trim() !== "") break;
7015
+ if (!nxt || nxt.type !== "text" || nonSpace(nxt.value)) break;
6941
7016
  consume(s);
6942
7017
  }
6943
7018
  };
@@ -6963,6 +7038,7 @@ var parseFontTableLabel = (s, open, fontStack) => {
6963
7038
  };
6964
7039
  var parseTableLabel = (s, fontStack) => {
6965
7040
  skipLeadingWs(s);
7041
+ if (heldNonSpace(peek(s))) throw parseError(s, peek(s), MSG_TEXT_BEFORE_TABLE);
6966
7042
  const table = parseTable(s, fontStack);
6967
7043
  finishTableLabel(s);
6968
7044
  return { kind: "table", table };
@@ -51621,21 +51697,21 @@ function peg$parse(input, options) {
51621
51697
  const peg$r22 = /^[^\n]/;
51622
51698
  const peg$e0 = peg$literalExpectation("{", false);
51623
51699
  const peg$e1 = peg$literalExpectation("}", false);
51624
- const peg$e2 = peg$literalExpectation(";", false);
51625
- const peg$e3 = peg$literalExpectation("=", false);
51626
- const peg$e4 = peg$literalExpectation("[", false);
51627
- const peg$e5 = peg$literalExpectation("]", false);
51628
- const peg$e6 = peg$classExpectation([";", ","], false, false, false);
51629
- const peg$e7 = peg$literalExpectation(":", false);
51630
- const peg$e8 = peg$otherExpectation("edge operator");
51631
- const peg$e9 = peg$literalExpectation("->", false);
51632
- const peg$e10 = peg$literalExpectation("--", false);
51633
- const peg$e11 = peg$literalExpectation("+", false);
51634
- const peg$e12 = peg$literalExpectation('"', false);
51635
- const peg$e13 = peg$literalExpectation('\\"', false);
51636
- const peg$e14 = peg$literalExpectation("\\\n", false);
51637
- const peg$e15 = peg$literalExpectation("\\", false);
51638
- const peg$e16 = peg$anyExpectation();
51700
+ const peg$e2 = peg$anyExpectation();
51701
+ const peg$e3 = peg$literalExpectation(";", false);
51702
+ const peg$e4 = peg$literalExpectation("=", false);
51703
+ const peg$e5 = peg$literalExpectation("[", false);
51704
+ const peg$e6 = peg$literalExpectation("]", false);
51705
+ const peg$e7 = peg$classExpectation([";", ","], false, false, false);
51706
+ const peg$e8 = peg$literalExpectation(":", false);
51707
+ const peg$e9 = peg$otherExpectation("edge operator");
51708
+ const peg$e10 = peg$literalExpectation("->", false);
51709
+ const peg$e11 = peg$literalExpectation("--", false);
51710
+ const peg$e12 = peg$literalExpectation("+", false);
51711
+ const peg$e13 = peg$literalExpectation('"', false);
51712
+ const peg$e14 = peg$literalExpectation('\\"', false);
51713
+ const peg$e15 = peg$literalExpectation("\\\n", false);
51714
+ const peg$e16 = peg$literalExpectation("\\", false);
51639
51715
  const peg$e17 = peg$classExpectation(['"', "\\"], true, false, false);
51640
51716
  const peg$e18 = peg$literalExpectation("<", false);
51641
51717
  const peg$e19 = peg$literalExpectation(">", false);
@@ -51667,86 +51743,90 @@ function peg$parse(input, options) {
51667
51743
  const peg$e45 = peg$classExpectation(["\n"], true, false, false);
51668
51744
  const peg$e46 = peg$literalExpectation("\n", false);
51669
51745
  const peg$e47 = peg$literalExpectation("#", false);
51670
- function peg$f0(s, t, id, stmts) {
51746
+ function peg$f0(s, t, id, stmts, end) {
51671
51747
  return {
51672
51748
  type: "graph",
51673
51749
  strict: s,
51674
51750
  directed: t,
51675
51751
  id,
51676
- stmts
51752
+ stmts,
51753
+ end
51677
51754
  };
51678
51755
  }
51679
51756
  function peg$f1() {
51680
- return { type: "graph", strict: false, directed: false, id: null, stmts: [] };
51757
+ return { type: "graph", strict: false, directed: false, id: null, stmts: [], end: text().length };
51681
51758
  }
51682
51759
  function peg$f2() {
51683
- return true;
51760
+ return offset();
51684
51761
  }
51685
51762
  function peg$f3() {
51686
- return false;
51763
+ return true;
51687
51764
  }
51688
51765
  function peg$f4() {
51689
- return true;
51766
+ return false;
51690
51767
  }
51691
51768
  function peg$f5() {
51769
+ return true;
51770
+ }
51771
+ function peg$f6() {
51692
51772
  return false;
51693
51773
  }
51694
- function peg$f6(a) {
51774
+ function peg$f7(a) {
51695
51775
  return a;
51696
51776
  }
51697
- function peg$f7() {
51777
+ function peg$f8() {
51698
51778
  return null;
51699
51779
  }
51700
- function peg$f8(s) {
51780
+ function peg$f9(s) {
51701
51781
  return s;
51702
51782
  }
51703
- function peg$f9(stmts) {
51783
+ function peg$f10(stmts) {
51704
51784
  return stmts;
51705
51785
  }
51706
- function peg$f10(s) {
51786
+ function peg$f11(s) {
51707
51787
  return s;
51708
51788
  }
51709
- function peg$f11(s) {
51789
+ function peg$f12(s) {
51710
51790
  return s;
51711
51791
  }
51712
- function peg$f12(t, m, attrs) {
51792
+ function peg$f13(t, m, attrs) {
51713
51793
  if (m) console.error("Warning: attribute macros not implemented");
51714
51794
  return { type: "attr", target: t, attrs };
51715
51795
  }
51716
- function peg$f13(a) {
51796
+ function peg$f14(a) {
51717
51797
  return { type: "assign", key: a.key, value: a.value };
51718
51798
  }
51719
- function peg$f14() {
51799
+ function peg$f15() {
51720
51800
  return true;
51721
51801
  }
51722
- function peg$f15() {
51802
+ function peg$f16() {
51723
51803
  return false;
51724
51804
  }
51725
- function peg$f16() {
51805
+ function peg$f17() {
51726
51806
  return "graph";
51727
51807
  }
51728
- function peg$f17() {
51808
+ function peg$f18() {
51729
51809
  return "node";
51730
51810
  }
51731
- function peg$f18() {
51811
+ function peg$f19() {
51732
51812
  return "edge";
51733
51813
  }
51734
- function peg$f19(defs, rest) {
51814
+ function peg$f20(defs, rest) {
51735
51815
  return defs.concat(rest);
51736
51816
  }
51737
- function peg$f20() {
51817
+ function peg$f21() {
51738
51818
  return [];
51739
51819
  }
51740
- function peg$f21(a) {
51820
+ function peg$f22(a) {
51741
51821
  return a;
51742
51822
  }
51743
- function peg$f22(pairs) {
51823
+ function peg$f23(pairs) {
51744
51824
  return pairs;
51745
51825
  }
51746
- function peg$f23(k, v) {
51826
+ function peg$f24(k, v) {
51747
51827
  return { key: k, value: v };
51748
51828
  }
51749
- function peg$f24(head, chain, attrs) {
51829
+ function peg$f25(head, chain, attrs) {
51750
51830
  if (chain.length > 0) {
51751
51831
  const nodes = [head].concat(chain);
51752
51832
  return { type: "edge", nodes, attrs };
@@ -51757,70 +51837,70 @@ function peg$parse(input, options) {
51757
51837
  return { type: "node", id: head, attrs };
51758
51838
  }
51759
51839
  }
51760
- function peg$f25(s) {
51840
+ function peg$f26(s) {
51761
51841
  return s;
51762
51842
  }
51763
- function peg$f26(n) {
51843
+ function peg$f27(n) {
51764
51844
  return n;
51765
51845
  }
51766
- function peg$f27(id, port, compass) {
51846
+ function peg$f28(id, port, compass) {
51767
51847
  return { id, port, compass };
51768
51848
  }
51769
- function peg$f28(id, port) {
51849
+ function peg$f29(id, port) {
51770
51850
  return { id, port, compass: null };
51771
51851
  }
51772
- function peg$f29(id) {
51852
+ function peg$f30(id) {
51773
51853
  return { id, port: null, compass: null };
51774
51854
  }
51775
- function peg$f30(s, rest) {
51855
+ function peg$f31(s, rest) {
51776
51856
  return [s].concat(rest);
51777
51857
  }
51778
- function peg$f31() {
51858
+ function peg$f32() {
51779
51859
  return [];
51780
51860
  }
51781
- function peg$f32(id, stmts) {
51861
+ function peg$f33(id, stmts) {
51782
51862
  return { type: "subgraph", id, stmts };
51783
51863
  }
51784
- function peg$f33(stmts) {
51864
+ function peg$f34(stmts) {
51785
51865
  return { type: "subgraph", id: null, stmts };
51786
51866
  }
51787
- function peg$f34(stmts) {
51867
+ function peg$f35(stmts) {
51788
51868
  return { type: "subgraph", id: null, stmts };
51789
51869
  }
51790
- function peg$f35(first, s) {
51870
+ function peg$f36(first, s) {
51791
51871
  return s;
51792
51872
  }
51793
- function peg$f36(first, rest) {
51873
+ function peg$f37(first, rest) {
51794
51874
  return rest.length > 0 ? first + rest.join("") : first;
51795
51875
  }
51796
- function peg$f37(chars) {
51876
+ function peg$f38(chars) {
51797
51877
  return chars.join("");
51798
51878
  }
51799
- function peg$f38() {
51879
+ function peg$f39() {
51800
51880
  return '"';
51801
51881
  }
51802
- function peg$f39() {
51882
+ function peg$f40() {
51803
51883
  return "";
51804
51884
  }
51805
- function peg$f40(c) {
51885
+ function peg$f41(c) {
51806
51886
  return "\\" + c;
51807
51887
  }
51808
- function peg$f41(content) {
51888
+ function peg$f42(content) {
51809
51889
  return "" + content;
51810
51890
  }
51811
- function peg$f42(chars) {
51891
+ function peg$f43(chars) {
51812
51892
  return chars.join("");
51813
51893
  }
51814
- function peg$f43(nested2, content) {
51894
+ function peg$f44(nested2, content) {
51815
51895
  return "<" + content + ">";
51816
51896
  }
51817
- function peg$f44(n) {
51897
+ function peg$f45(n) {
51818
51898
  return n;
51819
51899
  }
51820
- function peg$f45(first, rest) {
51900
+ function peg$f46(first, rest) {
51821
51901
  return first + rest.join("");
51822
51902
  }
51823
- function peg$f46(s) {
51903
+ function peg$f47(s) {
51824
51904
  return Array.isArray(s) ? s.flat(Infinity).filter((x) => x !== null && x !== void 0).join("") : String(s);
51825
51905
  }
51826
51906
  let peg$currPos = options.peg$currPos | 0;
@@ -51996,9 +52076,9 @@ function peg$parse(input, options) {
51996
52076
  }
51997
52077
  }
51998
52078
  if (s122 !== peg$FAILED) {
51999
- s13 = peg$parse_();
52079
+ s13 = peg$parseGraphEof();
52000
52080
  peg$savedPos = s0;
52001
- s0 = peg$f0(s2, s4, s6, s10);
52081
+ s0 = peg$f0(s2, s4, s6, s10, s13);
52002
52082
  } else {
52003
52083
  peg$currPos = s0;
52004
52084
  s0 = peg$FAILED;
@@ -52028,6 +52108,36 @@ function peg$parse(input, options) {
52028
52108
  }
52029
52109
  return s0;
52030
52110
  }
52111
+ function peg$parseGraphEof() {
52112
+ let s0, s12, s2;
52113
+ s0 = peg$currPos;
52114
+ s12 = [];
52115
+ if (input.length > peg$currPos) {
52116
+ s2 = input.charAt(peg$currPos);
52117
+ peg$currPos++;
52118
+ } else {
52119
+ s2 = peg$FAILED;
52120
+ if (peg$silentFails === 0) {
52121
+ peg$fail(peg$e2);
52122
+ }
52123
+ }
52124
+ while (s2 !== peg$FAILED) {
52125
+ s12.push(s2);
52126
+ if (input.length > peg$currPos) {
52127
+ s2 = input.charAt(peg$currPos);
52128
+ peg$currPos++;
52129
+ } else {
52130
+ s2 = peg$FAILED;
52131
+ if (peg$silentFails === 0) {
52132
+ peg$fail(peg$e2);
52133
+ }
52134
+ }
52135
+ }
52136
+ peg$savedPos = s0;
52137
+ s12 = peg$f2();
52138
+ s0 = s12;
52139
+ return s0;
52140
+ }
52031
52141
  function peg$parseOptStrict() {
52032
52142
  let s0, s12, s2;
52033
52143
  s0 = peg$currPos;
@@ -52035,7 +52145,7 @@ function peg$parse(input, options) {
52035
52145
  if (s12 !== peg$FAILED) {
52036
52146
  s2 = peg$parse_();
52037
52147
  peg$savedPos = s0;
52038
- s0 = peg$f2();
52148
+ s0 = peg$f3();
52039
52149
  } else {
52040
52150
  peg$currPos = s0;
52041
52151
  s0 = peg$FAILED;
@@ -52044,7 +52154,7 @@ function peg$parse(input, options) {
52044
52154
  s0 = peg$currPos;
52045
52155
  s12 = "";
52046
52156
  peg$savedPos = s0;
52047
- s12 = peg$f3();
52157
+ s12 = peg$f4();
52048
52158
  s0 = s12;
52049
52159
  }
52050
52160
  return s0;
@@ -52055,7 +52165,7 @@ function peg$parse(input, options) {
52055
52165
  s12 = peg$parseDigraphKw();
52056
52166
  if (s12 !== peg$FAILED) {
52057
52167
  peg$savedPos = s0;
52058
- s12 = peg$f4();
52168
+ s12 = peg$f5();
52059
52169
  }
52060
52170
  s0 = s12;
52061
52171
  if (s0 === peg$FAILED) {
@@ -52063,7 +52173,7 @@ function peg$parse(input, options) {
52063
52173
  s12 = peg$parseGraphKw();
52064
52174
  if (s12 !== peg$FAILED) {
52065
52175
  peg$savedPos = s0;
52066
- s12 = peg$f5();
52176
+ s12 = peg$f6();
52067
52177
  }
52068
52178
  s0 = s12;
52069
52179
  }
@@ -52076,7 +52186,7 @@ function peg$parse(input, options) {
52076
52186
  if (s12 !== peg$FAILED) {
52077
52187
  s2 = peg$parse_();
52078
52188
  peg$savedPos = s0;
52079
- s0 = peg$f6(s12);
52189
+ s0 = peg$f7(s12);
52080
52190
  } else {
52081
52191
  peg$currPos = s0;
52082
52192
  s0 = peg$FAILED;
@@ -52085,7 +52195,7 @@ function peg$parse(input, options) {
52085
52195
  s0 = peg$currPos;
52086
52196
  s12 = "";
52087
52197
  peg$savedPos = s0;
52088
- s12 = peg$f7();
52198
+ s12 = peg$f8();
52089
52199
  s0 = s12;
52090
52200
  }
52091
52201
  return s0;
@@ -52099,7 +52209,7 @@ function peg$parse(input, options) {
52099
52209
  if (s3 !== peg$FAILED) {
52100
52210
  s4 = peg$parse_();
52101
52211
  peg$savedPos = s2;
52102
- s2 = peg$f8(s3);
52212
+ s2 = peg$f9(s3);
52103
52213
  } else {
52104
52214
  peg$currPos = s2;
52105
52215
  s2 = peg$FAILED;
@@ -52111,14 +52221,14 @@ function peg$parse(input, options) {
52111
52221
  if (s3 !== peg$FAILED) {
52112
52222
  s4 = peg$parse_();
52113
52223
  peg$savedPos = s2;
52114
- s2 = peg$f8(s3);
52224
+ s2 = peg$f9(s3);
52115
52225
  } else {
52116
52226
  peg$currPos = s2;
52117
52227
  s2 = peg$FAILED;
52118
52228
  }
52119
52229
  }
52120
52230
  peg$savedPos = s0;
52121
- s12 = peg$f9(s12);
52231
+ s12 = peg$f10(s12);
52122
52232
  s0 = s12;
52123
52233
  return s0;
52124
52234
  }
@@ -52135,7 +52245,7 @@ function peg$parse(input, options) {
52135
52245
  } else {
52136
52246
  s4 = peg$FAILED;
52137
52247
  if (peg$silentFails === 0) {
52138
- peg$fail(peg$e2);
52248
+ peg$fail(peg$e3);
52139
52249
  }
52140
52250
  }
52141
52251
  if (s4 !== peg$FAILED) {
@@ -52150,7 +52260,7 @@ function peg$parse(input, options) {
52150
52260
  s3 = null;
52151
52261
  }
52152
52262
  peg$savedPos = s0;
52153
- s0 = peg$f10(s12);
52263
+ s0 = peg$f11(s12);
52154
52264
  } else {
52155
52265
  peg$currPos = s0;
52156
52266
  s0 = peg$FAILED;
@@ -52167,7 +52277,7 @@ function peg$parse(input, options) {
52167
52277
  } else {
52168
52278
  s4 = peg$FAILED;
52169
52279
  if (peg$silentFails === 0) {
52170
- peg$fail(peg$e2);
52280
+ peg$fail(peg$e3);
52171
52281
  }
52172
52282
  }
52173
52283
  if (s4 !== peg$FAILED) {
@@ -52182,7 +52292,7 @@ function peg$parse(input, options) {
52182
52292
  s3 = null;
52183
52293
  }
52184
52294
  peg$savedPos = s0;
52185
- s0 = peg$f11(s12);
52295
+ s0 = peg$f12(s12);
52186
52296
  } else {
52187
52297
  peg$currPos = s0;
52188
52298
  s0 = peg$FAILED;
@@ -52201,7 +52311,7 @@ function peg$parse(input, options) {
52201
52311
  s4 = peg$parseAttrListReq();
52202
52312
  if (s4 !== peg$FAILED) {
52203
52313
  peg$savedPos = s0;
52204
- s0 = peg$f12(s12, s3, s4);
52314
+ s0 = peg$f13(s12, s3, s4);
52205
52315
  } else {
52206
52316
  peg$currPos = s0;
52207
52317
  s0 = peg$FAILED;
@@ -52219,7 +52329,7 @@ function peg$parse(input, options) {
52219
52329
  s12 = peg$parseAttrAssignment();
52220
52330
  if (s12 !== peg$FAILED) {
52221
52331
  peg$savedPos = s0;
52222
- s12 = peg$f13(s12);
52332
+ s12 = peg$f14(s12);
52223
52333
  }
52224
52334
  s0 = s12;
52225
52335
  }
@@ -52237,13 +52347,13 @@ function peg$parse(input, options) {
52237
52347
  } else {
52238
52348
  s3 = peg$FAILED;
52239
52349
  if (peg$silentFails === 0) {
52240
- peg$fail(peg$e3);
52350
+ peg$fail(peg$e4);
52241
52351
  }
52242
52352
  }
52243
52353
  if (s3 !== peg$FAILED) {
52244
52354
  s4 = peg$parse_();
52245
52355
  peg$savedPos = s0;
52246
- s0 = peg$f14();
52356
+ s0 = peg$f15();
52247
52357
  } else {
52248
52358
  peg$currPos = s0;
52249
52359
  s0 = peg$FAILED;
@@ -52256,7 +52366,7 @@ function peg$parse(input, options) {
52256
52366
  s0 = peg$currPos;
52257
52367
  s12 = "";
52258
52368
  peg$savedPos = s0;
52259
- s12 = peg$f15();
52369
+ s12 = peg$f16();
52260
52370
  s0 = s12;
52261
52371
  }
52262
52372
  return s0;
@@ -52267,7 +52377,7 @@ function peg$parse(input, options) {
52267
52377
  s12 = peg$parseGraphKw();
52268
52378
  if (s12 !== peg$FAILED) {
52269
52379
  peg$savedPos = s0;
52270
- s12 = peg$f16();
52380
+ s12 = peg$f17();
52271
52381
  }
52272
52382
  s0 = s12;
52273
52383
  if (s0 === peg$FAILED) {
@@ -52275,7 +52385,7 @@ function peg$parse(input, options) {
52275
52385
  s12 = peg$parseNodeKw();
52276
52386
  if (s12 !== peg$FAILED) {
52277
52387
  peg$savedPos = s0;
52278
- s12 = peg$f17();
52388
+ s12 = peg$f18();
52279
52389
  }
52280
52390
  s0 = s12;
52281
52391
  if (s0 === peg$FAILED) {
@@ -52283,7 +52393,7 @@ function peg$parse(input, options) {
52283
52393
  s12 = peg$parseEdgeKw();
52284
52394
  if (s12 !== peg$FAILED) {
52285
52395
  peg$savedPos = s0;
52286
- s12 = peg$f18();
52396
+ s12 = peg$f19();
52287
52397
  }
52288
52398
  s0 = s12;
52289
52399
  }
@@ -52300,7 +52410,7 @@ function peg$parse(input, options) {
52300
52410
  } else {
52301
52411
  s2 = peg$FAILED;
52302
52412
  if (peg$silentFails === 0) {
52303
- peg$fail(peg$e4);
52413
+ peg$fail(peg$e5);
52304
52414
  }
52305
52415
  }
52306
52416
  if (s2 !== peg$FAILED) {
@@ -52313,14 +52423,14 @@ function peg$parse(input, options) {
52313
52423
  } else {
52314
52424
  s6 = peg$FAILED;
52315
52425
  if (peg$silentFails === 0) {
52316
- peg$fail(peg$e5);
52426
+ peg$fail(peg$e6);
52317
52427
  }
52318
52428
  }
52319
52429
  if (s6 !== peg$FAILED) {
52320
52430
  s7 = peg$parseAttrList();
52321
52431
  if (s7 !== peg$FAILED) {
52322
52432
  peg$savedPos = s0;
52323
- s0 = peg$f19(s4, s7);
52433
+ s0 = peg$f20(s4, s7);
52324
52434
  } else {
52325
52435
  peg$currPos = s0;
52326
52436
  s0 = peg$FAILED;
@@ -52342,7 +52452,7 @@ function peg$parse(input, options) {
52342
52452
  s0 = peg$currPos;
52343
52453
  s12 = "";
52344
52454
  peg$savedPos = s0;
52345
- s12 = peg$f20();
52455
+ s12 = peg$f21();
52346
52456
  s0 = s12;
52347
52457
  }
52348
52458
  return s0;
@@ -52362,7 +52472,7 @@ function peg$parse(input, options) {
52362
52472
  } else {
52363
52473
  s6 = peg$FAILED;
52364
52474
  if (peg$silentFails === 0) {
52365
- peg$fail(peg$e6);
52475
+ peg$fail(peg$e7);
52366
52476
  }
52367
52477
  }
52368
52478
  if (s6 !== peg$FAILED) {
@@ -52377,7 +52487,7 @@ function peg$parse(input, options) {
52377
52487
  s5 = null;
52378
52488
  }
52379
52489
  peg$savedPos = s2;
52380
- s2 = peg$f21(s3);
52490
+ s2 = peg$f22(s3);
52381
52491
  } else {
52382
52492
  peg$currPos = s2;
52383
52493
  s2 = peg$FAILED;
@@ -52395,7 +52505,7 @@ function peg$parse(input, options) {
52395
52505
  } else {
52396
52506
  s6 = peg$FAILED;
52397
52507
  if (peg$silentFails === 0) {
52398
- peg$fail(peg$e6);
52508
+ peg$fail(peg$e7);
52399
52509
  }
52400
52510
  }
52401
52511
  if (s6 !== peg$FAILED) {
@@ -52410,14 +52520,14 @@ function peg$parse(input, options) {
52410
52520
  s5 = null;
52411
52521
  }
52412
52522
  peg$savedPos = s2;
52413
- s2 = peg$f21(s3);
52523
+ s2 = peg$f22(s3);
52414
52524
  } else {
52415
52525
  peg$currPos = s2;
52416
52526
  s2 = peg$FAILED;
52417
52527
  }
52418
52528
  }
52419
52529
  peg$savedPos = s0;
52420
- s12 = peg$f22(s12);
52530
+ s12 = peg$f23(s12);
52421
52531
  s0 = s12;
52422
52532
  return s0;
52423
52533
  }
@@ -52433,7 +52543,7 @@ function peg$parse(input, options) {
52433
52543
  } else {
52434
52544
  s3 = peg$FAILED;
52435
52545
  if (peg$silentFails === 0) {
52436
- peg$fail(peg$e3);
52546
+ peg$fail(peg$e4);
52437
52547
  }
52438
52548
  }
52439
52549
  if (s3 !== peg$FAILED) {
@@ -52441,7 +52551,7 @@ function peg$parse(input, options) {
52441
52551
  s5 = peg$parseAtom();
52442
52552
  if (s5 !== peg$FAILED) {
52443
52553
  peg$savedPos = s0;
52444
- s0 = peg$f23(s12, s5);
52554
+ s0 = peg$f24(s12, s5);
52445
52555
  } else {
52446
52556
  peg$currPos = s0;
52447
52557
  s0 = peg$FAILED;
@@ -52468,7 +52578,7 @@ function peg$parse(input, options) {
52468
52578
  s5 = peg$parseAttrList();
52469
52579
  if (s5 !== peg$FAILED) {
52470
52580
  peg$savedPos = s0;
52471
- s0 = peg$f24(s12, s3, s5);
52581
+ s0 = peg$f25(s12, s3, s5);
52472
52582
  } else {
52473
52583
  peg$currPos = s0;
52474
52584
  s0 = peg$FAILED;
@@ -52489,7 +52599,7 @@ function peg$parse(input, options) {
52489
52599
  s12 = peg$parseSubgraph();
52490
52600
  if (s12 !== peg$FAILED) {
52491
52601
  peg$savedPos = s0;
52492
- s12 = peg$f25(s12);
52602
+ s12 = peg$f26(s12);
52493
52603
  }
52494
52604
  s0 = s12;
52495
52605
  if (s0 === peg$FAILED) {
@@ -52497,7 +52607,7 @@ function peg$parse(input, options) {
52497
52607
  s12 = peg$parseNode();
52498
52608
  if (s12 !== peg$FAILED) {
52499
52609
  peg$savedPos = s0;
52500
- s12 = peg$f26(s12);
52610
+ s12 = peg$f27(s12);
52501
52611
  }
52502
52612
  s0 = s12;
52503
52613
  }
@@ -52515,7 +52625,7 @@ function peg$parse(input, options) {
52515
52625
  } else {
52516
52626
  s3 = peg$FAILED;
52517
52627
  if (peg$silentFails === 0) {
52518
- peg$fail(peg$e7);
52628
+ peg$fail(peg$e8);
52519
52629
  }
52520
52630
  }
52521
52631
  if (s3 !== peg$FAILED) {
@@ -52529,7 +52639,7 @@ function peg$parse(input, options) {
52529
52639
  } else {
52530
52640
  s7 = peg$FAILED;
52531
52641
  if (peg$silentFails === 0) {
52532
- peg$fail(peg$e7);
52642
+ peg$fail(peg$e8);
52533
52643
  }
52534
52644
  }
52535
52645
  if (s7 !== peg$FAILED) {
@@ -52537,7 +52647,7 @@ function peg$parse(input, options) {
52537
52647
  s9 = peg$parseAtom();
52538
52648
  if (s9 !== peg$FAILED) {
52539
52649
  peg$savedPos = s0;
52540
- s0 = peg$f27(s12, s5, s9);
52650
+ s0 = peg$f28(s12, s5, s9);
52541
52651
  } else {
52542
52652
  peg$currPos = s0;
52543
52653
  s0 = peg$FAILED;
@@ -52569,7 +52679,7 @@ function peg$parse(input, options) {
52569
52679
  } else {
52570
52680
  s3 = peg$FAILED;
52571
52681
  if (peg$silentFails === 0) {
52572
- peg$fail(peg$e7);
52682
+ peg$fail(peg$e8);
52573
52683
  }
52574
52684
  }
52575
52685
  if (s3 !== peg$FAILED) {
@@ -52577,7 +52687,7 @@ function peg$parse(input, options) {
52577
52687
  s5 = peg$parseAtom();
52578
52688
  if (s5 !== peg$FAILED) {
52579
52689
  peg$savedPos = s0;
52580
- s0 = peg$f28(s12, s5);
52690
+ s0 = peg$f29(s12, s5);
52581
52691
  } else {
52582
52692
  peg$currPos = s0;
52583
52693
  s0 = peg$FAILED;
@@ -52595,7 +52705,7 @@ function peg$parse(input, options) {
52595
52705
  s12 = peg$parseAtom();
52596
52706
  if (s12 !== peg$FAILED) {
52597
52707
  peg$savedPos = s0;
52598
- s12 = peg$f29(s12);
52708
+ s12 = peg$f30(s12);
52599
52709
  }
52600
52710
  s0 = s12;
52601
52711
  }
@@ -52614,7 +52724,7 @@ function peg$parse(input, options) {
52614
52724
  s5 = peg$parseEdgeChain();
52615
52725
  if (s5 !== peg$FAILED) {
52616
52726
  peg$savedPos = s0;
52617
- s0 = peg$f30(s3, s5);
52727
+ s0 = peg$f31(s3, s5);
52618
52728
  } else {
52619
52729
  peg$currPos = s0;
52620
52730
  s0 = peg$FAILED;
@@ -52631,7 +52741,7 @@ function peg$parse(input, options) {
52631
52741
  s0 = peg$currPos;
52632
52742
  s12 = "";
52633
52743
  peg$savedPos = s0;
52634
- s12 = peg$f31();
52744
+ s12 = peg$f32();
52635
52745
  s0 = s12;
52636
52746
  }
52637
52747
  return s0;
@@ -52645,7 +52755,7 @@ function peg$parse(input, options) {
52645
52755
  } else {
52646
52756
  s0 = peg$FAILED;
52647
52757
  if (peg$silentFails === 0) {
52648
- peg$fail(peg$e9);
52758
+ peg$fail(peg$e10);
52649
52759
  }
52650
52760
  }
52651
52761
  if (s0 === peg$FAILED) {
@@ -52655,7 +52765,7 @@ function peg$parse(input, options) {
52655
52765
  } else {
52656
52766
  s0 = peg$FAILED;
52657
52767
  if (peg$silentFails === 0) {
52658
- peg$fail(peg$e10);
52768
+ peg$fail(peg$e11);
52659
52769
  }
52660
52770
  }
52661
52771
  }
@@ -52663,7 +52773,7 @@ function peg$parse(input, options) {
52663
52773
  if (s0 === peg$FAILED) {
52664
52774
  s12 = peg$FAILED;
52665
52775
  if (peg$silentFails === 0) {
52666
- peg$fail(peg$e8);
52776
+ peg$fail(peg$e9);
52667
52777
  }
52668
52778
  }
52669
52779
  return s0;
@@ -52702,7 +52812,7 @@ function peg$parse(input, options) {
52702
52812
  }
52703
52813
  if (s9 !== peg$FAILED) {
52704
52814
  peg$savedPos = s0;
52705
- s0 = peg$f32(s3, s7);
52815
+ s0 = peg$f33(s3, s7);
52706
52816
  } else {
52707
52817
  peg$currPos = s0;
52708
52818
  s0 = peg$FAILED;
@@ -52753,7 +52863,7 @@ function peg$parse(input, options) {
52753
52863
  }
52754
52864
  if (s7 !== peg$FAILED) {
52755
52865
  peg$savedPos = s0;
52756
- s0 = peg$f33(s5);
52866
+ s0 = peg$f34(s5);
52757
52867
  } else {
52758
52868
  peg$currPos = s0;
52759
52869
  s0 = peg$FAILED;
@@ -52797,7 +52907,7 @@ function peg$parse(input, options) {
52797
52907
  }
52798
52908
  if (s5 !== peg$FAILED) {
52799
52909
  peg$savedPos = s0;
52800
- s0 = peg$f34(s3);
52910
+ s0 = peg$f35(s3);
52801
52911
  } else {
52802
52912
  peg$currPos = s0;
52803
52913
  s0 = peg$FAILED;
@@ -52828,7 +52938,7 @@ function peg$parse(input, options) {
52828
52938
  } else {
52829
52939
  s5 = peg$FAILED;
52830
52940
  if (peg$silentFails === 0) {
52831
- peg$fail(peg$e11);
52941
+ peg$fail(peg$e12);
52832
52942
  }
52833
52943
  }
52834
52944
  if (s5 !== peg$FAILED) {
@@ -52836,7 +52946,7 @@ function peg$parse(input, options) {
52836
52946
  s7 = peg$parseQAtom();
52837
52947
  if (s7 !== peg$FAILED) {
52838
52948
  peg$savedPos = s3;
52839
- s3 = peg$f35(s12, s7);
52949
+ s3 = peg$f36(s12, s7);
52840
52950
  } else {
52841
52951
  peg$currPos = s3;
52842
52952
  s3 = peg$FAILED;
@@ -52855,7 +52965,7 @@ function peg$parse(input, options) {
52855
52965
  } else {
52856
52966
  s5 = peg$FAILED;
52857
52967
  if (peg$silentFails === 0) {
52858
- peg$fail(peg$e11);
52968
+ peg$fail(peg$e12);
52859
52969
  }
52860
52970
  }
52861
52971
  if (s5 !== peg$FAILED) {
@@ -52863,7 +52973,7 @@ function peg$parse(input, options) {
52863
52973
  s7 = peg$parseQAtom();
52864
52974
  if (s7 !== peg$FAILED) {
52865
52975
  peg$savedPos = s3;
52866
- s3 = peg$f35(s12, s7);
52976
+ s3 = peg$f36(s12, s7);
52867
52977
  } else {
52868
52978
  peg$currPos = s3;
52869
52979
  s3 = peg$FAILED;
@@ -52874,7 +52984,7 @@ function peg$parse(input, options) {
52874
52984
  }
52875
52985
  }
52876
52986
  peg$savedPos = s0;
52877
- s0 = peg$f36(s12, s2);
52987
+ s0 = peg$f37(s12, s2);
52878
52988
  } else {
52879
52989
  peg$currPos = s0;
52880
52990
  s0 = peg$FAILED;
@@ -52901,7 +53011,7 @@ function peg$parse(input, options) {
52901
53011
  } else {
52902
53012
  s12 = peg$FAILED;
52903
53013
  if (peg$silentFails === 0) {
52904
- peg$fail(peg$e12);
53014
+ peg$fail(peg$e13);
52905
53015
  }
52906
53016
  }
52907
53017
  if (s12 !== peg$FAILED) {
@@ -52917,12 +53027,12 @@ function peg$parse(input, options) {
52917
53027
  } else {
52918
53028
  s3 = peg$FAILED;
52919
53029
  if (peg$silentFails === 0) {
52920
- peg$fail(peg$e12);
53030
+ peg$fail(peg$e13);
52921
53031
  }
52922
53032
  }
52923
53033
  if (s3 !== peg$FAILED) {
52924
53034
  peg$savedPos = s0;
52925
- s0 = peg$f37(s2);
53035
+ s0 = peg$f38(s2);
52926
53036
  } else {
52927
53037
  peg$currPos = s0;
52928
53038
  s0 = peg$FAILED;
@@ -52942,12 +53052,12 @@ function peg$parse(input, options) {
52942
53052
  } else {
52943
53053
  s12 = peg$FAILED;
52944
53054
  if (peg$silentFails === 0) {
52945
- peg$fail(peg$e13);
53055
+ peg$fail(peg$e14);
52946
53056
  }
52947
53057
  }
52948
53058
  if (s12 !== peg$FAILED) {
52949
53059
  peg$savedPos = s0;
52950
- s12 = peg$f38();
53060
+ s12 = peg$f39();
52951
53061
  }
52952
53062
  s0 = s12;
52953
53063
  if (s0 === peg$FAILED) {
@@ -52958,12 +53068,12 @@ function peg$parse(input, options) {
52958
53068
  } else {
52959
53069
  s12 = peg$FAILED;
52960
53070
  if (peg$silentFails === 0) {
52961
- peg$fail(peg$e14);
53071
+ peg$fail(peg$e15);
52962
53072
  }
52963
53073
  }
52964
53074
  if (s12 !== peg$FAILED) {
52965
53075
  peg$savedPos = s0;
52966
- s12 = peg$f39();
53076
+ s12 = peg$f40();
52967
53077
  }
52968
53078
  s0 = s12;
52969
53079
  if (s0 === peg$FAILED) {
@@ -52974,7 +53084,7 @@ function peg$parse(input, options) {
52974
53084
  } else {
52975
53085
  s12 = peg$FAILED;
52976
53086
  if (peg$silentFails === 0) {
52977
- peg$fail(peg$e15);
53087
+ peg$fail(peg$e16);
52978
53088
  }
52979
53089
  }
52980
53090
  if (s12 !== peg$FAILED) {
@@ -52984,12 +53094,12 @@ function peg$parse(input, options) {
52984
53094
  } else {
52985
53095
  s2 = peg$FAILED;
52986
53096
  if (peg$silentFails === 0) {
52987
- peg$fail(peg$e16);
53097
+ peg$fail(peg$e2);
52988
53098
  }
52989
53099
  }
52990
53100
  if (s2 !== peg$FAILED) {
52991
53101
  peg$savedPos = s0;
52992
- s0 = peg$f40(s2);
53102
+ s0 = peg$f41(s2);
52993
53103
  } else {
52994
53104
  peg$currPos = s0;
52995
53105
  s0 = peg$FAILED;
@@ -53038,7 +53148,7 @@ function peg$parse(input, options) {
53038
53148
  }
53039
53149
  if (s3 !== peg$FAILED) {
53040
53150
  peg$savedPos = s0;
53041
- s0 = peg$f41(s2);
53151
+ s0 = peg$f42(s2);
53042
53152
  } else {
53043
53153
  peg$currPos = s0;
53044
53154
  s0 = peg$FAILED;
@@ -53059,7 +53169,7 @@ function peg$parse(input, options) {
53059
53169
  s2 = peg$parseHtmlChar();
53060
53170
  }
53061
53171
  peg$savedPos = s0;
53062
- s12 = peg$f42(s12);
53172
+ s12 = peg$f43(s12);
53063
53173
  s0 = s12;
53064
53174
  return s0;
53065
53175
  }
@@ -53089,7 +53199,7 @@ function peg$parse(input, options) {
53089
53199
  }
53090
53200
  if (s3 !== peg$FAILED) {
53091
53201
  peg$savedPos = s0;
53092
- s0 = peg$f43(s12, s2);
53202
+ s0 = peg$f44(s12, s2);
53093
53203
  } else {
53094
53204
  peg$currPos = s0;
53095
53205
  s0 = peg$FAILED;
@@ -53134,7 +53244,7 @@ function peg$parse(input, options) {
53134
53244
  s2 = peg$parseName();
53135
53245
  if (s2 !== peg$FAILED) {
53136
53246
  peg$savedPos = s0;
53137
- s0 = peg$f44(s2);
53247
+ s0 = peg$f45(s2);
53138
53248
  } else {
53139
53249
  peg$currPos = s0;
53140
53250
  s0 = peg$FAILED;
@@ -53182,7 +53292,7 @@ function peg$parse(input, options) {
53182
53292
  }
53183
53293
  }
53184
53294
  peg$savedPos = s0;
53185
- s0 = peg$f45(s12, s2);
53295
+ s0 = peg$f46(s12, s2);
53186
53296
  } else {
53187
53297
  peg$currPos = s0;
53188
53298
  s0 = peg$FAILED;
@@ -53340,7 +53450,7 @@ function peg$parse(input, options) {
53340
53450
  }
53341
53451
  if (s12 !== peg$FAILED) {
53342
53452
  peg$savedPos = s0;
53343
- s12 = peg$f46(s12);
53453
+ s12 = peg$f47(s12);
53344
53454
  }
53345
53455
  s0 = s12;
53346
53456
  return s0;
@@ -54615,7 +54725,7 @@ function peg$parse(input, options) {
54615
54725
  } else {
54616
54726
  s5 = peg$FAILED;
54617
54727
  if (peg$silentFails === 0) {
54618
- peg$fail(peg$e16);
54728
+ peg$fail(peg$e2);
54619
54729
  }
54620
54730
  }
54621
54731
  if (s5 !== peg$FAILED) {
@@ -54657,7 +54767,7 @@ function peg$parse(input, options) {
54657
54767
  } else {
54658
54768
  s5 = peg$FAILED;
54659
54769
  if (peg$silentFails === 0) {
54660
- peg$fail(peg$e16);
54770
+ peg$fail(peg$e2);
54661
54771
  }
54662
54772
  }
54663
54773
  if (s5 !== peg$FAILED) {
@@ -54747,7 +54857,7 @@ function peg$parse(input, options) {
54747
54857
  } else {
54748
54858
  s4 = peg$FAILED;
54749
54859
  if (peg$silentFails === 0) {
54750
- peg$fail(peg$e16);
54860
+ peg$fail(peg$e2);
54751
54861
  }
54752
54862
  }
54753
54863
  peg$silentFails--;
@@ -54824,7 +54934,7 @@ function peg$parse(input, options) {
54824
54934
  } else {
54825
54935
  s4 = peg$FAILED;
54826
54936
  if (peg$silentFails === 0) {
54827
- peg$fail(peg$e16);
54937
+ peg$fail(peg$e2);
54828
54938
  }
54829
54939
  }
54830
54940
  peg$silentFails--;
@@ -55611,8 +55721,9 @@ function parse(src) {
55611
55721
  }
55612
55722
  throw err;
55613
55723
  }
55724
+ const lexed = src.slice(0, ast.end);
55614
55725
  try {
55615
- validateEdgeOperators(src, ast.directed);
55726
+ validateEdgeOperators(lexed, ast.directed);
55616
55727
  } catch (err) {
55617
55728
  const offset = err instanceof ParseError ? err.location.offset : void 0;
55618
55729
  if (offset !== void 0) {
@@ -55621,7 +55732,7 @@ function parse(src) {
55621
55732
  }
55622
55733
  throw err;
55623
55734
  }
55624
- warnNumberAmbiguities(src, src.length);
55735
+ warnNumberAmbiguities(lexed, lexed.length);
55625
55736
  return buildFromAst(ast);
55626
55737
  }
55627
55738