読者です 読者をやめる 読者になる 読者になる

GeekFactory

int128.hatenablog.com

スラッシュドット日記をMovable Typeにエクスポートする方法

slashdot

日記リストページからURLリストを生成し、一括ダウンロードします。そして、それらをMovable Type形式に変換します。

URLリストの生成と一括ダウンロード

http://slashdot.jp/journal.pl?op=list のHTMLからURLリストを生成します。

#!/usr/bin/perl
while(<>) {
	if(/<!-- start template: ID 56, journallist;journal;default -->/) {
		last;
	}
}
while(<>) {
	if(/<td valign="top"><a href="(http:\/\/slashdot\.jp\/.+?)"><b>(.+?)<\/b>/) {
		print $1;
		print "\n";
	}
}

日記ページの解析

日記ページを解析してMovable Type形式で出力します。日記ページごとに以下のスクリプトを走らせて、出力を連結すればエクスポートデータができます。

#!/usr/bin/perl

while(<>) {
	if(/<div class="journal">/) {
		last;
	}
}

while(<>) {
	if(/<TD .+?><b>(.+?)<\/b>/) {
		# date
		$_ = $1;
		split /[^\d]+/;
		$date = "@_[1]/@_[2]/@_[0]";
		last;
	}
}

while(<>) {
	if(/<TD .+?>(\d\d:\d\d) (AM|PM)<\//) {
		$time = "$1:00 $2";
		last;
	}
}

if(!$date || !$time) {
	die;
}

print "--------\n";
print "DATE: $date $time\n";

while(<>) {
	if(/<TD>.+?<a href=".+?">(.+?)<\/a><\/B><div class="journalmain">(.+)/) {
		$title = $1;
		$main = $2;
		last;
	}
}

if(!$title || !$main) {
	die;
}

while(<>) {
	if(/HSPACE="20" VSPACE="10"  ALT="(.+?)" title=/) {
		$category = $1;
		last;
	}
}

# title
print "TITLE: $title\n";

# category
if($category) {
	print "CATEGORY: $category\n";
}

# main
print "-----\n";
print "BODY:\n";
$_ = $main;
s/<br>/\n/g;
s/<\/?p>//g;
s/<blockquote> <div><tt>/\n\n<code>/g;
s/<\/tt><\/div> <\/blockquote>/<\/code>\n\n/g;
s/<blockquote>/\n\n<blockquote>/g;
s/<\/blockquote>/<\/blockquote>\n\n/g;
s/<\/?div>/\n/g;
print;
print "\n";