Django でマークダウン記法っぽいものを実装する(その1)
2017-10-21 13:27
  • Django のサイトを運用していると、コンテンツの更新にマークダウンっぽい記法を使いたいとお思うこと
    がよくあります。とくに、このサイトのようにブログっぽいものがメインになっている場合は尚更です。

    これまでは管理画面のテキストエリアに HTML タグを入力していましたが、それもちょっと面倒なので
    カスタムフィルタを使って、少しずつですがマークダウンっぽい記法を実装していきました。

    まだまだ完全版ではありませんが、ぼくが最もよく使うバッククォートだけ対応してみました。

    こんな感じ でバッククォートで囲った部分に独自のスタイルが当たるようになっています。

    コード

    もっと素敵なやり方があるのかもしれませんが、取り急ぎ以下のような感じなりました。

    ・ バッククォートで囲まれた部分を span タグに置換する

    # replace "`" to "<span>" tag
    def replace_backquote_to_span(value):
        is_existing_multi = False
        regex = r'(?P<prefix>.*)`(?P<mask>.*)`(?P<suffix>.*)'
        mask = re.search(regex, value)
    
        prefix = ''
        text = ''
    
        while (mask and re.search(regex, mask.group('prefix'))):
            is_existing_multi = True
            text = mask.group('suffix') + text
            text = '<span class="mesh">' + mask.group('mask') + '</span>' + text
    
            mask = re.search(regex, mask.group('prefix'))
    
            if not re.search(regex, mask.group('prefix')):
                text = mask.group('suffix') + text
                text = '<span class="mesh">' + mask.group('mask') + '</span>' + text
    
        if mask and not is_existing_multi:
            prefix = mask.group('prefix')
            text = '<span class="mesh">' + mask.group('mask') + '</span>'
            text += mask.group('suffix')
        elif not mask:
            text = value
    
        return prefix + text
    
    

    ちょっと苦労したところ

    一行の中にバッククォートで囲まれた複数のテキストがあったときの対応で、 while で再帰的に正規表現マッチをしなきゃいけないというところがちょっとハマリポイントでした。


    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • 2017-10-21 13:27
  • Python
  • Djangoカスタムフィルタマークダウン記法バッククォート
  • 新しい記事へ
    今月やりたいことリスト(2017年11月)

    古い記事へ
    git のコミットを GnuPG を使って署名付きにする

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 普段はなんちゃってプログラマやってます。海外から帰任してからは現場に戻って最前線でコード書いてます。 週末は気の向くままにプログラミングしたり、写真撮りに出かけたり、家でhuluみながらまったりしたりしています。(*´ω`*)モキュ