Mercurial > hg > lukkari
diff parsedata.pl @ 72:6fd715063abc
Clean up some parsing operations.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 24 Oct 2012 06:31:32 +0300 |
parents | 119f0cef6498 |
children | b51ad733b624 |
line wrap: on
line diff
--- a/parsedata.pl Wed Oct 24 04:30:36 2012 +0300 +++ b/parsedata.pl Wed Oct 24 06:31:32 2012 +0300 @@ -326,12 +326,28 @@ $$hourFillTable{$lastHour + $t}{$cday} = $tid; } - if ($tid) { + if ($tid) + { $maxDays = $cday + 1 if ($cday + 1 > $maxDays); # Grouped, if there is another class ID in second slot $cgrouped = 1 if ($$cdata[1] =~ /^[A-Z]\d{6}$/); - $$hourDefs{$cid} = { "grouped" => $cgrouped, "start" => $lastHour, "hours" => $chours, "data" => $cdata }; + if ($cgrouped) + { + my $cdata1 = []; + my $cdata2 = []; + for (my $i = 0; $i < length($cdata); $i += 2) + { + push(@$cdata1, $$cdata[$i]) if defined($$cdata[$i]); + push(@$cdata2, $$cdata[$i+1]) if defined($$cdata[$i+1]); + } + $$hourDefs{$cid} = { "grouped" => $cgrouped, "start" => $lastHour, "hours" => $chours, "data" => [ $cdata1, $cdata2 ] }; + } + else + { + $$hourDefs{$cid} = { "grouped" => $cgrouped, "start" => $lastHour, "hours" => $chours, "data" => [ $cdata ] }; + } + push(@{$$hourTable{$cday}}, $tid); $totalHours += $chours; } @@ -339,27 +355,70 @@ sub parseHour($) { - if ($_[0] =~ /(\d+):(\d+)/) { + if ($_[0] =~ /(\d+):(\d+)/) + { return ((int($1) * 60 + int($2)) * 60); } return undef; } + +sub getDataStruct($); + +sub getDataStruct($) +{ + my @out = (); + my $tmp = $_[0]; + + if (ref($tmp) eq "ARRAY") + { + my @str = (); + foreach my $item (@{$tmp}) + { + push(@str, getDataStruct($item)); + } + push(@out, "array(".join(", ", @str).")"); + } + elsif (ref($tmp) eq "HASH") + { + my @str = (); + foreach my $key (keys %{$tmp}) + { + push(@out, "\"".$key."\" => ".getDataStruct($$tmp{$key})); + } + push(@out, "array(".join(", ", @str).")"); + } + elsif ($tmp =~ /^\d+$/) + { + push(@out, $tmp); + } + else + { + push(@out, "\"".$tmp."\""); + } + return join(", ", @out); +} + # Skip zero position this way (can't use foreach here) for (my $i = 1; $i < scalar(@{$q}); $i++) { my $d = $$q[$i]{"nodes"}; - if (defined($d)) { - foreach my $n (@{$d}) { + if (defined($d)) + { + foreach my $n (@{$d}) + { my $l = $$n{"nodes"}[0]{"nodes"}; if (defined($l)) { - if ($$n{"args"} =~ /colspan=6\s+rowspan=(\d+)/) { + if ($$n{"args"} =~ /colspan=6\s+rowspan=(\d+)/) + { parseHourData($l, $1); } - elsif ($$n{"args"} =~ /rowspan=2\s+align/) { + elsif ($$n{"args"} =~ /rowspan=2\s+align/) + { my $qstart = parseHour($$l[0]{"nodes"}[0]{"nodes"}[0]{"text"}); my $qend = parseHour($$l[1]{"nodes"}[0]{"nodes"}[0]{"text"}); - if (defined($qstart) && defined($qend)) { + if (defined($qstart) && defined($qend)) + { push(@$hourTimes, {"start" => $qstart, "end" => $qend}); } } @@ -416,21 +475,7 @@ print "\$classHourDefs = array(\n"; foreach my $cid (sort { $a <=> $b } keys %{$hourDefs}) { - print " $cid => array("; - foreach my $key (keys %{$$hourDefs{$cid}}) { - my $a = $$hourDefs{$cid}{$key}; - print "\"$key\" => "; - if (ref($a) eq "ARRAY") { - print "array(".join(", ", map { "\"".escape($_)."\""; } @$a).")"; - } - elsif ($a =~ /^\d+$/) { - print $a; - } else { - print "\"".escape($a)."\""; - } - print ", "; - } - print "),\n"; + print " $cid => array(".getDataStruct($$hourDefs{$cid})."),\n"; } print ");\n\n";