背景
由于obsidian和hugo的图片路径十分不兼容(obsidian支持Vault内的绝对路径或文章相对路径,而hugo会把static内的图片放到public,也就是网站根目录下),如果把图片和md文件放在同一目录下倒是方便一点,但是这样目录就太乱了,令人难以接受。最简单的方案是统一把图片传到图床,但我一是囊中羞涩,二是常常要断网打比赛,需要笔记的图片保存在本地,不能使用图床的方案。总之我拖了好久都没处理这个问题,现在觉得不得不解决了。
图片复制与链接修正
因为懒,所以先去搜了一下有没有插件可以一键解决。然后浪费了一上午时间测试各种插件,不是修复图片链接不方便就是迁移图片位置不好调整。最后一想,我自己会写代码,还有chatgpt, 为什么要学插件怎么用折磨自己…
于是搓了个很糙但是能用的版本。以下代码基本上是chatgpt生成的,就改了一下路径。
#!/bin/python3
import sys
import glob
import shutil
blog_dir = "/home/juicymio/blog/blog_papermod/"
source_dir = "/home/juicymio/notes/PWN!!!/"
attachments_folder = source_dir + "attachments"
target = sys.argv[1].strip(".md")
static_dir = blog_dir + "static/"
def copy_files(source_dir, dest_dir, pattern):
search_pattern = source_dir + "/" + pattern
file_paths = glob.glob(search_pattern)
for file_path in file_paths:
dest_path = dest_dir + "/" + file_path.split("/")[-1]
shutil.copy2(file_path, dest_path)
copy_files(attachments_folder, static_dir, target + "*")
source_path = source_dir + target + ".md"
post_path = blog_dir + "content/posts/" + target + ".md"
shutil.copy2(source_path, post_path)
def adjust_path(file_path, target_string, adjusted_string):
with open(file_path, "r") as f:
content = f.read()
updated_content = content.replace(target_string, adjusted_string)
with open(file_path, "w") as f:
f.write(updated_content)
return
adjust_path(post_path, "![](", "![](")
需要使用obsidian的Paste image rename第三方插件把插入的图片名字改成{{fileName}}-1.jpg的形式,并设置obsidian的图片存放路径和图片链接格式(attachments这个名字随便改)。这样python脚本就可以把attachments里所有以{{filename}}开头的文件复制到hugo site的/static目录下,并把md文件中的![]attachments/*
修正为![]/*
。
使用方法:
./publish.py hugo_with_obsidian.md
非常好用。
模板
以上虽然解决了图片的问题,但是直接复制的md并没有头部的Front Matter,研究了一下(经xxw指点)发现可以使用obsidian的Template功能。在设置里给Insert Template分配一个快捷键可以让操作更加丝滑,我设置为了Alt+T。
设置template的目录,这里设置成templates,即Vault下的templates文件夹。
向template/posts中添加如下内容,变量可以根据使用的主题自行增减。
---
title: "{{title}}"
author: ["JuicyMio"]
date: "{{date}}"
tags:
draft: false
ShowToc: "true"
description: ""
---
在md文件中按Alt+T,选择posts,即可一键添加Front Matter.