✨ Añade soporte para recursos en documentos HTML
- Incluye los recursos favicon, hojas de estilo y scripts JavaScript. - Se introduce una estructura de contexto que, además de gestionar el idioma y el uso de parámetros contextuales, permite administrar estos recursos en documentos HTML.
This commit is contained in:
parent
3ed94457fa
commit
7292f3d225
10 changed files with 903 additions and 7 deletions
63
src/html/assets.rs
Normal file
63
src/html/assets.rs
Normal file
|
@ -0,0 +1,63 @@
|
|||
pub mod favicon;
|
||||
pub mod javascript;
|
||||
pub mod stylesheet;
|
||||
|
||||
use crate::html::{html, Markup, Render};
|
||||
use crate::{AutoDefault, Weight};
|
||||
|
||||
pub trait AssetsTrait: Render {
|
||||
// Devuelve el nombre del recurso, utilizado como clave única.
|
||||
fn name(&self) -> &str;
|
||||
|
||||
// Devuelve el peso del recurso, durante el renderizado se procesan de menor a mayor peso.
|
||||
fn weight(&self) -> Weight;
|
||||
}
|
||||
|
||||
#[derive(AutoDefault)]
|
||||
pub(crate) struct Assets<T>(Vec<T>);
|
||||
|
||||
impl<T: AssetsTrait> Assets<T> {
|
||||
pub fn new() -> Self {
|
||||
Assets::<T>(Vec::<T>::new())
|
||||
}
|
||||
|
||||
pub fn add(&mut self, asset: T) -> bool {
|
||||
match self.0.iter().position(|x| x.name() == asset.name()) {
|
||||
Some(index) => {
|
||||
if self.0[index].weight() > asset.weight() {
|
||||
self.0.remove(index);
|
||||
self.0.push(asset);
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
self.0.push(asset);
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn remove(&mut self, name: impl AsRef<str>) -> bool {
|
||||
if let Some(index) = self.0.iter().position(|x| x.name() == name.as_ref()) {
|
||||
self.0.remove(index);
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: AssetsTrait> Render for Assets<T> {
|
||||
fn render(&self) -> Markup {
|
||||
let mut assets = self.0.iter().collect::<Vec<_>>();
|
||||
assets.sort_by_key(|a| a.weight());
|
||||
|
||||
html! {
|
||||
@for a in assets {
|
||||
(a.render())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue