GatsbyのBlogのTemplateをPythonのScriptで作成する
2023-09-16
2023-10-09
はじめに
Gatsbyの公式Guideでのやり方であるローカルで記事のデータを持つ場合に、その記事のテンプレートを作成するPythonのScriptを書いた。
ちょっとしたこだわりとして、slugはGoogle Translate
APIを使用して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
コマンドで対話モードを起動して処理を実行した方がいい。