links-notation 0.21.2 → 0.22.0

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/index.js CHANGED
@@ -280,7 +280,9 @@ class ParseError extends Error {
280
280
  const lineText = lineAt(input, start.offset);
281
281
  const summary = `line ${start.line}, column ${start.column}: ${error.message}`;
282
282
  const snippet = quote(start.line, lineText, start.column);
283
- super(`Syntax error at ${summary}
283
+ const maxDepth = error?.maxDepth ?? null;
284
+ const kind = maxDepth === null ? "Syntax error" : "Nesting too deep";
285
+ super(`${kind} at ${summary}
284
286
  ${snippet}`);
285
287
  this.name = "ParseError";
286
288
  this.cause = error;
@@ -291,6 +293,7 @@ ${snippet}`);
291
293
  this.found = error.found ?? null;
292
294
  this.lineText = lineText;
293
295
  this.snippet = snippet;
296
+ this.maxDepth = maxDepth;
294
297
  }
295
298
  }
296
299
  function lineAt(input, offset) {
@@ -639,11 +642,11 @@ function peg$parse(input, options) {
639
642
  const peg$e0 = peg$classExpectation([" ", "\t"], false, false, false);
640
643
  const peg$e1 = peg$classExpectation(["\r", `
641
644
  `], false, false, false);
642
- const peg$e2 = peg$literalExpectation("(", false);
643
- const peg$e3 = peg$literalExpectation(")", false);
644
- const peg$e4 = peg$literalExpectation(":", false);
645
- const peg$e5 = peg$literalExpectation('"', false);
646
- const peg$e6 = peg$anyExpectation();
645
+ const peg$e2 = peg$anyExpectation();
646
+ const peg$e3 = peg$literalExpectation("(", false);
647
+ const peg$e4 = peg$literalExpectation(")", false);
648
+ const peg$e5 = peg$literalExpectation(":", false);
649
+ const peg$e6 = peg$literalExpectation('"', false);
647
650
  const peg$e7 = peg$literalExpectation("'", false);
648
651
  const peg$e8 = peg$literalExpectation("`", false);
649
652
  const peg$e9 = peg$literalExpectation(" ", false);
@@ -673,65 +676,83 @@ function peg$parse(input, options) {
673
676
  function peg$f6(l) {
674
677
  return l;
675
678
  }
676
- function peg$f7(e, l) {
679
+ function peg$f7() {
680
+ return !unreadableLines.has(lineKey(offset()));
681
+ }
682
+ function peg$f8(start, e) {
683
+ return checkDepth(depth(), start);
684
+ }
685
+ function peg$f9(start, e, saved, l) {
686
+ if (l === null) {
687
+ indentationStack = saved;
688
+ return e;
689
+ }
677
690
  return Object.assign({}, e, { children: l });
678
691
  }
679
- function peg$f8(e) {
680
- return e;
692
+ function peg$f10() {
693
+ unreadableLines.add(lineKey(offset()));
694
+ return false;
681
695
  }
682
- function peg$f9(l) {
696
+ function peg$f11(l) {
683
697
  return l;
684
698
  }
685
- function peg$f10(i) {
699
+ function peg$f12(i) {
686
700
  return { id: i };
687
701
  }
688
- function peg$f11(ml) {
689
- return ml;
702
+ function peg$f13(g, rest) {
703
+ return rest === null ? g : { values: [g].concat(rest) };
690
704
  }
691
- function peg$f12(il) {
692
- return il;
705
+ function peg$f14() {
706
+ return null;
693
707
  }
694
- function peg$f13(sl) {
695
- return sl;
696
- }
697
- function peg$f14(fl) {
708
+ function peg$f15(fl) {
698
709
  return fl;
699
710
  }
700
- function peg$f15(vl) {
711
+ function peg$f16(vl) {
701
712
  return vl;
702
713
  }
703
- function peg$f16(body) {
714
+ function peg$f17(start) {
715
+ return checkDepth(depth() + 1, start);
716
+ }
717
+ function peg$f18(start, body) {
704
718
  exitNestedContext();
705
719
  return body;
706
720
  }
707
- function peg$f17(l) {
721
+ function peg$f19() {
722
+ exitNestedContext();
723
+ return false;
724
+ }
725
+ function peg$f20(l) {
708
726
  return { nested: l };
709
727
  }
710
- function peg$f18() {
728
+ function peg$f21() {
711
729
  return { nested: [] };
712
730
  }
713
- function peg$f19() {
731
+ function peg$f22() {
714
732
  return enterNestedContext();
715
733
  }
716
- function peg$f20(value) {
734
+ function peg$f23() {
735
+ return location();
736
+ }
737
+ function peg$f24(value) {
717
738
  return value;
718
739
  }
719
- function peg$f21(list) {
740
+ function peg$f25(list) {
720
741
  return list;
721
742
  }
722
- function peg$f22(id, v) {
743
+ function peg$f26(id, v) {
723
744
  return { id, values: v };
724
745
  }
725
- function peg$f23(v) {
746
+ function peg$f27(v) {
726
747
  return { values: v };
727
748
  }
728
- function peg$f24(id) {
749
+ function peg$f28(id) {
729
750
  return { id, values: [] };
730
751
  }
731
- function peg$f25(chars) {
752
+ function peg$f29(chars) {
732
753
  return chars.join("");
733
754
  }
734
- function peg$f26() {
755
+ function peg$f30() {
735
756
  const pos = offset();
736
757
  const result = parseQuotedStringAt(input, pos, '"');
737
758
  if (result) {
@@ -741,19 +762,19 @@ function peg$parse(input, options) {
741
762
  }
742
763
  return false;
743
764
  }
744
- function peg$f27(chars) {
765
+ function peg$f31(chars) {
745
766
  return parsedValue;
746
767
  }
747
- function peg$f28(c, cs) {
768
+ function peg$f32(c, cs) {
748
769
  return [c].concat(cs).join("");
749
770
  }
750
- function peg$f29() {
771
+ function peg$f33() {
751
772
  return parsedLength > 1 && (parsedLength--, true);
752
773
  }
753
- function peg$f30(c) {
774
+ function peg$f34(c) {
754
775
  return c;
755
776
  }
756
- function peg$f31() {
777
+ function peg$f35() {
757
778
  const pos = offset();
758
779
  const result = parseQuotedStringAt(input, pos, "'");
759
780
  if (result) {
@@ -763,19 +784,19 @@ function peg$parse(input, options) {
763
784
  }
764
785
  return false;
765
786
  }
766
- function peg$f32(chars) {
787
+ function peg$f36(chars) {
767
788
  return parsedValue;
768
789
  }
769
- function peg$f33(c, cs) {
790
+ function peg$f37(c, cs) {
770
791
  return [c].concat(cs).join("");
771
792
  }
772
- function peg$f34() {
793
+ function peg$f38() {
773
794
  return parsedLength > 1 && (parsedLength--, true);
774
795
  }
775
- function peg$f35(c) {
796
+ function peg$f39(c) {
776
797
  return c;
777
798
  }
778
- function peg$f36() {
799
+ function peg$f40() {
779
800
  const pos = offset();
780
801
  const result = parseQuotedStringAt(input, pos, "`");
781
802
  if (result) {
@@ -785,31 +806,34 @@ function peg$parse(input, options) {
785
806
  }
786
807
  return false;
787
808
  }
788
- function peg$f37(chars) {
809
+ function peg$f41(chars) {
789
810
  return parsedValue;
790
811
  }
791
- function peg$f38(c, cs) {
812
+ function peg$f42(c, cs) {
792
813
  return [c].concat(cs).join("");
793
814
  }
794
- function peg$f39() {
815
+ function peg$f43() {
795
816
  return parsedLength > 1 && (parsedLength--, true);
796
817
  }
797
- function peg$f40(c) {
818
+ function peg$f44(c) {
798
819
  return c;
799
820
  }
800
- function peg$f41(spaces) {
821
+ function peg$f45() {
822
+ return indentationStack.slice();
823
+ }
824
+ function peg$f46(spaces) {
801
825
  setBaseIndentation(spaces);
802
826
  }
803
- function peg$f42(spaces) {
827
+ function peg$f47(spaces) {
804
828
  return normalizeIndentation(spaces) > getCurrentIndentation();
805
829
  }
806
- function peg$f43(spaces) {
830
+ function peg$f48(spaces) {
807
831
  pushIndentation(spaces);
808
832
  }
809
- function peg$f44(spaces) {
833
+ function peg$f49(spaces) {
810
834
  return checkIndentation(spaces);
811
835
  }
812
- function peg$f45() {
836
+ function peg$f50() {
813
837
  return isInsideNestedContext();
814
838
  }
815
839
  let peg$currPos = options.peg$currPos | 0;
@@ -1135,16 +1159,47 @@ function peg$parse(input, options) {
1135
1159
  return s0;
1136
1160
  }
1137
1161
  function peg$parseelement() {
1138
- let s0, s1, s2, s3;
1162
+ let s0, s1, s2, s3, s4, s5, s6, s7, s8;
1139
1163
  s0 = peg$currPos;
1140
- s1 = peg$parseanyLink();
1164
+ peg$savedPos = peg$currPos;
1165
+ s1 = peg$f7();
1166
+ if (s1) {
1167
+ s1 = undefined;
1168
+ } else {
1169
+ s1 = peg$FAILED;
1170
+ }
1141
1171
  if (s1 !== peg$FAILED) {
1142
- s2 = peg$parsePUSH_INDENTATION();
1143
- if (s2 !== peg$FAILED) {
1144
- s3 = peg$parselinks();
1145
- if (s3 !== peg$FAILED) {
1172
+ s2 = peg$parseHERE();
1173
+ s3 = peg$parseanyLink();
1174
+ if (s3 !== peg$FAILED) {
1175
+ peg$savedPos = peg$currPos;
1176
+ s4 = peg$f8(s2, s3);
1177
+ if (s4) {
1178
+ s4 = undefined;
1179
+ } else {
1180
+ s4 = peg$FAILED;
1181
+ }
1182
+ if (s4 !== peg$FAILED) {
1183
+ s5 = peg$parseSAVE_INDENTATION();
1184
+ s6 = peg$currPos;
1185
+ s7 = peg$parsePUSH_INDENTATION();
1186
+ if (s7 !== peg$FAILED) {
1187
+ s8 = peg$parselinks();
1188
+ if (s8 !== peg$FAILED) {
1189
+ s6 = s8;
1190
+ } else {
1191
+ peg$currPos = s6;
1192
+ s6 = peg$FAILED;
1193
+ }
1194
+ } else {
1195
+ peg$currPos = s6;
1196
+ s6 = peg$FAILED;
1197
+ }
1198
+ if (s6 === peg$FAILED) {
1199
+ s6 = null;
1200
+ }
1146
1201
  peg$savedPos = s0;
1147
- s0 = peg$f7(s1, s3);
1202
+ s0 = peg$f9(s2, s3, s5, s6);
1148
1203
  } else {
1149
1204
  peg$currPos = s0;
1150
1205
  s0 = peg$FAILED;
@@ -1159,12 +1214,34 @@ function peg$parse(input, options) {
1159
1214
  }
1160
1215
  if (s0 === peg$FAILED) {
1161
1216
  s0 = peg$currPos;
1162
- s1 = peg$parseanyLink();
1217
+ peg$savedPos = peg$currPos;
1218
+ s1 = peg$f10();
1219
+ if (s1) {
1220
+ s1 = undefined;
1221
+ } else {
1222
+ s1 = peg$FAILED;
1223
+ }
1163
1224
  if (s1 !== peg$FAILED) {
1164
- peg$savedPos = s0;
1165
- s1 = peg$f8(s1);
1225
+ if (input.length > peg$currPos) {
1226
+ s2 = input.charAt(peg$currPos);
1227
+ peg$currPos++;
1228
+ } else {
1229
+ s2 = peg$FAILED;
1230
+ if (peg$silentFails === 0) {
1231
+ peg$fail(peg$e2);
1232
+ }
1233
+ }
1234
+ if (s2 !== peg$FAILED) {
1235
+ s1 = [s1, s2];
1236
+ s0 = s1;
1237
+ } else {
1238
+ peg$currPos = s0;
1239
+ s0 = peg$FAILED;
1240
+ }
1241
+ } else {
1242
+ peg$currPos = s0;
1243
+ s0 = peg$FAILED;
1166
1244
  }
1167
- s0 = s1;
1168
1245
  }
1169
1246
  return s0;
1170
1247
  }
@@ -1174,7 +1251,7 @@ function peg$parse(input, options) {
1174
1251
  s1 = peg$parsenestedGroup();
1175
1252
  if (s1 !== peg$FAILED) {
1176
1253
  peg$savedPos = s0;
1177
- s1 = peg$f9(s1);
1254
+ s1 = peg$f11(s1);
1178
1255
  }
1179
1256
  s0 = s1;
1180
1257
  if (s0 === peg$FAILED) {
@@ -1182,7 +1259,7 @@ function peg$parse(input, options) {
1182
1259
  s1 = peg$parsereference();
1183
1260
  if (s1 !== peg$FAILED) {
1184
1261
  peg$savedPos = s0;
1185
- s1 = peg$f10(s1);
1262
+ s1 = peg$f12(s1);
1186
1263
  }
1187
1264
  s0 = s1;
1188
1265
  }
@@ -1191,12 +1268,28 @@ function peg$parse(input, options) {
1191
1268
  function peg$parseanyLink() {
1192
1269
  let s0, s1, s2;
1193
1270
  s0 = peg$currPos;
1194
- s1 = peg$parsenestedGroup();
1271
+ s1 = peg$currPos;
1272
+ peg$silentFails++;
1273
+ if (input.charCodeAt(peg$currPos) === 40) {
1274
+ s2 = peg$c0;
1275
+ peg$currPos++;
1276
+ } else {
1277
+ s2 = peg$FAILED;
1278
+ if (peg$silentFails === 0) {
1279
+ peg$fail(peg$e3);
1280
+ }
1281
+ }
1282
+ peg$silentFails--;
1283
+ if (s2 !== peg$FAILED) {
1284
+ peg$currPos = s1;
1285
+ s1 = undefined;
1286
+ } else {
1287
+ s1 = peg$FAILED;
1288
+ }
1195
1289
  if (s1 !== peg$FAILED) {
1196
- s2 = peg$parseeol();
1290
+ s2 = peg$parsegroupLink();
1197
1291
  if (s2 !== peg$FAILED) {
1198
- peg$savedPos = s0;
1199
- s0 = peg$f11(s1);
1292
+ s0 = s2;
1200
1293
  } else {
1201
1294
  peg$currPos = s0;
1202
1295
  s0 = peg$FAILED;
@@ -1207,20 +1300,84 @@ function peg$parse(input, options) {
1207
1300
  }
1208
1301
  if (s0 === peg$FAILED) {
1209
1302
  s0 = peg$currPos;
1210
- s1 = peg$parseindentedIdLink();
1303
+ s1 = peg$currPos;
1304
+ peg$silentFails++;
1305
+ if (input.charCodeAt(peg$currPos) === 40) {
1306
+ s2 = peg$c0;
1307
+ peg$currPos++;
1308
+ } else {
1309
+ s2 = peg$FAILED;
1310
+ if (peg$silentFails === 0) {
1311
+ peg$fail(peg$e3);
1312
+ }
1313
+ }
1314
+ peg$silentFails--;
1315
+ if (s2 === peg$FAILED) {
1316
+ s1 = undefined;
1317
+ } else {
1318
+ peg$currPos = s1;
1319
+ s1 = peg$FAILED;
1320
+ }
1211
1321
  if (s1 !== peg$FAILED) {
1322
+ s2 = peg$parseindentedIdLink();
1323
+ if (s2 === peg$FAILED) {
1324
+ s2 = peg$parsesingleLineAnyLink();
1325
+ }
1326
+ if (s2 !== peg$FAILED) {
1327
+ s0 = s2;
1328
+ } else {
1329
+ peg$currPos = s0;
1330
+ s0 = peg$FAILED;
1331
+ }
1332
+ } else {
1333
+ peg$currPos = s0;
1334
+ s0 = peg$FAILED;
1335
+ }
1336
+ }
1337
+ return s0;
1338
+ }
1339
+ function peg$parsegroupLink() {
1340
+ let s0, s1, s2;
1341
+ s0 = peg$currPos;
1342
+ s1 = peg$parsenestedGroup();
1343
+ if (s1 !== peg$FAILED) {
1344
+ s2 = peg$parsegroupLinkRest();
1345
+ if (s2 !== peg$FAILED) {
1212
1346
  peg$savedPos = s0;
1213
- s1 = peg$f12(s1);
1347
+ s0 = peg$f13(s1, s2);
1348
+ } else {
1349
+ peg$currPos = s0;
1350
+ s0 = peg$FAILED;
1214
1351
  }
1215
- s0 = s1;
1216
- if (s0 === peg$FAILED) {
1217
- s0 = peg$currPos;
1218
- s1 = peg$parsesingleLineAnyLink();
1219
- if (s1 !== peg$FAILED) {
1220
- peg$savedPos = s0;
1221
- s1 = peg$f13(s1);
1222
- }
1352
+ } else {
1353
+ peg$currPos = s0;
1354
+ s0 = peg$FAILED;
1355
+ }
1356
+ return s0;
1357
+ }
1358
+ function peg$parsegroupLinkRest() {
1359
+ let s0, s1, s2;
1360
+ s0 = peg$currPos;
1361
+ s1 = peg$parseeol();
1362
+ if (s1 !== peg$FAILED) {
1363
+ peg$savedPos = s0;
1364
+ s1 = peg$f14();
1365
+ }
1366
+ s0 = s1;
1367
+ if (s0 === peg$FAILED) {
1368
+ s0 = peg$currPos;
1369
+ s1 = [];
1370
+ s2 = peg$parsesingleLineValueAndWhitespace();
1371
+ while (s2 !== peg$FAILED) {
1372
+ s1.push(s2);
1373
+ s2 = peg$parsesingleLineValueAndWhitespace();
1374
+ }
1375
+ s2 = peg$parseeol();
1376
+ if (s2 !== peg$FAILED) {
1223
1377
  s0 = s1;
1378
+ } else {
1379
+ peg$currPos = s0;
1380
+ s0 = peg$FAILED;
1224
1381
  }
1225
1382
  }
1226
1383
  return s0;
@@ -1233,7 +1390,7 @@ function peg$parse(input, options) {
1233
1390
  s2 = peg$parseeol();
1234
1391
  if (s2 !== peg$FAILED) {
1235
1392
  peg$savedPos = s0;
1236
- s0 = peg$f14(s1);
1393
+ s0 = peg$f15(s1);
1237
1394
  } else {
1238
1395
  peg$currPos = s0;
1239
1396
  s0 = peg$FAILED;
@@ -1249,7 +1406,7 @@ function peg$parse(input, options) {
1249
1406
  s2 = peg$parseeol();
1250
1407
  if (s2 !== peg$FAILED) {
1251
1408
  peg$savedPos = s0;
1252
- s0 = peg$f15(s1);
1409
+ s0 = peg$f16(s1);
1253
1410
  } else {
1254
1411
  peg$currPos = s0;
1255
1412
  s0 = peg$FAILED;
@@ -1262,24 +1419,37 @@ function peg$parse(input, options) {
1262
1419
  return s0;
1263
1420
  }
1264
1421
  function peg$parsenestedGroup() {
1265
- let s0, s1, s2, s3;
1422
+ let s0, s1, s2, s3, s4, s5;
1266
1423
  s0 = peg$currPos;
1424
+ s1 = peg$parseHERE();
1267
1425
  if (input.charCodeAt(peg$currPos) === 40) {
1268
- s1 = peg$c0;
1426
+ s2 = peg$c0;
1269
1427
  peg$currPos++;
1270
1428
  } else {
1271
- s1 = peg$FAILED;
1429
+ s2 = peg$FAILED;
1272
1430
  if (peg$silentFails === 0) {
1273
- peg$fail(peg$e2);
1431
+ peg$fail(peg$e3);
1274
1432
  }
1275
1433
  }
1276
- if (s1 !== peg$FAILED) {
1277
- s2 = peg$parseENTER_NESTED_CONTEXT();
1278
- if (s2 !== peg$FAILED) {
1279
- s3 = peg$parsenestedGroupBody();
1280
- if (s3 !== peg$FAILED) {
1281
- peg$savedPos = s0;
1282
- s0 = peg$f16(s3);
1434
+ if (s2 !== peg$FAILED) {
1435
+ peg$savedPos = peg$currPos;
1436
+ s3 = peg$f17(s1);
1437
+ if (s3) {
1438
+ s3 = undefined;
1439
+ } else {
1440
+ s3 = peg$FAILED;
1441
+ }
1442
+ if (s3 !== peg$FAILED) {
1443
+ s4 = peg$parseENTER_NESTED_CONTEXT();
1444
+ if (s4 !== peg$FAILED) {
1445
+ s5 = peg$parsenestedGroupBody();
1446
+ if (s5 !== peg$FAILED) {
1447
+ peg$savedPos = s0;
1448
+ s0 = peg$f18(s1, s5);
1449
+ } else {
1450
+ peg$currPos = s0;
1451
+ s0 = peg$FAILED;
1452
+ }
1283
1453
  } else {
1284
1454
  peg$currPos = s0;
1285
1455
  s0 = peg$FAILED;
@@ -1292,6 +1462,37 @@ function peg$parse(input, options) {
1292
1462
  peg$currPos = s0;
1293
1463
  s0 = peg$FAILED;
1294
1464
  }
1465
+ if (s0 === peg$FAILED) {
1466
+ s0 = peg$currPos;
1467
+ if (input.charCodeAt(peg$currPos) === 40) {
1468
+ s1 = peg$c0;
1469
+ peg$currPos++;
1470
+ } else {
1471
+ s1 = peg$FAILED;
1472
+ if (peg$silentFails === 0) {
1473
+ peg$fail(peg$e3);
1474
+ }
1475
+ }
1476
+ if (s1 !== peg$FAILED) {
1477
+ peg$savedPos = peg$currPos;
1478
+ s2 = peg$f19();
1479
+ if (s2) {
1480
+ s2 = undefined;
1481
+ } else {
1482
+ s2 = peg$FAILED;
1483
+ }
1484
+ if (s2 !== peg$FAILED) {
1485
+ s1 = [s1, s2];
1486
+ s0 = s1;
1487
+ } else {
1488
+ peg$currPos = s0;
1489
+ s0 = peg$FAILED;
1490
+ }
1491
+ } else {
1492
+ peg$currPos = s0;
1493
+ s0 = peg$FAILED;
1494
+ }
1495
+ }
1295
1496
  return s0;
1296
1497
  }
1297
1498
  function peg$parsenestedGroupBody() {
@@ -1307,12 +1508,12 @@ function peg$parse(input, options) {
1307
1508
  } else {
1308
1509
  s4 = peg$FAILED;
1309
1510
  if (peg$silentFails === 0) {
1310
- peg$fail(peg$e3);
1511
+ peg$fail(peg$e4);
1311
1512
  }
1312
1513
  }
1313
1514
  if (s4 !== peg$FAILED) {
1314
1515
  peg$savedPos = s0;
1315
- s0 = peg$f17(s2);
1516
+ s0 = peg$f20(s2);
1316
1517
  } else {
1317
1518
  peg$currPos = s0;
1318
1519
  s0 = peg$FAILED;
@@ -1330,12 +1531,12 @@ function peg$parse(input, options) {
1330
1531
  } else {
1331
1532
  s2 = peg$FAILED;
1332
1533
  if (peg$silentFails === 0) {
1333
- peg$fail(peg$e3);
1534
+ peg$fail(peg$e4);
1334
1535
  }
1335
1536
  }
1336
1537
  if (s2 !== peg$FAILED) {
1337
1538
  peg$savedPos = s0;
1338
- s0 = peg$f18();
1539
+ s0 = peg$f21();
1339
1540
  } else {
1340
1541
  peg$currPos = s0;
1341
1542
  s0 = peg$FAILED;
@@ -1346,7 +1547,7 @@ function peg$parse(input, options) {
1346
1547
  function peg$parseENTER_NESTED_CONTEXT() {
1347
1548
  let s0;
1348
1549
  peg$savedPos = peg$currPos;
1349
- s0 = peg$f19();
1550
+ s0 = peg$f22();
1350
1551
  if (s0) {
1351
1552
  s0 = undefined;
1352
1553
  } else {
@@ -1354,6 +1555,15 @@ function peg$parse(input, options) {
1354
1555
  }
1355
1556
  return s0;
1356
1557
  }
1558
+ function peg$parseHERE() {
1559
+ let s0, s1;
1560
+ s0 = peg$currPos;
1561
+ s1 = "";
1562
+ peg$savedPos = s0;
1563
+ s1 = peg$f23();
1564
+ s0 = s1;
1565
+ return s0;
1566
+ }
1357
1567
  function peg$parsesingleLineValueAndWhitespace() {
1358
1568
  let s0, s1, s2;
1359
1569
  s0 = peg$currPos;
@@ -1361,7 +1571,7 @@ function peg$parse(input, options) {
1361
1571
  s2 = peg$parsereferenceOrLink();
1362
1572
  if (s2 !== peg$FAILED) {
1363
1573
  peg$savedPos = s0;
1364
- s0 = peg$f20(s2);
1574
+ s0 = peg$f24(s2);
1365
1575
  } else {
1366
1576
  peg$currPos = s0;
1367
1577
  s0 = peg$FAILED;
@@ -1383,7 +1593,7 @@ function peg$parse(input, options) {
1383
1593
  }
1384
1594
  if (s1 !== peg$FAILED) {
1385
1595
  peg$savedPos = s0;
1386
- s1 = peg$f21(s1);
1596
+ s1 = peg$f25(s1);
1387
1597
  }
1388
1598
  s0 = s1;
1389
1599
  return s0;
@@ -1401,14 +1611,14 @@ function peg$parse(input, options) {
1401
1611
  } else {
1402
1612
  s4 = peg$FAILED;
1403
1613
  if (peg$silentFails === 0) {
1404
- peg$fail(peg$e4);
1614
+ peg$fail(peg$e5);
1405
1615
  }
1406
1616
  }
1407
1617
  if (s4 !== peg$FAILED) {
1408
1618
  s5 = peg$parsesingleLineValues();
1409
1619
  if (s5 !== peg$FAILED) {
1410
1620
  peg$savedPos = s0;
1411
- s0 = peg$f22(s2, s5);
1621
+ s0 = peg$f26(s2, s5);
1412
1622
  } else {
1413
1623
  peg$currPos = s0;
1414
1624
  s0 = peg$FAILED;
@@ -1429,7 +1639,7 @@ function peg$parse(input, options) {
1429
1639
  s1 = peg$parsesingleLineValues();
1430
1640
  if (s1 !== peg$FAILED) {
1431
1641
  peg$savedPos = s0;
1432
- s1 = peg$f23(s1);
1642
+ s1 = peg$f27(s1);
1433
1643
  }
1434
1644
  s0 = s1;
1435
1645
  return s0;
@@ -1446,14 +1656,14 @@ function peg$parse(input, options) {
1446
1656
  } else {
1447
1657
  s3 = peg$FAILED;
1448
1658
  if (peg$silentFails === 0) {
1449
- peg$fail(peg$e4);
1659
+ peg$fail(peg$e5);
1450
1660
  }
1451
1661
  }
1452
1662
  if (s3 !== peg$FAILED) {
1453
1663
  s4 = peg$parseeol();
1454
1664
  if (s4 !== peg$FAILED) {
1455
1665
  peg$savedPos = s0;
1456
- s0 = peg$f24(s1);
1666
+ s0 = peg$f28(s1);
1457
1667
  } else {
1458
1668
  peg$currPos = s0;
1459
1669
  s0 = peg$FAILED;
@@ -1491,7 +1701,7 @@ function peg$parse(input, options) {
1491
1701
  }
1492
1702
  if (s1 !== peg$FAILED) {
1493
1703
  peg$savedPos = s0;
1494
- s1 = peg$f25(s1);
1704
+ s1 = peg$f29(s1);
1495
1705
  }
1496
1706
  s0 = s1;
1497
1707
  return s0;
@@ -1518,7 +1728,7 @@ function peg$parse(input, options) {
1518
1728
  } else {
1519
1729
  s2 = peg$FAILED;
1520
1730
  if (peg$silentFails === 0) {
1521
- peg$fail(peg$e5);
1731
+ peg$fail(peg$e6);
1522
1732
  }
1523
1733
  }
1524
1734
  peg$silentFails--;
@@ -1530,7 +1740,7 @@ function peg$parse(input, options) {
1530
1740
  }
1531
1741
  if (s1 !== peg$FAILED) {
1532
1742
  peg$savedPos = peg$currPos;
1533
- s2 = peg$f26();
1743
+ s2 = peg$f30();
1534
1744
  if (s2) {
1535
1745
  s2 = undefined;
1536
1746
  } else {
@@ -1540,7 +1750,7 @@ function peg$parse(input, options) {
1540
1750
  s3 = peg$parseconsumeDouble();
1541
1751
  if (s3 !== peg$FAILED) {
1542
1752
  peg$savedPos = s0;
1543
- s0 = peg$f27(s3);
1753
+ s0 = peg$f31(s3);
1544
1754
  } else {
1545
1755
  peg$currPos = s0;
1546
1756
  s0 = peg$FAILED;
@@ -1564,7 +1774,7 @@ function peg$parse(input, options) {
1564
1774
  } else {
1565
1775
  s1 = peg$FAILED;
1566
1776
  if (peg$silentFails === 0) {
1567
- peg$fail(peg$e6);
1777
+ peg$fail(peg$e2);
1568
1778
  }
1569
1779
  }
1570
1780
  if (s1 !== peg$FAILED) {
@@ -1575,7 +1785,7 @@ function peg$parse(input, options) {
1575
1785
  s3 = peg$parseconsumeDoubleMore();
1576
1786
  }
1577
1787
  peg$savedPos = s0;
1578
- s0 = peg$f28(s1, s2);
1788
+ s0 = peg$f32(s1, s2);
1579
1789
  } else {
1580
1790
  peg$currPos = s0;
1581
1791
  s0 = peg$FAILED;
@@ -1586,7 +1796,7 @@ function peg$parse(input, options) {
1586
1796
  let s0, s1, s2;
1587
1797
  s0 = peg$currPos;
1588
1798
  peg$savedPos = peg$currPos;
1589
- s1 = peg$f29();
1799
+ s1 = peg$f33();
1590
1800
  if (s1) {
1591
1801
  s1 = undefined;
1592
1802
  } else {
@@ -1599,12 +1809,12 @@ function peg$parse(input, options) {
1599
1809
  } else {
1600
1810
  s2 = peg$FAILED;
1601
1811
  if (peg$silentFails === 0) {
1602
- peg$fail(peg$e6);
1812
+ peg$fail(peg$e2);
1603
1813
  }
1604
1814
  }
1605
1815
  if (s2 !== peg$FAILED) {
1606
1816
  peg$savedPos = s0;
1607
- s0 = peg$f30(s2);
1817
+ s0 = peg$f34(s2);
1608
1818
  } else {
1609
1819
  peg$currPos = s0;
1610
1820
  s0 = peg$FAILED;
@@ -1638,7 +1848,7 @@ function peg$parse(input, options) {
1638
1848
  }
1639
1849
  if (s1 !== peg$FAILED) {
1640
1850
  peg$savedPos = peg$currPos;
1641
- s2 = peg$f31();
1851
+ s2 = peg$f35();
1642
1852
  if (s2) {
1643
1853
  s2 = undefined;
1644
1854
  } else {
@@ -1648,7 +1858,7 @@ function peg$parse(input, options) {
1648
1858
  s3 = peg$parseconsumeSingle();
1649
1859
  if (s3 !== peg$FAILED) {
1650
1860
  peg$savedPos = s0;
1651
- s0 = peg$f32(s3);
1861
+ s0 = peg$f36(s3);
1652
1862
  } else {
1653
1863
  peg$currPos = s0;
1654
1864
  s0 = peg$FAILED;
@@ -1672,7 +1882,7 @@ function peg$parse(input, options) {
1672
1882
  } else {
1673
1883
  s1 = peg$FAILED;
1674
1884
  if (peg$silentFails === 0) {
1675
- peg$fail(peg$e6);
1885
+ peg$fail(peg$e2);
1676
1886
  }
1677
1887
  }
1678
1888
  if (s1 !== peg$FAILED) {
@@ -1683,7 +1893,7 @@ function peg$parse(input, options) {
1683
1893
  s3 = peg$parseconsumeSingleMore();
1684
1894
  }
1685
1895
  peg$savedPos = s0;
1686
- s0 = peg$f33(s1, s2);
1896
+ s0 = peg$f37(s1, s2);
1687
1897
  } else {
1688
1898
  peg$currPos = s0;
1689
1899
  s0 = peg$FAILED;
@@ -1694,7 +1904,7 @@ function peg$parse(input, options) {
1694
1904
  let s0, s1, s2;
1695
1905
  s0 = peg$currPos;
1696
1906
  peg$savedPos = peg$currPos;
1697
- s1 = peg$f34();
1907
+ s1 = peg$f38();
1698
1908
  if (s1) {
1699
1909
  s1 = undefined;
1700
1910
  } else {
@@ -1707,12 +1917,12 @@ function peg$parse(input, options) {
1707
1917
  } else {
1708
1918
  s2 = peg$FAILED;
1709
1919
  if (peg$silentFails === 0) {
1710
- peg$fail(peg$e6);
1920
+ peg$fail(peg$e2);
1711
1921
  }
1712
1922
  }
1713
1923
  if (s2 !== peg$FAILED) {
1714
1924
  peg$savedPos = s0;
1715
- s0 = peg$f35(s2);
1925
+ s0 = peg$f39(s2);
1716
1926
  } else {
1717
1927
  peg$currPos = s0;
1718
1928
  s0 = peg$FAILED;
@@ -1746,7 +1956,7 @@ function peg$parse(input, options) {
1746
1956
  }
1747
1957
  if (s1 !== peg$FAILED) {
1748
1958
  peg$savedPos = peg$currPos;
1749
- s2 = peg$f36();
1959
+ s2 = peg$f40();
1750
1960
  if (s2) {
1751
1961
  s2 = undefined;
1752
1962
  } else {
@@ -1756,7 +1966,7 @@ function peg$parse(input, options) {
1756
1966
  s3 = peg$parseconsumeBacktick();
1757
1967
  if (s3 !== peg$FAILED) {
1758
1968
  peg$savedPos = s0;
1759
- s0 = peg$f37(s3);
1969
+ s0 = peg$f41(s3);
1760
1970
  } else {
1761
1971
  peg$currPos = s0;
1762
1972
  s0 = peg$FAILED;
@@ -1780,7 +1990,7 @@ function peg$parse(input, options) {
1780
1990
  } else {
1781
1991
  s1 = peg$FAILED;
1782
1992
  if (peg$silentFails === 0) {
1783
- peg$fail(peg$e6);
1993
+ peg$fail(peg$e2);
1784
1994
  }
1785
1995
  }
1786
1996
  if (s1 !== peg$FAILED) {
@@ -1791,7 +2001,7 @@ function peg$parse(input, options) {
1791
2001
  s3 = peg$parseconsumeBacktickMore();
1792
2002
  }
1793
2003
  peg$savedPos = s0;
1794
- s0 = peg$f38(s1, s2);
2004
+ s0 = peg$f42(s1, s2);
1795
2005
  } else {
1796
2006
  peg$currPos = s0;
1797
2007
  s0 = peg$FAILED;
@@ -1802,7 +2012,7 @@ function peg$parse(input, options) {
1802
2012
  let s0, s1, s2;
1803
2013
  s0 = peg$currPos;
1804
2014
  peg$savedPos = peg$currPos;
1805
- s1 = peg$f39();
2015
+ s1 = peg$f43();
1806
2016
  if (s1) {
1807
2017
  s1 = undefined;
1808
2018
  } else {
@@ -1815,12 +2025,12 @@ function peg$parse(input, options) {
1815
2025
  } else {
1816
2026
  s2 = peg$FAILED;
1817
2027
  if (peg$silentFails === 0) {
1818
- peg$fail(peg$e6);
2028
+ peg$fail(peg$e2);
1819
2029
  }
1820
2030
  }
1821
2031
  if (s2 !== peg$FAILED) {
1822
2032
  peg$savedPos = s0;
1823
- s0 = peg$f40(s2);
2033
+ s0 = peg$f44(s2);
1824
2034
  } else {
1825
2035
  peg$currPos = s0;
1826
2036
  s0 = peg$FAILED;
@@ -1831,6 +2041,15 @@ function peg$parse(input, options) {
1831
2041
  }
1832
2042
  return s0;
1833
2043
  }
2044
+ function peg$parseSAVE_INDENTATION() {
2045
+ let s0, s1;
2046
+ s0 = peg$currPos;
2047
+ s1 = "";
2048
+ peg$savedPos = s0;
2049
+ s1 = peg$f45();
2050
+ s0 = s1;
2051
+ return s0;
2052
+ }
1834
2053
  function peg$parseSET_BASE_INDENTATION() {
1835
2054
  let s0, s1, s2;
1836
2055
  s0 = peg$currPos;
@@ -1857,7 +2076,7 @@ function peg$parse(input, options) {
1857
2076
  }
1858
2077
  }
1859
2078
  peg$savedPos = s0;
1860
- s1 = peg$f41(s1);
2079
+ s1 = peg$f46(s1);
1861
2080
  s0 = s1;
1862
2081
  return s0;
1863
2082
  }
@@ -1887,7 +2106,7 @@ function peg$parse(input, options) {
1887
2106
  }
1888
2107
  }
1889
2108
  peg$savedPos = peg$currPos;
1890
- s2 = peg$f42(s1);
2109
+ s2 = peg$f47(s1);
1891
2110
  if (s2) {
1892
2111
  s2 = undefined;
1893
2112
  } else {
@@ -1895,7 +2114,7 @@ function peg$parse(input, options) {
1895
2114
  }
1896
2115
  if (s2 !== peg$FAILED) {
1897
2116
  peg$savedPos = s0;
1898
- s0 = peg$f43(s1);
2117
+ s0 = peg$f48(s1);
1899
2118
  } else {
1900
2119
  peg$currPos = s0;
1901
2120
  s0 = peg$FAILED;
@@ -1928,7 +2147,7 @@ function peg$parse(input, options) {
1928
2147
  }
1929
2148
  }
1930
2149
  peg$savedPos = peg$currPos;
1931
- s2 = peg$f44(s1);
2150
+ s2 = peg$f49(s1);
1932
2151
  if (s2) {
1933
2152
  s2 = undefined;
1934
2153
  } else {
@@ -2139,7 +2358,7 @@ function peg$parse(input, options) {
2139
2358
  let s0, s1, s2, s3;
2140
2359
  s0 = peg$currPos;
2141
2360
  peg$savedPos = peg$currPos;
2142
- s1 = peg$f45();
2361
+ s1 = peg$f50();
2143
2362
  if (s1) {
2144
2363
  s1 = undefined;
2145
2364
  } else {
@@ -2154,7 +2373,7 @@ function peg$parse(input, options) {
2154
2373
  } else {
2155
2374
  s3 = peg$FAILED;
2156
2375
  if (peg$silentFails === 0) {
2157
- peg$fail(peg$e3);
2376
+ peg$fail(peg$e4);
2158
2377
  }
2159
2378
  }
2160
2379
  peg$silentFails--;
@@ -2187,7 +2406,7 @@ function peg$parse(input, options) {
2187
2406
  } else {
2188
2407
  s1 = peg$FAILED;
2189
2408
  if (peg$silentFails === 0) {
2190
- peg$fail(peg$e6);
2409
+ peg$fail(peg$e2);
2191
2410
  }
2192
2411
  }
2193
2412
  peg$silentFails--;
@@ -2264,14 +2483,23 @@ function peg$parse(input, options) {
2264
2483
  let indentationStack = [0];
2265
2484
  let baseIndentation = null;
2266
2485
  let contextStack = [];
2486
+ let contextDepth = 0;
2487
+ const maxDepth = options.maxDepth ?? Infinity;
2488
+ let unreadableLines = new Set;
2267
2489
  function resetState() {
2268
2490
  indentationStack = [0];
2269
2491
  baseIndentation = null;
2270
2492
  contextStack = [];
2493
+ contextDepth = 0;
2494
+ unreadableLines = new Set;
2271
2495
  return true;
2272
2496
  }
2497
+ function lineKey(position) {
2498
+ return contextStack.length > 0 ? -1 - position : position;
2499
+ }
2273
2500
  function enterNestedContext() {
2274
- contextStack.push({ indentationStack, baseIndentation });
2501
+ contextStack.push({ indentationStack, baseIndentation, contextDepth });
2502
+ contextDepth = depth() + 1;
2275
2503
  indentationStack = [0];
2276
2504
  baseIndentation = null;
2277
2505
  return true;
@@ -2281,9 +2509,24 @@ function peg$parse(input, options) {
2281
2509
  if (saved) {
2282
2510
  indentationStack = saved.indentationStack;
2283
2511
  baseIndentation = saved.baseIndentation;
2512
+ contextDepth = saved.contextDepth;
2284
2513
  }
2285
2514
  return true;
2286
2515
  }
2516
+ function depth() {
2517
+ return contextDepth + indentationStack.length - 1;
2518
+ }
2519
+ function checkDepth(levels, where) {
2520
+ if (levels <= maxDepth) {
2521
+ return true;
2522
+ }
2523
+ try {
2524
+ error(`nesting depth exceeds the maximum of ${maxDepth}`, where);
2525
+ } catch (tooDeep) {
2526
+ tooDeep.maxDepth = maxDepth;
2527
+ throw tooDeep;
2528
+ }
2529
+ }
2287
2530
  function isInsideNestedContext() {
2288
2531
  return contextStack.length > 0;
2289
2532
  }
@@ -2350,10 +2593,12 @@ function peg$parse(input, options) {
2350
2593
  }
2351
2594
 
2352
2595
  // src/Parser.js
2596
+ var DEFAULT_MAX_DEPTH = 64;
2597
+
2353
2598
  class Parser {
2354
2599
  constructor(options = {}) {
2355
2600
  this.maxInputSize = options.maxInputSize || 10 * 1024 * 1024;
2356
- this.maxDepth = options.maxDepth || 1000;
2601
+ this.maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
2357
2602
  this.comments = options.comments ?? true;
2358
2603
  }
2359
2604
  parse(input) {
@@ -2365,7 +2610,9 @@ class Parser {
2365
2610
  }
2366
2611
  const prepared = this.comments ? stripComments(input) : input;
2367
2612
  try {
2368
- const rawResult = peg$parse(prepared);
2613
+ const rawResult = peg$parse(prepared, {
2614
+ maxDepth: this.maxDepth
2615
+ });
2369
2616
  return this.transformResult(rawResult);
2370
2617
  } catch (error) {
2371
2618
  if (error && error.location) {
@@ -2734,6 +2981,7 @@ class FormatOptions {
2734
2981
  class FormatConfig extends FormatOptions {
2735
2982
  }
2736
2983
  export {
2984
+ DEFAULT_MAX_DEPTH,
2737
2985
  FormatConfig,
2738
2986
  FormatOptions,
2739
2987
  Link,