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(/^&gt\;\|/){
	    $out_lines .= sprintf("<pre>\n");
	    next;
	}

	if(/^\|+&lt\;/){
	    $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.