html2md/rewriter/
iframes.rs

1use crate::extended::base::iframe::{INSTAGRAM_PATTERN, VK_PATTERN, YOUTUBE_PATTERN};
2use lol_html::html_content::ContentType::Text;
3use lol_html::html_content::Element;
4
5/// Handle the conversion to iframes.
6pub(crate) fn handle_iframe(
7    element: &mut Element,
8) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
9    if let Some(src) = element.get_attribute("src") {
10        if let Some(capture) = YOUTUBE_PATTERN.captures(&src) {
11            let media_id = capture.get(1).map_or("", |m| m.as_str());
12            element.replace(
13                &format!("[![Embedded YouTube video](https://img.youtube.com/vi/{}/0.jpg)](https://www.youtube.com/watch?v={})", media_id, media_id),
14                Text
15            );
16            return Ok(());
17        }
18
19        if let Some(capture) = INSTAGRAM_PATTERN.captures(&src) {
20            let media_id = capture.get(1).map_or("", |m| m.as_str());
21            element.replace(
22                &format!("[![Embedded Instagram post](https://www.instagram.com/p/{}/media/?size=m)](https://www.instagram.com/p/{}/embed/)", media_id, media_id),
23                Text
24            );
25            return Ok(());
26        }
27
28        if let Some(capture) = VK_PATTERN.captures(&src) {
29            let owner_id = capture.get(1).map_or("", |m| m.as_str());
30            let video_id = capture.get(2).map_or("", |m| m.as_str());
31            element.replace(
32                &&format!("[![Embedded VK video](https://st.vk.com/images/icons/video_empty_2x.png)](https://vk.com/video{oid}_{vid})", oid = owner_id, vid = video_id),
33                Text,
34            );
35            return Ok(());
36        }
37    }
38
39    Ok(())
40}
41
42/// Handle the conversion to iframes.
43pub(crate) fn handle_iframe_send(
44    element: &mut lol_html::send::Element,
45) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
46    if let Some(src) = element.get_attribute("src") {
47        if let Some(capture) = YOUTUBE_PATTERN.captures(&src) {
48            let media_id = capture.get(1).map_or("", |m| m.as_str());
49            element.replace(
50                &format!("[![Embedded YouTube video](https://img.youtube.com/vi/{}/0.jpg)](https://www.youtube.com/watch?v={})", media_id, media_id),
51                Text
52            );
53            return Ok(());
54        }
55
56        if let Some(capture) = INSTAGRAM_PATTERN.captures(&src) {
57            let media_id = capture.get(1).map_or("", |m| m.as_str());
58            element.replace(
59                &format!("[![Embedded Instagram post](https://www.instagram.com/p/{}/media/?size=m)](https://www.instagram.com/p/{}/embed/)", media_id, media_id),
60                Text
61            );
62            return Ok(());
63        }
64
65        if let Some(capture) = VK_PATTERN.captures(&src) {
66            let owner_id = capture.get(1).map_or("", |m| m.as_str());
67            let video_id = capture.get(2).map_or("", |m| m.as_str());
68            element.replace(
69                &&format!("[![Embedded VK video](https://st.vk.com/images/icons/video_empty_2x.png)](https://vk.com/video{oid}_{vid})", oid = owner_id, vid = video_id),
70                Text,
71            );
72            return Ok(());
73        }
74    }
75
76    Ok(())
77}