55
66use crate :: pandoc:: attr:: is_empty_attr;
77use crate :: pandoc:: block:: MetaBlock ;
8- use crate :: pandoc:: list:: ListNumberDelim ;
8+ use crate :: pandoc:: list:: { ListNumberDelim , ListNumberStyle } ;
99use crate :: pandoc:: meta:: MetaValue ;
1010use crate :: pandoc:: table:: { Alignment , Cell , Table } ;
1111use crate :: pandoc:: {
@@ -101,12 +101,18 @@ struct OrderedListContext<'a, W: Write + ?Sized> {
101101 at_line_start : bool ,
102102 is_first_line : bool ,
103103 number : usize ,
104+ number_style : ListNumberStyle ,
104105 delimiter : ListNumberDelim ,
105106 indent : String ,
106107}
107108
108109impl < ' a , W : Write + ?Sized > OrderedListContext < ' a , W > {
109- fn new ( inner : & ' a mut W , number : usize , delimiter : ListNumberDelim ) -> Self {
110+ fn new (
111+ inner : & ' a mut W ,
112+ number : usize ,
113+ number_style : ListNumberStyle ,
114+ delimiter : ListNumberDelim ,
115+ ) -> Self {
110116 // Pandoc uses consistent spacing: for numbers < 10, uses two spaces after delimiter
111117 // For numbers >= 10, uses one space. Continuation lines always use 4 spaces indent.
112118 let indent = " " . to_string ( ) ; // Always 4 spaces for continuation lines
@@ -116,6 +122,7 @@ impl<'a, W: Write + ?Sized> OrderedListContext<'a, W> {
116122 at_line_start : true ,
117123 is_first_line : true ,
118124 number,
125+ number_style,
119126 delimiter,
120127 indent,
121128 }
@@ -128,18 +135,23 @@ impl<'a, W: Write + ?Sized> Write for OrderedListContext<'a, W> {
128135 for & byte in buf {
129136 if self . at_line_start {
130137 if self . is_first_line {
131- let delim_str = match self . delimiter {
132- ListNumberDelim :: Period => "." ,
133- ListNumberDelim :: OneParen => ")" ,
134- ListNumberDelim :: TwoParens => ")" ,
135- _ => "." ,
136- } ;
137- // Pandoc style: numbers < 10 get two spaces after delimiter,
138- // numbers >= 10 get one space
139- if self . number < 10 {
140- write ! ( self . inner, "{}{} " , self . number, delim_str) ?;
138+ // For example lists, always use (@) marker
139+ if matches ! ( self . number_style, ListNumberStyle :: Example ) {
140+ write ! ( self . inner, "(@) " ) ?;
141141 } else {
142- write ! ( self . inner, "{}{} " , self . number, delim_str) ?;
142+ let delim_str = match self . delimiter {
143+ ListNumberDelim :: Period => "." ,
144+ ListNumberDelim :: OneParen => ")" ,
145+ ListNumberDelim :: TwoParens => ")" ,
146+ _ => "." ,
147+ } ;
148+ // Pandoc style: numbers < 10 get two spaces after delimiter,
149+ // numbers >= 10 get one space
150+ if self . number < 10 {
151+ write ! ( self . inner, "{}{} " , self . number, delim_str) ?;
152+ } else {
153+ write ! ( self . inner, "{}{} " , self . number, delim_str) ?;
154+ }
143155 }
144156 self . is_first_line = false ;
145157 } else {
@@ -331,7 +343,7 @@ fn write_orderedlist(
331343 orderedlist : & OrderedList ,
332344 buf : & mut dyn std:: io:: Write ,
333345) -> std:: io:: Result < ( ) > {
334- let ( start_num, _number_style , delimiter) = & orderedlist. attr ;
346+ let ( start_num, number_style , delimiter) = & orderedlist. attr ;
335347
336348 // Determine if this is a tight list
337349 // A list is tight if the first block of all items is Plain (not Para)
@@ -346,7 +358,8 @@ fn write_orderedlist(
346358 writeln ! ( buf) ?;
347359 }
348360 let current_num = start_num + i;
349- let mut item_writer = OrderedListContext :: new ( buf, current_num, delimiter. clone ( ) ) ;
361+ let mut item_writer =
362+ OrderedListContext :: new ( buf, current_num, number_style. clone ( ) , delimiter. clone ( ) ) ;
350363 for ( j, block) in item. iter ( ) . enumerate ( ) {
351364 if j > 0 && !is_tight {
352365 // Add a blank line between blocks within a list item in loose lists
0 commit comments