#!/usr/bin/perl # # index-files.pl - make an & index topic for events/news/help # # Called by compose-tricky # # Take a MUSH help.txt format file on the stdin, and write a # "& entries" entry or entries. # Lines with entries to be indexed start with &'s. # Write the resulting entries to the stdout, also in help.txt format, # in columns and paged. # Idea by Schmidt@Dune, perl version by Alan Schwartz (Javelin/Paul) # with mods by Jeff Heinen. Modified further by Raevnos. # # Usage: index-files.pl [options] < news.txt > nws/index.nws # require 5; # Sorry, Talek. use strict; use Getopt::Long; use locale; my (@entries, @aentries); # Have we got any options? my($first,$longest) = ("",""); exit 1 unless GetOptions ('first' => \$first, 'longest' => \$longest); # Collect all the topic names my @set = (); my @aset = (); while (<STDIN>) { chomp; next if /^& &?Entries/o; # Skip index entries. if ((@set or @aset) and $_ !~ /&\s+\S/) { # We've got a set of entries now. Choose which to add. if ($first) { # Add the first one push(@entries,$set[0]) if $set[0]; push(@aentries,$aset[0]) if $aset[0]; } if ($longest) { # Add the longest one @set = sort { length($b) <=> length($a) } @set; @aset = sort { length($b) <=> length($a) } @aset; push(@entries,$set[0]) if $set[0]; push(@aentries,$aset[0]) if $aset[0]; } if (!$first and !$longest) { # Add all push(@entries,@set) if @set; push(@aentries,@aset) if @aset; } @set = (); @aset = (); } push @aset,$1 if /^&\s+(&.*)/o; # Catch admin-help entries push @set, $1 if /^&\s+([^&].*)/o; # Catch normal entries. } # If anything's left in @set/@aset now, someone's screwed up # Make 'em all lower-case and sort 'em. @entries = map { lc $_ } @entries; @aentries = map { lc $_ } @aentries; sub withnumchecking; my @sorted = ($#entries > 0) ? (sort withnumchecking @entries) : @entries; my @asorted = ($#entries > 0) ? (sort withnumchecking @aentries) : @aentries; my $maxlines = 14; my $maxlen = 25; my $separator ="-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"; my $three_items = " %-25.25s %-25.25s %-25.25s\n"; # Format for three entries my $bigone = " %-51.51s %-25.25s\n"; # Format for two entries, long first. my $bigtwo = " %-25.25s %-51.51s\n"; # Format for two entries, long second. my $admin = 0; my $index; foreach $index (\@sorted, \@asorted) { my $i = 0; my $title = $admin ? "&Entries" : "Entries"; $admin++; my $titlecount = 1; my $header = 0; my ($entry1, $entry2, $entry3); print "\n& $title\n", $separator; while (@$index) { if (${$index}[0] eq "help") { shift @$index; next; } if ($header) { print "& $title-$titlecount\n", $separator; $header = 0; } $entry1 = shift @$index; $entry2 = shift @$index; $entry2 = "" if !defined $entry2; if (length($entry1) > $maxlen) { if (length($entry2) > $maxlen) { printf " %-76.76s\n", $entry1; unshift @$index, $entry2; } else { printf $bigone, $entry1, $entry2; } } else { if (length($entry2) > $maxlen) { printf $bigtwo, $entry1, $entry2; } else { $entry3 = shift @$index; $entry3 = "" if !defined $entry3; if (length($entry3) > $maxlen) { unshift @$index, $entry3; $entry3 =""; } printf $three_items, $entry1, $entry2, $entry3; } } if ($i++ > $maxlines) { $titlecount++; print "\nFor more, see $title-$titlecount\n", $separator; $header = 1; $i = 0; } } } print $separator; sub withnumchecking { my($firsta, $firstb) = ($a,$b); my($lasta, $lastb); ($firsta, $lasta) = ($1,$2) if $a =~ /(.+)p(\d+)/o; ($firstb, $lastb) = ($1,$2) if $b =~ /(.+)p(\d+)/o; my $res = $firsta cmp $firstb; return $res if $res; if (!defined($lasta)) { warn "Possible duplicate help topic: $a\n"; return $res; } return $lasta <=> $lastb; }