GatsbyのBlogのTemplateをPythonのScriptで作成する

cute snake pop-styled
2023-09-16
2023-10-09

はじめに

Gatsbyの公式Guideでのやり方であるローカルで記事のデータを持つ場合に、その記事のテンプレートを作成するPythonのScriptを書いた。

ちょっとしたこだわりとして、slugはGoogle TranslateAPIを使用してTitleから自動で生成している。

総合的な手間を考えるとContentfulなどのCMSを導入したほうが楽にはなると思う。

ただ個人的にPythonを久しぶりに触りたかったのと、このサイトにブログのページを作るために記事として残すことにした。

前提と準備

>python --version
Python 3.11.5

必要なパッケージをInstallする

pip install translate

1. Templateを作成するScript

入力:標準入力

出力:MDX形式のTemplate

処理などの内容についてはコメントで多めに書いたのでここでの説明は省略する。

generate_gatsby_blog_template.py

import datetime
import os

import inflection
from translate import Translator


# ユーザーからタイトルを入力として受け取る関数
def get_title_input():
    while True:  # タイトルが入力されるまでループ
        title = input("記事のタイトルを入力してください: ").strip()
        if title:  # タイトルが入力された場合
            return title


# タイトルを英語のkebab-caseに変換する関数
def title_to_slug(title):
    print("Translating the title...")  # デバッグ用のprint文
    try:
        # Memo: 翻訳前の言語は自動判別らしいがjaはfromで指定しないと翻訳されなかった
        translator = Translator(from_lang="ja", to_lang="en")
        translated_title = translator.translate(title)

        print(f"Translated title: {translated_title}")  # 翻訳後のタイトルを表示

        # kebab-caseで小文字にする
        slug = inflection.parameterize(translated_title, separator="-").lower()
        print(f"Generated slug: {slug}")  # 生成されたスラッグを表示
        return slug
    except Exception as e:
        print(f"翻訳に失敗しました: {e}")
        return None


# メインの処理
def main():
    title = get_title_input()
    slug = title_to_slug(title)

    if not slug:  # 翻訳が失敗した場合は終了
        return

    today = datetime.datetime.now().strftime("%Y-%m-%d")

    # 保存先のパスを生成(WindowsとMacでの対応)
    user_home = os.path.expanduser("~")
    target_dir = os.path.join(user_home, "ryomazone.dev", "blog", f"{today}_{slug}")
    print(f"Directory path: {target_dir}")  # 作成予定のディレクトリパスを表示

    # ディレクトリが存在しない場合は作成
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)

    # MDXファイルの内容を生成
    mdx_content = f"""---
title: {title}
date: {today}
slug: {slug}
hero_image: "./hero_image.jpg"
hero_image_alt: hero_image
tags: 
  - 
---

"""

    # MDXファイルを保存
    with open(os.path.join(target_dir, "index.mdx"), "w", encoding="utf-8") as file:
        file.write(mdx_content)

    print(f"MDXファイルが {target_dir}/index.mdx に保存されました。")


# スクリプトを実行
if __name__ == "__main__":
    main()

2. Windows あるいは Macでの実行ファイルを作成する

Scriptをコマンドで実行するよりも実行ファイルから実行した方が楽なので作る。

  • Windows: generate_gatsby_blog_template.bat
python generate_gatsby_blog_template.py
:: 一時停止でエラーメッセージが表示された場合でも確認する
pause
  • Mac: generate_gatsby_blog_template.sh
#!/bin/bash
python3 generate_gatsby_blog_template.py
read -p "続行するには何かキーを押してください . . ."

まとめ

実行ファイルから実行した場合でもエラーを検知できるようにはした。

デバッグするのであればpythonコマンドで対話モードを起動して処理を実行した方がいい。

© 2023 ryomazone.dev