use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag};
pub(super) fn outside_subset(body: &str) -> Vec<(usize, &'static str)> {
let line_starts: Vec<usize> = std::iter::once(0)
.chain(body.match_indices('\n').map(|(at, _)| at + 1))
.collect();
let line_of = |offset: usize| line_starts.partition_point(|start| *start <= offset);
let options = Options::ENABLE_TABLES
| Options::ENABLE_FOOTNOTES
| Options::ENABLE_STRIKETHROUGH
| Options::ENABLE_TASKLISTS;
Parser::new_ext(body, options)
.into_offset_iter()
.filter_map(|(event, range)| construct(&event).map(|what| (line_of(range.start), what)))
.collect()
}
fn construct(event: &Event<'_>) -> Option<&'static str> {
Some(match event {
Event::Start(tag) => match tag {
Tag::HtmlBlock => "an HTML block",
Tag::BlockQuote(_) => "a block quote",
Tag::CodeBlock(CodeBlockKind::Indented) => "an indented code block",
Tag::FootnoteDefinition(_) => "a footnote",
Tag::Table(_) => "a table",
Tag::Strikethrough => "struck-through text",
Tag::Image { .. } => "an image",
_ => return None,
},
Event::InlineHtml(_) => "inline HTML",
Event::FootnoteReference(_) => "a footnote reference",
Event::Rule => "a thematic break",
Event::TaskListMarker(_) => "a task list item",
_ => return None,
})
}