0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Obsidianのimgタグを置換したい

Posted at

Obsidianのimgタグが使えなくなった(https://とかは表示できる)のでマークダウン表記である

![](相対パスC:/Users/)

を使わないといけなくなりました。
Obsidianって何?って方は以前の記事をぜひご覧ください!

ここで地味に重要なのが、WindowsのC:\Users\のような\を使うとPDF出力で画像が表示されなくなるので注意してください
厄介なのが、\を相対パスで使ってもをPDFに出力する前の.mdファイルでは正しく表示されます。トラップ?
ChatGPTに聞いたらElectron を使ったアプリなのでセキュリティポリシーでローカルファイルの表示が制限されてるのではないか?と言われましたが結局よくわかんなかったです。
ちなみに私はHTMLがサニタイズされたという公式のアナウンスによるものだと勝手に予想しています。

私にとってはメモの画像が突然表示されなくなって大問題でした。
なので、imgタグを埋め込みのマークダウン表記に置換しよう思い、置換するプログラムを作成しました。
たいした行数ないのでそのまま載せます。

import os
import re

def convert_img_to_md(vault_path, folder_path):
    img_tag_pattern = re.compile(r'<img src="([^"]+)"[^>]*>')
    
    for root, _, files in os.walk(folder_path):
        for file in files:
            if file.endswith(".md"):
                file_path = os.path.join(root, file)
                
                with open(file_path, "r", encoding="utf-8") as f:
                    content = f.read()
                
                def replacement(match):
                    img_abs_path = os.path.abspath(match.group(1))  # 絶対パスへ変換
                    file_name = os.path.basename(img_abs_path)  # ファイル名取得
                    
                    if img_abs_path.startswith(vault_path):
                        img_relative_path = os.path.relpath(img_abs_path, vault_path).replace("\\", "/")  # スラッシュを統一
                        return f'![{file_name}]({img_relative_path})'  # Obsidianの画像埋め込み形式
                    else:
                        return match.group(0)  # 変換せずそのまま戻す
                
                new_content = img_tag_pattern.sub(replacement, content)
                
                if new_content != content:
                    with open(file_path, "w", encoding="utf-8") as f:
                        f.write(new_content)
                    print(f"Updated: {file_path}")
                else:
                    print(f"No changes: {file_path}")

if __name__ == "__main__":
    vault_path = input("Obsidianの保管庫のルートディレクトリを入力してください: ")
    if not os.path.isdir(vault_path):
        print("指定された保管庫ディレクトリが見つかりません。")
        exit(1)
    
    target_folder = input("変換したいMarkdownファイルがあるフォルダのパスを入力してください: ")
    if os.path.isdir(target_folder):
        convert_img_to_md(vault_path, target_folder)
    else:
        print("指定されたフォルダが見つかりません。")

ターミナルでpython convert_img_to_md.pyと打つと使えます。
引数として保管庫のルートディレクトリと置換したいマークダウンがあるディレクトリを渡します。
ディレクトリを渡さないと相対パスで表示できないからです。
↓こんな感じ

環境はPython 3.12.1です。
一応同じプログラムをGitHubにも置いておいたのでリンク貼っておきます。

最近見つけた便利なプラグインが色々貯まってきたので、そろそろまとめて記事にしたいところなのですが、就活が忙しいので来月に投稿とかは厳しいと思いますね......
いいプラグイン貯めてる方いたら代わりにまとめて記事にしてくれ~

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?