shithub: riscv

ref: 7186be0424ba65942a13b7706017c6ef4338f219
dir: /sys/src/cmd/python/Doc/tools/node2label.pl/

View raw version
#! /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);
}