#!/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; s/^[ \t]+//; 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\n"; for (@id) { print "$space <$_>$$task{$_}\n" if defined $$task{$_}; } for (@{$$task{'desc'}}) { if (/^\+ /) { print "$space $_\n"; } elsif (/^- /) { print "$space $_\n"; } else { print "$space $_\n"; } } for (sort { $a <=> $b || $a cmp $b } keys %$task) { next if defined $n{$_}; print_task_xml ("$id.$_", "$space ", $$task{$_}); } print "$space\n"; } sub print_tasks_xml { print '' . "\n"; print '' . "\n"; print '' . "\n"; print "\n"; my ($tasks) = @_; for (sort { $a <=> $b || $a cmp $b} keys %$tasks) { print_task_xml $_, ' ', $$tasks{$_}; } print "\n"; } my %tab = build_tab; print_tasks_xml \%tab;