Hatena::ブログ(Diary)

papamitra RSSフィード

2006-06-25

[][] hw-howm.rb 0.1.0

微妙に修正。

はてダラファイルにhowmファイル名を"><!--hoge.howm--><"のように埋め込んでたけど、これがよろしくないらしい。RSSにしたとき"<"がゴミとして入ってきてしまう。

たぶんはてな側のバグだとおもうけど、よくよく考えるとpタグ停止記法を使う理由もないのでファイル名埋め込みには"<!-- -->"を使うことにする。


以下本体

#!/usr/bin/ruby -w
#
# hw-howm.rb -- howmメモをhw.plで扱える形式にする.
#
require "optparse"
require "fileutils"
require "find"
require "pathname"

begin
  opt = OptionParser.new
  OPTS = {}
  opt.banner= "usage: #$0 [options] src"
  opt.on_tail("-h", "--help", "show this message") {puts opt; exit 0}
  opt.on("-t", "--timestamp=FILE", "use FILE as timestamp (default: none)") {|v| OPTS[:t] = v} # touch file path
  opt.on("-g", "--group=GROUP", "assume group name"){|v| OPTS[:g] = v}
  opt.on("-o", "--outputdir=DIR", "output file in DIR (default: .)"){ |v| OPTS[:o] = v }
  opt.version = "0.1.0"
  opt.release = nil
  opt.parse!(ARGV)
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
  puts $!
  puts opt
  exit 1
end

if ARGV.size == 0
  puts opt
  exit 1
end

updir = OPTS.key?(:o) ? OPTS[:o] : '.'
unless FileTest.directory? updir
  puts "invalid directory: #{dir}"
  puts opt
  exit 1
end

touch_file = ""
if OPTS.key?(:t) && FileTest.file?(OPTS[:t])
  touch_file = OPTS[:t]
end
TOUCH_MTIME = (touch_file == "") ? Time.at(0) : File.mtime(touch_file)

ARG_GROUP = OPTS.key?(:g) ? OPTS[:g] : ""

IN_NOOP = :IN_NOOP
IN_BODY = :IN_BODY
IN_DIARY = :IN_DIARY

# howmファイルの読み込み
def readhowm (path, def_date)

  status = IN_NOOP
  howm_content = Hash.new("")

  date = ""
  path.each_line do |line|    
    case status
    when IN_NOOP
      if line =~ /^= .*\{hw(:(.*))?(?=\})/
        date = def_date
        group = ""
        if !$2.nil? 
          $2.split(',').each do |str|
            str.strip!
            if str =~ /(\d{4}-\d{2}-\d{2})/
              date = $1
            elsif str =~ /g=(.*)/
              group = $1.strip
            end
          end
        end
        howm_content[date] += ""
        status = IN_BODY if ARG_GROUP == group
      end

    when IN_BODY
      if line =~ /^=( |$)/
        status = IN_NOOP
        redo
      end

      if line =~ /^%%%/
        status = IN_DIARY
        next
      end

    when IN_DIARY
      if line =~ /^=( |$)/
        status = IN_NOOP
        redo
      end

      # EOF対策。改行で終らせる。
      line += "\n" if line[-1] != ?\n
      howm_content[date] += line
    end
  end

  return howm_content
end

def scan_files(array, &block)
  array.each do |p|
    path = Pathname.new(p)
    path.find {|path| block.call(path)}
  end
end

# メインの処理
scan_files(ARGV) do |path|
  next unless path.readable?()

  # touchファイルより新しいか
  next if TOUCH_MTIME > path.mtime()

  # *.howmファイルのみ対象
  next unless /\.howm$/ =~ path.to_s

  filename = path.basename().to_s

  # ファイル名の先頭がYYYY-MM-DDならその日付を日記日付のデフォルトとして使用
  if /^(\d{4}-\d{2}-\d{2}).*\.howm$/ =~ filename
    def_date = $1
  else
    def_date = path.mtime().strftime("%Y-%m-%d")
  end

  # howmファイルの内容をハッシュに読みこみ
  howm_content = readhowm(path, def_date)

  howm_content.keys.each do |date|
    # はてダラファイル記事格納用ハッシュ
    hatena_content = Hash.new("")

    # はてダラファイルの先頭部分はhatena_content["0"]に格納
    key = "0"
    # はてダラファイルの内容をハッシュに格納
    uppath = "#{updir}/#{date}.txt"
    if FileTest.file?(uppath)
      File.foreach(uppath) do |line|
        if /^<!--(\d{4}-\d{2}-\d{2}.*\.howm)-->$/ =~ line
          key = $1
          next
        end
        hatena_content[key] += line
      end
    elsif FileTest.exist?(uppath)
      puts "#{uppath} is not file."
      next
    end

    # はてダラファイルもなく内容が空の場合はファイル出力しない
    next if !hatena_content.key?("0") and howm_content[date] == ""

    # はてダラファイルがなかったとき
    # とりあえずファイルの先頭は空行にしておく
    hatena_content["0"] = "\n" unless hatena_content.key?("0")

    if !hatena_content.key?(filename) or hatena_content[filename] != howm_content[date]
      hatena_content[filename] = howm_content[date]
      # はてダラファイルへ書き込み
      File.open(uppath, "w+") do |io|
        io << hatena_content["0"]
        hatena_content.keys.sort.each do |key|
          if key != "0" && hatena_content[key] != ""
            io << "<!--#{key}-->\n"
            io << hatena_content[key]
          end
        end
      end
    end
  end

end

# touch
if OPTS.key?(:t)
    FileUtils.touch(OPTS[:t])
end

exit 0

マイナーバージョン番号が上ってますがあんまり意味はないです。

2006-06-24

[][] hw-howm.rb 0.0.5

id:sshiの助言で仕様変更。



以下本体

#!/usr/bin/ruby -w
#
# hw-howm.rb -- howmメモをhw.plで扱える形式にする.
#
require "optparse"
require "fileutils"
require "find"
require "pathname"

begin
  opt = OptionParser.new
  OPTS = {}
  opt.banner= "usage: #$0 [options] src"
  opt.on_tail("-h", "--help", "show this message") {puts opt; exit 0}
  opt.on("-t", "--timestamp=FILE", "use FILE as timestamp (default: none)") {|v| OPTS[:t] = v} # touch file path
  opt.on("-g", "--group=GROUP", "assume group name"){|v| OPTS[:g] = v}
  opt.on("-o", "--outputdir=DIR", "output file in DIR (default: .)"){ |v| OPTS[:o] = v }
  opt.version = "0.0.5"
  opt.release = nil
  opt.parse!(ARGV)
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
  puts $!
  puts opt
  exit 1
end

if ARGV.size == 0
  puts opt
  exit 1
end

updir = OPTS.key?(:o) ? OPTS[:o] : '.'
unless FileTest.directory? updir
  puts "invalid directory: #{dir}"
  puts opt
  exit 1
end

touch_file = ""
if OPTS.key?(:t) && FileTest.file?(OPTS[:t])
  touch_file = OPTS[:t]
end
TOUCH_MTIME = (touch_file == "") ? Time.at(0) : File.mtime(touch_file)

ARG_GROUP = OPTS.key?(:g) ? OPTS[:g] : ""

IN_NOOP = :IN_NOOP
IN_BODY = :IN_BODY
IN_DIARY = :IN_DIARY

# howmファイルの読み込み
def readhowm (path, def_date)

  status = IN_NOOP
  howm_content = Hash.new("")

  date = ""
  path.each_line do |line|    
    case status
    when IN_NOOP
      if line =~ /^= .*\{hw(:(.*))?(?=\})/
        date = def_date
        group = ""
        if !$2.nil? 
          $2.split(',').each do |str|
            str.strip!
            if str =~ /(\d{4}-\d{2}-\d{2})/
              date = $1
            elsif str =~ /g=(.*)/
              group = $1.strip
            end
          end
        end
        howm_content[date] += ""
        status = IN_BODY if ARG_GROUP == group
      end

    when IN_BODY
      if line =~ /^=( |$)/
        status = IN_NOOP
        redo
      end

      if line =~ /^%%%/
        status = IN_DIARY
        next
      end

    when IN_DIARY
      if line =~ /^=( |$)/
        status = IN_NOOP
        redo
      end

      # EOF対策。改行で終らせる。
      line += "\n" if line[-1] != ?\n
      howm_content[date] += line
    end
  end

  return howm_content
end

def scan_files(array, &block)
  array.each do |p|
    path = Pathname.new(p)
    path.find {|path| block.call(path)}
  end
end

# メインの処理
scan_files(ARGV) do |path|
  next unless path.readable?()

  # touchファイルより新しいか
  next if TOUCH_MTIME > path.mtime()

  # *.howmファイルのみ対象
  next unless /\.howm$/ =~ path.to_s

  filename = path.basename().to_s

  # ファイル名の先頭がYYYY-MM-DDならその日付を日記日付のデフォルトとして使用
  if /^(\d{4}-\d{2}-\d{2}).*\.howm$/ =~ filename
    def_date = $1
  else
    def_date = path.mtime().strftime("%Y-%m-%d")
  end

  # howmファイルの内容をハッシュに読みこみ
  howm_content = readhowm(path, def_date)

  howm_content.keys.each do |date|
    # はてダラファイル記事格納用ハッシュ
    hatena_content = Hash.new("")

    # はてダラファイルの先頭部分はhatena_content["0"]に格納
    key = "0"
    # はてダラファイルの内容をハッシュに格納
    uppath = "#{updir}/#{date}.txt"
    if FileTest.file?(uppath)
      File.foreach(uppath) do |line|
        if /^><!--(\d{4}-\d{2}-\d{2}.*\.howm)--><$/ =~ line
          key = $1
          next
        end
        hatena_content[key] += line
      end
    elsif FileTest.exist?(uppath)
      puts "#{uppath} is not file."
      next
    end

    # はてダラファイルもなく内容が空の場合はファイル出力しない
    next if !hatena_content.key?("0") and howm_content[date] == ""
     
    # はてダラファイルがなかったとき
    # とりあえずファイルの先頭は空行にしておく
    hatena_content["0"] = "\n" unless hatena_content.key?("0")

    if !hatena_content.key?(filename) or hatena_content[filename] != howm_content[date]
      hatena_content[filename] = howm_content[date]
      # はてダラファイルへ書き込み
      File.open(uppath, "w+") do |io|
        io << hatena_content["0"]
        hatena_content.keys.sort.each do |key|
          if key != "0" && hatena_content[key] != ""
            io << "><!--#{key}--><\n"
            io << hatena_content[key]
          end
        end
      end
    end
  end

end

# touch
if OPTS.key?(:t)
    FileUtils.touch(OPTS[:t])
end

exit 0

howmファイルを正規表現で一括処理するのはヤメ。

Pathnameを使うようにした。

2006-06-23

[][] hw-howm.rb 0.0.4

前回上げたやつバグってました。すみません。

バグ修正したやつ上げときます。


機能的にはこれでほぼ完成。あとはバグ潰しとリファクタくらいかな。


以下スクリプト

#!/usr/bin/ruby -w
#
# hw-howm.rb -- howmメモをhw.plで扱える形式にする.
#
require "optparse"
require "fileutils"
require "find"

begin
  opt = OptionParser.new
  OPTS = {}
  opt.banner= "usage: #$0 [options] src_dir target_dir"
  opt.on_tail("-h", "--help", "show this message") {puts opt; exit 0}
  opt.on("-t", "--timestamp=FILE", "use FILE as timestamp(default: none)") {|v| OPTS[:t] = v} # touch file path
  opt.on("-g", "--group=GROUP", "assume group name"){|v| OPTS[:g] = v}
  opt.version = "0.0.4"
  opt.release = nil
  opt.parse!(ARGV)
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
  puts $!
  puts opt
  exit 1
end

srcdir = ARGV[0]
updir = ARGV[1]

if !srcdir or !updir
  puts opt
  exit 1
end

[srcdir, updir].each do |dir|
  unless FileTest.directory? dir
    puts "invalid directory: #{dir}"
    puts opt
    exit 1
  end
end

touch_file = ""
if OPTS.key?(:t) && FileTest.file?(OPTS[:t])
  touch_file = OPTS[:t]
end
TOUCH_MTIME = (touch_file == "") ? Time.at(0) : File.mtime(touch_file)

ARG_GROUP = OPTS.key?(:g) ? OPTS[:g] : ""

# howmファイルの読み込み
def readhowm (path, def_date)

  howm_content = Hash.new("")
  date = ""
  File.open(path, "r") do |io|
    break if io.eof? 
    io.readlines.join('').scan(/^= [^\n]*\{hw(?:\:([^\n\}]*))?\}(?:(?!\n).)*\n(?:(?!^\=[ \n]|^%%%).)*\n%%%(?:(?!\n).)*\n((?:(?!(?:^\=[ \n])).)*)/m) do |(options, body)|
      (howm_content[date] = ""; next) if body == ""
      date = def_date
      group = ""
      if !options.nil? 
        options.split(',').each do |opt|
          opt.strip!
          if opt =~ /(\d{4}-\d{2}-\d{2})/
            date = $1
          elsif opt =~ /g=(.*)/
            group = $1.strip
          end
        end
      end

      body += "\n" if body[-1] != ?\n
      howm_content[date] = body
    end
  end

  return howm_content
end

# メインの処理
Find.find(srcdir) do |path|
  next unless FileTest.readable?(path)

  # touchファイルより新しいか
  next if TOUCH_MTIME > File.mtime(path)

  # *.howmファイルのみ対象
  next unless /\.howm$/ =~ path

  filename = File.basename(path)  

  # ファイル名の先頭がYYYY-MM-DDならその日付を日記日付のデフォルトとして使用
  if /^(\d{4}-\d{2}-\d{2}).*\.howm$/ =~ filename
    def_date = $1
  else
    def_date = File.mtime(path).strftime("%Y-%m-%d")
  end

  # howmファイルの内容をハッシュに読みこみ
  howm_content = readhowm(path, def_date)

  howm_content.keys.each do |date|
    # はてダラファイル記事格納用ハッシュ
    hatena_content = Hash.new("")

    # はてダラファイルの先頭部分はhatena_content["0"]に格納
    key = "0"
    # はてダラファイルの内容をハッシュに格納
    uppath = "#{updir}/#{date}.txt"
    if FileTest.file?(uppath)
      File.foreach(uppath) do |line|
        if /^><!--(\d{4}-\d{2}-\d{2}.*\.howm)--><$/ =~ line
          key = $1
          next
        end
        hatena_content[key] += line
      end
    elsif FileTest.exist?(uppath)
      puts "#{uppath} is not file."
      next
    end

    # はてダラファイルがなかったとき
    # とりあえずファイルの先頭は空行にしておく
    hatena_content["0"] = "\n" unless hatena_content.key?("0")

    if !hatena_content.key?(filename) or hatena_content[filename] != howm_content[date]
      hatena_content[filename] = howm_content[date]
      # はてダラファイルへ書き込み
      File.open(uppath, "w+") do |io|
        io << hatena_content["0"]
        hatena_content.keys.sort.each do |key|
          if key != "0" && hatena_content[key] != ""
            io << "><!--#{key}--><\n"
            io << hatena_content[key]
          end
        end
      end
    end
  end

end

# touch
if OPTS.key?(:t)
    FileUtils.touch(OPTS[:t])
end

exit 0

howmファイルを正規表現でいっきに処理するようにした。コードは短くなったけど正規表現みにくいなぁ…

あとhowmファイルの検索にFindモジュールを使うようにした。

2006-06-22

[][] スクリプト更新

  • -gオプションでグループ名指定。howm側では{hw:g=グループ名}みたいな感じでグループ名設定。-gオプションが指定されると対応するグループ名の記事のみ取得します。
  • 1ファイル複数タイトルに対応。

こんなふうに書けます。

 = {hw:g=hoge} テスト1

%%%
*test1

 = {hw} テスト2

%%%
*test2

 = {hw:2006-06-22,g=fuga} テスト3

%%%
*test3


以下スクリプト。なんか長い…

#!/usr/bin/ruby -w
#
# hw-howm.rb -- howmメモをhw.plで扱える形式にする.
#
require "optparse"
require "fileutils"

begin
  opt = OptionParser.new
  OPTS = {}
  opt.banner= "usage: #$0 [options] src_dir target_dir"
  opt.on_tail("-h", "--help", "show this message") {puts opt; exit 0}
  opt.on("-t", "--timestamp=FILE", "use FILE as timestamp(default: none)") {|v| OPTS[:t] = v} # touch file path
  opt.on("-g", "--group=GROUP", "assume group name"){|v| OPTS[:g] = v}
  opt.version = "0.0.2"
  opt.release = nil
  opt.parse!(ARGV)
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
  puts $!
  puts opt
  exit 1
end

srcdir = ARGV[0]
updir = ARGV[1]

if !srcdir or !updir
  puts opt
  exit 1
end

[srcdir, updir].each do |dir|
  unless FileTest.directory? dir
    puts "invalid directory: #{dir}"
    puts opt
    exit 1
  end
end

touch_file = ""
if OPTS.key?(:t) && FileTest.file?(OPTS[:t])
  touch_file = OPTS[:t]
end
TOUCH_MTIME = (touch_file == "") ? Time.at(0) : File.mtime(touch_file)

ARG_GROUP = OPTS.key?(:g) ? OPTS[:g] : ""

# ファイルの再帰探索
IGNORE_DIR = %w(. ..)
def scan_files (path, &block)
  if FileTest.directory?(path)
    Dir.foreach(path) do |file|
      next if IGNORE_DIR.include? file
      scan_files("#{path}/#{file}", &block)
    end
  else
    block.call(path)
  end
end

IN_NOOP = :IN_NOOP
IN_BODY = :IN_BODY
IN_DIARY = :IN_DIARY

# howmファイルの読み込み
def readhowm (path, def_date)

  status = IN_NOOP
  howm_content = Hash.new("")

  date = ""
  File.foreach(path) do |line|    
    case status
    when IN_NOOP
      if line =~ /^= .*\{hw(:(.*))?(?=\})/
        date = def_date
        group = ""
        if !$2.nil? 
          $2.split(',').each do |str|
            str.strip!
            if str =~ /(\d{4}-\d{2}-\d{2})/
              date = $1
            elsif str =~ /g=(.*)/
              group = $1.strip
              puts group
            end
          end
        end
        status = IN_BODY if ARG_GROUP == group
      end

    when IN_BODY
      if line =~ /^=( |$)/
        status = IN_NOOP
        redo
      end

      if line =~ /^%%%/
        status = IN_DIARY
        next
      end

    when IN_DIARY
      if line =~ /^=( |$)/
        status = IN_NOOP
        redo
      end
      howm_content[date] += line
    end
  end

  return howm_content
end

# メインの処理
scan_files(srcdir) do |path|
  next unless FileTest.readable?(path)

  # touchファイルより新しいか
  next if TOUCH_MTIME > File.mtime(path)

  # howm形式のファイル名か
  next unless /(\d{4}-\d{2}-\d{2}).*\.howm$/ =~ path
  def_date = $1

  filename = File.basename(path)  

  howm_content = readhowm(path, def_date)

  howm_content.keys.each do |date|
    # はてダラファイル記事格納用ハッシュ
    hatena_content = Hash.new("")

    # はてダラファイルの先頭部分はhatena_content["0"]に格納
    key = "0"
    # はてダラファイルの内容をハッシュに格納
    uppath = "#{updir}/#{date}.txt"
    if FileTest.file?(uppath)
      File.foreach(uppath) do |line|
        if /^><!--(\d{4}-\d{2}-\d{2}.*\.howm)--><$/ =~ line
          key = $1
          next
        end
        hatena_content[key] += line
      end
    elsif FileTest.exist?(uppath)
      puts "#{uppath} is not file."
      next
    end

    # はてダラファイルがなかったとき
    # とりあえずファイルの先頭は空行にしておく
    hatena_content["0"] = "\n" unless hatena_content.key?("0")

    if !hatena_content.key?(filename) or hatena_content[filename] != howm_content[date]
      hatena_content[filename] = howm_content[date]
      # はてダラファイルへ書き込み
      File.open(uppath, "w+") do |io|
        io << hatena_content["0"]
        hatena_content.keys.sort.each do |key|
          if key != "0" && hatena_content[key] != ""
            io << "><!--#{key}--><\n"
            io << hatena_content[key]
          end
        end
      end
    end
  end

end

# touch
if OPTS.key?(:t)
    FileUtils.touch(OPTS[:t])
end

exit 0

[][] スクリプト更新

はてダラ-howm連携スクリプト更新

いままで/^(\d{4}-\d{2}-\d{2}).*\.howm$/をhowmファイルと認識していたが/\.howm$/に変更。

それにともないファイル名の先頭が\d{4}-\d{2}-\d{2}になってない場合はファイルのmtimeをデフォルトの日記日付に設定。


以下スクリプト

#!/usr/bin/ruby -w
#
# hw-howm.rb -- howmメモをhw.plで扱える形式にする.
#
require "optparse"
require "fileutils"

begin
  opt = OptionParser.new
  OPTS = {}
  opt.banner= "usage: #$0 [options] src_dir target_dir"
  opt.on_tail("-h", "--help", "show this message") {puts opt; exit 0}
  opt.on("-t", "--timestamp=FILE", "use FILE as timestamp(default: none)") {|v| OPTS[:t] = v} # touch file path
  opt.on("-g", "--group=GROUP", "assume group name"){|v| OPTS[:g] = v}
  opt.version = "0.0.3"
  opt.release = nil
  opt.parse!(ARGV)
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
  puts $!
  puts opt
  exit 1
end

srcdir = ARGV[0]
updir = ARGV[1]

if !srcdir or !updir
  puts opt
  exit 1
end

[srcdir, updir].each do |dir|
  unless FileTest.directory? dir
    puts "invalid directory: #{dir}"
    puts opt
    exit 1
  end
end

touch_file = ""
if OPTS.key?(:t) && FileTest.file?(OPTS[:t])
  touch_file = OPTS[:t]
end
TOUCH_MTIME = (touch_file == "") ? Time.at(0) : File.mtime(touch_file)

ARG_GROUP = OPTS.key?(:g) ? OPTS[:g] : ""

# ファイルの再帰探索
IGNORE_DIR = %w(. ..)
def scan_files (path, &block)
  if FileTest.directory?(path)
    Dir.foreach(path) do |file|
      next if IGNORE_DIR.include? file
      scan_files("#{path}/#{file}", &block)
    end
  else
    block.call(path)
  end
end

IN_NOOP = :IN_NOOP
IN_BODY = :IN_BODY
IN_DIARY = :IN_DIARY

# howmファイルの読み込み
def readhowm (path, def_date)

  status = IN_NOOP
  howm_content = Hash.new("")

  date = ""
  File.foreach(path) do |line|    
    case status
    when IN_NOOP
      if line =~ /^= .*\{hw(:(.*))?(?=\})/
        date = def_date
        group = ""
        if !$2.nil? 
          $2.split(',').each do |str|
            str.strip!
            if str =~ /(\d{4}-\d{2}-\d{2})/
              date = $1
            elsif str =~ /g=(.*)/
              group = $1.strip
              puts group
            end
          end
        end
        status = IN_BODY if ARG_GROUP == group
      end

    when IN_BODY
      if line =~ /^=( |$)/
        status = IN_NOOP
        redo
      end

      if line =~ /^%%%/
        status = IN_DIARY
        next
      end

    when IN_DIARY
      if line =~ /^=( |$)/
        status = IN_NOOP
        redo
      end
      howm_content[date] += line
    end
  end

  return howm_content
end

# メインの処理
scan_files(srcdir) do |path|
  next unless FileTest.readable?(path)

  # touchファイルより新しいか
  next if TOUCH_MTIME > File.mtime(path)

  # *.howmファイルのみ対象
  next unless /\.howm$/ =~ path

  # ファイル名の先頭がYYYY-MM-DDならその日付を日記日付のデフォルトとして使用
  if /^(\d{4}-\d{2}-\d{2}).*\.howm$/ =~ path
    def_date = $1
  else
    def_date = File.mtime(path).strftime("%Y-%m-%d")
  end

  filename = File.basename(path)  

  # howmファイルの内容をハッシュに読みこみ
  howm_content = readhowm(path, def_date)

  howm_content.keys.each do |date|
    # はてダラファイル記事格納用ハッシュ
    hatena_content = Hash.new("")

    # はてダラファイルの先頭部分はhatena_content["0"]に格納
    key = "0"
    # はてダラファイルの内容をハッシュに格納
    uppath = "#{updir}/#{date}.txt"
    if FileTest.file?(uppath)
      File.foreach(uppath) do |line|
        if /^><!--(\d{4}-\d{2}-\d{2}.*\.howm)--><$/ =~ line
          key = $1
          next
        end
        hatena_content[key] += line
      end
    elsif FileTest.exist?(uppath)
      puts "#{uppath} is not file."
      next
    end

    # はてダラファイルがなかったとき
    # とりあえずファイルの先頭は空行にしておく
    hatena_content["0"] = "\n" unless hatena_content.key?("0")

    if !hatena_content.key?(filename) or hatena_content[filename] != howm_content[date]
      hatena_content[filename] = howm_content[date]
      # はてダラファイルへ書き込み
      File.open(uppath, "w+") do |io|
        io << hatena_content["0"]
        hatena_content.keys.sort.each do |key|
          if key != "0" && hatena_content[key] != ""
            io << "><!--#{key}--><\n"
            io << hatena_content[key]
          end
        end
      end
    end
  end

end

# touch
if OPTS.key?(:t)
    FileUtils.touch(OPTS[:t])
end

exit 0

あきらかに冗長な気がするけど自分のスキルではこんなもん。

精進します…

2006-06-21

[][] ダメ出し

先日掲載したhowm-はてダラ連携スクリプトだけど、適当に作っただけあって結構問題ありそげ。

とりあえず思い付くのは

  • howmメモが1ファイル/月とか1ファイル/年の場合に対応できてない。
  • 1ファイル/日の場合にも微妙に対応できてない。
  • グループ指定ができない。

グループ指定は簡単に対応できるとして、他が困ったな…