Revert "LP#1332651 do not strip internal spaces in barcode"
[working/Evergreen.git] / build / tools / relator_map
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4
5 use XML::LibXML;
6 use XML::LibXML::Reader;
7 use LWP::Simple qw($ua get);
8 use Data::Dumper;
9
10 # loc.gov blocks basic user agents now
11 $ua->agent('Evergreen/3.1');
12
13 my %relator;
14 my $code = 0;
15 my $fullname = 0;
16 my $code_v;
17
18 my $content = get('http://www.loc.gov/marc/relators/relacode.html');
19
20 $content =~ s{^<!DOCTYPE.*?>}{}s;
21 $content =~ s{<head>.+?</head>}{}s;
22 $content =~ s{<table .+?<table }{<table }s;
23 $content =~ s{&raquo;}{}gs;
24 $content =~ s{</table>.+?</table>}{</table>}s;
25
26 my $reader = XML::LibXML::Reader->new(
27     string => $content,
28     recover => 2,
29     load_ext_dtd => 0
30 );
31
32 $reader->nextElement('table');
33 $reader->nextElement('tr');
34 while($reader->read) {
35     processNode($reader);
36 }
37
38 #print Dumper(\%relator);
39 generateRelatorMap();
40
41 sub processNode {
42     my $reader = shift;
43     if ($reader->nodeType == XML_READER_TYPE_ELEMENT && $reader->name eq 'td') {
44         if ($reader->getAttribute('class') && $reader->getAttribute('class') eq 'code') {
45             $code = 1;
46         } else {
47             $fullname = 1;
48         }
49     }
50     if ($reader->nodeType == XML_READER_TYPE_TEXT) {
51         if ($code) {
52             $code_v = $reader->value();
53
54             # Treat deprecated codes as valid
55             $code_v =~ s/^-//;
56             $code = 0;
57         } elsif ($fullname) {
58             $relator{$code_v} = $reader->value();
59             $fullname = 0;
60         }
61     }
62 }
63
64 sub generateRelatorMap {
65     print <<"HEAD";
66 [%-  
67 # Generated from http://www.loc.gov/marc/relators/relacode.html
68 # using the build/tools/relator_map script
69 HEAD
70     print 'relators = {' . "\n";
71     foreach (sort keys %relator) {
72         print "    '$_' => l('$relator{$_}'),\n";
73     }
74     print '} -%]';
75 }