From 00be5d36c4f5bdc39a5f94ae1eb200499ffb8871 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 5 Oct 2021 17:25:58 +0200 Subject: [PATCH] Change indent requirements to allow alignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the following wouldn't work correctly because "Fourth" would have been a child of "Third". ``` 3. Third ⎵. Fourth ``` --- src/parse/mod.rs | 10 +++++----- tests/ref/markup/enums.png | Bin 2923 -> 4123 bytes tests/typ/markup/enums.typ | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 19d810ea4..cc7102019 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -34,7 +34,7 @@ fn markup(p: &mut Parser) -> Markup { markup_while(p, true, &mut |_| true) } -/// Parse markup that stays right of the given column. +/// Parse markup that stays equal or right of the given column. fn markup_indented(p: &mut Parser, column: usize) -> Markup { p.eat_while(|t| match t { Token::Space(n) => n == 0, @@ -43,7 +43,7 @@ fn markup_indented(p: &mut Parser, column: usize) -> Markup { }); markup_while(p, false, &mut |p| match p.peek() { - Some(Token::Space(n)) if n >= 1 => p.column(p.next_end()) > column, + Some(Token::Space(n)) if n >= 1 => p.column(p.next_end()) >= column, _ => true, }) } @@ -175,7 +175,6 @@ fn raw(p: &mut Parser, token: RawToken) -> MarkupNode { /// Parse a heading. fn heading(p: &mut Parser) -> MarkupNode { let start = p.next_start(); - let column = p.column(start); p.eat_assert(Token::Eq); // Count depth. @@ -188,6 +187,7 @@ fn heading(p: &mut Parser) -> MarkupNode { return MarkupNode::Text(p.get(start .. p.prev_end()).into()); } + let column = p.column(p.prev_end()); let body = markup_indented(p, column); MarkupNode::Heading(Box::new(HeadingNode { span: p.span_from(start), @@ -199,8 +199,8 @@ fn heading(p: &mut Parser) -> MarkupNode { /// Parse a single list item. fn list_node(p: &mut Parser) -> MarkupNode { let start = p.next_start(); - let column = p.column(start); p.eat_assert(Token::Hyph); + let column = p.column(p.prev_end()); let body = markup_indented(p, column); MarkupNode::List(Box::new(ListNode { span: p.span_from(start), body })) } @@ -208,8 +208,8 @@ fn list_node(p: &mut Parser) -> MarkupNode { /// Parse a single enum item. fn enum_node(p: &mut Parser, number: Option) -> MarkupNode { let start = p.next_start(); - let column = p.column(start); p.eat_assert(Token::Numbering(number)); + let column = p.column(p.prev_end()); let body = markup_indented(p, column); MarkupNode::Enum(Box::new(EnumNode { span: p.span_from(start), diff --git a/tests/ref/markup/enums.png b/tests/ref/markup/enums.png index c1eee45de81253815878075fc62bae7a0f736daf..f1d3855bbb265ee55c1dacbea00931f55cfb3080 100644 GIT binary patch literal 4123 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 I(T)-S0ifwZ_W%F@ literal 2923 zcmaKuc{tQ-8^?b$BYw7N#wmxg&XfolB55)hjI9tVlzj`?*E6U|Q`U?kOXiSc@Ky|p zEE&s$h|tVA9E@d1nqyx>;`Ltdd;WV*_w{}LdG70ZuIs*@@BO)-Bx_3(QK2J3004-Z znHt#u0EBOU$%FeFKqK^yEdU5>m>C(^MGw!9evBwOcjz9M4GAY7SF6PK4V*kN=CjhXczGzY2cT_3N>YuwKIs4+y;AVK6fd@sag+YJLH~q_=9)RFXDW1b`G}>8f-T$e!CSNNw)SH8#Ros5YYW8zU#cKJmB`k z$KOTn`n;A3STWF0jMO`@G%&0~$GBt@KEJ5htwMVD`5>s(zbM(js)$%g)x4-GVH8Qb??1&C%K&SEh+(| zD}=^s$T`Wc$*wf|Yy({&m<5y1S9~vokp$Wy)Hb#kAkl813~?pBPE5HRV~lZ6Rqr^) zmk1JAEnqpVqxLA4b}54stJ$&e49hY2(q2m7JQGKT_}1qweyT^}{nl*KdY!I-#VPAl z@Uo+VR-_oKqes5nes|zqQUwb0p}-hGLvo7E9#lgyiFZ@Z%1KEvqDfPR1=8OB^JbO< zj&+@G_gu?s1_BSJdaY_Wg)KjOXpqMCJgTFE&mG|rJH7F_E~SHxG7Z?e-%nyptMI0J z`T=QzVM;csJPd@0R4>es!J|>d0(fQAwAIn2KV*wr6ZB$oCl&*Mc;Q)-Z~D=68$M&} zABbFFlvB!6+q2yHtg$YGz^kH0%pT3JIp*YxLY|jJ6%FmsYuWym`J#7HMD#mXE|TYU zW6$t0y@tk@WblkLk(NR*C8-2@%8E$Vl0Nu&d^88ob?WCB#pdH z_bIu~^mlR=4+Tkm$CZo6kK;R2z9R9LTIJCF!Yx#72tUvErK6!UggMqw zA!RhS_nH_qZcfiDp8%M{aG(E-9Fm@VQ%4Vv{Nlu!HIx)%UJ2~(6tf*V!HgJj)v`Wh zF?HA_q72kZ7&oW9R5J@%t6#-<}_;QsHmZ4lUA6PFr6^|@5lU0dMnQ(vkOAyFa z4~Mad_86)H^P}yr))+mk-FWQ~IsLc;ztOZxV$jmqCeDk^JZx-n!zH zD3oD0$h*05KiyGO!=Ew>5UYLQj#XL!;UPL4AKN>FW%dP9^5?d|6~rqI43a?k1;sj9cAxd~&N$62SlC>1R5!d|bCvh_KZU+C2mz8|A1EA$8eJo(piy5=% z*b!%H)LdW;h2}ZW#*S4Hz5o~U_mSj)rfuD4nforh7Ql*8XH)JrM@80UIA23#Ih16L zQf$l1k&Sj0+Mu2$a-?A2>{o7wM?STGndVQP&b8!-O*)`4o~VSd=x{Q{oiV#Md;|g# zR<1h^fFaWs%I{2!O=W#>c>B`90gx2*t-IZX?)D&E;dqQSd7BS2a~wfmkby>sXRUsc zCM$?;^{`3=Ri<)+En)A9P~kQXF}>}}fy8nvo>pDk{?&z#8|bsIV5wB+ijoW9-QU$R z9xq%%lBy0p?0}`p77r45a+Xov+Y{bB*JRD6h^7|TuZkgN0bM(@Hp5^;D`tAd* z4SjM{U4$5PVy=iY`6&f#qR*N?Z=e^t^c7SlAg=VC;f`kEqV9x>$Fl6KJTUjEup(%!Ifr>?Z%YG`Tv zdOq~?ytDjPR#P6(tt2+^LHwjZf{p?)U@>~?~?Z=LtgQyGPJ=BRuP zl69jgUqqH};LP0K`vrmh?}?s#jh(y*N#*A#eMNXnp$H;b9NsPx_Df=y9!T(($hvlC zPP8@P#NjwJ>JM-;+U-{6LvH)r}~G(O>o?&e)Z(^c~N6gLAH#@13n!kh^vRS2R>8ev)+t zU@>)WD3clGGqx)ZRT}grX}tMfJ#h`GUWKl+p(PSLlx)&?U7L#c#~LL`{pJHbzjEK4 z4%+_qgMszm6xqc9WLL+jc3QDD8AmUD`?Q|%%G4^OkCF`F_FNZgV)tDX8D{8wDzKz$ zABk7D-1rK9UhHF>$(+QcRK|I7Ms^FNE{rEntZKw!N|PxeMHQ$8;u69Mo2%?d=aMAw0YeTUeJMe^WrMi}@FA-Qm_K?6+o14ALyG`qjG3kXP^ zREY_`z%R&EsDDkccR#Nr+#t+1Lp_>Tt-TulSmr{mxc)YKWQkz(#bZgGM(tK*uJrIC z#)R=ZwV8lNjnVIlww1_ZeaVLQXijQr9vF@aty>T*{5c^*;o|F!4g20kixd6i^vRnX ztXP&;g2d$^VZ8D!UXLa5Mt0X`mhKJqupl=ebY2Gkml|cixzqAWI~z@U88OAXJc#b8R{cd`w2 z+s