diff options
| author | gyoder <70408179+gyoder@users.noreply.github.com> | 2025-07-07 11:36:31 -0600 |
|---|---|---|
| committer | gyoder <70408179+gyoder@users.noreply.github.com> | 2025-07-07 11:36:31 -0600 |
| commit | 6c3f257942d2b1d88aa471f52d5b0241492730ae (patch) | |
| tree | 529a3a55cb55333d4a39802e35f40c78b0dd362e /htmlua-parser | |
| parent | f9b2e74b4525eabb5ea7d1df84b4e570194429b8 (diff) | |
| parent | 3897b8dd30d11cad8b35129797186c5879f9f711 (diff) | |
Merged Divergent Branches
Diffstat (limited to 'htmlua-parser')
| -rw-r--r-- | htmlua-parser/Cargo.toml | 1 | ||||
| -rw-r--r-- | htmlua-parser/src/render.rs | 64 | ||||
| -rw-r--r-- | htmlua-parser/src/serve.rs | 11 |
3 files changed, 63 insertions, 13 deletions
diff --git a/htmlua-parser/Cargo.toml b/htmlua-parser/Cargo.toml index c3ecb0f..436844d 100644 --- a/htmlua-parser/Cargo.toml +++ b/htmlua-parser/Cargo.toml @@ -9,6 +9,7 @@ html5ever = "0.35.0" kuchikiki = "0.8.2" markup5ever = "0.11.0" mlua = { version = "0.10.5", features = ["lua54", "vendored", "serialize"] } +pulldown-cmark = "0.13.0" tendril = "0.4.3" diff --git a/htmlua-parser/src/render.rs b/htmlua-parser/src/render.rs index 1ea99a0..927eb35 100644 --- a/htmlua-parser/src/render.rs +++ b/htmlua-parser/src/render.rs @@ -1,12 +1,9 @@ -use std::cell::RefCell; -use std::fmt::Write; -use std::path::PathBuf; -use std::rc::Rc; +use std::{cell::RefCell, fmt::Write, fs::read_to_string, path::PathBuf, rc::Rc}; -use anyhow::Result; -use anyhow::anyhow; -use kuchikiki::NodeRef; +use anyhow::{Result, anyhow}; +use kuchikiki::{NodeRef, traits::TendrilSink}; use mlua::{Lua, Table}; +use pulldown_cmark::{Options, Parser, html}; use crate::helpers::read_doc_from_file; @@ -70,6 +67,30 @@ pub fn execute_lua(document: NodeRef) -> Result<NodeRef> { Ok(document) } +pub fn process_markdown(document: NodeRef) -> Result<NodeRef> { + let markdown_elements: Vec<_> = match document.select("markdown") { + Ok(e) => e.collect(), + Err(()) => return Err(anyhow!("Unable to find markdown elements")), + }; + for node in markdown_elements { + if let Some(text_node) = node.as_node().first_child() { + if let Some(markdown_text) = text_node.as_text() { + let borrowed_text = markdown_text.borrow(); + let parser = Parser::new_ext(&borrowed_text, Options::all()); + let mut html_output = String::new(); + html::push_html(&mut html_output, parser); + let html_fragment = kuchikiki::parse_html().one(html_output); + for child in html_fragment.children() { + node.as_node().insert_before(child); + } + // Remove the original markdown node. + node.as_node().detach(); + } + } + } + Ok(document) +} + pub fn expand_template(document: NodeRef, component_path: &PathBuf, include_from: Option<&NodeRef>) -> Result<NodeRef> { if let Some(from_node) = include_from { for i in document @@ -269,4 +290,33 @@ mod tests { assert!(d.select_first("exportelement").is_err()); assert!(d.select_first("includeelement").is_err()); } + + #[test] + fn basic_markdown() { + let page = r#" + <!DOCTYPE html> + <html> + <head> + <title>Markdown Test</title> + </head> + <body> + <h1>Hello World</h1> + <div> + <markdown> +# This is a heading +This is a paragraph with **bold text** and *italic text*. + +- Item 1 +- Item 2 +- Item 3 + </markdown> + </div> + </body> + </html>"#; + let document = kuchikiki::parse_html().one(page); + let d = process_markdown(document).unwrap(); + assert!(d.select_first("markdown").is_err()); + assert!(d.select_first("p").is_ok()); + assert!(d.select_first("ul").is_ok()); + } } diff --git a/htmlua-parser/src/serve.rs b/htmlua-parser/src/serve.rs index 370d2e9..981cdf6 100644 --- a/htmlua-parser/src/serve.rs +++ b/htmlua-parser/src/serve.rs @@ -1,22 +1,21 @@ use crate::helpers::read_doc_from_file; -use super::render::execute_lua; -use super::render::expand_template; +use super::render::{execute_lua, expand_template, process_markdown}; use anyhow::Result; -use std::path::{Path, PathBuf}; +use std::path::{Path, PathBuf} +; pub fn serve_content(request_uri: &str) -> Result<String> { // TODO: read from config let pages = PathBuf::from("/var/www/htmlua/pages"); let components = PathBuf::from("/var/www/htmlua/components"); - let safe_path = Path::new(request_uri).strip_prefix("/")?; let page_path = pages.join(safe_path); let doc = read_doc_from_file(page_path)?; let full_doc = expand_template(doc, &components, None)?; - let executed_doc = execute_lua(full_doc)?; - + let markdown_doc = process_markdown(full_doc)?; + let executed_doc = execute_lua(markdown_doc)?; Ok(executed_doc.to_string()) } |
