use super::{cmark_resume_one_event, fmt, Borrow, Error, Event, Options, Range, State};
pub fn cmark_resume_with_source_range_and_options<'a, I, E, F>(
event_and_ranges: I,
source: &'a str,
mut formatter: F,
state: Option<State<'a>>,
options: Options<'_>,
) -> Result<State<'a>, Error>
where
I: Iterator<Item = (E, Option<Range<usize>>)>,
E: Borrow<Event<'a>>,
F: fmt::Write,
{
let mut state = state.unwrap_or_default();
for (event, range) in event_and_ranges {
let update_event_end_index = !matches!(*event.borrow(), Event::Start(_));
let prevent_escape_leading_special_characters = match (&range, event.borrow()) {
_ if state.current_heading.is_some() || !state.table_alignments.is_empty() => false,
(Some(range), Event::Text(_)) => {
range.start <= state.last_event_end_index ||
source.as_bytes().get(range.start.saturating_sub(1)) != Some(&b'\\')
}
_ => false,
} && !state.is_in_code_block();
if prevent_escape_leading_special_characters {
state.code_block = Some(crate::CodeBlockKind::Fenced);
}
cmark_resume_one_event(event, &mut formatter, &mut state, &options)?;
if prevent_escape_leading_special_characters {
state.code_block = None;
}
if let (true, Some(range)) = (update_event_end_index, range) {
state.last_event_end_index = range.end;
}
}
Ok(state)
}
pub fn cmark_resume_with_source_range<'a, I, E, F>(
event_and_ranges: I,
source: &'a str,
formatter: F,
state: Option<State<'a>>,
) -> Result<State<'a>, Error>
where
I: Iterator<Item = (E, Option<Range<usize>>)>,
E: Borrow<Event<'a>>,
F: fmt::Write,
{
cmark_resume_with_source_range_and_options(event_and_ranges, source, formatter, state, Options::default())
}
pub fn cmark_with_source_range_and_options<'a, I, E, F>(
event_and_ranges: I,
source: &'a str,
mut formatter: F,
options: Options<'_>,
) -> Result<State<'a>, Error>
where
I: Iterator<Item = (E, Option<Range<usize>>)>,
E: Borrow<Event<'a>>,
F: fmt::Write,
{
let state = cmark_resume_with_source_range_and_options(
event_and_ranges,
source,
&mut formatter,
Default::default(),
options,
)?;
state.finalize(formatter)
}
pub fn cmark_with_source_range<'a, I, E, F>(
event_and_ranges: I,
source: &'a str,
mut formatter: F,
) -> Result<State<'a>, Error>
where
I: Iterator<Item = (E, Option<Range<usize>>)>,
E: Borrow<Event<'a>>,
F: fmt::Write,
{
cmark_with_source_range_and_options(event_and_ranges, source, &mut formatter, Default::default())
}