FastAPIでDocusaurus風サイトを構築:ステップ3 - コードハイライト

要約
このガイドでは、Pygmentsと`python-markdown`拡張機能を使用してFastAPIドキュメントサイトにコード構文ハイライトを追加する方法を説明します(静的CSSの設定を含む)。
意見はこのエリアに表示されます
アイキャッチ画像

前の記事では、.mdファイルからHTMLを動的にレンダリングするサポートを追加しました。

しかし、ご覧のとおり、docs/hello.mdのPythonコードブロックはレンダリングされましたが、プレーンで色付けされておらず、読みにくかったです。

この記事では、この問題を解決します。Pygmentspython-markdown拡張機能を使用して、Markdownコードブロックに構文ハイライトを追加します。

ステップ1:ハイライト依存関係のインストール

python-markdownライブラリは、「拡張機能」を通じて追加の機能をサポートしています。コードハイライトを実装するには、codehilite拡張機能が必要ですが、これは別のライブラリであるPygmentsに依存しています。

Pygmentsをインストールするには、次のコマンドを実行します。

ステップ2:静的ファイルディレクトリとCSSの設定

構文ハイライトの仕組みは、次の2段階のプロセスです。

  1. python-markdowncodehilite拡張機能は、コードブロック(例: @@CODE_BLOCK1@@)を特定のCSSクラス(キーワードの.k、文字列の.sなど)を持つHTMLタグに変換します。
  2. CSSファイルを使用して、ブラウザにこれらのCSSクラスが表示すべき色を指示します。

Pygmentsライブラリは、このCSSを生成するための便利なコマンドラインツールを提供しています。

まず、プロジェクトのルートディレクトリにstatic/cssフォルダを作成して、このCSSファイルを保存しましょう。

ステップ3:ハイライトCSSファイルの生成

ターミナルを開き、次のコマンドを実行します。

pygmentizeパラメータの説明:

  • -S monokai: ハイライトテーマとしてmonokaiを指定します(defaultgithub-darksolarized-lightなども試せます)。
  • -f html: -fは、HTML用のCSSを生成したいことを示します。
  • -a .codehilite: -aは、すべてのCSSルールが.codehilite CSSクラス(python-markdownによって使用されるデフォルトクラス)の下にネストされることを意味します。

完了後、static/css/highlight.cssを開くと、monokaiテーマのCSSルールが内部に生成されているのがわかります。

ステップ4:FastAPIでの静的ディレクトリのマウント

これでCSSファイルはできましたが、FastAPIはまだそれを認識していません。これを修正するには、main.pystaticディレクトリを「マウント」する必要があります。

main.pyを開き、次のように変更します。

ステップ5:HTMLテンプレートにCSSを含める

templates/doc.htmlを変更し、HTMLページがコードハイライトCSSをロードできるように、<head><link>タグを追加します。

ステップ6:Markdown拡張機能の有効化

最後のステップとして、main.pyに戻り、python-markdownライブラリにcodehilite拡張機能を使用するように指示しましょう。

また、バッククォート3つ内のコンテンツをコードブロックとしてレンダリングするために使用されるfenced_code拡張機能も必要です。これは、構文ハイライトを表示するための必須条件です。

main.pyget_hello_docルート関数を変更します。

ステップ7:実行とテスト

uvicorn main:app --reloadを実行してサーバーを起動します。

再度http://127.0.0.1:8000/docs/helloにアクセスします。

hello.mdのPythonコードブロックに、monokaiテーマの構文ハイライトが適用されているのがわかります。CSSを生成する際のパラメータを変更して、他のハイライトテーマの効果を確認することもできます。

ImageP1

プロジェクトのオンラインデプロイ

ドキュメントサイトは皆が閲覧できるようにするものなので、ローカルで実行するだけでは十分ではありません。次に、オンラインでデプロイしましょう。

簡単なデプロイオプションはLeapcellを使用することです。これは、FastAPIを含むさまざまな言語やフレームワークのプロジェクトをホストできるWebアプリホスティングプラットフォームです。

Leapcell

以下の手順に従ってください。

1.ウェブサイトでアカウントを登録します。

2.プロジェクトをGitHubにコミットします。手順については、GitHubの公式ドキュメントを参照してください。Leapcellは後でGitHubリポジトリからコードを取得します。

3.Leapcellページで「Create Service」をクリックします。

LeapcellImageP1

4.FastAPIリポジトリを選択すると、Leapcellが必要な構成を自動入力しているのが表示されます。

LeapcellImageP2

5.下部にある「Submit」をクリックしてデプロイします。デプロイはすぐに完了し、デプロイホームページに戻ります。ここでLeapcellがドメインを提供していることがわかります。これはブログのオンラインアドレスです。

LeapcellImageP3

結論と次のステップ

構文ハイライトにより、ドキュメントサイトははるかにプロフェッショナルに見えます。

しかし、まだ問題が1つあります。doc.htmlテンプレートのページタイトル({{ page_title }})は、main.pyのルート関数でハードコードされたままです("page_title": "Hello, Markdown!")。これはMarkdownファイルから取得されているわけではありません。

これは非常に柔軟性がありません。正しいアプローチは、このタイトルもhello.mdファイル自体から読み取ることです。

次の記事では、MarkdownファイルでFrontmattertitledateなどの記事メタデータを定義するために使用)を導入し、プロジェクトでFrontmatterの解析と読み込みを実装して、コードでのハードコーディングを回避します。


Xでフォローする:@LeapcellJapan


本シリーズの他の記事を読む

関連記事:

Explore More
関連記事はありません。
Trends