initial source import
diff --git a/doc/tools/node2label.pl b/doc/tools/node2label.pl
new file mode 100755
index 0000000..f3e6bd8
--- /dev/null
+++ b/doc/tools/node2label.pl
@@ -0,0 +1,55 @@
+#! /usr/bin/env perl
+
+use English;
+$INPLACE_EDIT = '';
+
+# 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) {
+ $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 "internals.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)=[\"\']([^\#\"\']*)html[\#\"\']/) {
+ @parts = split(/(HREF|href)\=[\"\']/);
+ shift @parts;
+ for $node (@parts) {
+ $node =~ s/[\#\"\'].*$//g;
+ chop($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});
+}