Emacs org-modeを使ってみる: (43) mhcをインポート

このエントリーをはてなブックマークに追加

今回は,mhcをインポートする方法について説明する.
なおUbuntu 8.04 LTSとEmacs22上で, org-6.34c (2010年1月10日リリース)の利用を前提にしている.

mhctoorg.plプログラム

(6) アジェンダ表示 に書いたように, iCalendar形式のファイルはdiary形式に変換した後,アジェンダ表示にマージすることができる.
したがって,mhcのカレンダーも mhc2ical.rb を用いて, iCalendar形式に変換した後,同様に処理すれば良い.
しかし,これだとアジェンダ表示にマージされているだけで, orgファイルとして管理できるわけではない.
そこで,以下のようにmhcのカレンダーをorg形式に変換する mhctoorg.pl プログラムを作成した.

#!/usr/bin/perl
use Getopt::Std;
use strict;

my %w = (
    'Sun'=>'日', 'Mon'=>'月', 'Tue'=>'火',
    'Wed'=>'水', 'Thu'=>'木', 'Fri'=>'金', 'Sat'=>'土');
my ($opt_h);
&getopts("h");
my $q = shift(@ARGV);
if ($opt_h) {
    print "Usage: $0 [date]\n";
    print "Example:\n";
    print "\t$0 +3\n";
    print "\t$0 201003\n";
    exit 1;
}
my ($year, $month, $day);
&toorg($q);
exit 0;

sub toorg {
    my ($q) = @_;
    my ($y, $m, $d, $w, $t, $loc);
    if ($q =~ /^(\d\d\d\d)/) {
	$y = $1;
    } else {
	my @t = localtime();
	$y = $t[5] + 1900;
	$q = sprintf("%04d%02d%02d%s", $y, $t[4]+1, $t[3], $q);
    }
    open(TODAY, "today --date=$q | perl -pne 's/    /\n    /g;' |") || die;
    while (<TODAY>) {
	chomp;
	s/^\s+//; s/\s+$//;
	next if $_ eq "";
	if (s/^(\d\d)\/(\d\d) (\w+)\s*//) {
	    ($m, $d, $w) = ($1, $2, $3);
	    $w = $w{$w} || $w;
	}
	$t = "";
	if (s/^(\d\d:\d\d(-\d\d:\d\d)?)\s*//) {
	    $t = $1;
	}
	s/^\s+//; s/\s+$//;
	next if $_ eq "";
	$loc = "";
	if (s/\s*\[\s*([^\]]*?)\s*\]//) {
	    $loc = $1;
	}
	&conv($y, $m, $d, $w, $t, $loc, $_);
    }
    close(TODAY);
}

sub conv {
    my ($y, $m, $d, $w, $t, $loc, $str) = @_;
    if ($year != $y || $month != $m) {
	print "* $y-$m\n";
    }
    if ($year != $y || $month != $m || $day != $d) {
	print "** [$y-$m-$d $w]\n";
    }
    ($year, $month, $day) = ($y, $m, $d);
    my $timestamp = &timestamp($y, $m, $d, $w, $t);
    my %tag = &tag($str);
    print "*** $timestamp $str";
    if (%tag) {
	my $tag = ":" . join(":", sort keys %tag) . ":";
	print " $tag";
    }
    print "\n";
    if ($loc) {
	print "    :PROPERTIES:\n";
	print "    :LOCATION: $loc\n";
	print "    :END:\n";
    }

}

sub timestamp {
    my ($y, $m, $d, $w, $t) = @_;
    my $ts = sprintf("%04d-%02d-%02d %s", $y, $m, $d, $w);
    if ($t) {
	$ts = "$ts $t";
    }
    return "<$ts>";
}

sub tag {
    my ($str) = @_;
    my %tag = ();
    return %tag;
}

利用方法

以下のようにすると,その日のカレンダーをorg形式で表示する.

  $ ./mhctoorg.pl
* 2010-03
** [2010-03-18]
*** <2010-03-1810:00-12:00>3回ORG会議
    :PROPERTIES:
    :LOCATION: 第1会議室
    :END:
*** <2010-03-1813:30-15:00> 打合せ

引数は mhc 付属の today と同様である.

  $ ./mhctoorg.pl +3      # 3日分
  $ ./mhctoorg.pl 201003  # 2010年3月

その他

  • CategoryやPriorityには対応していない.
  • ical2orgがあるようだが,内容は確認していない.