[LON-CAPA-cvs] cvs: loncom /interface lonnavmaps.pm

bowersj2 lon-capa-cvs@mail.lon-capa.org
Fri, 11 Oct 2002 18:39:55 -0000


bowersj2		Fri Oct 11 14:39:55 2002 EDT

  Modified files:              
    /loncom/interface	lonnavmaps.pm 
  Log:
  * Removed extraneous "use HTML::TokeParse".
  
  * Feedback commit: I've added a "human time" function that tries to
    display the time to a user in a way that a human can quickly
    understand, without parsing an ISO-compliant full date specification.
    I'm interested in feedback (including "bleh, toss it completely!"),
    tuning suggestion (i.e., where to break up the various behaviors), and
    bug reports. 
  
    This function might need to be moved to loncommon.
  
  
  
Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.72 loncom/interface/lonnavmaps.pm:1.73
--- loncom/interface/lonnavmaps.pm:1.72	Fri Oct 11 10:56:43 2002
+++ loncom/interface/lonnavmaps.pm	Fri Oct 11 14:39:55 2002
@@ -2,7 +2,7 @@
 # The LearningOnline Network with CAPA
 # Navigate Maps Handler
 #
-# $Id: lonnavmaps.pm,v 1.72 2002/10/11 14:56:43 bowersj2 Exp $
+# $Id: lonnavmaps.pm,v 1.73 2002/10/11 18:39:55 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -45,8 +45,8 @@
 use Apache::Constants qw(:common :http);
 use Apache::lonnet();
 use Apache::loncommon();
-use HTML::TokeParser;
 use GDBM_File;
+use POSIX qw (floor strftime);
 
 # -------------------------------------------------------------- Module Globals
 my %hash;
@@ -843,7 +843,7 @@
     $r->rflush();
     if ($navmap->{LAST_CHECK}) {
         $r->print('<img src="/adm/lonMisc/chat.gif"> New discussion since '.
-                  timeToHumanString($navmap->{LAST_CHECK}).
+                  strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})).
                   '<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>'); 
     } else {
         $r->print('<img src="/adm/lonMisc/chat.gif"> Discussions'.
@@ -1270,20 +1270,20 @@
         return "Not currently assigned.";
     }
     if ($status == $res->OPEN_LATER) {
-        return "Opens: " . timeToHumanString($res->opendate($part));
+        return "Open " . timeToHumanString($res->opendate($part));
     }
     if ($status == $res->OPEN) {
         if ($res->duedate()) {
-            return "Due: $status " . timeToHumanString($res->duedate($part));
+            return "Due " . timeToHumanString($res->duedate($part));
         } else {
             return "Open, no due date";
         }
     }
     if ($status == $res->PAST_DUE_ANSWER_LATER) {
-        return "Answer opens: " . timeToHumanString($res->answerdate($part));
+        return "Answer open " . timeToHumanString($res->answerdate($part));
     }
     if ($status == $res->PAST_DUE_NO_ANSWER) {
-        return "Was Due: " . timeToHumanString($res->duedate($part));
+        return "Was due " . timeToHumanString($res->duedate($part));
     }
     if ($status == $res->ANSWER_OPEN) {
         return "Answer available";
@@ -1299,7 +1299,7 @@
         my $maxtries = $res->maxtries();
         my $triesString = "($tries of $maxtries tries used)";
         if ($res->duedate()) {
-            return "Due: $status " . timeToHumanString($res->duedate($part)) .
+            return "Due " . timeToHumanString($res->duedate($part)) .
                 " $triesString";
         } else {
             return "No due date $triesString";
@@ -1311,16 +1311,108 @@
     return $ENV{'user.adv'};
 }
 
-# I want to change this into something more human-friendly. For
-# now, this is a simple call to localtime. The final function
-# probably belongs in loncommon.
+
+# timeToHumanString takes a time number and converts it to a
+# human-readable representation, meant to be used in the following
+# manner:
+# print "Due $timestring"
+# print "Open $timestring"
+# print "Answer available $timestring"
+# Very, very, very, VERY English-only... goodness help a localizer on
+# this func...
 sub timeToHumanString {
     my ($time) = @_;
     # zero, '0' and blank are bad times
-    if ($time) {
-        return localtime($time);
-    } else {
-        return 'Never';
+    if (!$time) {
+        return 'never';
+    }
+
+    my $now = time();
+
+    my @time = localtime($time);
+    my @now = localtime($now);
+
+    # Positive = future
+    my $delta = $time - $now;
+
+    my $minute = 60;
+    my $hour = 60 * $minute;
+    my $day = 24 * $hour;
+    my $week = 7 * $day;
+    my $inPast = 0;
+
+    # Logic in comments:
+    # Is it now? (extremely unlikely)
+    if ( $delta == 0 ) {
+        return "this instant";
+    }
+
+    if ($delta < 0) {
+        $inPast = 1;
+        $delta = -$delta;
+    }
+
+    # Is it in the future?
+    if ( $delta > 0 ) {
+        # Is it less then a minute away?
+        my $tense = $inPast ? " ago" : "";
+        my $prefix = $inPast ? "" : "in ";
+        if ( $delta < $minute ) {
+            if ($delta == 1) { return "${prefix}1 second$tense"; }
+            return "$prefix$delta seconds$tense";
+        }
+
+        # Is it less then an hour away?
+        if ( $delta < $hour ) {
+            # If so, use minutes
+            my $minutes = floor($delta / 60);
+            if ($minutes == 1) { return "${prefix}1 minute$tense"; }
+            return "$prefix$minutes minutes$tense";
+        }
+        
+        # Is it less then 24 hours away? If so,
+        # display hours + minutes
+        if ( $delta < $hour * 24) {
+            my $hours = floor($delta / $hour);
+            my $minutes = floor(($delta % $hour) / $minute);
+            my $hourString = "$hours hours";
+            my $minuteString = ", $minutes minutes";
+            if ($hours == 1) {
+                $hourString = "1 hour";
+            }
+            if ($minutes == 1) {
+                $minuteString = ", 1 minute";
+            }
+            if ($minutes == 0) {
+                $minuteString = "";
+            }
+            return "$prefix$hourString$minuteString$tense";
+        }
+
+        # Less then 5 days away, display day of the week and
+        # HH:MM
+        if ( $delta < $day * 5 ) {
+            my $timeStr = strftime("%A at %I:%M %P", localtime($time));
+            $timeStr =~ s/12:00 am/midnight/;
+            $timeStr =~ s/12:00 pm/noon/;
+            return ($inPast ? "last " : "next ") .
+                $timeStr;
+        }
+        
+        # Is it this year?
+        if ( $time[5] == $now[5]) {
+            # Return on Month Day, HH:MM meridian
+            my $timeStr = strftime("on %A, %b %e at %I:%M %P", localtime($time));
+            $timeStr =~ s/12:00 am/midnight/;
+            $timeStr =~ s/12:00 pm/noon/;
+            return $timeStr;
+        }
+
+        # Not this year, so show the year
+        my $timeStr = strftime("on %A, %b %e %G at %I:%M %P", localtime($time));
+        $timeStr =~ s/12:00 am/midnight/;
+        $timeStr =~ s/12:00 pm/noon/;
+        return $timeStr;
     }
 }