From 0c33e46b3055defe2baf37ce609cf6f1a7e2b370 Mon Sep 17 00:00:00 2001 From: gyoder <70408179+gyoder@users.noreply.github.com> Date: Mon, 23 Jun 2025 20:04:08 -0600 Subject: [PATCH] added template expanding --- htmlua-parser/src/lib.rs | 88 ++++++++++++++++--- htmlua-parser/tests/components/comp1.html | 1 + .../tests/components/comp2_level1.html | 4 + .../tests/components/comp2_level2.html | 1 + 4 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 htmlua-parser/tests/components/comp1.html create mode 100644 htmlua-parser/tests/components/comp2_level1.html create mode 100644 htmlua-parser/tests/components/comp2_level2.html diff --git a/htmlua-parser/src/lib.rs b/htmlua-parser/src/lib.rs index dcbd4b1..bf62208 100644 --- a/htmlua-parser/src/lib.rs +++ b/htmlua-parser/src/lib.rs @@ -1,5 +1,7 @@ use std::cell::RefCell; use std::fmt::Write; +use std::fs::read_to_string; +use std::path::PathBuf; use std::rc::Rc; use anyhow::Result; @@ -9,8 +11,7 @@ use kuchikiki::{ traits::TendrilSink, }; use mlua::{Lua, Table}; -use tendril::fmt; -use tendril::{Atomicity, Tendril}; +use tendril::Atomicity; fn create_luahtml_stdlib(l: &Lua, stdout: &Rc>) -> mlua::Result { let t = l.create_table()?; @@ -37,14 +38,7 @@ fn create_luahtml_stdlib(l: &Lua, stdout: &Rc>) -> mlua::Result< Ok(t) } -pub fn parse(to_parse: T) -> Result -where - F: fmt::Format, - A: Atomicity, - T: Into>, - tendril::Tendril: std::convert::From>, -{ - let document = kuchikiki::parse_html().one(to_parse.into()); +pub fn execute_lua(document: NodeRef) -> Result { let lua = Lua::new(); let globals = lua.globals(); @@ -79,12 +73,32 @@ where Ok(document) } +pub fn expand_template(document: NodeRef, component_path: &PathBuf) -> Result { + for i in document.select("include").map_err(|()| anyhow!("Error finding include"))? { + let attrs = match i.as_node().as_element() { + Some(e) => e.attributes.borrow(), + None => continue, + }; + if let Some(include_path) = attrs.get("path") { + let mut item_path = component_path.clone(); + item_path.push(include_path); + println!("{item_path:?}"); + let component_text = read_to_string(item_path)?; + let new_node = kuchikiki::parse_html().one(component_text); + let replaced_node = expand_template(new_node, component_path)?; + i.as_node().insert_before(replaced_node); + i.as_node().detach(); + } + } + Ok(document) +} + #[cfg(test)] mod tests { use super::*; #[test] - fn base() { + fn basic_lua() { let page = r#" @@ -99,9 +113,59 @@ mod tests { "#; - let d = parse(page).unwrap(); + let document = kuchikiki::parse_html().one(page); + let d = execute_lua(document).unwrap(); let text = d.select_first("span").unwrap().as_node().text_contents(); assert_eq!(text, "Test from Lua!\n"); assert!(d.select_first("lua").is_err()); } + + #[test] + fn basic_include() { + let page = r#" + + + + Basic HTML Page + + +

Hello World

+

This is a paragraph.

+ + + htmlua.println("Test from Lua!") + + + "#; + let mut p = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + p.push("tests/components"); + let document = kuchikiki::parse_html().one(page); + let d = expand_template(document, &p).unwrap(); + let text = d.select_first("span").unwrap().as_node().text_contents(); + assert_eq!(text, "included1"); + assert!(d.select_first("include").is_err()); + } + + #[test] + fn recursive_include() { + let page = r#" + + + + Basic HTML Page + + +

Hello World

+ + + "#; + let mut p = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + p.push("tests/components"); + let document = kuchikiki::parse_html().one(page); + let d = expand_template(document, &p).unwrap(); + let text = d.select_first("span").unwrap().as_node().text_contents(); + assert_eq!(text, "included_twice"); + assert!(d.select_first("include").is_err()); + } + } diff --git a/htmlua-parser/tests/components/comp1.html b/htmlua-parser/tests/components/comp1.html new file mode 100644 index 0000000..516d00e --- /dev/null +++ b/htmlua-parser/tests/components/comp1.html @@ -0,0 +1 @@ +included1 diff --git a/htmlua-parser/tests/components/comp2_level1.html b/htmlua-parser/tests/components/comp2_level1.html new file mode 100644 index 0000000..086a939 --- /dev/null +++ b/htmlua-parser/tests/components/comp2_level1.html @@ -0,0 +1,4 @@ +
+

test

+ +
diff --git a/htmlua-parser/tests/components/comp2_level2.html b/htmlua-parser/tests/components/comp2_level2.html new file mode 100644 index 0000000..5a8bced --- /dev/null +++ b/htmlua-parser/tests/components/comp2_level2.html @@ -0,0 +1 @@ +included_twice