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]