• トップ
  • ブログ一覧
  • 【番外編】Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた【Pythonでコードをハイライトする】
  • 【番外編】Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた【Pythonでコードをハイライトする】

    広告メディア事業部広告メディア事業部
    2020.09.07

    IT技術

    番外編

    本連載「Python Responder + Firestoreでモダンかつサーバーレスなブログシステムを作ってみる」は全10回で終了しました。

    前回の記事はこちら

    featureImg2020.08.20【第10回】Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた【ブログ完成!!】第10回~モダンなフレームワークの使い方を学びながらブログシステムを構築~連載「Responder + Firesto...

    コードハイライトを実装しよう!

    番外編となる今回は、「コードハイライト」で記事個別ページのデザインを整えたいと思います。

    デザインは各自お好きなもので良いのですが、便利なツールをご紹介するので、ぜひ参考にしてくださいね!

    シンタックスハイライト

    記事にコードを挿入する場合、Qiita や Github では以下のような記法をしますね。

    1```python
    2import numpy as np
    3
    4a = np.arange(0, 100, 2)
    5print(a)
    6```

    これが HTML になると、言語によって自動で色付けされ、とても便利なんです。

    本ブログシステムもそれを目指そうと思います。

    markdown + pygments

    今まで Markdown → HTML の変換は、Python の markdown ライブラリを使用してきました。

    実は、コードブロックにも対応しているのですが、ハイライト機能は Pygments というライブラリで拡張する必要があります。

    では、さっそくやってみましょう!

    インストールと CSS 取得

    インストール

    まずは、インストールから。

    1$ pip install Pygments

    テーマを選択

    そうしたら、テーマを選び、手元に CSS を落とします。

    テーマは以下の通り。

    1>>> from pygments.styles import STYLE_MAP
    2>>> print(STYLE_MAP.keys())
    3dict_keys(['default', 'emacs', 'friendly', 'colorful', 'autumn', 'murphy', 'manni', 'monokai', 'perldoc', 'pastie', 'borland', 'trac', 'native', 'fruity', 'bw', 'vim', 'vs', 'tango', 'rrt', 'xcode', 'igor', 'paraiso-light', 'paraiso-dark', 'lovelace', 'algol', 'algol_nu', 'arduino', 'rainbow_dash', 'abap', 'solarized-dark', 'solarized-light', 'sas', 'stata', 'stata-light', 'stata-dark', 'inkpot'])

    どんなテーマがあるの?

    実際のテーマは、以下のページが参考になりますよ。

    【Pygments style gallery!】
    https://help.farbox.com/pygments.html

    載っているのはごく一部ですが、この中からお好きなものを選ぶといいでしょう!

    static ディレクトリに落とす

    今回は「monokai」を選択して、static ディレクトリに落とします。

    1$ pygmentize -S monokai -f html -a .codehilite > static/highlight.css

    layout.html に CSS を追加

    そして、layout.html に、この CSS を追加します。

    1<link rel="stylesheet" href="/static/highlight.css">

    これだけで導入は OK です。

    Python側の設定

    Python 側では、マークダウンから変換する際のextensions を変更します。

    1md = markdown.Markdown(extensions=['tables', 'fenced_code', 'codehilite'])

    これでOKです。

    各所に追記しておきましょう。

    動作例

    動作確認してみると、こんな感じです!

    ハイライト例: Monokai (余白は要調整)

    行番号を入れる

    行番号を入れる場合は、markdown > extensions > codehilite.py の以下の部分を直さなければなりません。

    1class CodeHiliteExtension(Extension):
    2    """ Add source code hilighting to markdown codeblocks. """
    3
    4    def __init__(self, **kwargs):
    5        # define default configs
    6        self.config = {
    7            'linenums': [True,  # None,
    8                         "Use lines numbers. True=yes, False=no, None=auto"],
    9            'guess_lang': [True,
    10                           "Automatic language detection - Default: True"],
    11            'css_class': ["codehilite",
    12                          "Set class name for wrapper <div> - "
    13                          "Default: codehilite"],
    14            'pygments_style': ['default',
    15                               'Pygments HTML Formatter Style '
    16                               '(Colorscheme) - Default: default'],
    17            'noclasses': [False,
    18                          'Use inline styles instead of CSS classes - '
    19                          'Default false'],
    20            'use_pygments': [True,
    21                             'Use Pygments to Highlight code blocks. '
    22                             'Disable if using a JavaScript library. '
    23                             'Default: True']
    24            }
    25
    26        super().__init__(**kwargs)

    特定の行をマークアップ

    特定の行をマークアップさせたい場合は、以下のように指定してください。

    1```python hl_lines="5 17"
    2nanikashirano code
    3```

    行全体にかかるわけではありませんが、強調させたい時には便利ですね。

    Monokaiでのマークアップ (ついでに pre{ padding: 10px;} としてみた)

    さいごに

    番外編である今回は、「コードハイライトの実装」を行いました。

    これで、本連載も完全に終了です!

    長い間、ありがとうございました!

    次の連載企画にも、ぜひご注目ください!

    ソースコード

    なお、「本連載で制作したコードをちょっと扱いやすくしたもの」が Github にありますので、ぜひご自分で動かしてみてください!

    【ソースコード:Github】
    https://github.com/rightcode/python-firestore

    これをもとに、オリジナルのブログシステムを作るのも良いですよ!

    第1回の記事はこちら

    featureImg2020.07.17【第1回】Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた【初期セットアップ編】モダンなフレームワークの使い方を学びながらブログシステムを構築今回より、また新たに Python WebAPI 関連の...

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background