libhanzzok/core/plugin/youtube/
youtube_embed.rs

1use serde_hzdata::HzdataValue;
2
3use crate::{
4    api::BlockConstructorRule,
5    codegen::{Context, HtmlNode},
6    core::ast::{BlockConstructorForm, InlineObjectNode, Raw},
7};
8
9pub struct YouTubeEmbedBlockConstructorRule;
10
11impl BlockConstructorRule for YouTubeEmbedBlockConstructorRule {
12    fn name(&self) -> String {
13        "youtube".to_owned()
14    }
15
16    fn form(&self) -> crate::core::ast::BlockConstructorForm {
17        BlockConstructorForm::Basic
18    }
19
20    fn apply(
21        &self,
22        _context: &mut Context,
23        main_text: Vec<InlineObjectNode>,
24        _param: Option<HzdataValue>,
25        _: Vec<Vec<InlineObjectNode>>,
26    ) -> HtmlNode {
27        HtmlNode::create_tag_builder("iframe")
28            .set_attr(
29                "src",
30                format!(
31                    "https://www.youtube.com/embed/{}",
32                    main_text
33                        .raw()
34                        .iter()
35                        .map(|t| t.text.clone())
36                        .collect::<String>()
37                ),
38            )
39            .set_attr("width", "560")
40            .set_attr("height", "315")
41            .set_attr("title", "YouTube video player")
42            .set_attr("frameborder", "0")
43            .set_attr("allow", "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture")
44            .set_attr("allowfullscreen","")
45            .build()
46    }
47}