summaryrefslogtreecommitdiff
path: root/2005/d/dev/todo/tasklist.pl
blob: 5e9aabace2a34d6099191cbbe6db550df2d28516 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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;