|
<?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;
|
|
}
|
|
?>
|