Skip to content

Commit dab82ba

Browse files
committed
Enhance link parsing to support singlet values and update tests accordingly (part of #64)
1 parent 9c92be0 commit dab82ba

File tree

6 files changed

+98
-147
lines changed

6 files changed

+98
-147
lines changed

js/src/Parser.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ export class Parser {
2828

2929
collectLinks(item, parentPath, result) {
3030
if (!item) return;
31+
32+
// Handle singlet value links by promoting the single value to id
33+
if (item.id == null && item.values && item.values.length === 1 && item.values[0].id !== null && (!item.values[0].values || item.values[0].values.length === 0)) {
34+
item.id = item.values[0].id;
35+
item.values = [];
36+
}
3137

3238
// For items with children (indented structure)
3339
if (item.children && item.children.length > 0) {

js/src/grammar.pegjs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
}
1212
}
1313

14-
function checkIndentation(spaces) {
15-
return spaces.length === indentationStack[indentationStack.length - 1];
16-
}
14+
function checkIndentation(spaces) {
15+
return spaces.length >= indentationStack[indentationStack.length - 1];
16+
}
1717

1818
function getCurrentIndentation() {
1919
return indentationStack[indentationStack.length - 1];
@@ -38,10 +38,9 @@ referenceOrLink = l:multiLineAnyLink { return l; } / i:reference { return { id:
3838

3939
anyLink = ml:multiLineAnyLink eol { return ml; } / sl:singleLineAnyLink { return sl; }
4040

41-
multiLineAnyLink = multiLinePointLink / multiLineValueLink / multiLineLink
41+
multiLineAnyLink = multiLineValueLink / multiLineLink
4242

43-
singleLineAnyLink = fl:singleLineLink eol { return fl; }
44-
/ pl:singleLinePointLink eol { return pl; }
43+
singleLineAnyLink = fl:singleLineLink eol { return fl; }
4544
/ vl:singleLineValueLink eol { return vl; }
4645

4746
multiLineValueAndWhitespace = value:referenceOrLink _ { return value; }
@@ -60,11 +59,7 @@ singleLineValueLink = v:singleLineValues { return { values: v }; }
6059

6160
multiLineValueLink = "(" v:multiLineValues _ ")" { return { values: v }; }
6261

63-
pointLink = id:reference { return { id: id }; }
64-
65-
singleLinePointLink = __ l:pointLink { return l; }
6662

67-
multiLinePointLink = "(" _ l:pointLink _ ")" { return l; }
6863

6964
reference = doubleQuotedReference / singleQuotedReference / simpleReference
7065

js/src/parser-generated.js

Lines changed: 31 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -208,24 +208,20 @@ function peg$parse(input, options) {
208208
function peg$f10(ml) { return ml; }
209209
function peg$f11(sl) { return sl; }
210210
function peg$f12(fl) { return fl; }
211-
function peg$f13(pl) { return pl; }
212-
function peg$f14(vl) { return vl; }
213-
function peg$f15(value) { return value; }
214-
function peg$f16(list) { return list; }
215-
function peg$f17(value) { return value; }
216-
function peg$f18(list) { return list; }
211+
function peg$f13(vl) { return vl; }
212+
function peg$f14(value) { return value; }
213+
function peg$f15(list) { return list; }
214+
function peg$f16(value) { return value; }
215+
function peg$f17(list) { return list; }
216+
function peg$f18(id, v) { return { id: id, values: v }; }
217217
function peg$f19(id, v) { return { id: id, values: v }; }
218-
function peg$f20(id, v) { return { id: id, values: v }; }
218+
function peg$f20(v) { return { values: v }; }
219219
function peg$f21(v) { return { values: v }; }
220-
function peg$f22(v) { return { values: v }; }
221-
function peg$f23(id) { return { id: id }; }
222-
function peg$f24(l) { return l; }
223-
function peg$f25(l) { return l; }
224-
function peg$f26(chars) { return chars.join(''); }
225-
function peg$f27(r) { return r.join(''); }
226-
function peg$f28(r) { return r.join(''); }
227-
function peg$f29(spaces) { return spaces.length > getCurrentIndentation(); }
228-
function peg$f30(spaces) { pushIndentation(spaces); }
220+
function peg$f22(chars) { return chars.join(''); }
221+
function peg$f23(r) { return r.join(''); }
222+
function peg$f24(r) { return r.join(''); }
223+
function peg$f25(spaces) { return spaces.length > getCurrentIndentation(); }
224+
function peg$f26(spaces) { pushIndentation(spaces); }
229225
let peg$currPos = options.peg$currPos | 0;
230226
let peg$savedPos = peg$currPos;
231227
const peg$posDetailsCache = [{ line: 1, column: 1 }];
@@ -607,12 +603,9 @@ function peg$parse(input, options) {
607603
function peg$parsemultiLineAnyLink() {
608604
let s0;
609605

610-
s0 = peg$parsemultiLinePointLink();
606+
s0 = peg$parsemultiLineValueLink();
611607
if (s0 === peg$FAILED) {
612-
s0 = peg$parsemultiLineValueLink();
613-
if (s0 === peg$FAILED) {
614-
s0 = peg$parsemultiLineLink();
615-
}
608+
s0 = peg$parsemultiLineLink();
616609
}
617610

618611
return s0;
@@ -638,7 +631,7 @@ function peg$parse(input, options) {
638631
}
639632
if (s0 === peg$FAILED) {
640633
s0 = peg$currPos;
641-
s1 = peg$parsesingleLinePointLink();
634+
s1 = peg$parsesingleLineValueLink();
642635
if (s1 !== peg$FAILED) {
643636
s2 = peg$parseeol();
644637
if (s2 !== peg$FAILED) {
@@ -652,23 +645,6 @@ function peg$parse(input, options) {
652645
peg$currPos = s0;
653646
s0 = peg$FAILED;
654647
}
655-
if (s0 === peg$FAILED) {
656-
s0 = peg$currPos;
657-
s1 = peg$parsesingleLineValueLink();
658-
if (s1 !== peg$FAILED) {
659-
s2 = peg$parseeol();
660-
if (s2 !== peg$FAILED) {
661-
peg$savedPos = s0;
662-
s0 = peg$f14(s1);
663-
} else {
664-
peg$currPos = s0;
665-
s0 = peg$FAILED;
666-
}
667-
} else {
668-
peg$currPos = s0;
669-
s0 = peg$FAILED;
670-
}
671-
}
672648
}
673649

674650
return s0;
@@ -682,7 +658,7 @@ function peg$parse(input, options) {
682658
if (s1 !== peg$FAILED) {
683659
s2 = peg$parse_();
684660
peg$savedPos = s0;
685-
s0 = peg$f15(s1);
661+
s0 = peg$f14(s1);
686662
} else {
687663
peg$currPos = s0;
688664
s0 = peg$FAILED;
@@ -703,7 +679,7 @@ function peg$parse(input, options) {
703679
s3 = peg$parsemultiLineValueAndWhitespace();
704680
}
705681
peg$savedPos = s0;
706-
s0 = peg$f16(s2);
682+
s0 = peg$f15(s2);
707683

708684
return s0;
709685
}
@@ -716,7 +692,7 @@ function peg$parse(input, options) {
716692
s2 = peg$parsereferenceOrLink();
717693
if (s2 !== peg$FAILED) {
718694
peg$savedPos = s0;
719-
s0 = peg$f17(s2);
695+
s0 = peg$f16(s2);
720696
} else {
721697
peg$currPos = s0;
722698
s0 = peg$FAILED;
@@ -741,7 +717,7 @@ function peg$parse(input, options) {
741717
}
742718
if (s1 !== peg$FAILED) {
743719
peg$savedPos = s0;
744-
s1 = peg$f18(s1);
720+
s1 = peg$f17(s1);
745721
}
746722
s0 = s1;
747723

@@ -767,7 +743,7 @@ function peg$parse(input, options) {
767743
s5 = peg$parsesingleLineValues();
768744
if (s5 !== peg$FAILED) {
769745
peg$savedPos = s0;
770-
s0 = peg$f19(s2, s5);
746+
s0 = peg$f18(s2, s5);
771747
} else {
772748
peg$currPos = s0;
773749
s0 = peg$FAILED;
@@ -819,7 +795,7 @@ function peg$parse(input, options) {
819795
}
820796
if (s8 !== peg$FAILED) {
821797
peg$savedPos = s0;
822-
s0 = peg$f20(s3, s6);
798+
s0 = peg$f19(s3, s6);
823799
} else {
824800
peg$currPos = s0;
825801
s0 = peg$FAILED;
@@ -847,7 +823,7 @@ function peg$parse(input, options) {
847823
s1 = peg$parsesingleLineValues();
848824
if (s1 !== peg$FAILED) {
849825
peg$savedPos = s0;
850-
s1 = peg$f21(s1);
826+
s1 = peg$f20(s1);
851827
}
852828
s0 = s1;
853829

@@ -877,80 +853,7 @@ function peg$parse(input, options) {
877853
}
878854
if (s4 !== peg$FAILED) {
879855
peg$savedPos = s0;
880-
s0 = peg$f22(s2);
881-
} else {
882-
peg$currPos = s0;
883-
s0 = peg$FAILED;
884-
}
885-
} else {
886-
peg$currPos = s0;
887-
s0 = peg$FAILED;
888-
}
889-
890-
return s0;
891-
}
892-
893-
function peg$parsepointLink() {
894-
let s0, s1;
895-
896-
s0 = peg$currPos;
897-
s1 = peg$parsereference();
898-
if (s1 !== peg$FAILED) {
899-
peg$savedPos = s0;
900-
s1 = peg$f23(s1);
901-
}
902-
s0 = s1;
903-
904-
return s0;
905-
}
906-
907-
function peg$parsesingleLinePointLink() {
908-
let s0, s1, s2;
909-
910-
s0 = peg$currPos;
911-
s1 = peg$parse__();
912-
s2 = peg$parsepointLink();
913-
if (s2 !== peg$FAILED) {
914-
peg$savedPos = s0;
915-
s0 = peg$f24(s2);
916-
} else {
917-
peg$currPos = s0;
918-
s0 = peg$FAILED;
919-
}
920-
921-
return s0;
922-
}
923-
924-
function peg$parsemultiLinePointLink() {
925-
let s0, s1, s2, s3, s4, s5;
926-
927-
s0 = peg$currPos;
928-
if (input.charCodeAt(peg$currPos) === 40) {
929-
s1 = peg$c2;
930-
peg$currPos++;
931-
} else {
932-
s1 = peg$FAILED;
933-
if (peg$silentFails === 0) { peg$fail(peg$e2); }
934-
}
935-
if (s1 !== peg$FAILED) {
936-
s2 = peg$parse_();
937-
s3 = peg$parsepointLink();
938-
if (s3 !== peg$FAILED) {
939-
s4 = peg$parse_();
940-
if (input.charCodeAt(peg$currPos) === 41) {
941-
s5 = peg$c3;
942-
peg$currPos++;
943-
} else {
944-
s5 = peg$FAILED;
945-
if (peg$silentFails === 0) { peg$fail(peg$e3); }
946-
}
947-
if (s5 !== peg$FAILED) {
948-
peg$savedPos = s0;
949-
s0 = peg$f25(s3);
950-
} else {
951-
peg$currPos = s0;
952-
s0 = peg$FAILED;
953-
}
856+
s0 = peg$f21(s2);
954857
} else {
955858
peg$currPos = s0;
956859
s0 = peg$FAILED;
@@ -993,7 +896,7 @@ function peg$parse(input, options) {
993896
}
994897
if (s1 !== peg$FAILED) {
995898
peg$savedPos = s0;
996-
s1 = peg$f26(s1);
899+
s1 = peg$f22(s1);
997900
}
998901
s0 = s1;
999902

@@ -1044,7 +947,7 @@ function peg$parse(input, options) {
1044947
}
1045948
if (s3 !== peg$FAILED) {
1046949
peg$savedPos = s0;
1047-
s0 = peg$f27(s2);
950+
s0 = peg$f23(s2);
1048951
} else {
1049952
peg$currPos = s0;
1050953
s0 = peg$FAILED;
@@ -1105,7 +1008,7 @@ function peg$parse(input, options) {
11051008
}
11061009
if (s3 !== peg$FAILED) {
11071010
peg$savedPos = s0;
1108-
s0 = peg$f28(s2);
1011+
s0 = peg$f24(s2);
11091012
} else {
11101013
peg$currPos = s0;
11111014
s0 = peg$FAILED;
@@ -1145,15 +1048,15 @@ function peg$parse(input, options) {
11451048
}
11461049
}
11471050
peg$savedPos = peg$currPos;
1148-
s2 = peg$f29(s1);
1051+
s2 = peg$f25(s1);
11491052
if (s2) {
11501053
s2 = undefined;
11511054
} else {
11521055
s2 = peg$FAILED;
11531056
}
11541057
if (s2 !== peg$FAILED) {
11551058
peg$savedPos = s0;
1156-
s0 = peg$f30(s1);
1059+
s0 = peg$f26(s1);
11571060
} else {
11581061
peg$currPos = s0;
11591062
s0 = peg$FAILED;
@@ -1305,9 +1208,9 @@ function peg$parse(input, options) {
13051208
}
13061209
}
13071210

1308-
function checkIndentation(spaces) {
1309-
return spaces.length === indentationStack[indentationStack.length - 1];
1310-
}
1211+
function checkIndentation(spaces) {
1212+
return spaces.length >= indentationStack[indentationStack.length - 1];
1213+
}
13111214

13121215
function getCurrentIndentation() {
13131216
return indentationStack[indentationStack.length - 1];

0 commit comments

Comments
 (0)