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";