1#!/usr/bin/perl -w
2
3use strict;
4
5no locale;
6
7my %items;
8my $item_key;
9
10$/ = '';
11
12while (<>) {
13  if (/^=item\s+(.+)/) {
14    # new item
15
16    $item_key = get_item_key($1);
17    $items{$item_key} .= $_;
18
19  } elsif (/^=back\b/) {
20    # no more items in this group
21
22    foreach my $item_key (sort keys %items) {
23      print $items{$item_key};
24    }
25
26    $item_key = undef;
27    %items = ();
28
29    print;
30
31  } elsif (defined $item_key) {
32    # part of the current item
33
34    $items{$item_key} .= $_;
35
36  } else {
37    # not part of an item
38
39    print;
40
41  }
42}
43
44if (keys %items) {
45  warn "Missing =back after final =item.\n";
46
47  foreach my $item_key (sort keys %items) {
48    print $items{$item_key};
49  }
50}
51
52
53# get the sortable key for an item
54sub get_item_key {
55  my($item) = @_;
56
57  # remove POD formatting
58  $item =~ s/[A-Z]<(.*?)>/$1/g;
59
60  # remove printf-style escapes
61  # note: be careful not to remove things like %hash
62  $item =~ s/%(?:[scg]|lx|#o)//g;
63
64  # remove all non-letter characters
65  $item =~ tr/A-Za-z//cd;
66
67  return lc $item;
68
69}
70
71__END__
72
73=pod
74
75=head1 NAME
76
77sort_perldiag.pl - Sort warning and error messages in perldiag.pod
78
79=head1 SYNOPSIS
80
81B<sort_perldiag.pl> I<file>
82
83=head1 DESCRIPTION
84
85B<sort_perldiag.pl> is a script for sorting the warning and error
86messages in F<perldiag.pod>.  POD formatting, printf-style escapes,
87non-letter characters, and case are ignored, as explained in L<perldiag>.
88
89=cut
90
91