use {
lewp::{
config::{ModuleConfig, PageConfig},
html::{api::*, NodeExt, Nodes, Script},
LewpError,
Module,
Modules,
Page,
RuntimeInformation,
},
std::rc::Rc,
};
struct HeadOnly {
config: ModuleConfig,
head_tags: Nodes,
}
impl HeadOnly {
pub fn new() -> Self {
let mut config = ModuleConfig::new();
config.skip_wrapper = true;
Self {
config,
head_tags: Self::create_head_tags(),
}
}
fn create_head_tags() -> Nodes {
let content = String::from(
"
document.addEventListener('DOMContentLoaded', () => {
document.querySelector('#head-only').innerHTML =
\"I have been added using JavaScript.\"
});",
);
vec![script(Script::Inline(&content)).attr("defer", "defer")]
}
}
impl Module for HeadOnly {
fn head_tags(&self) -> &Nodes {
&self.head_tags
}
fn id(&self) -> &str {
"head-module"
}
fn config(&self) -> &ModuleConfig {
&self.config
}
fn run(
&mut self,
_runtime_info: Rc<RuntimeInformation>,
) -> Result<(), LewpError> {
Ok(())
}
fn view(&self) -> Nodes {
vec![div(vec![]).attr("id", "head-only")]
}
}
struct HelloWorldPage {
modules: Modules,
config: PageConfig,
}
impl Page for HelloWorldPage {
fn modules(&self) -> &Modules {
&self.modules
}
fn modules_mut(&mut self) -> &mut Modules {
&mut self.modules
}
fn title(&self) -> &str {
"Head-only module example!"
}
fn description(&self) -> &str {
"This page shows how to create a head-only module!"
}
fn config(&self) -> &PageConfig {
&self.config
}
fn run(&mut self) {
let module = HeadOnly::new();
self.add_module(module.into_module_ptr());
}
}
fn main() {
let mut page = HelloWorldPage {
modules: vec![],
config: PageConfig::new(),
};
let dom = page.build();
println!("{}", dom);
}