railsにmarkdownを実装したよ
markdown 機能実装
記事を書くのにいちいちHTMLで書くのは面倒。
だから使い慣れているmarkdownを導入することにした。
今回欲しかった機能は以下の通り
順番に説明していく。
実装工程
markdown
今回使うgemはこれ
gem 'redcarpet' gem 'rouge'
そしておなじみのやつを打ち込んで
sudo bundle install
以下のファイルを作ってコードをぶち込む
app/helper/markdown_helper.rb
module MarkdownHelper def markdown(text) options = { filter_html: true, hard_wrap: true, space_after_headers: true, with_toc_data: true } extensions = { autolink: true, no_intra_emphasis: true, fenced_code_blocks: true, tables: true } renderer = Redcarpet::Render::HTML.new(options) markdown = Redcarpet::Markdown.new(renderer, extensions) markdown.render(text).html_safe end end
optionsとextentionsの中身(filter_htmlとか)は参考サイトを参照してほしい。もっと丁寧に書いてあって参考になるはず。
これができたらあとは、適当なviewにこれをかく。()の中身は各自対応させる。
app/views/articles/show.html.slim
= markdown(@article.content)
これだけで@article.contentがmarkdownで表示される。
すげええ。
参考
redcarpetでrailsにシンプルにMarkdownを適用する
リアルタイムプレビュー
vue.jsとmarked.jsをheadに追加する
/app/views/layout/application.html.slim
doctype html
html
head
title
| hoge
link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"
script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"
script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"
/! Realtime preview 始まり
script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.10/vue.js"
script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.5/marked.js"
/! Realtime preview 終わり
= csrf_meta_tags
= csp_meta_tag
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
body
/! 以下略
ほんで、フォームの部分に、投稿部分とプレビュー部分を並べる。
JSも書き忘れないように。
app/views/articles/_form.html.slim
= form_for @article do |f| /! 中略 .field #editor textarea.form-control debounce="50" name="article[content]" rows="20" v-model="input" div v-html=("input | marked") .actions = f.submit "保存" javascript: window.onload = function() { new Vue({ el: '#editor', data: { input: '#{j @article.content}', }, filters: { marked: marked, }, }); };

参考
html.erbファイルでjs直書きでその中にrubyのコードを埋め込んでいる状態のものをslimに置き換えるときの書き方
toc(目次)機能
先ほど作成したヘルパーに追記していく。
toc用のものを作成した。markdownを参考にしたら簡単にできた。
app/helper/markdown_helper.rb
module MarkdownHelper
def markdown(text)
options = {
filter_html: true,
hard_wrap: true,
space_after_headers: true,
with_toc_data: true
}
extensions = {
autolink: true,
no_intra_emphasis: true,
fenced_code_blocks: true,
tables: true
}
renderer = Redcarpet::Render::HTML.new(options)
markdown = Redcarpet::Markdown.new(renderer, extensions)
markdown.render(text).html_safe
end
/!以下追加
def toc(text)
toc_option = {
nesting_level: 2
}
toc_renderer = Redcarpet::Render::HTML_TOC.new
toc = Redcarpet::Markdown.new(toc_renderer, toc_option)
toc.render(text).html_safe
end
/! 以上追加
end
あとは、markdownを実装したとき同様こうやると完成。
app/views/articles/show.html.slim
= markdown(@article.content)
