2023-03-24 21:00:27 +00:00
use super ::error ::Res ;
2023-04-07 21:14:44 +00:00
use super ::footnote_definition ::footnote_definition ;
2023-04-03 22:33:07 +00:00
use super ::greater_block ::greater_block ;
2023-04-07 21:14:44 +00:00
use super ::greater_element ::FootnoteDefinition ;
2023-04-03 21:36:56 +00:00
use super ::greater_element ::GreaterBlock ;
2023-03-23 21:26:07 +00:00
use super ::greater_element ::PlainList ;
use super ::lesser_element ::Paragraph ;
2023-03-25 16:53:57 +00:00
use super ::paragraph ::paragraph ;
2023-03-27 17:06:41 +00:00
use super ::plain_list ::plain_list ;
2023-03-23 21:51:49 +00:00
use super ::source ::Source ;
2023-03-24 21:00:27 +00:00
use super ::Context ;
2023-04-10 14:36:16 +00:00
use crate ::parser ::parser_context ::ContextElement ;
2023-03-27 17:06:41 +00:00
use crate ::parser ::parser_with_context ::parser_with_context ;
use nom ::branch ::alt ;
use nom ::combinator ::map ;
2023-03-23 21:26:07 +00:00
2023-03-23 21:51:49 +00:00
#[ derive(Debug) ]
2023-03-23 21:26:07 +00:00
pub enum Element < ' s > {
Paragraph ( Paragraph < ' s > ) ,
PlainList ( PlainList < ' s > ) ,
2023-04-03 21:36:56 +00:00
GreaterBlock ( GreaterBlock < ' s > ) ,
2023-04-07 21:14:44 +00:00
FootnoteDefinition ( FootnoteDefinition < ' s > ) ,
2023-03-31 15:16:37 +00:00
/// The whitespace that follows an element.
///
/// This isn't a real org-mode element. Except for items in plain lists, trailing blank lines belong to the preceding element. It is a separate `Element` in this enum to make parsing easier.
TrailingWhitespace ( & ' s str ) ,
2023-03-23 21:26:07 +00:00
}
2023-03-23 21:51:49 +00:00
impl < ' s > Source < ' s > for Element < ' s > {
fn get_source ( & ' s self ) -> & ' s str {
match self {
Element ::Paragraph ( obj ) = > obj . source ,
Element ::PlainList ( obj ) = > obj . source ,
2023-04-03 21:36:56 +00:00
Element ::GreaterBlock ( obj ) = > obj . source ,
2023-03-31 15:16:37 +00:00
Element ::TrailingWhitespace ( src ) = > src ,
2023-04-07 21:14:44 +00:00
Element ::FootnoteDefinition ( obj ) = > obj . source ,
2023-03-23 21:51:49 +00:00
}
}
}
2023-03-24 21:00:27 +00:00
2023-04-10 14:36:16 +00:00
#[ tracing::instrument(ret, level = " debug " ) ]
pub fn element_with_whitespace < ' r , ' s > (
context : Context < ' r , ' s > ,
input : & ' s str ,
) -> Res < & ' s str , Element < ' s > > {
let parser_context =
context . with_additional_node ( ContextElement ::ConsumeTrailingWhitespace ( true ) ) ;
element ( & parser_context , input )
}
#[ tracing::instrument(ret, level = " debug " ) ]
pub fn element_without_whitespace < ' r , ' s > (
context : Context < ' r , ' s > ,
input : & ' s str ,
) -> Res < & ' s str , Element < ' s > > {
let parser_context =
context . with_additional_node ( ContextElement ::ConsumeTrailingWhitespace ( false ) ) ;
element ( & parser_context , input )
}
2023-03-27 22:08:17 +00:00
#[ tracing::instrument(ret, level = " debug " ) ]
2023-03-24 21:00:27 +00:00
pub fn element < ' r , ' s > ( context : Context < ' r , ' s > , input : & ' s str ) -> Res < & ' s str , Element < ' s > > {
2023-03-27 17:06:41 +00:00
let non_paragraph_matcher = parser_with_context! ( non_paragraph_element ) ( context ) ;
2023-03-25 15:22:59 +00:00
let paragraph_matcher = parser_with_context! ( paragraph ) ( context ) ;
2023-03-27 17:06:41 +00:00
alt ( (
non_paragraph_matcher ,
map ( paragraph_matcher , Element ::Paragraph ) ,
) ) ( input )
}
pub fn non_paragraph_element < ' r , ' s > (
context : Context < ' r , ' s > ,
input : & ' s str ,
) -> Res < & ' s str , Element < ' s > > {
let plain_list_matcher = parser_with_context! ( plain_list ) ( context ) ;
2023-04-03 22:33:07 +00:00
let greater_block_matcher = parser_with_context! ( greater_block ) ( context ) ;
2023-04-07 21:14:44 +00:00
let footnote_definition_matcher = parser_with_context! ( footnote_definition ) ( context ) ;
2023-04-03 22:33:07 +00:00
alt ( (
map ( plain_list_matcher , Element ::PlainList ) ,
map ( greater_block_matcher , Element ::GreaterBlock ) ,
2023-04-07 21:14:44 +00:00
map ( footnote_definition_matcher , Element ::FootnoteDefinition ) ,
2023-04-03 22:33:07 +00:00
) ) ( input )
2023-03-25 15:22:59 +00:00
}