summaryrefslogtreecommitdiff
path: root/2005/d/dev/todo/tasklist.pl
diff options
context:
space:
mode:
authorschodet2004-06-27 12:04:28 +0000
committerschodet2004-06-27 12:04:28 +0000
commitdaff5cf6e974fa6fa003e7b592475250c83bfc2e (patch)
tree6a7410417943a69bdab1ed1b7e8a19285e40a2fe /2005/d/dev/todo/tasklist.pl
parenta9f3689ee85da91a51d01a76a469cbb5298806d2 (diff)
Initial revision
Diffstat (limited to '2005/d/dev/todo/tasklist.pl')
-rwxr-xr-x2005/d/dev/todo/tasklist.pl123
1 files changed, 123 insertions, 0 deletions
diff --git a/2005/d/dev/todo/tasklist.pl b/2005/d/dev/todo/tasklist.pl
new file mode 100755
index 0000000..5e9aaba
--- /dev/null
+++ b/2005/d/dev/todo/tasklist.pl
@@ -0,0 +1,123 @@
+#!/usr/bin/perl
+use strict;
+
+sub get_task
+{
+ my ($tasks, $id) = @_;
+ my $subid;
+ if ($id =~ /([^.]+)\.(.+)/)
+ {
+ $id = $1;
+ $subid = $2;
+ }
+ unless (defined $$tasks{$id})
+ {
+ $$tasks{$id} = { };
+ }
+ if (defined $subid)
+ {
+ return get_task ($$tasks{$id}, $subid);
+ }
+ else
+ {
+ return $$tasks{$id};
+ }
+}
+
+sub build_tab
+{
+ my %tab;
+ my $task;
+ my $lastdesc;
+ my $taskid;
+ while (<>)
+ {
+ chomp;
+ if (!defined $lastdesc && /^([a-z0-9](?:\.[a-z0-9.]+)*) (.*)/)
+ {
+ # Task.
+ $taskid = $1;
+ $task = get_task \%tab, $taskid;
+ die "Duplicated task id" if defined $$task{'name'};
+ $$task{'name'} = $2;
+ }
+ elsif (/^\$ (.*)/)
+ {
+ # Date.
+ die "Task not defined" unless defined $task;
+ $$task{'date'} = $1;
+ }
+ elsif (/^@ (.*)/)
+ {
+ # Assigned to.
+ die "Task not defined" unless defined $task;
+ $$task{'assignedto'} = $1;
+ }
+ elsif (/^= (.*)/)
+ {
+ # Status.
+ die "Task not defined" unless defined $task;
+ $$task{'status'} = $1;
+ }
+ elsif (/^$/)
+ {
+ $lastdesc = undef;
+ }
+ else
+ {
+ die "Task not defined" unless defined $task;
+ $$task{'desc'} = [ ] unless defined $$task{'desc'};
+ if (defined $lastdesc)
+ {
+ $$lastdesc .= ' ' . $_;
+ }
+ else
+ {
+ push @{$$task{'desc'}}, $_;
+ $lastdesc = \${$$task{'desc'}}[$#{$$task{'desc'}}]
+ }
+ }
+ }
+ return %tab;
+}
+
+sub print_task_xml
+{
+ my ($id, $space, $task) = @_;
+ my @id = ('name', 'date', 'assignedto', 'status');
+ my %n;
+ for (@id) { $n{$_} = 1 }
+ $n{'desc'} = 1;
+ print "$space<task id=\"$id\">\n";
+ for (@id)
+ {
+ print "$space <$_>$$task{$_}</$_>\n" if defined $$task{$_};
+ }
+ for (@{$$task{'desc'}})
+ {
+ print "$space <desc>$_</desc>\n";
+ }
+ for (sort { $a <=> $b || $a cmp $b } keys %$task)
+ {
+ next if defined $n{$_};
+ print_task_xml ("$id.$_", "$space ", $$task{$_});
+ }
+ print "$space</task>\n";
+}
+
+sub print_tasks_xml
+{
+ print '<?xml version="1.0" encoding="iso-8859-1"?>' . "\n";
+ print '<!DOCTYPE tasklist SYSTEM "tasklist.dtd">' . "\n";
+ print '<?xml-stylesheet href="tasklist.xsl" type="text/xsl"?>' . "\n";
+ print "<tasklist>\n";
+ my ($tasks) = @_;
+ for (sort { $a <=> $b || $a cmp $b} keys %$tasks)
+ {
+ print_task_xml $_, ' ', $$tasks{$_};
+ }
+ print "</tasklist>\n";
+}
+
+my %tab = build_tab;
+print_tasks_xml \%tab;