View source
<?php
function biblio_normalize_title($title) {
$stop_words = 'a,an,the,is,on';
$stop_words = explode(',', variable_get('biblio_stop_words', $stop_words));
if (!@preg_match('/\\pL/u', 'a')) {
$title = trim(_strip_punctuation($title));
}
else {
$title = trim(_strip_punctuation_utf8($title));
}
$title = trim(_strip_punctuation($title));
mb_regex_encoding("utf-8");
$title_words = mb_split(' +', $title);
while (array_search(drupal_strtolower($title_words[0]), $stop_words) !== FALSE) {
array_shift($title_words);
}
return drupal_substr(implode(' ', $title_words), 0, 64);
}
function biblio_coins($node) {
$fmt = "info:ofi/fmt:kev:mtx:";
if ($node->biblio_type == 108) {
$fmt .= "dissertation";
}
elseif ($node->biblio_type == 102) {
$fmt .= "journal";
}
elseif ($node->biblio_type == 100 || $node->biblio_type == 101) {
$fmt .= "book";
}
else {
$fmt .= "dc";
}
$co = biblio_contextObject($node);
$coins = "ctx_ver=Z39.88-2004&rft_val_fmt=" . urlencode($fmt);
foreach ($co as $coKey => $coValue) {
$coKey = preg_replace("/au[0-9]*/", "au", $coKey);
$coins .= "&" . $coKey . "=" . urlencode($coValue);
}
$coinsSpan = "<span class=\"Z3988\" title=\"" . $coins . "\"></span>";
return $coinsSpan;
}
function biblio_contextObject($node) {
global $base_url;
$i = 0;
$co = array();
if ($node->biblio_type == 102 || $node->biblio_type == 101) {
if (!empty($node->title)) {
$co["rft.atitle"] = check_plain($node->title);
}
if (!empty($node->biblio_secondary_title)) {
$co["rft.title"] = check_plain($node->biblio_secondary_title);
if ($node->biblio_type == 101) {
$co["rft.btitle"] = check_plain($node->biblio_secondary_title);
}
}
}
elseif (!empty($node->title)) {
$co["rft.title"] = check_plain($node->title);
}
if ($node->biblio_type == 100 && !empty($node->biblio_secondary_title)) {
$co["rft.btitle"] = check_plain($node->biblio_secondary_title);
}
if (!empty($node->biblio_short_title)) {
$co["rft.stitle"] = check_plain($node->biblio_short_title);
}
if (!empty($node->biblio_tertiary_title)) {
$co["rft.series"] = check_plain($node->biblio_tertiary_title);
}
if (!empty($node->biblio_issn)) {
$co["rft.issn"] = check_plain($node->biblio_issn);
}
if (!empty($node->biblio_isbn)) {
$co["rft.isbn"] = check_plain($node->biblio_isbn);
}
if (!empty($node->biblio_year)) {
$co["rft.date"] = check_plain($node->biblio_year);
}
if (!empty($node->biblio_volume)) {
$co["rft.volume"] = check_plain($node->biblio_volume);
}
if (!empty($node->biblio_issue)) {
$co["rft.issue"] = check_plain($node->biblio_issue);
}
if (!empty($node->biblio_pages)) {
if (preg_match("/[0-9] *- *[0-9]/", $node->biblio_pages)) {
list($pagestart, $pageend) = preg_split('/\\s*[-]\\s*/', $node->biblio_pages);
if ($pagestart < $pageend) {
$co["rft.spage"] = check_plain($pagestart);
$co["rft.epage"] = check_plain($pageend);
}
}
elseif ($node->biblio_type == 100) {
$pagetotal = preg_replace('/^(\\d+)\\s*pp?\\.?$/', "\\1", $node->biblio_pages);
$co["rft.tpages"] = check_plain($pagetotal);
}
else {
$co["rft.spage"] = check_plain($node->biblio_pages);
}
}
if (!empty($node->biblio_contributors)) {
if (!empty($node->biblio_contributors[1][0]['lastname'])) {
$co["rft.aulast"] = check_plain($node->biblio_contributors[1][0]['lastname']);
}
if (!empty($node->biblio_contributors[1][0]['firstname'])) {
$co["rft.aufirst"] = check_plain($node->biblio_contributors[1][0]['firstname']);
}
elseif (!empty($node->biblio_contributors[1][0]['initials'])) {
$co["rft.auinit"] = check_plain($node->biblio_contributors[1][0]['initials']);
}
for ($i = 1; $i < count($node->biblio_contributors[1]); $i++) {
$author = $node->biblio_contributors[1][$i];
if (isset($author['auth_category']) && $author['auth_category'] == 1) {
if (!empty($author['lastname'])) {
$au = $author['lastname'];
if (!empty($author['firstname']) || !empty($author['initials'])) {
$au .= ", ";
}
}
if (!empty($author['firstname'])) {
$au .= $author['firstname'];
}
elseif (!empty($author['initials'])) {
$au .= $author['initials'];
}
if (!empty($au)) {
$co["rft.au" . $i] = $au;
}
}
}
}
if (!empty($node->biblio_publisher)) {
$co["rft.pub"] = check_plain($node->biblio_publisher);
}
if (!empty($node->biblio_place_published)) {
$co["rft.place"] = check_plain($node->biblio_place_published);
}
if (!empty($node->biblio_doi)) {
$co["rft_id"] = "info:doi/" . check_plain($node->biblio_doi);
}
return $co;
}
function biblio_coins_generate(&$node) {
if (!isset($node->vid)) {
$node->biblio_coins = biblio_coins($node);
return;
}
if ($node) {
$node->biblio_coins = biblio_coins($node);
db_update('biblio')
->fields(array(
'biblio_coins' => $node->biblio_coins,
))
->condition('vid', $node->vid)
->execute();
}
else {
$result = db_query("SELECT nr.*, b.*\n FROM {node} AS n\n LEFT JOIN {node_revision} AS nr ON n.vid = nr.vid LEFT JOIN {biblio} AS b ON n.vid = b.vid\n WHERE n.type = 'biblio' ");
foreach ($result as $node) {
$node->biblio_coins = biblio_coins($node);
db_update('biblio')
->fields(array(
'biblio_coins' => $node->biblio_coins,
))
->condition('vid', $node->vid)
->execute();
}
drupal_goto('');
}
}
function _strip_punctuation($text) {
return preg_replace("/[[:punct:]]/", '', $text);
}
function _strip_punctuation_utf8($text) {
$urlbrackets = '\\[\\]\\(\\)';
$urlspacebefore = ':;\'_\\*%@&?!' . $urlbrackets;
$urlspaceafter = '\\.,:;\'\\-_\\*@&\\/\\\\\\?!#' . $urlbrackets;
$urlall = '\\.,:;\'\\-_\\*%@&\\/\\\\\\?!#' . $urlbrackets;
$specialquotes = '\'"\\*<>';
$fullstop = '\\x{002E}\\x{FE52}\\x{FF0E}';
$comma = '\\x{002C}\\x{FE50}\\x{FF0C}';
$arabsep = '\\x{066B}\\x{066C}';
$numseparators = $fullstop . $comma . $arabsep;
$numbersign = '\\x{0023}\\x{FE5F}\\x{FF03}';
$percent = '\\x{066A}\\x{0025}\\x{066A}\\x{FE6A}\\x{FF05}\\x{2030}\\x{2031}';
$prime = '\\x{2032}\\x{2033}\\x{2034}\\x{2057}';
$nummodifiers = $numbersign . $percent . $prime;
return preg_replace(array(
'/[\\p{Z}\\p{Cc}\\p{Cf}\\p{Cs}\\p{Pi}\\p{Pf}]/u',
'/\\p{Po}(?<![' . $specialquotes . $numseparators . $urlall . $nummodifiers . '])/u',
'/[\\p{Ps}\\p{Pe}](?<![' . $urlbrackets . '])/u',
'/[' . $specialquotes . $numseparators . $urlspaceafter . '\\p{Pd}\\p{Pc}]+((?= )|$)/u',
'/((?<= )|^)[' . $specialquotes . $urlspacebefore . '\\p{Pc}]+/u',
'/((?<= )|^)\\p{Pd}+(?![\\p{N}\\p{Sc}])/u',
'/ +/',
), ' ', $text);
}
function _strip_symbols($text) {
$plus = '\\+\\x{FE62}\\x{FF0B}\\x{208A}\\x{207A}';
$minus = '\\x{2012}\\x{208B}\\x{207B}';
$units = '\\x{00B0}\\x{2103}\\x{2109}\\x{23CD}';
$units .= '\\x{32CC}-\\x{32CE}';
$units .= '\\x{3300}-\\x{3357}';
$units .= '\\x{3371}-\\x{33DF}';
$units .= '\\x{33FF}';
$ideo = '\\x{2E80}-\\x{2EF3}';
$ideo .= '\\x{2F00}-\\x{2FD5}';
$ideo .= '\\x{2FF0}-\\x{2FFB}';
$ideo .= '\\x{3037}-\\x{303F}';
$ideo .= '\\x{3190}-\\x{319F}';
$ideo .= '\\x{31C0}-\\x{31CF}';
$ideo .= '\\x{32C0}-\\x{32CB}';
$ideo .= '\\x{3358}-\\x{3370}';
$ideo .= '\\x{33E0}-\\x{33FE}';
$ideo .= '\\x{A490}-\\x{A4C6}';
return preg_replace(array(
'/[\\p{Sk}\\p{Co}]/u',
'/\\p{Sm}(?<![' . $plus . $minus . '=~\\x{2044}])/u',
'/((?<= )|^)[' . $plus . $minus . ']+((?![\\p{N}\\p{Sc}])|$)/u',
'/((?<= )|^)=+/u',
'/[' . $plus . $minus . '=~]+((?= )|$)/u',
'/\\p{So}(?<![' . $units . $ideo . '])/u',
'/ +/',
), ' ', $text);
}
function _strip_html_tags($text) {
$text = preg_replace(array(
'@<head[^>]*?>.*?</head>@siu',
'@<style[^>]*?>.*?</style>@siu',
'@<script[^>]*?.*?</script>@siu',
'@<object[^>]*?.*?</object>@siu',
'@<embed[^>]*?.*?</embed>@siu',
'@<applet[^>]*?.*?</applet>@siu',
'@<noframes[^>]*?.*?</noframes>@siu',
'@<noscript[^>]*?.*?</noscript>@siu',
'@<noembed[^>]*?.*?</noembed>@siu',
'@</?((address)|(blockquote)|(center)|(del))@iu',
'@</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))@iu',
'@</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))@iu',
'@</?((table)|(th)|(td)|(caption))@iu',
'@</?((form)|(button)|(fieldset)|(legend)|(input))@iu',
'@</?((label)|(select)|(optgroup)|(option)|(textarea))@iu',
'@</?((frameset)|(frame)|(iframe))@iu',
), array(
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
"\n\$0",
"\n\$0",
"\n\$0",
"\n\$0",
"\n\$0",
"\n\$0",
"\n\$0",
"\n\$0",
), $text);
return strip_tags($text);
}