目次 ↑
#!/bin/perl
#
# Convert XTMemo data text (Shift_JIS) to org-mode text file (UTF-8)
#
use strict;
use warnings;
use utf8;
use Encode;
my $RE_HEADER = qr{
\A
( \d{4} ) [/] ( \d{2} ) [/] ( \d{2} )
\s+
( \d{2} [:] \d{2} )
\s*
( .+ [:] )?
\s*
( .* )
\z
}xms;
my $RE_CONTENT = qr{
\A
[\t]
( .* )
\z
}xms;
my $RE_SEPARATOR = qr{
\A
\z
}xms;
print <<END_OF_FILE_HEADER;
#+TITLE: XTMemo
#+CATEGORY: XTMemo
#+STARTUP: content
#+TODO:
#+FILETAGS: XTMemo
END_OF_FILE_HEADER
my $line_no = 0;
while (my $line = <>) {
$line_no++;
Encode::from_to($line, "shiftjis", "utf8");
chomp $line;
$line =~ s{\s*\z}{}xms;
if ( $line =~ m{$RE_HEADER}xms ) {
my ( $year, $month, $day, $hour_min, $tags, $title ) =
( $1, $2, $3, $4, $5, $6);
if (defined $tags) {
$tags =~ s{\s+}{_}xms;
$tags = q{ :} . $tags;
}
else {
$tags = q{};
}
if (!defined $title or $title =~ m{\A \s* \z}xms) {
$title = q{NOTITLE};
}
print qq{\n* $title$tags\n};
print qq{ [$year-$month-$day $hour_min]\n};
}
elsif ( $line =~ m{$RE_CONTENT}xms ) {
my ( $content ) = ( $1 );
print q{ } . $content . qq{\n};
}
elsif ( $line =~ m{$RE_SEPARATOR}xms ) {
# do nothing
}
else {
# default
Encode::from_to($line, "utf8", "shiftjis");
warn(qq{Failed to parse [#$line_no]: $line\n});
}
}
# --- end of script ---