From a272dbf39b359bd7e3112e543b4726b7ceaca823 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sat, 29 Nov 2025 13:55:35 +0100 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=9A=A7=20A=C3=B1ade=20constante=20`PA?= =?UTF-8?q?GETOP=5FVERSION`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-aliner/src/lib.rs | 29 ++++++++++++++++-------- src/app.rs | 4 ++-- src/base/component/intro.rs | 2 +- src/base/theme/basic.rs | 19 ++++++++++++---- src/lib.rs | 34 ++++++++++++++++++++++++++++ src/prelude.rs | 2 ++ 6 files changed, 72 insertions(+), 18 deletions(-) diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs index 5e915578..80e6ca15 100644 --- a/extensions/pagetop-aliner/src/lib.rs +++ b/extensions/pagetop-aliner/src/lib.rs @@ -105,15 +105,24 @@ impl Extension for Aliner { impl Theme for Aliner { fn before_render_page_body(&self, page: &mut Page) { - page.alter_param("include_basic_assets", true) - .alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/aliner/css/styles.css") - .with_version(env!("CARGO_PKG_VERSION")) - .with_weight(-90), - )) - .alter_child_in( - Region::FOOTER, - ChildOp::AddIfEmpty(Child::with(PoweredBy::new())), - ); + page.alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/normalize.css") + .with_version("8.0.1") + .with_weight(-99), + )) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/basic.css") + .with_version(PAGETOP_VERSION) + .with_weight(-99), + )) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/aliner/css/styles.css") + .with_version(env!("CARGO_PKG_VERSION")) + .with_weight(-99), + )) + .alter_child_in( + Region::FOOTER, + ChildOp::AddIfEmpty(Child::with(PoweredBy::new())), + ); } } diff --git a/src/app.rs b/src/app.rs index c8ffba11..6ecff369 100644 --- a/src/app.rs +++ b/src/app.rs @@ -6,7 +6,7 @@ use crate::core::{extension, extension::ExtensionRef}; use crate::html::Markup; use crate::response::page::{ErrorPage, ResultPage}; use crate::service::HttpRequest; -use crate::{global, locale, service, trace}; +use crate::{global, locale, service, trace, PAGETOP_VERSION}; use actix_session::config::{BrowserSession, PersistentSession, SessionLifecycle}; use actix_session::storage::CookieSessionStore; @@ -108,7 +108,7 @@ impl Application { println!( "{} {}\n", "Powered by PageTop".yellow(), - env!("CARGO_PKG_VERSION").yellow() + PAGETOP_VERSION.yellow() ); } } diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs index 5de7349a..ea01ccc8 100644 --- a/src/base/component/intro.rs +++ b/src/base/component/intro.rs @@ -105,7 +105,7 @@ impl Component for Intro { fn setup_before_prepare(&mut self, cx: &mut Context) { cx.alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/intro.css").with_version(env!("CARGO_PKG_VERSION")), + StyleSheet::from("/css/intro.css").with_version(PAGETOP_VERSION), )); } diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 63ebe7a3..83dc4a8d 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -12,10 +12,19 @@ impl Extension for Basic { impl Theme for Basic { fn before_render_page_body(&self, page: &mut Page) { - page.alter_param("include_basic_assets", true) - .alter_child_in( - Region::FOOTER, - ChildOp::AddIfEmpty(Child::with(PoweredBy::new())), - ); + page.alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/normalize.css") + .with_version("8.0.1") + .with_weight(-99), + )) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/basic.css") + .with_version(PAGETOP_VERSION) + .with_weight(-99), + )) + .alter_child_in( + Region::FOOTER, + ChildOp::AddIfEmpty(Child::with(PoweredBy::new())), + ); } } diff --git a/src/lib.rs b/src/lib.rs index a2683495..caa74536 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -99,6 +99,40 @@ use std::ops::Deref; // **< RE-EXPORTED >******************************************************************************** +/// Versión del *crate* `pagetop`, obtenida en tiempo de compilación (`CARGO_PKG_VERSION`). +/// +/// Útil para versionar recursos estáticos de PageTop desde otros *crates*. Por ejemplo: +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// pub struct MyTheme; +/// +/// impl Extension for MyTheme { +/// fn theme(&self) -> Option { +/// Some(&Self) +/// } +/// } +/// +/// impl Theme for MyTheme { +/// fn before_render_page_body(&self, page: &mut Page) { +/// page +/// .alter_assets(ContextOp::AddStyleSheet( +/// StyleSheet::from("/css/normalize.css").with_version("8.0.1"), +/// )) +/// .alter_assets(ContextOp::AddStyleSheet( +/// StyleSheet::from("/css/basic.css").with_version(PAGETOP_VERSION), +/// )) +/// .alter_assets(ContextOp::AddStyleSheet( +/// StyleSheet::from("/mytheme/styles.css").with_version(env!("CARGO_PKG_VERSION")), +/// )); +/// } +/// } +/// ``` +/// Donde `PAGETOP_VERSION` identifica la versión de PageTop y `env!("CARGO_PKG_VERSION")` hace +/// referencia a la versión del *crate* que lo usa. +pub const PAGETOP_VERSION: &str = env!("CARGO_PKG_VERSION"); + pub use pagetop_macros::{builder_fn, html, main, test, AutoDefault}; pub use pagetop_statics::{resource, StaticResource}; diff --git a/src/prelude.rs b/src/prelude.rs index 15121036..1d649fec 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -2,6 +2,8 @@ // RE-EXPORTED. +pub use crate::PAGETOP_VERSION; + pub use crate::{builder_fn, html, main, test}; pub use crate::{AutoDefault, StaticResources, UniqueId, Weight}; From 89f037eedbfa1963f1d991d1d04c1bba3f83709b Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sat, 29 Nov 2025 14:42:05 +0100 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=9A=A7=20Retoques=20menores=20en=20lo?= =?UTF-8?q?s=20comentarios=20del=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/src/theme/navbar/component.rs | 2 +- src/base/component/html.rs | 2 +- src/base/component/intro.rs | 2 +- src/base/component/poweredby.rs | 4 ++-- src/html/unit.rs | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/extensions/pagetop-bootsier/src/theme/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/navbar/component.rs index b40d06c2..225c2af5 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/component.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/component.rs @@ -73,7 +73,7 @@ impl Component for Navbar { return PrepareMarkup::None; } - // Asegura que la barra tiene un id estable para poder asociarlo al colapso/offcanvas. + // Asegura que la barra tiene un `id` para poder asociarlo al colapso/offcanvas. let id = cx.required_id::(self.id()); PrepareMarkup::With(html! { diff --git a/src/base/component/html.rs b/src/base/component/html.rs index a60d30f9..1cca9899 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -/// Componente básico para renderizar dinámicamente código HTML recibiendo el contexto. +/// Componente básico que renderiza dinámicamente código HTML según el contexto. /// /// Este componente permite generar contenido HTML arbitrario, usando la macro `html!` y accediendo /// opcionalmente al contexto de renderizado. diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs index ea01ccc8..7a3b2812 100644 --- a/src/base/component/intro.rs +++ b/src/base/component/intro.rs @@ -29,7 +29,7 @@ pub enum IntroOpening { /// opta por [`IntroOpening::PageTop`]) y bloques ([`Block`](crate::base::component::Block)) de /// contenido libre para crear párrafos vistosos de texto. Aunque admite todo tipo de componentes. /// -/// ### Ejemplos +/// # Ejemplos /// /// **Intro mínima por defecto** /// diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs index 797253dc..5a2dc5b2 100644 --- a/src/base/component/poweredby.rs +++ b/src/base/component/poweredby.rs @@ -3,7 +3,7 @@ use crate::prelude::*; // Enlace a la página oficial de PageTop. const LINK: &str = "PageTop"; -/// Componente que informa del 'Powered by' (*Funciona con*) típica del pie de página. +/// Componente que muestra el típico mensaje *Powered by* (*Funciona con*) en el pie de página. /// /// Por defecto, usando [`default()`](Self::default) sólo se muestra un reconocimiento a PageTop. /// Sin embargo, se puede usar [`new()`](Self::new) para crear una instancia con un texto de @@ -17,7 +17,7 @@ impl Component for PoweredBy { /// Crea una nueva instancia de `PoweredBy`. /// /// El copyright se genera automáticamente con el año actual y el nombre de la aplicación - /// configurada en [`global::SETTINGS`]. + /// configurada en [`global::SETTINGS`], en el formato `YYYY © Nombre de la aplicación`. fn new() -> Self { let year = Utc::now().format("%Y").to_string(); let c = join!(year, " © ", global::SETTINGS.app.name); diff --git a/src/html/unit.rs b/src/html/unit.rs index 4a99de16..aec40372 100644 --- a/src/html/unit.rs +++ b/src/html/unit.rs @@ -167,7 +167,7 @@ impl fmt::Display for UnitValue { /// Convierte una cadena a [`UnitValue`] siguiendo una gramática CSS acotada. /// -/// ## Acepta +/// # Acepta /// /// - `""` para `UnitValue::None` /// - `"auto"` @@ -178,7 +178,7 @@ impl fmt::Display for UnitValue { /// /// (Se toleran espacios entre número y unidad: `"12 px"`, `"1.5 rem"`). /// -/// ## Ejemplo +/// # Ejemplo /// /// ```rust /// # use pagetop::prelude::*; @@ -188,7 +188,7 @@ impl fmt::Display for UnitValue { /// assert!(UnitValue::from_str("12").is_err()); /// ``` /// -/// ## Errores de interpretación +/// # Errores de interpretación /// /// - Falta la unidad cuando es necesaria (p. ej., `"12"`, excepto para el valor cero). /// - Decimales en valores que deben ser absolutos (p. ej. `"1.5px"`). @@ -262,7 +262,7 @@ impl FromStr for UnitValue { /// Deserializa desde una cadena usando la misma gramática que [`FromStr`]. /// -/// ### Ejemplo con `serde_json` +/// # Ejemplo con `serde_json` /// ```rust /// # use pagetop::prelude::*; /// use serde::Deserialize;