ISBN/ASIN リンクの修正

はてなダイアリーインポート後の「やり残し」の件。

確認中に気付いたのですが、a タグの href 属性値に書いたisbn記法やasin記法もはてなブログでは展開してくれないんですね… これは別途対処しようと思います。
id記法のリンクの修正 & お詫び

これですが、以下のようなスクリプトで対処しました。id記法リンクの修正まで終わったエントリファイルを orig2 ディレクトリにコピーしてから実行します。

#!/usr/bin/env ruby
# coding: utf-8
# HatenaBlogWriter のワーキングディレクトリで実行します。
# orig2 ディレクトリに変換前のエントリファイルをコピーしてから実行します。

ORIG_DIR = "orig2"
TB_SECTION_SEPARATOR = '<!-- trackback -->'

def load_entry_file(filename)
  header = []
  body = []
  tb = []
  File.open(filename) { |file|
    in_header = true
    in_tb = false
    file.each_line(chomp: true) { |line|
      if (line == TB_SECTION_SEPARATOR) then
        in_tb = true
        next
      elsif in_header && /^$/.match(line) then
        in_header = false
        next
      end
      if in_header then
        header.push(line)
      elsif in_tb then
        tb.push(line)
      else
        body.push(line)
      end
    }
  }
  return { :header => header, :body => body, :tb => tb }
end

def dump_entry_file(filename, entry)
  File.open(filename, "w") { |f|
    f.puts entry[:header]
    f.puts ""
    f.puts entry[:body]
    unless entry[:tb].empty? then
      f.puts TB_SECTION_SEPARATOR
      f.puts entry[:tb]
    end
  }
end

def convert_id_links(lines)
  in_super_pre = false
  new_lines = []
  lines.each { |line|
    if in_super_pre then
      new_lines.push(line)
      in_super_pre = false if line.match(/^||<$/)
      next
    end
    if !in_super_pre && line.match(/^>\|\w*\|$/) then
      new_lines.push(line)
      in_super_pre = true
      next
    end
    # href: isbn/asin
    new_line = line.gsub(/href=['"]\[?(isbn|asin):([^\]'"]+)?\]?['"]/i) { |matched|
      type, code = $~.captures
      url = "http://d.hatena.ne.jp/asin/#{code}/hatena-blog-22"
      "href=\"#{url}\""
    }
    new_lines.push(new_line)
  }
  return new_lines
end

def print_diff(src_lines, dst_lines)
  src_lines.each_index { |i|
    if src_lines[i] != dst_lines[i] then
      puts "- #{src_lines[i]}"
      puts "+ #{dst_lines[i]}"
    end
  }
end

check = (ARGV[0] == "check")
Dir.glob("#{ORIG_DIR}/????-??-??_*.txt").sort.each { |src|
  dst = File.basename(src)
  entry = load_entry_file(src)
  body = entry[:body]
  new_body = convert_id_links(entry[:body])
  if (body != new_body) then
    puts "#{src}:"
    print_diff(body, new_body)
    unless check then
      entry[:body] = new_body
      dump_entry_file(dst, entry)
      puts "saved: #{dst}"
    end
  end
}

URL にくっつけてる hatena-blog-22 はアマゾンアソシエイトIDだと思うのですが、ISBN/ASIN 記法を使うとデフォルトで付いてくるので付けてあります。ID持ってる人は自分のIDと差し替えるといいかも。

これではてなダイアリーの移行作業は一通り終わったかな… 例のフラグメント識別子付きリンクの問題は残っていますが、これははてなが対応してくれればこのままでもいいし、一応リンクの指す情報は飛び先にある(探さないといけないけど)ので、そこまで深刻ではないですし。