| #! /usr/bin/env perl |
| |
| # On Cygwin, we actually have to generate a temporary file when doing |
| # the inplace edit, or we'll get permission errors. Not sure who's |
| # bug this is, except that it isn't ours. To deal with this, we |
| # generate backups during the edit phase and remove them at the end. |
| # |
| use English; |
| $INPLACE_EDIT = '.bak'; |
| |
| # read the labels, then reverse the mappings |
| require "labels.pl"; |
| |
| %nodes = (); |
| my $key; |
| # sort so that we get a consistent assignment for nodes with multiple labels |
| foreach $label (sort keys %external_labels) { |
| # |
| # If the label can't be used as a filename on non-Unix platforms, |
| # skip it. Such labels may be used internally within the documentation, |
| # but will never be used for filename generation. |
| # |
| if ($label =~ /^([-.a-zA-Z0-9]+)$/) { |
| $key = $external_labels{$label}; |
| $key =~ s|^/||; |
| $nodes{$key} = $label; |
| } |
| } |
| |
| # This adds the "internal" labels added for indexing. These labels will not |
| # be used for file names. |
| require "intlabels.pl"; |
| foreach $label (keys %internal_labels) { |
| $key = $internal_labels{$label}; |
| $key =~ s|^/||; |
| if (defined($nodes{$key})) { |
| $nodes{$label} = $nodes{$key}; |
| } |
| } |
| |
| # collect labels that have been used |
| %newnames = (); |
| |
| while (<>) { |
| # don't want to do one s/// per line per node |
| # so look for lines with hrefs, then do s/// on nodes present |
| if (/(HREF|href)=[\"\']node\d+\.html[\#\"\']/) { |
| @parts = split(/(HREF|href)\=[\"\']/); |
| shift @parts; |
| for $node (@parts) { |
| $node =~ s/[\#\"\'].*$//g; |
| chomp($node); |
| if (defined($nodes{$node})) { |
| $label = $nodes{$node}; |
| if (s/(HREF|href)=([\"\'])$node([\#\"\'])/href=$2$label.html$3/g) { |
| s/(HREF|href)=([\"\'])$label.html/href=$2$label.html/g; |
| $newnames{$node} = "$label.html"; |
| } |
| } |
| } |
| } |
| print; |
| } |
| |
| foreach $oldname (keys %newnames) { |
| rename($oldname, $newnames{$oldname}); |
| } |
| |
| foreach $filename (glob('*.bak')) { |
| unlink($filename); |
| } |