From 33178700381261183dae460d479a1da3065cb76b Mon Sep 17 00:00:00 2001 From: Alec Ames Date: Thu, 5 Feb 2026 16:46:08 -0500 Subject: [PATCH] (feat) added ![[]] embeds --- .gitignore | 2 ++ CHANGELOG.md | 1 + src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 1 + src-tauri/src/lib.rs | 34 ++++++++++++++++++++++++++++++++-- 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 50e98dc..2f27531 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ vite.config.ts.timestamp-* test.md test_image.png src-tauri/output.txt +test_obsidian.md + diff --git a/CHANGELOG.md b/CHANGELOG.md index e8a1159..afcd6ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Fixed titlebar icon color - Added togglable status bar - Added optional word count in status bar +- Added Obsidian `![[]]` embed support ### Released diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index ba4d583..94fe6b4 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -14,6 +14,7 @@ dependencies = [ "mslnk", "notify", "opener", + "regex", "serde", "serde_json", "tauri", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 88ff88b..df06730 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -32,6 +32,7 @@ comrak = "0.18" serde_json = "1" tauri-plugin-prevent-default = "2.0.0-rc.1" notify = "6" +regex = "1" directories = "5" opener = { version = "0.7", features = ["reveal"] } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index ba5a260..2e35f06 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -5,6 +5,8 @@ use std::path::Path; use std::sync::Mutex; use tauri::{AppHandle, Emitter, Manager, State}; use tauri::menu::ContextMenu; +use regex::{Regex, Captures}; +use std::borrow::Cow; struct WatcherState { @@ -21,8 +23,36 @@ async fn show_window(window: tauri::Window) { window.show().unwrap(); } +fn process_obsidian_embeds(content: &str) -> Cow<'_, str> { + let re = Regex::new(r"!\[\[(.*?)\]\]").unwrap(); + + re.replace_all(content, |caps: &Captures| { + let inner = &caps[1]; + let mut parts = inner.split('|'); + let path = parts.next().unwrap_or(""); + let size = parts.next(); + + let path_escaped = path.replace(" ", "%20"); + + if let Some(size_str) = size { + if size_str.contains('x') { + let mut dims = size_str.split('x'); + let width = dims.next().unwrap_or(""); + let height = dims.next().unwrap_or(""); + format!("\"{}\"", path_escaped, width, height, path) + } else { + format!("\"{}\"", path_escaped, size_str, path) + } + } else { + format!("\"{}\"", path_escaped, path) + } + }) +} + #[tauri::command] fn convert_markdown(content: &str) -> String { + let processed = process_obsidian_embeds(content); + let mut options = ComrakOptions { extension: ComrakExtensionOptions { strikethrough: true, @@ -36,11 +66,11 @@ fn convert_markdown(content: &str) -> String { }, ..ComrakOptions::default() }; - options.render.unsafe_ = false; + options.render.unsafe_ = true; options.render.hardbreaks = true; options.render.sourcepos = true; - markdown_to_html(content, &options) + markdown_to_html(&processed, &options) } #[tauri::command]