mdtranslation/
extraction.rs

1use crate::roundtrip::write_markdown;
2use crate::utils::VecSet;
3use crate::utils::{InlineGroupEvent, InlineGroupIteratorExt};
4use pulldown_cmark::{Event, Tag};
5
6fn process_event<'event>(
7    event_group: Vec<Event<'event>>,
8    default_lang: Option<&str>,
9) -> Vec<Event<'event>> {
10    let mut result = Vec::new();
11    result.push(Event::Start(Tag::BlockQuote));
12    result.extend(event_group.iter().cloned());
13    result.push(Event::End(Tag::BlockQuote));
14    if let Some(default_lang) = default_lang {
15        result.push(Event::Start(Tag::List(None)));
16        result.push(Event::Start(Tag::Item));
17        result.push(Event::Text(default_lang.to_string().into()));
18        result.push(Event::End(Tag::Item));
19        result.push(Event::End(Tag::List(None)));
20    }
21    result.push(Event::Start(Tag::Paragraph));
22    result.extend(event_group);
23    result.push(Event::End(Tag::Paragraph));
24    result.push(Event::Rule);
25    result
26}
27
28pub fn extract<'event>(
29    input: impl Iterator<Item = Event<'event>>,
30    output: &mut dyn std::io::Write,
31    default_lang: Option<&str>,
32) -> std::io::Result<()> {
33    let iter = input
34        .into_inline_groups()
35        .flat_map(|e| match e {
36            InlineGroupEvent::InlineGroup(e) => Some(e),
37            InlineGroupEvent::NonInline(_) => None,
38        })
39        .collect::<VecSet<_>>()
40        .into_iter()
41        .flat_map(|e| process_event(e, default_lang));
42    write_markdown(output, iter)?;
43    Ok(())
44}