From 897de73e3ebdd04651f4fde50d3b417ff8c79d44 Mon Sep 17 00:00:00 2001 From: wznmickey Date: Tue, 21 Jan 2025 18:20:16 -0500 Subject: [PATCH] support sub enum --- crates/typst-syntax/src/parser.rs | 24 ++++++++++++++++++------ tests/suite/model/enum.typ | 12 ++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/crates/typst-syntax/src/parser.rs b/crates/typst-syntax/src/parser.rs index 6c1778c4a..663b835e5 100644 --- a/crates/typst-syntax/src/parser.rs +++ b/crates/typst-syntax/src/parser.rs @@ -107,15 +107,13 @@ fn markup_expr(p: &mut Parser, at_start: bool, nesting: &mut usize) { SyntaxKind::Star => strong(p), SyntaxKind::Underscore => emph(p), SyntaxKind::HeadingMarker if at_start => heading(p), - SyntaxKind::ListMarker if at_start => list_item(p), - SyntaxKind::EnumMarker if at_start => enum_item(p), + SyntaxKind::ListMarker => list_item(p), + SyntaxKind::EnumMarker => enum_item(p), SyntaxKind::TermMarker if at_start => term_item(p), SyntaxKind::RefMarker => reference(p), SyntaxKind::Dollar => equation(p), SyntaxKind::HeadingMarker - | SyntaxKind::ListMarker - | SyntaxKind::EnumMarker | SyntaxKind::TermMarker | SyntaxKind::Colon => p.convert_and_eat(SyntaxKind::Text), @@ -157,7 +155,14 @@ fn heading(p: &mut Parser) { /// Parses an item in a bullet list: `- ...`. fn list_item(p: &mut Parser) { - p.with_nl_mode(AtNewline::RequireColumn(p.current_column()), |p| { + let mut column = 0; + for i in (0..p.current_start()).rev() { + if p.text.chars().nth(i) == Some('\n') { + column = i; + break; + } + } + p.with_nl_mode(AtNewline::RequireColumn(p.current_start() - column), |p| { let m = p.marker(); p.assert(SyntaxKind::ListMarker); markup(p, false, false, syntax_set!(RightBracket, End)); @@ -167,7 +172,14 @@ fn list_item(p: &mut Parser) { /// Parses an item in an enumeration (numbered list): `+ ...` or `1. ...`. fn enum_item(p: &mut Parser) { - p.with_nl_mode(AtNewline::RequireColumn(p.current_column()), |p| { + let mut column = 0; + for i in (0..p.current_start()).rev() { + if p.text.chars().nth(i) == Some('\n') { + column = i; + break; + } + } + p.with_nl_mode(AtNewline::RequireColumn(p.current_start() - column), |p| { let m = p.marker(); p.assert(SyntaxKind::EnumMarker); markup(p, false, false, syntax_set!(RightBracket, End)); diff --git a/tests/suite/model/enum.typ b/tests/suite/model/enum.typ index 258c6f6bc..1c5aaf14c 100644 --- a/tests/suite/model/enum.typ +++ b/tests/suite/model/enum.typ @@ -192,3 +192,15 @@ a + 0. + f #align(right)[+ align] + h + + +--- issue-5719-sub-enum-numbering --- +#set enum(numbering: "(a)") + ++ first main ++ + first sub + + second sub + +- first main +- - first sub + - second sub