Move the document parser inside text_element_parser.

This is to put the context-sensitive parsers together during this early development stage.
This commit is contained in:
Tom Alexander 2022-11-26 19:14:19 -05:00
parent a09c6838b3
commit 77f02a21b9
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
2 changed files with 21 additions and 13 deletions

View File

@ -2,4 +2,4 @@ mod nom_context;
mod parser_with_context; mod parser_with_context;
mod text; mod text;
mod text_element_parser; mod text_element_parser;
pub use text::document; pub use text_element_parser::document;

View File

@ -5,6 +5,7 @@ use std::rc::Rc;
use crate::parser::parser_with_context::parser_with_context; use crate::parser::parser_with_context::parser_with_context;
use crate::parser::text::paragraph_end; use crate::parser::text::paragraph_end;
use super::nom_context::ContextTree;
use super::nom_context::OrgModeContext; use super::nom_context::OrgModeContext;
use super::nom_context::OrgModeContextTree; use super::nom_context::OrgModeContextTree;
use super::text::bold_end; use super::text::bold_end;
@ -27,12 +28,31 @@ use nom::combinator::recognize;
use nom::error::ErrorKind; use nom::error::ErrorKind;
use nom::error::ParseError; use nom::error::ParseError;
use nom::error::VerboseError; use nom::error::VerboseError;
use nom::multi::many1;
use nom::multi::many_till; use nom::multi::many_till;
use nom::sequence::tuple; use nom::sequence::tuple;
use nom::IResult; use nom::IResult;
use tracing::instrument; use tracing::instrument;
use tracing::trace; use tracing::trace;
pub fn document(input: &str) -> Res<&str, Vec<(Vec<TextElement>, &str)>> {
let initial_context = ContextTree::new();
let ret = many1(parser_with_context!(paragraph)(&initial_context))(input);
ret
}
pub fn paragraph<'s, 'r>(
i: &'s str,
context: &'r OrgModeContext<'r>,
) -> Res<&'s str, (Vec<TextElement<'s>>, &'s str)> {
// Add a not(eof) check because many_till cannot match a zero-length string
not(eof)(i)?;
let paragraph_context = context.with_additional_fail_matcher(&paragraph_end);
let text_element_parser = parser_with_context!(flat_text_element)(&paragraph_context);
let ret = many_till(text_element_parser, paragraph_end)(i);
ret
}
fn flat_text_element<'s, 'r>( fn flat_text_element<'s, 'r>(
i: &'s str, i: &'s str,
context: &'r OrgModeContext<'r>, context: &'r OrgModeContext<'r>,
@ -83,15 +103,3 @@ fn flat_link<'s, 'r>(i: &'s str, context: &'r OrgModeContext<'r>) -> Res<&'s str
let ret = Link { contents: captured }; let ret = Link { contents: captured };
Ok((remaining, ret)) Ok((remaining, ret))
} }
pub fn paragraph<'s, 'r>(
i: &'s str,
context: &'r OrgModeContext<'r>,
) -> Res<&'s str, (Vec<TextElement<'s>>, &'s str)> {
// Add a not(eof) check because many_till cannot match a zero-length string
not(eof)(i)?;
let paragraph_context = context.with_additional_fail_matcher(&paragraph_end);
let text_element_parser = parser_with_context!(flat_text_element)(&paragraph_context);
let ret = many_till(text_element_parser, paragraph_end)(i);
ret
}