Refbase update_2021-01-28_15_58
This commit is contained in:
231
includes/cite.inc.php
Normal file
231
includes/cite.inc.php
Normal file
@@ -0,0 +1,231 @@
|
||||
<?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/cite.inc.php
|
||||
// Repository: $HeadURL: file:///svn/p/refbase/code/branches/bleeding-edge/includes/cite.inc.php $
|
||||
// Author(s): Matthias Steffens <mailto:refbase@extracts.de>
|
||||
//
|
||||
// Created: 25-May-06, 15:19
|
||||
// Modified: $Date: 2012-02-27 20:25:30 +0000 (Mon, 27 Feb 2012) $
|
||||
// $Author: msteffens $
|
||||
// $Revision: 1337 $
|
||||
|
||||
// This file contains functions
|
||||
// that are used when outputting
|
||||
// references as citations.
|
||||
|
||||
|
||||
// Include common transliteration/translation tables and search & replace patterns
|
||||
include 'includes/transtab_refbase_rtf.inc.php'; // include refbase markup -> RTF search & replace patterns
|
||||
include 'includes/transtab_refbase_pdf.inc.php'; // include refbase markup -> PDF search & replace patterns
|
||||
include 'includes/transtab_refbase_latex.inc.php'; // include refbase markup -> LaTeX search & replace patterns
|
||||
include 'includes/transtab_refbase_markdown.inc.php'; // include refbase markup -> Markdown search & replace patterns
|
||||
include 'includes/transtab_refbase_ascii.inc.php'; // include refbase markup -> plain text search & replace patterns
|
||||
|
||||
if ($contentTypeCharset == "UTF-8") // variable '$contentTypeCharset' is defined in 'ini.inc.php'
|
||||
include_once 'includes/transtab_unicode_latex.inc.php'; // include Unicode -> LaTeX translation table
|
||||
else // we assume "ISO-8859-1" by default
|
||||
include_once 'includes/transtab_latin1_latex.inc.php'; // include Latin1 -> LaTeX translation table
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Print any section heading(s):
|
||||
function generateSectionHeading($yearsArray, $typeTitlesArray, $row, $citeOrder, $headingPrefix, $headingSuffix, $sectionMarkupPrefix, $sectionMarkupSuffix, $subSectionMarkupPrefix, $subSectionMarkupSuffix)
|
||||
{
|
||||
global $loc;
|
||||
|
||||
$sectionHeading = "";
|
||||
|
||||
if (!empty($row['year']))
|
||||
$yearHeading = $row['year'];
|
||||
else
|
||||
$yearHeading = $loc["notSpecified"];
|
||||
|
||||
// List records in blocks sorted by record type:
|
||||
if (($citeOrder == "type") OR ($citeOrder == "type-year"))
|
||||
{
|
||||
$typeTitle = generateTypeTitle($row['type'], $row['thesis']); // assign an appropriate title to this record type
|
||||
|
||||
if (!in_array($typeTitle, $typeTitlesArray)) // if this record's type title hasn't occurred already
|
||||
{
|
||||
$typeTitlesArray[$row['type']] = $typeTitle; // add this title to the array of type titles
|
||||
$sectionHeading .= $headingPrefix . $sectionMarkupPrefix . $typeTitle . $sectionMarkupSuffix . $headingSuffix; // print out a the current record type
|
||||
}
|
||||
|
||||
// List records in sub-blocks sorted by year:
|
||||
if ($citeOrder == "type-year")
|
||||
{
|
||||
if (!isset($yearsArray[$typeTitle]) OR !in_array($yearHeading, $yearsArray[$typeTitle])) // if this record's year hasn't occurred already for this record's type
|
||||
{
|
||||
$yearsArray[$typeTitle][] = $yearHeading; // add it to the record-specific array of years
|
||||
$sectionHeading .= $headingPrefix . $subSectionMarkupPrefix . $yearHeading . $subSectionMarkupSuffix . $headingSuffix; // print out a the current year
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// List records in blocks sorted by year:
|
||||
elseif ($citeOrder == "year")
|
||||
{
|
||||
if (!in_array($yearHeading, $yearsArray)) // if this record's year hasn't occurred already
|
||||
{
|
||||
$yearsArray[] = $yearHeading; // add it to the array of years
|
||||
$sectionHeading .= $headingPrefix . $sectionMarkupPrefix . $yearHeading . $sectionMarkupSuffix . $headingSuffix; // print out a the current year
|
||||
}
|
||||
}
|
||||
|
||||
return array($yearsArray, $typeTitlesArray, $sectionHeading);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Assign an appropriate title to a given record or thesis type:
|
||||
function generateTypeTitle($recordType, $thesis)
|
||||
{
|
||||
global $contentTypeCharset; // defined in 'ini.inc.php'
|
||||
|
||||
global $citeType;
|
||||
global $loc;
|
||||
|
||||
global $availableTypeTitlesArray; // these variables are made globally available from within this function
|
||||
global $availableThesisTitlesArray;
|
||||
|
||||
if (empty($thesis))
|
||||
{
|
||||
if (!isset($availableTypeTitlesArray))
|
||||
// Map record types with items of the global localization array ('$loc'):
|
||||
$availableTypeTitlesArray = array(
|
||||
"Journal Article" => "JournalArticles",
|
||||
"Abstract" => "Abstracts",
|
||||
"Book Chapter" => "BookContributions",
|
||||
"Book Whole" => "Monographs",
|
||||
"Conference Article" => "ConferenceArticles",
|
||||
"Conference Volume" => "ConferenceVolumes",
|
||||
"Journal" => "Journals",
|
||||
"Magazine Article" => "MagazineArticles",
|
||||
"Manual" => "Manuals",
|
||||
"Manuscript" => "Manuscripts",
|
||||
"Map" => "Maps",
|
||||
"Miscellaneous" => "Miscellaneous",
|
||||
"Newspaper Article" => "NewspaperArticles",
|
||||
"Patent" => "Patents",
|
||||
"Report" => "Reports",
|
||||
"Software" => "Software"
|
||||
);
|
||||
|
||||
if (isset($recordType, $availableTypeTitlesArray))
|
||||
$typeTitle = $loc[$availableTypeTitlesArray[$recordType]];
|
||||
else
|
||||
$typeTitle = $loc["OtherPublications"];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!isset($availableThesisTitlesArray))
|
||||
// Map thesis types with items of the global localization array ('$loc'):
|
||||
$availableThesisTitlesArray = array(
|
||||
"Bachelor's thesis" => "Theses_Bachelor",
|
||||
"Master's thesis" => "Theses_Master",
|
||||
"Ph.D. thesis" => "Theses_PhD",
|
||||
"Diploma thesis" => "Theses_Diploma",
|
||||
"Doctoral thesis" => "Theses_Doctoral",
|
||||
"Habilitation thesis" => "Theses_Habilitation"
|
||||
);
|
||||
|
||||
if (isset($thesis, $availableThesisTitlesArray))
|
||||
$typeTitle = $loc[$availableThesisTitlesArray[$thesis]];
|
||||
else
|
||||
$typeTitle = $loc["Theses_Other"];
|
||||
}
|
||||
|
||||
if (!preg_match("/^html$/i", $citeType)) // for citation formats other than HTML:
|
||||
// apply dirty hack that reverses the HTML encoding of locales (which were HTML encoded globally in 'core.inc.php');
|
||||
// note that function 'html_entity_decode' doesn't support multibyte character sets (such as UTF-8) in PHP versions < 5
|
||||
// (see <http://www.php.net/manual/en/function.html-entity-decode.php>)
|
||||
$typeTitle = html_entity_decode($typeTitle, ENT_QUOTES, $contentTypeCharset);
|
||||
|
||||
return $typeTitle;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
// Format page information:
|
||||
//
|
||||
// NOTES: - this function (and refbase in general) assumes following rules for the original formatting of page information in '$origPageInfo':
|
||||
// - single-page items are given as a page range with identical start & end numbers (e.g. "127-127")
|
||||
// - multi-page items are given as a page range where the end number is greater than the start number (e.g. "127-132")
|
||||
// - for multi-page items where only the start page is known, a hyphen is appended to the start page (e.g. "127-")
|
||||
// - total number of pages are given with a "pp" suffix (e.g. "498 pp"), see TODO
|
||||
// - the given page info is left as is if it does not match any of the above rules (e.g. a single page number is ambiguous since it
|
||||
// could mean a single page or the total number of pages)
|
||||
// - the function attempts to deal with page locators that contain letters (e.g. "A1 - A3" or "4a-4c") but, ATM, locator parts (e.g. "A1")
|
||||
// must contain at least one digit character & must not contain any whitespace
|
||||
//
|
||||
// TODO: - should we only use Unicode-aware regex expressions (i.e. always use '$space', '$digit' or '$word' instead of ' ', '\d' or '\w', etc)?
|
||||
// - recognize & process total number of pages
|
||||
// - for '$shortenPageRangeEnd=true', add support for page locators that contain letters (e.g. "A1 - A3" or "4a-4c")
|
||||
function formatPageInfo($origPageInfo, $pageRangeDelim = "-", $singlePagePrefix = "", $pageRangePrefix = "", $totalPagesPrefix = "", $singlePageSuffix = "", $pageRangeSuffix = "", $totalPagesSuffix = "", $shortenPageRangeEnd = false)
|
||||
{
|
||||
global $alnum, $alpha, $cntrl, $dash, $digit, $graph, $lower, $print, $punct, $space, $upper, $word, $patternModifiers; // defined in 'transtab_unicode_charset.inc.php' and 'transtab_latin1_charset.inc.php'
|
||||
|
||||
// Check original page info for any recognized page locators, and process them appropriately:
|
||||
if (preg_match("/\w*\d+\w* *[$dash]+ *(?:\w*\d+\w*)?/$patternModifiers", $origPageInfo)) // the original page info contains a page range (like: "127-127", "127-132", "A1 - A3", "4a-4c", or "127-" if only start page given)
|
||||
{
|
||||
// Remove any whitespace around dashes or hyphens that indicate a page range:
|
||||
$origPageInfo = preg_replace("/(\w*\d+\w*) *([$dash]+) *(\w*\d+\w*)?(?=[^\w\d]|$)/$patternModifiers", "\\1\\2\\3", $origPageInfo);
|
||||
|
||||
// Split original page info into its functional parts:
|
||||
// NOTE: ATM, we simply split on any whitespace characters, then process all parts with page ranges
|
||||
// (this will also reduce runs of whitespace to a single space)
|
||||
$partsArray = preg_split("/ +/", $origPageInfo);
|
||||
$partsCount = count($partsArray);
|
||||
|
||||
for ($i=0; $i < $partsCount; $i++)
|
||||
{
|
||||
// Format parts with page ranges:
|
||||
// - single-page item:
|
||||
if (preg_match("/(\w*\d+\w*)[$dash]+\\1(?=[^\w\d]|$)/$patternModifiers", $partsArray[$i])) // this part contains a page range with identical start & end numbers (like: "127-127")
|
||||
$partsArray[$i] = preg_replace("/(\w*\d+\w*)[$dash]+\\1(?=[^\w\d]|$)/$patternModifiers", $singlePagePrefix . "\\1" . $singlePageSuffix, $partsArray[$i]);
|
||||
|
||||
// - multi-page item:
|
||||
elseif (preg_match("/\w*\d+\w*[$dash]+(?:\w*\d+\w*)?(?=[^\w\d]|$)/$patternModifiers", $partsArray[$i])) // this part contains a page range (like: "127-132", or "127-" if only start page given)
|
||||
{
|
||||
// In case of '$shortenPageRangeEnd=true', we abbreviate ending page numbers so that digits aren't repeated unnecessarily:
|
||||
if ($shortenPageRangeEnd AND preg_match("/\d+[$dash]+\d+/$patternModifiers", $partsArray[$i])) // ATM, only digit-only page locators (like: "127-132") are supported
|
||||
{
|
||||
// NOTE: the logic of this 'if' clause doesn't work if the original page info contains something like "173-190; 195-195" (where, for the first page range, '$endPage' would be "190;" and not "190")
|
||||
list($startPage, $endPage) = preg_split("/[$dash]+/$patternModifiers", $partsArray[$i]);
|
||||
|
||||
$countStartPage = strlen($startPage);
|
||||
$countEndPage = strlen($endPage);
|
||||
|
||||
if(($countStartPage == $countEndPage) AND ($startPage < $endPage))
|
||||
{
|
||||
for ($j=0; $j < $countStartPage; $j++)
|
||||
{
|
||||
if (preg_match("/^" . substr($startPage, $j, 1) . "/", $endPage)) // if the ending page number has a digit that's identical to the starting page number (at the same digit offset)
|
||||
$endPage = substr($endPage, 1); // remove the first digit from the remaining ending page number
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$partsArray[$i] = $pageRangePrefix . $startPage . $pageRangeDelim . $endPage . $pageRangeSuffix;
|
||||
}
|
||||
else // don't abbreviate ending page numbers:
|
||||
$partsArray[$i] = preg_replace("/(\w*\d+\w*)[$dash]+(\w*\d+\w*)?(?=[^\w\d]|$)/$patternModifiers", $pageRangePrefix . "\\1" . $pageRangeDelim . "\\2" . $pageRangeSuffix, $partsArray[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
$newPageInfo = join(" ", $partsArray); // merge again all parts
|
||||
}
|
||||
else
|
||||
$newPageInfo = $origPageInfo; // page info is ambiguous, so we don't mess with it
|
||||
|
||||
return $newPageInfo;
|
||||
}
|
||||
?>
|
Reference in New Issue
Block a user