// 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/cite.inc.php // Repository: $HeadURL: file:///svn/p/refbase/code/branches/bleeding-edge/includes/cite.inc.php $ // Author(s): Matthias Steffens // // 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 ) $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; } ?>