平々凡々エンジニア

平凡で難しい悩みを解決

rails マークダウン とシンタックスハイライトの導入仕方

 解説

gem 'redcarpet'
gem 'coderay'

をインストール

redcarpetはマークダウン 形式の文字列をhtmlに変換する
coderayシンタックスハイライトで表示するためのものです

ヘルパーを作成する

module ApplicationHelper
    require "redcarpet"
    require "coderay"

    class HTMLwithCoderay < Redcarpet::Render::HTML
        def block_code(code, language)
            case language.to_s
            when 'rb'
                lang = 'ruby'
            when 'yml'
                lang = 'yaml'
            when 'css'
                lang = 'css'
            when 'html'
                lang = 'html'
            when ''
                lang = 'md'
            else
                lang = language
            end

            CodeRay.scan(code, lang).div
        end
    end

    def markdown(text)
        html_render = HTMLwithCoderay.new(filter_html: true, hard_wrap: true)
        options = {
            autolink: true,
            space_after_headers: true,
            no_intra_emphasis: true,
            fenced_code_blocks: true,
            tables: true,
            hard_wrap: true,
            xhtml: true,
            lax_html_blocks: true,
            strikethrough: true
        }
        markdown = Redcarpet::Markdown.new(html_render, options)
        markdown.render(text)
    end
end

block_codeはブロックコードの指定してコードをハイライトにする。
またコード指定の略称を設定できる。
例えばrbrubyとして略す事ができます。
CodeRay.scanでハイライトにする。
langnilだとエラーになるので何もないときはマークダウン の指定にしてます。

markdownメソッドはマークダウン で書かれて文字列をhtmlに変換する。
HTMLwithCoderay.newはマークダウン が指定する構文分析のオプションを指定する。
Redcarpet::Markdown.newはhtmlレンダーの仕方を設定できます。
renderメソッドでマークダウン で書かれて文字列をhtmlに変換します。

余談

block_codeがどの処理あたりで呼ばれてるのかよくわかってない。ブロックというのだからhtmlをrenderするときに勝手に呼ばれてるような感じだと思うのだけれども確証が得られない。英語力が問われる。