Introduction#
Recently, I use Obsidian to write almost everything, including blog posts. I mainly use images and math in my posts. (I used to use PicGo to upload my images to a repo, now I started to store images locally.)
So I wrote a simple Python script to modify my Obsidian markdown posts for publishing.
- There are still many bugs (for example, when the wiki link is inside a code block), I guess, but it works for my recent posts.
- Input a file name
- Search for it in the blog folder, vault/Blogs
- Copy the mentioned image files to the image path, repo/static/images.
- Do something to the .mdfile:- Convert wiki image links to markdown links 
- \\->- \\\, or the (all the- \\will be changed, though, not just in math)
- Remove the comments at the beginning of my file %%some comments%%
- Write the new file to the post path, repo/content/posts
 
Script#
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 | # -*- coding: utf-8 -*-
import re
import shutil
import os
import glob
# Get the input file path
fname = input('Enter the file name (without .md):')
f_fullname =  fname + '.md'
src_file_path = 'vault/Blogs/**/' + f_fullname
file_list = glob.glob(src_file_path,recursive = True)
blog_img_dir = 'repo/static/images'
blog_content_dir = 'repo/content/posts'
src_img_dir = 'vault/images'
# For simplicity, 
# the blog file name should be unique
# or the script will exit
if len(file_list)>1:
	print('More than one file with the same name.')
	input('Press Enter to exit...')
	os._exit(1)
elif len(file_list) == 0:
	print(f'{f_fullname}: No file found.')
	input('Press Enter to exit...')
	os._exit(1)
	
# if file name is unique, continue:
with open(file_list[0], 'r',  encoding='utf-8') as f:
    # Read the entire contents of the file as a string
    text = f.read()
    f.close()
# Find all wiki style attachment file names using re
# such as `[[image.jpg]]`
pattern = r'!\[\[(.*?)\]\]'
file_names = re.findall(pattern, text)
# Move each file to the target directory
for file_name in file_names:
    src_path = src_img_dir + '/' + file_name  
    img_dest_path = blog_img_dir + '/' + file_name
    
    # Use shutil.move() to copy the file
    shutil.copy(src_path, img_dest_path)
    print(f'Moved {file_name} to {img_dest_path}')
# Replace all occurrences of [[file name]] with [](file name)
# Hogo display images in /static/images/: ``
new_text = re.sub(pattern, r'', text)
# for multiline math, `\\` -> `\\\`
new_text = re.sub(r'\\\\', r'\\\\\\', new_text)
# remove markdown comment `%% comment\n comment2%%`. 
new_text = re.sub(r'%%(.|\n)*?%%', '', new_text) 
blog_dest_path = blog_content_dir + '/' + f_fullname
with open(blog_dest_path, 'w',  encoding='utf-8') as f:
    # Write the modified string to a new file
    f.write(new_text)
    f.close()
print(f'Write {blog_dest_path}')	
input('Press Enter to exit...')
 | 
Some links#
How to use Glob() function to find files recursively in Python? - GeeksforGeeks
How can I write a regex which matches non greedy? - Stack Overflow
devidw/obsidian-to-hugo: Process Obsidian notes to publish them with Hugo