PythonのMarkdownで、コードの複数行表示とシンタックスハイライトに対応し、HTMLに表示する

インストール

pip install markdown
pip install pygments

コード

from markdown import markdown

codehilite_configs = {
    'codehilite': {
        'pygments_style': 'solarized-light',
        'noclasses': True
    }
}

def content_as_markdown(self):
    return markdown(
        self,
        extensions=['fenced_code', 'codehilite'],
        extension_configs=codehilite_configs
        )
  • pygmentsはimportしなくていい
  • extensionsでfenced_codecodehiliteを設定
  • fenced_codeは、Markdownでコードの複数行表示に対応するために必要
  • 拡張機能をすべて追加する場合は、extensionsにextraを設定
    • extensions=[‘extra’, ‘codehilite’]
  • コードのハイライトに対応するには、extension_configsを設定する必要がある
  • 今回は、ハイライトのスタイルにsolarized-lightを設定している
  • ハイライト表示するためには、'noclasses': Trueが必要

Djangoのmodels.pyでの設定例

from django.db import models
from django.utils.safestring import mark_safe
from markdown import markdown

CATEGORY = (('python', 'python'), ('django', 'django'), ('flask','flask'), ('html','html'), ('css','css'))

codehilite_configs = {
    'codehilite': {
        'pygments_style': 'solarized-light',
        'noclasses': True
    }
}

class ConponentModel(models.Model):
    title = models.CharField('タイトル', max_length=64)
    content = models.TextField('内容')
    category = models.CharField(
        max_length=16,
        choices=CATEGORY
    )
    created_at = models.DateTimeField('作成日', auto_now_add=True)

    def content_as_markdown(self):
        return mark_safe(markdown(
            self.content,
            extensions=['fenced_code', 'codehilite'],
            extension_configs=codehilite_configs
            ))

    def __str__(self) -> str:
        return self.title

    class Meta:
        db_table = 'conponent'