2020年10月2日金曜日

Sinatra で Markdown テンプレートを使う方法

概要

rdiscount という Markdown プロセッサを使います
Sinatra に sinatra-rdiscount というエクステンションがあるのでこれを使います

環境

  • macOS 10.15.6
  • Ruby 2.7.1p83
    • sinatra 2.0.7

準備

  • bundle init
  • vim Gemfile
gem "sinatra"
gem "sinatra-rdiscount"
  • bundle install

サンプルアプリ

テンプレートを表示するのに markdown という命令を使います
views/index.md はあとで紹介します

  • vim app.rb
require 'sinatra/base'
require 'sinatra/rdiscount'

class MyApp < Sinatra::Base
  get '/test' do
    markdown :index
  end
end
  • vim config.ru
require './app'
run MyApp

Markdown ファイル

普通の Markdown ファイルです
テーブルも使えました
基本的には discount が対応しているフォーマットは使えるので詳しくは discount のドキュメント を御覧ください

  • vim views/index.md
# Markdown Tests

## List
* Name
  * Hawksnowlog
* Age
  * 10

## Link
[blog](https://hawksnowlog.blogspot.com/)

## Table

| A | B |
|---|---|
| C | D |

## Horizen

Top
***
Bottom

あとは起動して確認すれば OK です

  • bundle exec rackup config.ru

スタイルを当てるには

layout_engine を指定します

  • vim app.rb
require 'sinatra/base'
require 'sinatra/rdiscount'

class MyApp < Sinatra::Base
  get '/test' do
    markdown :index, :layout_engine => :erb
  end
end

今回はレイアウトに erb を使ってコンテンツの本体は Markdown を想定しています
コンテンツ本体を呼び出す場合には yield をコールします

  • view views/layout.erb
<html>
<head>
  <title>test</title>
</head>
<body>
<%= yield %>
</body>
</html>

あとはここで CSS や JS などの読み込みをすれば OK です

最後に

Sinatra で Markdown テンプレートを使って Markdown に記載された情報を HTML で返却する方法を紹介しました
Jekyll のような感じのことができるようになると思います

変換部分の本体は rdiscount -> discount というネイティブエクステンションを使っているので一応念頭に入れておきましょう

参考サイト

0 件のコメント:

コメントを投稿