From 7bfc5a7872fa23bac1911cac2ee6a0e074c8b473 Mon Sep 17 00:00:00 2001 From: KitsuneCafe <10284516+kitsunecafe@users.noreply.github.com> Date: Thu, 1 Feb 2024 05:12:31 -0500 Subject: [PATCH] waawrwrw fuck it --- Cargo.toml | 3 +-- src/lib.rs | 65 ++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b8c283e..79c00d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" edition = "2021" [dependencies] -lol_html = "1.2.0" regex = "^1.7" roxy_core = { git = "https://github.com/kitsunecafe/roxy-core.git" } - +once_cell = { version = "1.19.0" } diff --git a/src/lib.rs b/src/lib.rs index 0746a64..7d1dbb2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,33 +1,54 @@ -use regex::Regex; -use lol_html::{element, HtmlRewriter}; +use std::io::Write; + +use once_cell::sync::Lazy; +use regex::{Captures, Regex}; use roxy_core::roxy::Parse; -const EXTENSION_RE: &'static Regex = Regex::new("{% extends \"?.+\"? %}"); +pub struct MarkdownTeraRewriter; -pub struct MarkdownTeraParser<'a, F: FnMut(&'a [u8]) -> ()> { - rewriter: HtmlRewriter<'a, F>, - output: Vec -} +const EXTENSION_RE: Lazy = Lazy::new(|| Regex::new("

(\\{% extends.+%\\})

").unwrap()); -impl<'a, O: FnMut(&'a [u8]) -> ()> MarkdownTeraParser<'a, O> { +impl MarkdownTeraRewriter { pub fn new() -> Self { - let mut output = vec![]; - Self { - rewriter: HtmlRewriter::new(lol_html::Settings { - element_content_handlers: vec![element!("p", |el| { - - if - })], - ..Default::default() - }, |c: &[u8]| output.extend_from_slice(c)), - output - } + Self } } -// TODO: use an html->dom parser to strip

tags around tera placeholders -impl<'a, O: FnMut(&'a [u8]) -> ()> Parse for MarkdownTeraParser<'a, O> { - fn parse(&mut self, path: &str, src: &[u8], dst: &mut Vec) -> std::io::Result<()> { +impl Parse for MarkdownTeraRewriter { + fn parse(&mut self, _path: &str, src: &[u8], dst: &mut Vec) -> std::io::Result<()> { + let utf8 = String::from_utf8_lossy(src).to_string(); + let result = EXTENSION_RE + .replace(utf8.as_str(), |captures: &Captures| { + format!("{}", &captures[1]) + }) + .to_string(); + dst.write(result.as_bytes())?; Ok(()) } } + +#[cfg(test)] +mod tests { + use roxy_core::roxy::Parse; + + use crate::MarkdownTeraRewriter; + + #[test] + fn basic_parse() { + let mut parser = MarkdownTeraRewriter::new(); + let mut buf = Vec::new(); + + parser + .parse( + "test.html", + b"

{% extends \"base.html\" %}

hi :3

", + &mut buf, + ) + .unwrap(); + + assert_eq!( + "{% extends \"base.html\" %}

hi :3

", + String::from_utf8_lossy(&buf) + ); + } +}