TPAC: Fine-grained credits in record details
[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;
8 use Data::Dumper;
9
10 my %relator;
11 my $code = 0;
12 my $fullname = 0;
13 my $code_v;
14
15 my $content = get('http://www.loc.gov/marc/relators/relacode.html');
16
17 $content =~ s{^<!DOCTYPE.*?>}{}s;
18 $content =~ s{<head>.+?</head>}{}s;
19 $content =~ s{<table .+?<table }{<table }s;
20 $content =~ s{&raquo;}{}gs;
21 $content =~ s{</table>.+?</table>}{</table>}s;
22
23 my $reader = XML::LibXML::Reader->new(
24     string => $content,
25     recover => 2,
26     load_ext_dtd => 0
27 );
28
29 $reader->nextElement('table');
30 $reader->nextElement('tr');
31 while($reader->read) {
32     processNode($reader);
33 }
34
35 #print Dumper(\%relator);
36 generateRelatorMap();
37
38 sub processNode {
39     my $reader = shift;
40     if ($reader->nodeType == XML_READER_TYPE_ELEMENT && $reader->name eq 'td') {
41         if ($reader->getAttribute('class') && $reader->getAttribute('class') eq 'code') {
42             $code = 1;
43         } else {
44             $fullname = 1;
45         }
46     }
47     if ($reader->nodeType == XML_READER_TYPE_TEXT) {
48         if ($code) {
49             $code_v = $reader->value();
50
51             # Treat deprecated codes as valid
52             $code_v =~ s/^-//;
53             $code = 0;
54         } elsif ($fullname) {
55             $relator{$code_v} = $reader->value();
56             $fullname = 0;
57         }
58     }
59 }
60
61 sub generateRelatorMap {
62     print <<"HEAD";
63 [%-  
64 # Generated from http://www.loc.gov/marc/relators/relacode.html
65 # using the build/tools/relator_map script
66 HEAD
67     print 'relators = {' . "\n";
68     foreach (sort keys %relator) {
69         print "    '$_' => l('$relator{$_}'),\n";
70     }
71     print '} -%]';
72 }