]> granicus.if.org Git - docbook-dsssl/commitdiff
Support page ranges (generated by startofrang/endofrange index entries)
authorNorman Walsh <ndw@nwalsh.com>
Mon, 26 Aug 2002 10:56:53 +0000 (10:56 +0000)
committerNorman Walsh <ndw@nwalsh.com>
Mon, 26 Aug 2002 10:56:53 +0000 (10:56 +0000)
xsl/fo/pdf2index

index 2a8439852a21ae389b8098c75471b4dd73b8c5cf..c52963989fb452eb1f30080e2ce61c2df60b9595 100755 (executable)
@@ -29,6 +29,22 @@ while ($index =~ /^(.*?)((<phrase role=\"pageno\">.*?<\/phrase>\s*)+)/s) {
 
     my @pages = m/<phrase role=\"pageno\">.*?<\/phrase>\s*/sg;
 
+    # Expand ranges
+    if ($#pages >= 0) {
+       my @mpages = ();
+       foreach my $page (@pages) {
+           my $pageno = &pageno($page);
+           if ($pageno =~ /^([0-9]+)[^0-9]([0-9]+)$/) { # funky -
+               for (my $count = $1; $count <= $2; $count++) {
+                   push (@mpages, "<phrase role=\"$pageno\">$count</phrase>");
+               }
+           } else {
+               push (@mpages, $page);
+           }
+       }
+       @pages = sort rangesort @mpages;
+    }
+
     # Remove duplicates...
     if ($#pages > 0) {
        my @mpages = ();
@@ -91,6 +107,16 @@ sub pageno {
     return "?";
 }
 
+sub rangesort {
+    my $apno = &pageno($a);
+    my $bpno = &pageno($b);
+
+    # Make sure roman pages come before arabic ones, otherwise sort them in order
+    return -1 if ($apno !~ /^\d+/ && $bpno =~ /^\d+/);
+    return  1 if ($apno =~ /^\d+/ && $bpno !~ /^\d+/);
+    return $apno cmp $bpno;
+}
+
 sub rangelen {
     my $count = shift;
     my @pages = @_;