178 lines
6.3 KiB
Rust
178 lines
6.3 KiB
Rust
use dioxus::prelude::*;
|
|
use dioxus_sdk::{i18n::use_i18, translate};
|
|
|
|
use crate::components::{UnderConstruction, H1, HR};
|
|
|
|
#[component]
|
|
pub fn PublicationsProjects() -> Element {
|
|
let i18 = use_i18();
|
|
|
|
rsx! {
|
|
div {
|
|
class: "flex flex-col ",
|
|
UnderConstruction { },
|
|
div {
|
|
H1 { { translate!(i18, "publications_projects.publications.title") } }
|
|
Publications { },
|
|
},
|
|
HR {},
|
|
div {
|
|
H1 { { translate!(i18, "publications_projects.projects.title") } }
|
|
Projects { },
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, PartialEq, Props)]
|
|
struct PublicationProp {
|
|
#[props(default = "".to_string())]
|
|
doi: String,
|
|
authors: String,
|
|
title: String,
|
|
conference: String,
|
|
#[props(default = "".to_string())]
|
|
description: String,
|
|
}
|
|
|
|
fn Publications() -> Element {
|
|
let i18 = use_i18();
|
|
|
|
rsx! {
|
|
div {
|
|
class: "flex gap-4 items-center flex-wrap",
|
|
Publication {
|
|
title: translate!(i18, "publications_projects.publications.rpm.title"),
|
|
authors: translate!(i18, "publications_projects.publications.rpm.authors"),
|
|
conference: translate!(i18, "publications_projects.publications.rpm.conference"),
|
|
doi: translate!(i18, "publications_projects.publications.rpm.url"),
|
|
description: translate!(i18, "publications_projects.publications.rpm.description")
|
|
},
|
|
|
|
Publication {
|
|
title: translate!(i18, "publications_projects.publications.iot_fuzzers.title"),
|
|
authors: translate!(i18, "publications_projects.publications.iot_fuzzers.authors"),
|
|
conference: translate!(i18, "publications_projects.publications.iot_fuzzers.conference"),
|
|
doi: translate!(i18, "publications_projects.publications.iot_fuzzers.url"),
|
|
description: translate!(i18, "publications_projects.publications.iot_fuzzers.description")
|
|
},
|
|
}
|
|
}
|
|
}
|
|
fn Publication(prop: PublicationProp) -> Element {
|
|
let pattern = "T.-D. Tran";
|
|
rsx! {
|
|
Link {
|
|
class:"block max-w-sm p-6 bg-white border border-gray-200 rounded-lg shadow hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-700 dark:hover:bg-gray-700",
|
|
to:"{prop.doi}",
|
|
new_tab: true,
|
|
h5 {
|
|
class:"mb-2 text-2xl font-bold tracking-tight text-gray-900 dark:text-white",
|
|
"{prop.title}",
|
|
},
|
|
span { class: "text-lg text-gray-900 dark:text-white", "{prop.conference}" },
|
|
p {
|
|
class:"font-normal text-gray-700 dark:text-gray-400 italic",
|
|
Authors {
|
|
authors: "{prop.authors}",
|
|
pattern: "{pattern}",
|
|
},
|
|
}
|
|
p {
|
|
class:"font-normal text-gray-700 dark:text-gray-400",
|
|
"{prop.description}",
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn Projects() -> Element {
|
|
let i18 = use_i18();
|
|
|
|
rsx! {
|
|
div {
|
|
class: "flex gap-4 items-center flex-wrap",
|
|
Project {
|
|
title: translate!(i18, "publications_projects.projects.bachelorproject.title"),
|
|
authors: translate!(i18, "publications_projects.projects.bachelorproject.authors"),
|
|
kind: translate!(i18, "publications_projects.projects.bachelorproject.kind"),
|
|
url: translate!(i18, "publications_projects.projects.bachelorproject.url"),
|
|
description: translate!(i18, "publications_projects.projects.bachelorproject.description")
|
|
},
|
|
Project {
|
|
title: translate!(i18, "publications_projects.projects.dotfiles.title"),
|
|
authors: translate!(i18, "publications_projects.projects.dotfiles.authors"),
|
|
kind: translate!(i18, "publications_projects.projects.dotfiles.kind"),
|
|
url: translate!(i18, "publications_projects.projects.dotfiles.url"),
|
|
description: translate!(i18, "publications_projects.projects.dotfiles.description")
|
|
},
|
|
Project {
|
|
title: translate!(i18, "publications_projects.projects.homelab.title"),
|
|
authors: translate!(i18, "publications_projects.projects.homelab.authors"),
|
|
kind: translate!(i18, "publications_projects.projects.homelab.kind"),
|
|
url: translate!(i18, "publications_projects.projects.homelab.url"),
|
|
description: translate!(i18, "publications_projects.projects.homelab.description")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, PartialEq, Props)]
|
|
struct ProjectProp {
|
|
#[props(default = "".to_string())]
|
|
url: String,
|
|
authors: String,
|
|
title: String,
|
|
kind: String,
|
|
#[props(default = "".to_string())]
|
|
description: String,
|
|
}
|
|
|
|
fn Project(prop: ProjectProp) -> Element {
|
|
let pattern = "T.-D. Tran";
|
|
|
|
rsx! {
|
|
Link {
|
|
class:"block max-w-sm p-6 bg-white border border-gray-200 rounded-lg shadow hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-700 dark:hover:bg-gray-700",
|
|
to:"{prop.url}",
|
|
new_tab: true,
|
|
h5 {
|
|
class:"mb-2 text-2xl font-bold tracking-tight text-gray-900 dark:text-white",
|
|
"{prop.title}",
|
|
},
|
|
p { class: "text-lg text-gray-900 dark:text-white", "{prop.kind}" },
|
|
p {
|
|
class:"font-normal text-gray-700 dark:text-gray-400",
|
|
Authors {
|
|
authors: "{prop.authors}",
|
|
pattern: "{pattern}",
|
|
},
|
|
}
|
|
p {
|
|
class:"font-normal text-gray-700 dark:text-gray-400",
|
|
"{prop.description}",
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, PartialEq, Props)]
|
|
struct AuthorProp {
|
|
authors: String,
|
|
pattern: String,
|
|
}
|
|
|
|
fn Authors(prop: AuthorProp) -> Element {
|
|
if let Some(start) = prop.authors.find(&prop.pattern) {
|
|
let end = start + prop.pattern.len();
|
|
let left = &prop.authors[..start];
|
|
let middle = &prop.authors[start..end];
|
|
let right = &prop.authors[end..];
|
|
rsx! {
|
|
"{left}" , b { "{middle}" }, "{right}",
|
|
}
|
|
} else {
|
|
rsx! { "{prop.authors}" }
|
|
}
|
|
}
|