// Copyright: Matthias Steffens 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 // // 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 . For more info about COinS, see . // 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 = ""; 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; } ?>