はてなダイアリーインポート後の「やり残し」の件。
確認中に気付いたのですが、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と差し替えるといいかも。
これではてなダイアリーの移行作業は一通り終わったかな… 例のフラグメント識別子付きリンクの問題は残っていますが、これははてなが対応してくれればこのままでもいいし、一応リンクの指す情報は飛び先にある(探さないといけないけど)ので、そこまで深刻ではないですし。