diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index 1af80243..45324b92 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -1,7 +1,7 @@ -use crate::html::{html, Markup, PreEscaped}; +use crate::html::{html, Markup}; #[derive(Default)] -pub struct Favicon(Vec); +pub struct Favicon(Vec); impl Favicon { pub fn new() -> Self { @@ -11,66 +11,66 @@ impl Favicon { // Favicon BUILDER. pub fn with_icon(self, image: &str) -> Self { - self.add_item("icon", image, "", "") + self.add_icon_item("icon", image, None, None) } pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { - self.add_item("icon", image, sizes, "") + self.add_icon_item("icon", image, Some(sizes), None) } pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { - self.add_item("apple-touch-icon", image, sizes, "") + self.add_icon_item("apple-touch-icon", image, Some(sizes), None) } pub fn with_mask_icon(self, image: &str, color: &str) -> Self { - self.add_item("mask-icon", image, "", color) + self.add_icon_item("mask-icon", image, None, Some(color)) } pub fn with_manifest(self, file: &str) -> Self { - self.add_item("manifest", file, "", "") + self.add_icon_item("manifest", file, None, None) } pub fn with_theme_color(mut self, color: &str) -> Self { - self.0 - .push(format!("", color)); + self.0.push(html! { meta name="theme-color" content=(color); }); self } pub fn with_ms_tile_color(mut self, color: &str) -> Self { - self.0.push(format!( - "", - color - )); + self.0.push(html! { meta name="msapplication-TileColor" content=(color); }); self } pub fn with_ms_tile_image(mut self, image: &str) -> Self { - self.0.push(format!( - "", - image - )); + self.0.push(html! { meta name="msapplication-TileImage" content=(image); }); self } - fn add_item(mut self, rel: &str, source: &str, sizes: &str, color: &str) -> Self { - let mut link: String = format!(" format!("{} type=\"image/gif\"", link), - ".ico" => format!("{} type=\"image/x-icon\"", link), - ".jpg" => format!("{} type=\"image/jpg\"", link), - ".png" => format!("{} type=\"image/png\"", link), - ".svg" => format!("{} type=\"image/svg+xml\"", link), - _ => link, - }; - } - if !sizes.is_empty() { - link = format!("{} sizes=\"{}\"", link, sizes); - } - if !color.is_empty() { - link = format!("{} color=\"{}\"", link, color); - } - self.0.push(format!("{} href=\"{}\">", link, source)); + fn add_icon_item( + mut self, + icon_rel: &str, + icon_source: &str, + icon_sizes: Option<&str>, + icon_color: Option<&str>, + ) -> Self { + let icon_type = match icon_source.rfind('.') { + Some(i) => match icon_source[i..].to_owned().to_lowercase().as_str() { + ".gif" => Some("image/gif"), + ".ico" => Some("image/x-icon"), + ".jpg" => Some("image/jpg"), + ".png" => Some("image/png"), + ".svg" => Some("image/svg+xml"), + _ => None, + }, + _ => None, + }; + self.0.push(html! { + link + rel=(icon_rel) + type=[(icon_type)] + sizes=[(icon_sizes)] + color=[(icon_color)] + href=(icon_source); + }); self } @@ -79,7 +79,7 @@ impl Favicon { pub(crate) fn render(&self) -> Markup { html! { @for item in &self.0 { - (PreEscaped(item)) + (item) } } }