From 3ee5859eae895ece4487d5c9db7cf809a3e2bb9b Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sat, 19 Mar 2022 22:52:05 +0100 Subject: [PATCH] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desarrollo=20?= =?UTF-8?q?0.0.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- pagetop/src/app/application.rs | 22 ++--- pagetop/src/{ => base}/component/block.rs | 0 pagetop/src/{ => base}/component/chunck.rs | 0 pagetop/src/{ => base}/component/container.rs | 0 .../src/{ => base}/component/form/button.rs | 0 pagetop/src/{ => base}/component/form/date.rs | 0 pagetop/src/{ => base}/component/form/form.rs | 0 .../src/{ => base}/component/form/hidden.rs | 0 .../src/{ => base}/component/form/input.rs | 0 pagetop/src/{ => base}/component/form/mod.rs | 0 pagetop/src/{ => base}/component/menu.rs | 0 pagetop/src/{ => base}/component/mod.rs | 0 pagetop/src/base/mod.rs | 3 + .../homepage/locales/en-US/homepage.ftl | 0 .../homepage/locales/es-ES/homepage.ftl | 0 pagetop/src/{ => base}/module/homepage/mod.rs | 2 +- pagetop/src/base/module/mod.rs | 1 + pagetop/src/{ => base}/theme/aliner/mod.rs | 0 .../theme/bootsier/locales/en-US/bootsier.ftl | 0 .../theme/bootsier/locales/es-ES/bootsier.ftl | 0 pagetop/src/{ => base}/theme/bootsier/mod.rs | 2 +- pagetop/src/{ => base}/theme/minimal/mod.rs | 0 pagetop/src/base/theme/mod.rs | 3 + pagetop/src/{all.rs => global.rs} | 86 +++++++++++++------ pagetop/src/lib.rs | 9 +- pagetop/src/module/definition.rs | 3 +- pagetop/src/module/mod.rs | 15 +--- pagetop/src/prelude.rs | 2 +- pagetop/src/response/page/assets.rs | 14 +-- pagetop/src/theme/definition.rs | 4 +- pagetop/src/theme/mod.rs | 19 +--- 32 files changed, 94 insertions(+), 93 deletions(-) rename pagetop/src/{ => base}/component/block.rs (100%) rename pagetop/src/{ => base}/component/chunck.rs (100%) rename pagetop/src/{ => base}/component/container.rs (100%) rename pagetop/src/{ => base}/component/form/button.rs (100%) rename pagetop/src/{ => base}/component/form/date.rs (100%) rename pagetop/src/{ => base}/component/form/form.rs (100%) rename pagetop/src/{ => base}/component/form/hidden.rs (100%) rename pagetop/src/{ => base}/component/form/input.rs (100%) rename pagetop/src/{ => base}/component/form/mod.rs (100%) rename pagetop/src/{ => base}/component/menu.rs (100%) rename pagetop/src/{ => base}/component/mod.rs (100%) create mode 100644 pagetop/src/base/mod.rs rename pagetop/src/{ => base}/module/homepage/locales/en-US/homepage.ftl (100%) rename pagetop/src/{ => base}/module/homepage/locales/es-ES/homepage.ftl (100%) rename pagetop/src/{ => base}/module/homepage/mod.rs (97%) create mode 100644 pagetop/src/base/module/mod.rs rename pagetop/src/{ => base}/theme/aliner/mod.rs (100%) rename pagetop/src/{ => base}/theme/bootsier/locales/en-US/bootsier.ftl (100%) rename pagetop/src/{ => base}/theme/bootsier/locales/es-ES/bootsier.ftl (100%) rename pagetop/src/{ => base}/theme/bootsier/mod.rs (98%) rename pagetop/src/{ => base}/theme/minimal/mod.rs (100%) create mode 100644 pagetop/src/base/theme/mod.rs rename pagetop/src/{all.rs => global.rs} (57%) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index a9c7993c..db491819 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 12af039c..274203e6 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,7 +1,6 @@ -use crate::{Lazy, all, app, trace}; +use crate::{Lazy, app, base, global, trace}; use crate::config::SETTINGS; -use crate::theme::*; -use crate::module::*; +use crate::module::register_module; use std::io::Error; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; @@ -52,30 +51,25 @@ impl Application { #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] Lazy::force(&app::db::DBCONN); - // Registra los temas predefinidos. - register_theme(&aliner::AlinerTheme); - register_theme(&minimal::MinimalTheme); - register_theme(&bootsier::BootsierTheme); - // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); let _ = &bootstrap(); - // Registra el módulo para la página de inicio de PageTop. - // Al ser el último, puede sobrecargarse con la función de inicio. - register_module(&homepage::HomepageModule); + // Registra el módulo para una página de presentación de PageTop. + // Normalmente se sobrecargará en la función de inicio. + register_module(&base::module::homepage::HomepageModule); // Comprueba actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - all::run_migrations(); + global::run_migrations(); // Prepara el servidor web. let server = app::HttpServer::new(move || { app::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(NormalizePath::new(TrailingSlash::Trim)) - .configure(&all::themes) - .configure(&all::modules) + .configure(&global::themes) + .configure(&global::modules) }) .bind(format!("{}:{}", &SETTINGS.webserver.bind_address, diff --git a/pagetop/src/component/block.rs b/pagetop/src/base/component/block.rs similarity index 100% rename from pagetop/src/component/block.rs rename to pagetop/src/base/component/block.rs diff --git a/pagetop/src/component/chunck.rs b/pagetop/src/base/component/chunck.rs similarity index 100% rename from pagetop/src/component/chunck.rs rename to pagetop/src/base/component/chunck.rs diff --git a/pagetop/src/component/container.rs b/pagetop/src/base/component/container.rs similarity index 100% rename from pagetop/src/component/container.rs rename to pagetop/src/base/component/container.rs diff --git a/pagetop/src/component/form/button.rs b/pagetop/src/base/component/form/button.rs similarity index 100% rename from pagetop/src/component/form/button.rs rename to pagetop/src/base/component/form/button.rs diff --git a/pagetop/src/component/form/date.rs b/pagetop/src/base/component/form/date.rs similarity index 100% rename from pagetop/src/component/form/date.rs rename to pagetop/src/base/component/form/date.rs diff --git a/pagetop/src/component/form/form.rs b/pagetop/src/base/component/form/form.rs similarity index 100% rename from pagetop/src/component/form/form.rs rename to pagetop/src/base/component/form/form.rs diff --git a/pagetop/src/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs similarity index 100% rename from pagetop/src/component/form/hidden.rs rename to pagetop/src/base/component/form/hidden.rs diff --git a/pagetop/src/component/form/input.rs b/pagetop/src/base/component/form/input.rs similarity index 100% rename from pagetop/src/component/form/input.rs rename to pagetop/src/base/component/form/input.rs diff --git a/pagetop/src/component/form/mod.rs b/pagetop/src/base/component/form/mod.rs similarity index 100% rename from pagetop/src/component/form/mod.rs rename to pagetop/src/base/component/form/mod.rs diff --git a/pagetop/src/component/menu.rs b/pagetop/src/base/component/menu.rs similarity index 100% rename from pagetop/src/component/menu.rs rename to pagetop/src/base/component/menu.rs diff --git a/pagetop/src/component/mod.rs b/pagetop/src/base/component/mod.rs similarity index 100% rename from pagetop/src/component/mod.rs rename to pagetop/src/base/component/mod.rs diff --git a/pagetop/src/base/mod.rs b/pagetop/src/base/mod.rs new file mode 100644 index 00000000..6a8ebdf7 --- /dev/null +++ b/pagetop/src/base/mod.rs @@ -0,0 +1,3 @@ +pub mod component; +pub mod module; +pub mod theme; \ No newline at end of file diff --git a/pagetop/src/module/homepage/locales/en-US/homepage.ftl b/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl similarity index 100% rename from pagetop/src/module/homepage/locales/en-US/homepage.ftl rename to pagetop/src/base/module/homepage/locales/en-US/homepage.ftl diff --git a/pagetop/src/module/homepage/locales/es-ES/homepage.ftl b/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl similarity index 100% rename from pagetop/src/module/homepage/locales/es-ES/homepage.ftl rename to pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl diff --git a/pagetop/src/module/homepage/mod.rs b/pagetop/src/base/module/homepage/mod.rs similarity index 97% rename from pagetop/src/module/homepage/mod.rs rename to pagetop/src/base/module/homepage/mod.rs index c74480b3..bd364534 100644 --- a/pagetop/src/module/homepage/mod.rs +++ b/pagetop/src/base/module/homepage/mod.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -localize!("src/module/homepage/locales"); +localize!("src/base/module/homepage/locales"); pub struct HomepageModule; diff --git a/pagetop/src/base/module/mod.rs b/pagetop/src/base/module/mod.rs new file mode 100644 index 00000000..070e5b82 --- /dev/null +++ b/pagetop/src/base/module/mod.rs @@ -0,0 +1 @@ +pub mod homepage; diff --git a/pagetop/src/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs similarity index 100% rename from pagetop/src/theme/aliner/mod.rs rename to pagetop/src/base/theme/aliner/mod.rs diff --git a/pagetop/src/theme/bootsier/locales/en-US/bootsier.ftl b/pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl similarity index 100% rename from pagetop/src/theme/bootsier/locales/en-US/bootsier.ftl rename to pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl diff --git a/pagetop/src/theme/bootsier/locales/es-ES/bootsier.ftl b/pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl similarity index 100% rename from pagetop/src/theme/bootsier/locales/es-ES/bootsier.ftl rename to pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl diff --git a/pagetop/src/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs similarity index 98% rename from pagetop/src/theme/bootsier/mod.rs rename to pagetop/src/base/theme/bootsier/mod.rs index 6fba1615..132dce32 100644 --- a/pagetop/src/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -2,7 +2,7 @@ use crate::prelude::*; include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); -localize!("src/theme/bootsier/locales"); +localize!("src/base/theme/bootsier/locales"); pub struct BootsierTheme; diff --git a/pagetop/src/theme/minimal/mod.rs b/pagetop/src/base/theme/minimal/mod.rs similarity index 100% rename from pagetop/src/theme/minimal/mod.rs rename to pagetop/src/base/theme/minimal/mod.rs diff --git a/pagetop/src/base/theme/mod.rs b/pagetop/src/base/theme/mod.rs new file mode 100644 index 00000000..baccfbd9 --- /dev/null +++ b/pagetop/src/base/theme/mod.rs @@ -0,0 +1,3 @@ +pub mod aliner; +pub mod bootsier; +pub mod minimal; diff --git a/pagetop/src/all.rs b/pagetop/src/global.rs similarity index 57% rename from pagetop/src/all.rs rename to pagetop/src/global.rs index a7134172..34280cf4 100644 --- a/pagetop/src/all.rs +++ b/pagetop/src/global.rs @@ -1,31 +1,11 @@ -use crate::{Lazy, run_now, app}; +use crate::{Lazy, app, base, run_now, trace}; +use crate::config::SETTINGS; use crate::db::migration::*; -use crate::theme::ThemeTrait; -use crate::module::ModuleTrait; +use crate::module::*; +use crate::theme::*; use std::sync::RwLock; -include!(concat!(env!("OUT_DIR"), "/theme.rs")); - -// ----------------------------------------------------------------------------- -// Temas registrados y tema predeterminado. -// ----------------------------------------------------------------------------- - -pub static THEMES: Lazy>> = Lazy::new( - || { RwLock::new(Vec::new()) } -); - -pub fn themes(cfg: &mut app::web::ServiceConfig) { - cfg.service(actix_web_static_files::ResourceFiles::new( - "/theme", - assets() - )); - - for t in THEMES.read().unwrap().iter() { - t.configure_theme(cfg); - } -} - // ----------------------------------------------------------------------------- // Módulos registrados. // ----------------------------------------------------------------------------- @@ -34,6 +14,17 @@ pub static MODULES: Lazy>> = Lazy::new( || { RwLock::new(Vec::new()) } ); +pub fn register_module(m: &'static dyn ModuleTrait) { + let mut modules = MODULES.write().unwrap(); + match modules.iter().find(|t| t.name() == m.name()) { + None => { + trace::info!("{}", m.name()); + modules.push(m); + }, + Some(_) => {}, + } +} + pub fn modules(cfg: &mut app::web::ServiceConfig) { for m in MODULES.read().unwrap().iter() { m.configure_module(cfg); @@ -56,3 +47,50 @@ pub fn run_migrations() { Migrator::up(&app::db::DBCONN, None) }).unwrap(); } + +// ----------------------------------------------------------------------------- +// Temas registrados y tema predeterminado. +// ----------------------------------------------------------------------------- + +include!(concat!(env!("OUT_DIR"), "/theme.rs")); + +pub static THEMES: Lazy>> = Lazy::new(|| { + RwLock::new(vec![ + &base::theme::aliner::AlinerTheme, + &base::theme::minimal::MinimalTheme, + &base::theme::bootsier::BootsierTheme, + ]) +}); + +pub static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { + for t in THEMES.read().unwrap().iter() { + if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { + return *t; + } + } + &base::theme::bootsier::BootsierTheme +}); + +pub fn register_theme(t: &'static dyn ThemeTrait) { + THEMES.write().unwrap().push(t); +} + +pub fn theme_by_name(name: &str) -> Option<&'static dyn ThemeTrait> { + let themes = crate::global::THEMES.write().unwrap(); + match themes.iter().find(|t| t.name() == name) { + Some(theme) => Some(*theme), + _ => None, + } +} + +pub fn themes(cfg: &mut app::web::ServiceConfig) { + cfg.service(actix_web_static_files::ResourceFiles::new( + "/theme", + assets() + )); + + for t in THEMES.read().unwrap().iter() { + t.configure_theme(cfg); + } +} + diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 1ecb2028..3efe21aa 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -8,7 +8,7 @@ pub use futures::executor::block_on as run_now; // APIs públicas. // ----------------------------------------------------------------------------- -mod all; // Variables globales privadas. +mod global; // Ref. privadas globales a todos los temas y módulos. pub mod config; // Gestión de la configuración. pub mod trace; // Registro de trazas y eventos de la aplicación. @@ -17,14 +17,13 @@ pub mod locale; // Localización. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a la base de datos. -pub mod html; // Publicación de código HTML desde el código. -pub mod theme; // API para crear temas y temas predeterminados. +pub mod html; // Publicación de HTML desde el código. pub mod module; // API para crear módulos con nuevas funcionalidades. +pub mod theme; // API para crear temas y temas predeterminados. pub mod response; // Tipos de respuestas web. pub mod app; // Aplicación y servidor web. -pub mod component; // Componentes base. - +pub mod base; // Componentes, Módulos y Temas base. pub mod util; // Macros y funciones útiles. pub mod prelude; // Re-exporta recursos comunes. diff --git a/pagetop/src/module/definition.rs b/pagetop/src/module/definition.rs index ccebe607..9424fbd8 100644 --- a/pagetop/src/module/definition.rs +++ b/pagetop/src/module/definition.rs @@ -1,6 +1,7 @@ +use crate::app; + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db; -use crate::app; use std::any::type_name; diff --git a/pagetop/src/module/mod.rs b/pagetop/src/module/mod.rs index cb71dfd2..faf51e8b 100644 --- a/pagetop/src/module/mod.rs +++ b/pagetop/src/module/mod.rs @@ -1,17 +1,4 @@ -use crate::{all, trace}; - mod definition; pub use definition::ModuleTrait; -pub mod homepage; - -pub fn register_module(m: &'static dyn ModuleTrait) { - let mut modules = all::MODULES.write().unwrap(); - match modules.iter().find(|t| t.name() == m.name()) { - None => { - trace::info!("{}", m.name()); - modules.push(m); - }, - Some(_) => {}, - } -} +pub use crate::global::register_module; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 1bfc1817..e9b3617c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -16,6 +16,6 @@ pub use crate::response::page::*; pub use crate::app; pub use crate::app::application::{Application, essence}; -pub use crate::component::*; +pub use crate::base::component::*; pub use crate::util; diff --git a/pagetop/src/response/page/assets.rs b/pagetop/src/response/page/assets.rs index 9c30d981..99e42b06 100644 --- a/pagetop/src/response/page/assets.rs +++ b/pagetop/src/response/page/assets.rs @@ -1,17 +1,7 @@ -use crate::{Lazy, all}; -use crate::config::SETTINGS; +use crate::global::DEFAULT_THEME; use crate::html::{Markup, PreEscaped, html}; use crate::theme::*; -static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - for t in all::THEMES.read().unwrap().iter() { - if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { - return *t; - } - } - &bootsier::BootsierTheme -}); - // ----------------------------------------------------------------------------- // Favicon. // ----------------------------------------------------------------------------- @@ -207,7 +197,7 @@ impl PageAssets { } pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.theme = find_theme(theme_name).unwrap_or(*DEFAULT_THEME); + self.theme = theme_by_name(theme_name).unwrap_or(*DEFAULT_THEME); self } diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 38ad1bfd..727df347 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -1,8 +1,8 @@ +use crate::app; use crate::config::SETTINGS; use crate::html::{Markup, html}; use crate::response::page::{Page, PageAssets, PageComponent}; -use crate::app; -use crate::component::Chunck; +use crate::base::component::Chunck; /// Los temas deben implementar este "trait". pub trait ThemeTrait: Send + Sync { diff --git a/pagetop/src/theme/mod.rs b/pagetop/src/theme/mod.rs index 9b045708..a1d0e4ca 100644 --- a/pagetop/src/theme/mod.rs +++ b/pagetop/src/theme/mod.rs @@ -1,20 +1,5 @@ -use crate::all; - mod definition; pub use definition::ThemeTrait; -pub mod aliner; -pub mod minimal; -pub mod bootsier; - -pub fn register_theme(t: &'static dyn ThemeTrait) { - all::THEMES.write().unwrap().push(t); -} - -pub fn find_theme(name: &str) -> Option<&'static dyn ThemeTrait> { - let themes = all::THEMES.write().unwrap(); - match themes.iter().find(|t| t.name() == name) { - Some(theme) => Some(*theme), - _ => None, - } -} +pub use crate::global::register_theme; +pub use crate::global::theme_by_name;