結城浩のはてなブログ

ふと思いついたことをパタパタと書いてます。

はてダラスプリッタ(hws.pl)

というわけでちょこっと作ってみました。はてダラスプリッタ(hws.pl)です。diary.txtの内容をスプリットして、YYYY-MM-DD.txtのファイル群を作ります。md5.txtというファイルにMD5値を保存して比較しますので、更新されていない部分の日記はファイル更新しません。もう少し整備したらはてダラのページにも置きます。とりあえず公開。→はてダラスプリッタの最新版

#!/usr/bin/perl
#
# hws.pl - Splitter for Hatena Diary Writer.
#
# Copyright (C) 2004 by Hiroshi Yuki.
# <hyuki@hyuki.com>
# http://www.hyuki.com/techinfo/hatena_diary_writer.html
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
use strict;
use Digest::MD5 qw(md5_hex);

my %diary;
my $diary_file = "diary.txt";
my $md5_file = "md5.txt";

# Scan diary.
{
    my $date = "";
    my $title = "";
    open(FILE, $diary_file) or die "$!: $diary_file\n";
    while (<FILE>) {
        chomp;
        if (/^(\d\d\d\d-\d\d-\d\d):(.*)/) {
            ($date, $title) = ($1, $2);
            if ($diary{$date}) {
                die "ERROR: Duplicate $date. ($title)\n";
            }
            $diary{$date}->{content} = "$title\n";
        } elsif ($date) {
            $diary{$date}->{content} .= "$_\n";
        } else {
            print "Before dateline: ", "$_\n";
        }
    }
    close(FILE);
}

# Compute MD5.
foreach (keys %diary) {
    $diary{$_}->{md5} = md5_hex($diary{$_}->{content});
    $diary{$_}->{update} = 1;
}

# Compare diary.
if (open(FILE, $md5_file)) {
    while (<FILE>) {
        chomp;
        my ($date, $md5) = split(/:/, $_);
        # print "\$date = $date\n";
        # print "\$md5 = $md5\n";
        if ($diary{$date}->{md5} eq $md5) {
            $diary{$date}->{update} = 0;
        }
    }
    close(FILE);
}

# Save diary files.
for (sort keys %diary) {
    if ($diary{$_}->{update}) {
        print "Create $_.txt\n";
        open(FILE, "> $_.txt") or die "$!: $_.txt\n";
        print FILE $diary{$_}->{content};
        close(FILE);
    }
}

# Update md5 file.
open(FILE, "> $md5_file") or die "$!: $md5_file\n";
for (sort keys %diary) {
    print FILE $_, ":", $diary{$_}->{md5}, "\n";
}
close(FILE);

diary.txtの例は以下(注意!hws.plを動かすと、2004-08-23.txtと2004-08-24.txtを作ってしまいます。カレントディレクトリのバックアップを取ってからためしてください)。

2004-08-23:タイトルA
ここに8/23の日記の内容。
ここに8/23の日記の内容。
ここに8/23の日記の内容。
2004-08-24:タイトルB
ここに8/24の日記の内容。
ここに8/24の日記の内容。
ここに8/24の日記の内容。

もちろん、以下のようにすれば、8/24の日記を削除できます。

2004-08-23:タイトルA
ここに8/23の日記の内容。
ここに8/23の日記の内容。
ここに8/23の日記の内容。
2004-08-24:delete
ここに8/24の日記の内容。
ここに8/24の日記の内容。
ここに8/24の日記の内容。