Hello all,

I have taken a first stab at including an "Export to RefWorks" button
in the Evergreen OPAC. The attached patch (refworks_supercat.diff,
against trunk) should provide the necessary changes to SuperCat to
support this.

The patch a new transform, MARC21slim2MARCtxt.xsl, which converts MARC
into the MARC-ish plain text format accepted by RefWorks (see [1]).
The patch also adds a new feed to SuperCat, called "marctxt".

Also, I'm including a sample patch against the 1.4 OPAC
(refworks_opac_1_4.diff), and is only provided as a demonstration of
how this feature could be enabled (for instance, the <VENDOR> and
<HOSTNAME> tags in the callback URL need to be replaced with proper
values for each specific site). See [1] and [2] for more info.

This was first foray into the SuperCat code, so let me know if
something's not up to scratch.

Cheers,
  Warren Layton
  NRCan Library

[1] http://robotlibrarian.billdueber.com/sending-marcish-data-to-refworks/
[2] http://www.refworks.com/DirectExport.htm#DECallback


-ps- I don't know if I need to provide a DCO for this, but just in case...

Developer's Certificate of Origin
=======================

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.

Signed-off-by: Warren A. Layton
Index: Open-ILS/xsl/MARC21slim2MARCtxt.xsl
===================================================================
--- Open-ILS/xsl/MARC21slim2MARCtxt.xsl	(revision 0)
+++ Open-ILS/xsl/MARC21slim2MARCtxt.xsl	(revision 0)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:marc="http://www.loc.gov/MARC21/slim"; xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; exclude-result-prefixes="marc">
+    <xsl:output method="text"/>
+
+    <xsl:template match="marc:record">
+       <xsl:text>LEADER </xsl:text>
+       <xsl:value-of select="marc:leader"/>
+        
+        <xsl:for-each select="marc:controlfield">
+            <xsl:text>&#10;</xsl:text>
+            <xsl:value-of select="@tag"/>
+            <xsl:text>    </xsl:text>
+            <xsl:value-of select="marc:controlfield"/>
+            <xsl:value-of select="."/>
+        </xsl:for-each>
+
+        <xsl:for-each select="marc:datafield">
+            <xsl:text>&#10;</xsl:text>
+            <xsl:value-of select="@tag"/>
+            <xsl:text> </xsl:text>
+            <xsl:value-of select="@ind1"/>
+            <xsl:value-of select="@ind2"/>
+            <xsl:text> </xsl:text>
+            <xsl:for-each select="marc:subfield">
+                <xsl:if test="@code != 'a'">
+                    <xsl:text>|</xsl:text>
+                    <xsl:value-of select="@code"/>
+                </xsl:if>
+                <xsl:value-of select="."/>
+            </xsl:for-each>
+        </xsl:for-each>
+	</xsl:template>
+</xsl:stylesheet>
+
Index: Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm
===================================================================
--- Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm	(revision 13378)
+++ Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm	(working copy)
@@ -744,4 +744,57 @@
 package OpenILS::WWW::SuperCat::Feed::htmlholdings::item;
 use base 'OpenILS::WWW::SuperCat::Feed::htmlcard::item';
 
+
+package OpenILS::WWW::SuperCat::Feed::marctxt;
+use base 'OpenILS::WWW::SuperCat::Feed::marcxml';
+
+sub new {
+	my $class = shift;
+	my $self = $class->SUPER::new;
+	$self->{type} = 'text/plain';
+	$self->{xsl} = "/MARC21slim2MARCtxt.xsl";
+	return $self;
+}
+
+
+our ($_parser, $_xslt, $xslt_file);
+
+sub toString {
+	my $self = shift;
+	my $base = $self->base || '';
+	my $root = $self->root || '';
+	my $search = $self->search || '';
+	my $class = $self->class || '';
+	my $lib = $self->lib || '-';
+
+	$self->composeDoc;
+
+        $_parser ||= new XML::LibXML;
+        $_xslt ||= new XML::LibXSLT;
+
+	$xslt_file ||=
+                OpenSRF::Utils::SettingsClient
+       	                ->new
+               	        ->config_value( dirs => 'xsl' ).
+                $self->{xsl};
+
+        # parse the MARC text xslt ...
+        my $marctxt_xslt = $_xslt->parse_stylesheet( $_parser->parse_file($xslt_file) );
+
+	my $new_doc = $marctxt_xslt->transform(
+		$self->{doc},
+		base_dir => "'$root'",
+		lib => "'$lib'",
+		searchTerms => "'$search'",
+		searchClass => "'$class'",
+	);
+
+	return $marctxt_xslt->output_string($new_doc); 
+}
+
+
+package OpenILS::WWW::SuperCat::Feed::marctxt::item;
+use base 'OpenILS::WWW::SuperCat::Feed::marcxml::item';
+
+
 1;
Index: Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm
===================================================================
--- Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm	(revision 13378)
+++ Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm	(working copy)
@@ -145,7 +145,7 @@
 		->gather(1);
 
     $list = [ map { (keys %$_)[0] } @$list ];
-    push @$list, 'htmlholdings','html';
+    push @$list, 'htmlholdings','html', 'marctxt';
 
     for my $browse_axis ( qw/title author subject topic series item-age/ ) {
         for my $record_browse_format ( @$list ) {
@@ -256,6 +256,7 @@
 	<format name='htmlholdings' type='text/html'/>
 	<format name='html-full' type='text/html'/>
 	<format name='htmlholdings-full' type='text/html'/>
+	<format name='marctxt' type='text/plain'/>
 				FORMATS
 			} elsif ($type eq 'metarecord') {
 				$body .= <<"				FORMATS";
@@ -310,6 +311,7 @@
 	<format name='htmlholdings' type='text/html'/>
 	<format name='html-full' type='text/html'/>
 	<format name='htmlholdings-full' type='text/html'/>
+	<format name='marctxt' type='text/plain'/>
 			FORMATS
 
 
@@ -402,7 +404,7 @@
 	       @{ $supercat->request("open-ils.supercat.$type.formats")->gather(1) }
 	     and !grep
 	       { $_ eq $base_format }
-	       qw/opac html htmlholdings/
+	       qw/opac html htmlholdings marctxt/
 	) {
 		print "Content-type: text/html; charset=utf-8\n\n";
 		$apache->custom_response( 406, <<"		HTML");
@@ -541,6 +543,10 @@
 				   <format>
 				     <name>html-full</name>
 				     <type>text/html</type>
+				   </format>
+				   <format>
+				     <name>marctxt</name>
+				     <type>text/plain</type>
 				   </format>";
 			}
 
@@ -606,6 +612,10 @@
 			   <format>
 			     <name>html-full</name>
 			     <type>text/html</type>
+			   </format>
+			   <format>
+			     <name>marctxt</name>
+			     <type>text/plain</type>
 			   </format>";
 
 		for my $h (@$list) {
@@ -1210,7 +1220,7 @@
 	$feed->unapi($unapi) if ($flesh);
 
 	$type = 'atom' if ($type eq 'html');
-	$type = 'marcxml' if ($type eq 'htmlholdings');
+	$type = 'marcxml' if (($type eq 'htmlholdings') || ($type eq 'marctxt'));
 
 	#$records = $supercat->request( "open-ils.supercat.record.object.retrieve", $records )->gather(1);
 
--- page_rdetail.xml	2009-06-16 15:58:37.000000000 -0400
+++ page_rdetail.xml-refw	2009-06-16 15:56:26.000000000 -0400
@@ -52,6 +52,9 @@
 
 				<td align='right' style='padding-right: 7px;' width='33%'>
 					<span style='padding-right: 7px;'>
+                                           <a id='rdetail_exp_refworks'>Export to RefWorks</a>
+					</span>
+					<span style='padding-right: 7px;'>
 						<a id='rdetail_place_hold' class='classic_link'>&opac.holds.placeHold;</a>
 					</span>
 					<span style='padding-right: 7px;' class='hide_me' id='rdetail_more_actions'>
--- rdetail.js	2009-06-16 15:58:42.000000000 -0400
+++ rdetail.js-refw	2009-06-16 15:56:53.000000000 -0400
@@ -283,6 +283,13 @@
 	$('rdetail_place_hold').setAttribute(
 		'href','javascript:holdsDrawEditor({record:"'+record.doc_id()+'",type:"T"});');
 
+    $('rdetail_exp_refworks').setAttribute(
+        'href',
+        'http://www.refworks.com/express/expressimport.asp?vendor=<VENDOR>&filter=MARC+Format&database=All+MARC+Formats&encoding=65001&url=http%3A%2F%2F<HOSTNAME>/opac/extras/supercat/marctxt/record'+record.doc_id());
+
+    $('rdetail_exp_refworks').setAttribute(
+        'target','RefWorksMain');
+
 	$('rdetail_img_link').setAttribute('href', buildISBNSrc(cleanISBN(record.isbn()), 'large'));
 	G.ui.rdetail.image.setAttribute("src", buildISBNSrc(cleanISBN(record.isbn())));
 	runEvt("rdetail", "recordDrawn");

Reply via email to