きりかノート 3冊め

おあそびプログラミング

rakeで日記を書く

そこそこ安定してきたようなので、この日記の編集ツールをさらしてみる。添削プリーズ。いまだにrakeよくわかってないし。

基本的にはすべてローカルのターミナル上の作業で

  1. rake edit_todayでテキスト編集
  2. rake sendではてなにアップ
  3. ブラウザで日記ページを確認
  4. 気になるところがあれば、1.にもどって修正

というループ。はてダラ単体で運用してもよかったのだけど、送信済み=svnにコミットされている、としたかったので周辺をいじってみた。

はてダラがあってよかった。結城さん++

# $Id: Rakefile 1051 2009-04-19 15:08:27Z kimuraw $
#
# = はてダラによる日記環境
#
# subversionで送信したテキストファイルをバージョン管理する
# という運用環境を構築する
#
# == 想定される使い方
#
# 年や月ごとのディレクトリを作成し、そこで日付名のファイルを書く。
# `rake send'すると、はてダラにより日記ファイルがはてなダイアリーに
# 送信される。
#
# ファイル構成の例
#
#   ./200811/2008-11-01.txt
#   ./200812/2008-12-01.txt
#   ./2009/2009-01-01.txt
#   ./2009/2009-02-01.txt
#   ./Rakefile
#   ./tool/hw.pl
#   ./config.txt
#   ./template.txt
#
# ディレクトリを新規作成したときは`svn add'すること。
# (めんどいので対応していない)
#
# == 利用できるrakeタスク
#
# `rake -T'の結果を参照のこと
#
# == 必要なもの
#
# * perl
# * svn
# * rake
#
# == SEE ALSO
#
# :はてなダイアリーライター(略称:はてダラ)
#   http://www.hyuki.com/techinfo/hatena_diary_writer.html
#

require 'fileutils'
require 'time'

# 実行につかうコマンド、好みでフルパスに
PERL = 'perl'
SVN = 'svn'

# 設定
HDW_PATH = 'tool/hw.pl' #はてダラのパス(Rakefileからの相対パス)
HDW_OPTIONS = '-c'
CONF_TXT = 'config.txt'
TMPL_TXT = 'template.txt'

EDIT_CMD = 'vim "%s"' #編集コマンド
HOUR_DELTA = -6

task :default => :list

# 数字で始まるファイルを日記ディレクトリと見なす
diary_dirs = FileList.new('[0-9]*')
# 今日のファイル
today_file =  (Time.now + HOUR_DELTA * 3600).strftime('%Y-%m-%d.txt')
today_path = File.join(Rake.original_dir, today_file)

#### タスク

desc '未送信の日記ファイルを一覧表示します'
task :list do |t|
   if t.prerequisites.size > 0
     puts t.prerequisites.join("\n")
   else
     puts "未送信のファイルはありません。"
   end
end

desc '未送信の日記ファイルをはてなに送信します'
task :send do |t|
  files = t.prerequisites
  if files.size == 0
    puts "未送信のファイルはありません。"
  else
    # すべてをコミット
    sh "#{SVN} ci -m 'post: #{Time.now.rfc2822}' #{diary_dirs.join(' ')}"
  end
end

desc '今日の日記ファイルをエディタで開きます'
task :edit_today => :touch do
  sh (EDIT_CMD % today_path)
end

desc '今日の日記ファイルがなければ作成します'
task :touch do
  unless File.exists? today_path
    puts "touch \"#{today_file}\""
    sh "cat \"#{TMPL_TXT}\" > \"#{today_path}\""
  end
end

# はてダラで送信する
rule '.send' => '.txt' do |t|
  sh "#{PERL} #{HDW_PATH} #{HDW_OPTIONS} -f #{t.source} -n #{CONF_TXT}"
end

# バージョン管理下にないファイルを追加
rule '.add' => '.txt' do |t|
  sh "#{SVN} add \"#{t.source}\""
end

#### 対象ファイルの抽出

#### listまたはsendタスクが指示されたときは未コミットのファイルを収集
if ([:list, :send] - Rake.application.top_level_tasks).size > 0
  uncommited_files = `#{SVN} st #{diary_dirs.join(' ')}`
  uncommited_files.lines.grep(/\A[AM\?]/).each do |line|
    line.slice(/(\S).\s+(.*)/)
    svn_type = $~[1]
    path = $~[2]
    # テキストファイル以外は無視
    next if File.extname(path) != '.txt'

    if svn_type == '?'
      task path.pathmap('%X.send') => path.pathmap('%X.add')
    end
    task :send => path.pathmap('%X.send')
    task :list => path
  end
end