mdtranslation/
extraction.rs1use 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}