[open-ils-commits] r11359 - trunk/Open-ILS/src/perlmods/OpenILS/Utils/MFHD

svn at svn.open-ils.org svn at svn.open-ils.org
Wed Nov 26 20:58:42 EST 2008


Author: djfiander
Date: 2008-11-26 20:58:40 -0500 (Wed, 26 Nov 2008)
New Revision: 11359

Modified:
   trunk/Open-ILS/src/perlmods/OpenILS/Utils/MFHD/Holding.pm
Log:
Refactor formatting code to properly handle chronology
information stored in the enumeration fields (well, I think it's
handling it properly; it hasn't been tested yet for that case).

Also refactored basic next/prediction code to handle the same
situation. Basically this is all minor stuff that needs to be
done, but allows me to avoid working on actually taking a stab at
predicting the date of the next issue, but that's pretty much all
that's left to do for this iteration of the code.


Modified: trunk/Open-ILS/src/perlmods/OpenILS/Utils/MFHD/Holding.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Utils/MFHD/Holding.pm	2008-11-26 15:24:19 UTC (rev 11358)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Utils/MFHD/Holding.pm	2008-11-27 01:58:40 UTC (rev 11359)
@@ -61,10 +61,11 @@
     return $self;
 }
 
-sub format {
+sub format_chron {
     my $self = shift;
     my $caption = $self->{CAPTION};
-    my $str = "";
+    my @keys;
+    my $str = '';
     my %month = ( '01' => 'Jan.', '02' => 'Feb.', '03' => 'Mar.',
 		  '04' => 'Apr.', '05' => 'May ', '06' => 'Jun.',
 		  '07' => 'Jul.', '08' => 'Aug.', '09' => 'Sep.',
@@ -72,66 +73,90 @@
 		  '21' => 'Spring', '22' => 'Summer',
 		  '23' => 'Autumn', '24' => 'Winter' );
 
-    # Enumerations
-    foreach my $key ('a'..'f') {
+    @keys = @_;
+    foreach my $i (0 .. @keys) {
+	my $key = $keys[$i];
 	my $capstr;
+	my $chron;
+	my $sep;
 
 	last if !defined $caption->caption($key);
 
-# 	printf("fmt %s: '%s'\n", $key, $caption->caption($key));
-
 	$capstr = $caption->caption($key);
-	if (substr($capstr, 0, 1) eq '(') {
+	if (substr($capstr,0,1) eq '(') {
 	    # a caption enclosed in parentheses is not displayed
 	    $capstr = '';
 	}
-	$str .= ($key eq 'a' ? "" : ':') . $capstr . $self->{ENUMS}->{$key}->{HOLDINGS};
+
+	# If this is the second level of chronology, then it's
+	# likely to be a month or season, so we should use the
+	# string name rather than the number given.
+	if (($i == 1) && exists $month{$self->{CHRON}->{$key}}) {
+	    $chron = $month{$self->{CHRON}->{$key}};
+	} else {
+	    $chron = $self->{CHRON}->{$key};
+	}
+
+
+	$str .= (($i == 0 || $str =~ /[. ]$/) ? '' : ':') . $capstr . $chron;
     }
 
-    # Chronology
-    if (defined $caption->caption('i')) {
-	$str .= '(';
-	foreach my $key ('i'..'l') {
+    return $str;
+}
+
+sub format {
+    my $self = shift;
+    my $caption = $self->{CAPTION};
+    my $str = "";
+
+    if ($caption->enumeration_is_chronology) {
+	# if issues are identified by chronology only, then the
+	# chronology data is stored in the enumeration subfields,
+	# so format those fields as if they were chronological.
+	$str = $self->format_chron('a'..'f');
+    } else {
+	# OK, there is enumeration data and maybe chronology
+	# data as well, format both parts appropriately
+
+	# Enumerations
+	foreach my $key ('a'..'f') {
 	    my $capstr;
-	    my $chron;
-	    my $sep;
 
 	    last if !defined $caption->caption($key);
 
+	    # 	printf("fmt %s: '%s'\n", $key, $caption->caption($key));
+
 	    $capstr = $caption->caption($key);
-	    if (substr($capstr,0,1) eq '(') {
+	    if (substr($capstr, 0, 1) eq '(') {
 		# a caption enclosed in parentheses is not displayed
 		$capstr = '';
 	    }
-
-	    # If this is the second level of chronology, then it's
-	    # likely to be a month or season, so we should use the
-	    # string name rather than the number given.
-	    if ($key eq 'j' && exists $month{$self->{CHRON}->{$key}}) {
-		$chron = $month{$self->{CHRON}->{$key}};
-	    } else {
-		$chron = $self->{CHRON}->{$key};
-	    }
-
-
-	    $str .= (($key eq 'i' || $str =~ /[. ]$/) ? '' : ':') . $capstr . $chron;
+	    $str .= ($key eq 'a' ? "" : ':') . $capstr . $self->{ENUMS}->{$key}->{HOLDINGS};
 	}
-	$str .= ')';
-    }
 
-    if (exists $caption->{ENUMS}->{'g'}) {
-	# There's at least one level of alternative enumeration
-	$str .= '=';
-	foreach my $key ('g', 'h') {
-	    $str .= ($key eq 'g' ? '' : ':') . $caption->caption($key) . $self->{ENUMS}->{$key}->{HOLDINGS};
-	}
-
-	if (exists $caption->{CHRONS}->{m}) {
-	    # Alternative Chronology
+	# Chronology
+	if (defined $caption->caption('i')) {
 	    $str .= '(';
-	    $str .= $caption->caption('m') . $self->{ENUMS}->{m}->{HOLDINGS};
+	    $str .= $self->format_chron('i'..'l');
 	    $str .= ')';
 	}
+
+	if (exists $caption->{ENUMS}->{'g'}) {
+	    # There's at least one level of alternative enumeration
+	    $str .= '=';
+	    foreach my $key ('g', 'h') {
+		$str .= ($key eq 'g' ? '' : ':') . $caption->caption($key) . $self->{ENUMS}->{$key}->{HOLDINGS};
+	    }
+
+	    # This assumes that alternative chronology is only ever
+	    # provided if there is an alternative enumeration.
+	    if (exists $caption->{CHRONS}->{m}) {
+		# Alternative Chronology
+		$str .= '(';
+		$str .= $caption->caption('m') . $self->{ENUMS}->{m}->{HOLDINGS};
+		$str .= ')';
+	    }
+	}
     }
 
     # Public Note
@@ -149,6 +174,15 @@
     return $str;
 }
 
+sub next_date {
+    my $self = shift;
+    my $next = shift;
+    my @keys = @_;
+
+    my $caption = $self->{CAPTION};
+}
+
+
 # next: Given a holding statement, return a hash containing the 
 # enumeration values for the next issues, whether we hold it or not
 #
@@ -158,85 +192,94 @@
     my $next = {};
     my $carry;
 
+    # Initialize $next with current enumeration & chronology, then
+    # we can just operate on $next, based on the contents of the caption
     foreach my $key ('a' .. 'h') {
-	next if !exists $self->{ENUMS}->{$key};
-	$next->{$key} = $self->{ENUMS}->{$key}->{HOLDINGS};
+	$next->{$key} = $self->{ENUMS}->{$key}->{HOLDINGS}
+	  if exists $self->{ENUMS}->{$key};
     }
 
-    # First handle any "alternative enumeration", since they're
-    # a lot simpler, and don't depend on the the calendar
-    foreach my $key ('h', 'g') {
-	next if !exists $next->{$key};
-	if (!exists $caption->{ENUMS}->{$key}) {
-	    warn "Holding data exists for $key, but no caption specified";
-	    $next->{$key} += 1;
-	    last;
-	}
-
-	my $cap = $caption->{ENUMS}->{$key};
-	if ($cap->{RESTART} && $cap->{COUNT}
-	    && ($next->{$key} == $cap->{COUNT})) {
-	    $next->{$key} = 1;
-	} else {
-	    $next->{$key} += 1;
-	    last;
-	}
+    foreach my $key ('i'..'m') {
+	$next->{$key} = $self->{CHRON}->{$key}
+	  if exists $self->{CHRON}->{$key};
     }
 
     if ($caption->enumeration_is_chronology) {
-	# do something
-    }
+	$self->next_date($caption, $next, ('a'..'h'));
+    } else {
+	# First handle any "alternative enumeration", since they're
+	# a lot simpler, and don't depend on the the calendar
+	foreach my $key ('h', 'g') {
+	    next if !exists $next->{$key};
+	    if (!exists $caption->{ENUMS}->{$key}) {
+		warn "Holding data exists for $key, but no caption specified";
+		$next->{$key} += 1;
+		last;
+	    }
 
-    # $carry keeps track of whether we need to carry into the next
-    # higher level of enumeration. It's not actually necessary except
-    # for when the loop ends: if we need to carry from $b into $a
-    # then $carry will be set when the loop ends.
-    # 
-    # We need to keep track of this because there are two different
-    # reasons why we might increment the highest level of enumeration ($a)
-    # 1) we hit the correct number of items in $b (ie, 5th iss of quarterly)
-    # 2) it's the right time of the year.
-    #
-    $carry = 0;
-    foreach my $key (reverse('b'.. 'f')) {
-	next if !exists $next->{$key};
-	if (!exists $caption->{ENUMS}->{$key}) {
-	    # Just assume that it increments continuously and give up
-	    warn "Holding data exists for $key, but no caption specified";
-	    $next->{$key} += 1;
-	    $carry = 0;
-	    last;
+	    my $cap = $caption->{ENUMS}->{$key};
+	    if ($cap->{RESTART} && $cap->{COUNT}
+		&& ($next->{$key} == $cap->{COUNT})) {
+		$next->{$key} = 1;
+	    } else {
+		$next->{$key} += 1;
+		last;
+	    }
 	}
 
-	my $cap = $caption->{ENUMS}->{$key};
-	if ($cap->{RESTART} && $cap->{COUNT}
-	    && ($next->{$key} eq $cap->{COUNT})) {
-	    $next->{$key} = 1;
-	    $carry = 1;
-	} else {
-	    # If I don't need to "carry" beyond here, then I just increment
-	    # this level of the enumeration and stop looping, since the
-	    # "next" hash has been initialized with the current values
+	# $carry keeps track of whether we need to carry into the next
+	# higher level of enumeration. It's not actually necessary except
+	# for when the loop ends: if we need to carry from $b into $a
+	# then $carry will be set when the loop ends.
+	# 
+	# We need to keep track of this because there are two different
+	# reasons why we might increment the highest level of enumeration ($a)
+	# 1) we hit the correct number of items in $b (ie, 5th iss of quarterly)
+	# 2) it's the right time of the year.
+	#
+	$carry = 0;
+	foreach my $key (reverse('b'.. 'f')) {
+	    next if !exists $next->{$key};
+	    if (!exists $caption->{ENUMS}->{$key}) {
+		# Just assume that it increments continuously and give up
+		warn "Holding data exists for $key, but no caption specified";
+		$next->{$key} += 1;
+		$carry = 0;
+		last;
+	    }
 
-	    # NOTE: This DOES NOT take into account the incrementing
-	    # of enumerations based on the calendar. (eg: The Economist)
-	    $next->{$key} += 1;
-	    $carry = 0;
-	    last;
+	    my $cap = $caption->{ENUMS}->{$key};
+	    if ($cap->{RESTART} && $cap->{COUNT}
+		&& ($next->{$key} eq $cap->{COUNT})) {
+		$next->{$key} = 1;
+		$carry = 1;
+	    } else {
+		# If I don't need to "carry" beyond here, then I just increment
+		# this level of the enumeration and stop looping, since the
+		# "next" hash has been initialized with the current values
+
+		# NOTE: This DOES NOT take into account the incrementing
+		# of enumerations based on the calendar. (eg: The Economist)
+		$next->{$key} += 1;
+		$carry = 0;
+		last;
+	    }
 	}
-    }
 
-    # The easy part is done. There are two things left to do:
-    # 1) Calculate the date of the next issue, if necessary
-    # 2) Increment the highest level of enumeration (either by date
-    #    or because $carry is set because of the above loop
+	# The easy part is done. There are two things left to do:
+	# 1) Calculate the date of the next issue, if necessary
+	# 2) Increment the highest level of enumeration (either by date
+	#    or because $carry is set because of the above loop
 
-    if (!%{$caption->{CHRONS}}) {
-	# The simple case: if there is no chronology specified
-	# then just check $carry and return
-	$next->{'a'} += $carry;
-    } else {
-	# Complicated: figure out date of next issue
+	if (!%{$caption->{CHRONS}}) {
+	    # The simple case: if there is no chronology specified
+	    # then just check $carry and return
+	    $next->{'a'} += $carry;
+	} else {
+	    # Figure out date of next issue, then decide if we need
+	    # to adjust top level enumeration based on that
+	    $self->next_date($caption, $next, ('i'..'m'));
+	}
     }
 
     return($next);



More information about the open-ils-commits mailing list