/ #hugo #blog 

このブログの記事の土台を生成するrakeタスクを作った

少しでも記事を書くのをラクにする試みです。

このブログで記事を書き始めるまでの作業

1. 前の記事をコピーしてcontent/post/yyyy-mm-dd_slug名.mdの形で保存。

2. このへん↓のメタ情報を編集して

+++
date = "2017-01-04T23:21:39+09:00"
draft = false
title = "記事のひな形から記事の土台を生成するrakeタスクを作った"
slug = "rake_entry_new"
tags = ["hugo","blog"]
image = "images/blog_mvim.png"

+++
(...ここから記事本文...)

3. 記事本文を書き始める

という流れでした。いろいろとめんどい💦

1と2の作業は、slugさえ決まれば自動的に決まります。 あと、時刻とかも自動的に挿入できそうです。 このへんを自動化してみました。

記事のひな形とRakeタスクを作った

記事のひな形

今まで前の記事をコピーしていたので、ひな形は作っていなかったのですが、 今回作りました。こんな形です。

+++
date = "<%= (Time.now + 2*60*60).iso8601 %>"
draft = false
title = "テンプレです💪"
slug = "<%= @slug %>"
tags = ["tag1","tag2"]
image = "images/slack_display.png"

+++

見出し文

<!--more-->

### h3

imgタグ例
<img alt="slack" src="/images/slack_sidebar.png" width=400>

### ✎まとめ

* まとめ内容です

Time#iso8601を使っているのがミソ(死語)です。

ちょうど”2017-01-04T23:21:39+09:00” というフォーマットで出力してくれます💪

ちなみにTime#iso8601は、require 'time'しないと使えません。

Timeクラスは、require 'time'する場合としない場合で挙動が変わる、珍しいクラスです。知ってたかい! 詳しくはこちら

Rakeタスク

@slugというインスタンス変数経由でmarkdownにslugを渡します。

# Rakefile
namespace :entry do
  desc 'Put a new entry'
  task :new, 'title'
  task :new do |task, args|
    puts
    template = ERB.new(File.read('entry_template.md.erb'))
    @slug = args['title'] || 'slug'
    File.write(
      "./content/post/#{Date.today}_#{@slug}.md",
      template.result
    )
  end
end

このRakeタスクの使い方

つまり

$ rake 'entry:new[hoge]'とやるとcontent/post/2017-01-04_hoge.mdというファイルが自動生成され、メタ情報のslugにもhogeがセットされます💪。

これで記事を書く手間が少し減りました☺

ところで、こういうふうに、 rakeタスクには引数が渡せるんだよ。知ってたかい。

[がシェル的に解釈されちゃう問題があるのでシングルクオートで括る必要がありますが。

(これがダサいと考える派の人は環境変数使うんだろうなと思います)

✎まとめ

rakeタスクに引数、使っていこうな()


Author

hoshinotsuyoshi

星野剛志(ほしのつよし) web application engineer. ruby/rails/docker