|
<?php
|
|
// Project: Web Reference Database (refbase) <http://www.refbase.net>
|
|
// Copyright: Matthias Steffens <mailto:refbase@extracts.de> and the file's
|
|
// original author(s).
|
|
//
|
|
// This code is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY. Please see the GNU General Public
|
|
// License for more details.
|
|
//
|
|
// File: ./includes/openurl.inc.php
|
|
// Repository: $HeadURL: file:///svn/p/refbase/code/branches/bleeding-edge/includes/openurl.inc.php $
|
|
// Author(s): Richard Karnesky <mailto:karnesky@gmail.com>
|
|
//
|
|
// Created: 06-Sep-06, 16:30
|
|
// Modified: $Date: 2012-02-29 00:15:45 +0000 (Wed, 29 Feb 2012) $
|
|
// $Author: msteffens $
|
|
// $Revision: 1349 $
|
|
|
|
// This include file contains functions that generate OpenURL and COinS data.
|
|
// More info about the OpenURL standard (including pointers to further documentation) is available
|
|
// at <http://en.wikipedia.org/wiki/OpenURL>. For more info about COinS, see <http://ocoins.info/>.
|
|
|
|
// TODO: Multiple aus have the same array key, so we apped a number that is later stripped
|
|
// Cleanup if possible
|
|
|
|
|
|
// Include refbase markup -> plain text search & replace patterns
|
|
include 'includes/transtab_refbase_ascii.inc.php';
|
|
|
|
function openURL($row, $resolver = "") {
|
|
global $openURLResolver; // these variables are defined in 'ini.inc.php'
|
|
global $crossRefReqDat;
|
|
global $hostInstitutionAbbrevName;
|
|
|
|
$co = contextObject($row);
|
|
$co["sid"] = "refbase:" . $hostInstitutionAbbrevName;
|
|
|
|
if (empty($resolver))
|
|
$resolver = $openURLResolver;
|
|
|
|
$openURL = $resolver;
|
|
|
|
if (!preg_match("/\?/", $resolver))
|
|
$openURL .= "?";
|
|
else
|
|
$openURL .= "&";
|
|
|
|
if (preg_match("#^http://www\.crossref\.org/openurl#", $openURL) && !empty($crossRefReqDat))
|
|
$openURL .= "pid=" . rawurlencode($crossRefReqDat) . "&";
|
|
|
|
$openURL .= "ctx_ver=Z39.88-2004";
|
|
|
|
foreach ($co as $coKey => $coValue) {
|
|
$coKey = preg_replace("/rft./i", "", $coKey);
|
|
$coKey = preg_replace("/au[0-9]*/i", "au", $coKey);
|
|
$openURL .= "&" . $coKey . "=" . rawurlencode($coValue);
|
|
}
|
|
|
|
return $openURL;
|
|
}
|
|
|
|
function coins($row) {
|
|
// fmt_info (type)
|
|
$fmt = "info:ofi/fmt:kev:mtx:";
|
|
// 'dissertation' is compatible with the 1.0 spec, but not the 0.1 spec
|
|
if (!empty($row['thesis']))
|
|
$fmt .= "dissertation";
|
|
elseif (preg_match("/Journal/", $row['type']))
|
|
$fmt .= "journal";
|
|
elseif (preg_match("/Patent/", $row['type']))
|
|
$fmt .= "patent";
|
|
elseif (preg_match("/Book/", $row['type']))
|
|
$fmt .= "book";
|
|
// 'dc' (dublin core) is compatible with the 1.0 spec, but not the 0.1 spec.
|
|
// We default to this, as it is the most generic type.
|
|
else
|
|
$fmt .= "dc";
|
|
|
|
$co = contextObject($row);
|
|
|
|
$coins = "ctx_ver=Z39.88-2004" . "&rft_val_fmt=" . urlencode($fmt);
|
|
|
|
foreach ($co as $coKey => $coValue) {
|
|
// 'urlencode()' differs from 'rawurlencode() (i.e., RFC1738 encoding)
|
|
// in that spaces are encoded as plus (+) signs
|
|
$coKey = preg_replace("/au[0-9]*/i", "au", $coKey);
|
|
|
|
// While COinS does not specify encoding, most javascript tools assume that it is UTF-8
|
|
// TODO: use function 'detectCharacterEncoding()' instead of the 'mb_*()' functions?
|
|
// if (($contentTypeCharset == "ISO-8859-1") AND (detectCharacterEncoding($coValue) != "UTF-8"))
|
|
if (mb_detect_encoding($coValue) != "UTF-8" || !(mb_check_encoding($coValue,"UTF-8")))
|
|
$coValue = utf8_encode($coValue);
|
|
$coins .= "&" . $coKey . "=" . urlencode($coValue);
|
|
}
|
|
$coins .= "%26ctx_enc%3Dinfo%3Aofi%2Fenc%3AUTF-8";
|
|
|
|
$coinsSpan = "<span class=\"Z3988\" title=\"" . $coins . "\"></span>";
|
|
|
|
return $coinsSpan;
|
|
}
|
|
|
|
function contextObject($row) {
|
|
global $databaseBaseURL; // defined in 'ini.inc.php'
|
|
|
|
// The array '$transtab_refbase_ascii' contains search & replace patterns for
|
|
// conversion from refbase markup to plain text
|
|
global $transtab_refbase_ascii; // defined in 'transtab_refbase_ascii.inc.php'
|
|
|
|
// Defines search & replace 'actions' that will be applied to all those
|
|
// refbase fields that are listed in the corresponding 'fields' element:
|
|
$plainTextSearchReplaceActionsArray = array(
|
|
array(
|
|
'fields' => array("title", "publication", "abbrev_journal", "address", "keywords", "abstract", "orig_title", "series_title", "abbrev_series_title", "notes"),
|
|
'actions' => $transtab_refbase_ascii
|
|
)
|
|
);
|
|
|
|
foreach ($row as $rowFieldName => $rowFieldValue)
|
|
// Apply search & replace 'actions' to all fields that are listed in the 'fields'
|
|
// element of the arrays contained in '$plainTextSearchReplaceActionsArray':
|
|
foreach ($plainTextSearchReplaceActionsArray as $fieldActionsArray)
|
|
if (in_array($rowFieldName, $fieldActionsArray['fields']))
|
|
// function 'searchReplaceText()' is defined in 'include.inc.php'
|
|
$row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $row[$rowFieldName], true);
|
|
|
|
$co = array();
|
|
|
|
// rfr_id
|
|
$co["rfr_id"] = "info:sid/" . preg_replace("#http://#", "", $databaseBaseURL);
|
|
|
|
// genre (type)
|
|
if (isset($row['type'])) {
|
|
if ($row['type'] == "Journal Article")
|
|
$co["rft.genre"] = "article";
|
|
elseif ($row['type'] == "Book Chapter")
|
|
$co["rft.genre"] = "bookitem";
|
|
elseif ($row['type'] == "Book Whole")
|
|
$co["rft.genre"] = "book";
|
|
elseif ($row['type'] == "Conference Article")
|
|
$co["rft.genre"] = "proceeding";
|
|
elseif ($row['type'] == "Conference Volume")
|
|
$co["rft.genre"] = "conference";
|
|
elseif ($row['type'] == "Journal")
|
|
$co["rft.genre"] = "journal";
|
|
elseif ($row['type'] == "Manuscript")
|
|
$co["rft.genre"] = "preprint";
|
|
elseif ($row['type'] == "Report")
|
|
$co["rft.genre"] = "report"; // "report" is only supported by OpenURL v1.0 (but not v0.1)
|
|
}
|
|
|
|
// atitle, btitle, title (title, publication)
|
|
if (($row['type'] == "Journal Article") || ($row['type'] == "Book Chapter")) {
|
|
if (!empty($row['title']))
|
|
$co["rft.atitle"] = $row['title'];
|
|
if (!empty($row['publication'])) {
|
|
$co["rft.title"] = $row['publication'];
|
|
if ($row['type'] == "Book Chapter")
|
|
$co["rft.btitle"] = $row['publication'];
|
|
}
|
|
}
|
|
elseif (!empty($row['title']))
|
|
$co["rft.title"] = $row['title'];
|
|
if (($row['type'] == "Book Whole") && (!empty($row['title'])))
|
|
$co["rft.btitle"] = $row['title'];
|
|
|
|
// stitle (abbrev_journal)
|
|
if (!empty($row['abbrev_journal'])) {
|
|
$co["rft.stitle"] = $row['abbrev_journal'];
|
|
if (empty($row['publication']) && (!isset($co["rft.title"]))) {
|
|
// we duplicate the abbreviated journal name to 'rft.title' since the
|
|
// CrossRef resolver seems to require 'rft.title' (otherwise it aborts
|
|
// with an error: "No journal identifier supplied")
|
|
$co["rft.title"] = $row['abbrev_journal'];
|
|
}
|
|
}
|
|
|
|
// series (series_title)
|
|
if (!empty($row['series_title']))
|
|
$co["rft.series"] = $row['series_title'];
|
|
|
|
// issn
|
|
if (!empty($row['issn']))
|
|
$co["rft.issn"] = $row['issn'];
|
|
|
|
// isbn
|
|
if (!empty($row['isbn']))
|
|
$co["rft.isbn"] = $row['isbn'];
|
|
|
|
// date (year)
|
|
if (!empty($row['year']))
|
|
$co["rft.date"] = $row['year'];
|
|
|
|
// volume
|
|
if (!empty($row['volume']))
|
|
$co["rft.volume"] = $row['volume'];
|
|
|
|
// issue
|
|
if (!empty($row['issue']))
|
|
$co["rft.issue"] = $row['issue'];
|
|
|
|
// spage, epage, tpages (pages)
|
|
// NOTE: lifted from modsxml.inc.php--should throw some into a new include file
|
|
if (!empty($row['pages'])) {
|
|
if (preg_match("/[0-9] *- *[0-9]/", $row['pages'])) {
|
|
list($pagestart, $pageend) = preg_split('/\s*[-]\s*/', $row['pages']);
|
|
if ($pagestart < $pageend) {
|
|
$co["rft.spage"] = $pagestart;
|
|
$co["rft.epage"] = $pageend;
|
|
}
|
|
}
|
|
elseif ($row['type'] == "Book Whole") {
|
|
$pagetotal = preg_replace('/^(\d+)\s*pp?\.?$/', "\\1", $row['pages']);
|
|
$co["rft.tpages"] = $pagetotal;
|
|
}
|
|
else
|
|
$co["rft.spage"] = $row['pages'];
|
|
}
|
|
|
|
// aulast, aufirst, author (author)
|
|
if (!empty($row['author'])) {
|
|
$author = $row['author'];
|
|
$aulast = extractAuthorsLastName("/ *; */", "/ *, */", 1, $author);
|
|
$aufirst = extractAuthorsGivenName("/ *; */", "/ *, */", 1, $author);
|
|
if (!empty($aulast))
|
|
$co["rft.aulast"] = $aulast;
|
|
if (!empty($aufirst))
|
|
$co["rft.aufirst"] = $aufirst;
|
|
// TODO: cleanup and put this function in include.inc.php?
|
|
$authorcount = count(preg_split("/ *; */", $author));
|
|
for ($i=0; $i < $authorcount-1; $i++){
|
|
$aul = extractAuthorsLastName("/ *; */", "/ *, */", $i+2, $author);
|
|
$auf = extractAuthorsGivenName("/ *; */", "/ *, */", $i+2, $author);
|
|
if (!empty($aul)) {
|
|
$au = $aul;
|
|
if (!empty($auf))
|
|
$au .= ", ";
|
|
}
|
|
if (!empty($auf))
|
|
$au .= $auf;
|
|
if (!empty($au))
|
|
$co["rft.au".$i] = $au;
|
|
}
|
|
}
|
|
|
|
// pub (publisher)
|
|
if (!empty($row['publisher']))
|
|
$co["rft.pub"] = $row['publisher'];
|
|
|
|
// place
|
|
if (!empty($row['place']))
|
|
$co["rft.place"] = $row['place'];
|
|
|
|
// id (doi, url)
|
|
if (!empty($row['doi']))
|
|
$co["rft_id"] = "info:doi/" . $row['doi'];
|
|
elseif (!empty($row['url']))
|
|
$co["rft_id"] = $row['url'];
|
|
|
|
return $co;
|
|
}
|
|
?>
|