Add the ability to link out to sameAs entities
authorDan Scott <dscott@laurentian.ca>
Tue, 16 Dec 2014 04:29:35 +0000 (23:29 -0500)
committerDan Scott <dscott@laurentian.ca>
Wed, 17 Dec 2014 21:32:50 +0000 (16:32 -0500)
Look for standard identifiers with known URIs, such as
LCCNs, OCLC numbers, and URIs identified in 024 fields,
and add http://schema.org/sameAs properties to the record.
This helps us link out to the broader linked data world,
and should help those consuming our data to better
understand what resources we have to offer.

Signed-off-by: Dan Scott <dscott@laurentian.ca>
Open-ILS/src/templates/opac/parts/misc_util.tt2
Open-ILS/src/templates/opac/parts/record/body.tt2

index da7c958..5ad5b61 100644 (file)
         END;
         args.upc = args.upcs.0; # use first UPC as the default
 
+        # These are URIs that link out to related works for linked data purposes,
+        # such as OCLC Work Entities like http://worldcat.org/entity/work/id/415491
+        args.links = []; 
+        FOR link_node IN xml.findnodes('//*[@tag="024"]/*[@code="2" and text()="uri"]');
+            my_parent = link_node.parentNode();
+            FOR link IN my_parent.findnodes('./*[@code="a"]');
+                link_uri = textContent | trim;
+                args.links.push(link_uri);
+            END;
+        END;
+        FOR lccn IN xml.findnodes('//*[@tag="010"]/*[@code="a"]');
+            lccn_num = lccn.textContent | trim;
+            args.links.push('http://lccn.loc.gov/' _ lccn_num);
+        END;
+        FOR oclcnum IN xml.findnodes('//*[@tag="035"]/*[@code="a"]');
+            oclcnum = oclcnum.textContent | trim;
+            NEXT UNLESS oclcnum.search('^\(OCoLC\)');
+            oclcnum = oclcnum | remove('\(OCoLC\)');
+            # These prefixes are often included in the 035, even though they should not be
+            oclcnum = oclcnum | remove('ocm');
+            oclcnum = oclcnum | remove('ocn');
+            oclcnum = oclcnum | remove('on') | trim;
+            args.links.push('http://www.worldcat.org/oclc/' _ oclcnum);
+        END;
+        args.links = args.links.unique;
+
         args.issns = [];
         FOR sub IN xml.findnodes('//*[@tag="022"]/*[@code="a"]');
             args.issns.push(sub.textContent);
index 216f8f9..d758846 100644 (file)
@@ -5,6 +5,9 @@
     ctx.record_attrs = attrs; # capture for JS
 %]
 <div id='canvas_main' class='canvas' vocab="http://schema.org/" typeof='[% args.schema.itemtype %] Product' resource="#schemarecord">
+[%- FOREACH link IN args.links; %]
+    <link property="sameAs" href="[% link %]">
+[%- END; %]
     [%- INCLUDE "opac/parts/record/navigation.tt2" %]
     [%- IF ctx.bib_is_dead %]
     <div id='rdetail_deleted_exp'>