about summary refs log tree commit diff
path: root/splorm/src/handler/quark/markup/source.rs
diff options
context:
space:
mode:
authorgennyble <gen@nyble.dev>2026-10-01 02:29:03 -0500
committergennyble <gen@nyble.dev>2026-10-01 02:29:03 -0500
commitffc831fa44274d4fd6cb9c30fa34e25e590cff44 (patch)
tree97ec56af8efca04b2c19fcd80ff9d72cb86678d2 /splorm/src/handler/quark/markup/source.rs
parent7513c3f9067a0916786bf8f852432d17d5db4f1e (diff)
splorm: opengraph using frontmatter
Diffstat (limited to 'splorm/src/handler/quark/markup/source.rs')
-rw-r--r--splorm/src/handler/quark/markup/source.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/splorm/src/handler/quark/markup/source.rs b/splorm/src/handler/quark/markup/source.rs
new file mode 100644
index 0000000..41529fc
--- /dev/null
+++ b/splorm/src/handler/quark/markup/source.rs
@@ -0,0 +1,65 @@
+use paige::{Amanda, Frontmatter};
+use wikarden::{WikError, Wikarden};
+
+use crate::handler::quark::PageFrontmatter;
+
+pub struct Source<'p> {
+	full_content: &'p str,
+
+	frontmatter: PageFrontmatter<'p>,
+	content: &'p str,
+}
+
+impl<'p> Source<'p> {
+	pub async fn from_wik(wik: &Wikarden, path: &str) -> Result<Self, WikError> {
+		let source = wik.source(path).await?;
+
+		//SAFETY: This reference must live for the lifetime of this struct
+		let source_text: &'p str = Box::leak(source.data.into_boxed_str());
+
+		let maybe_paige = Self::parse_frontmatter(source_text);
+		let mut pf = PageFrontmatter::default();
+		let mut content = source_text;
+
+		if let Some(paige) = maybe_paige {
+			let frontmatter_ptr = (&paige.frontmatter) as *const Frontmatter;
+			let frontmatter: &'p Frontmatter = unsafe { frontmatter_ptr.as_ref_unchecked() };
+			pf.from_frontmatter(frontmatter);
+			content = paige.content;
+		}
+
+		Ok(Self {
+			full_content: source_text,
+
+			frontmatter: pf,
+			content,
+		})
+	}
+
+	fn parse_frontmatter(raw: &'p str) -> Option<paige::Templated<'p>> {
+		match paige::Templated::parse(raw) {
+			Ok(tpl) => Some(tpl),
+			Err(_) => None,
+		}
+	}
+
+	pub fn frontmatter(&self) -> &PageFrontmatter<'p> {
+		&self.frontmatter
+	}
+
+	pub fn content(&self) -> &str {
+		self.content
+	}
+
+	pub fn amanda(&self) -> Amanda<'p> {
+		Amanda::parse(self.content)
+	}
+}
+
+impl<'p> Drop for Source<'p> {
+	fn drop(&mut self) {
+		// Doing shenenegains because I cannot have a &mut str in the struct
+		let mut_ptr = self.full_content.as_ptr();
+		drop(unsafe { Box::from_raw(mut_ptr as *mut u8) });
+	}
+}