hatena to fdus converter
今度はexportされたhatena形式からfdus形式に変換するコンバータを書いてみた。しかしリストの深さは1までに制限されている事と、基本的なはてな書式にしか対応していないという制約がある。しかし昔のログはほぼまともに変換出来ているので良いか。
#!/usr/bin/perl # hatena format to fdus format open(FILE,"20061231-hatena-export.htm"); sub process_diary{ my ($date,$contents) = @_; my @lines; my $flg_ul = 0; my $flg_ol = 0; my $out_lines = ""; #print "date=$date\n"; #print "contents=$contents\n"; @lines = split(/\n/,$contents); foreach (@lines){ # link 処理(インラインの変換処理) s/\[(http\S+)\:title=(.+)\]/<a href=$1>$2<\/a>/g; # "*"の処理 if(/^\*/){ s/\*(.+)\*/\*/; s/\*(.+)$/:::$1/; $out_lines .= sprintf "$_\n"; next; } # "+"の処理 (一階層まで) if(/^\+(.+)$/){ if(!$flg_ol){ $out_lines .= sprintf "<ol>\n"; $flg_ol = 1; } $out_lines .= sprintf "<li> $1\n"; next; }else{ if($flg_ol){ $out_lines .= sprintf "</ol>\n"; $flg_ol = 0; } } # "-"の処理 (一階層まで) if(/^\-(.+)$/){ if(!$flg_ul){ $out_lines .= sprintf "<ul>\n"; $flg_ul = 1; } $out_lines .= sprintf "<li> $1\n"; next; }else{ if($flg_ul){ $out_lines .= sprintf "</ul>\n"; $flg_ul = 0; } } if(/^>\;\|/){ $out_lines .= sprintf("<pre>\n"); next; } if(/^\|+<\;/){ $out_lines .= sprintf("</pre>\n"); next; } $out_lines .= sprintf "$_<br>\n"; } #タグの閉じ忘れチェック if($flg_ol){ $out_lines .= sprintf("</ol>\n"); $flg_ol = 0; } if($flg_ul){ $out_lines .= sprintf("</ul>\n"); $flg_ul = 0; } # printf $out_lines; #出力処理 if($date =~ /^([0-9]{6})/){ $dir = $1; } $fname = $dir . "/" . $date . ".hd"; print "dir=$dir $fname\n"; mkdir($dir); open(FILE2,">$fname"); print FILE2 $out_lines; close(FILE2); #exit; } while(<FILE>){ next if(/^<\?xml/); next if(/^<diary/); next if(/^<\/diary/); next if(/^<\/day/); if(/^<day date=\"(.+)\" title/){ $date = $1; $date =~ s/-//g; #print "$date\n"; } elsif(/^<body/){ $contents = ""; } elsif(/^<\/body/){ process_diary($date,$contents); } else { $contents .= $_; } #print; } close(FILE);
I wrote a converter from hatena format to fdus format. But there are still many restrictions.