function superScriptToLatin1($sourceString)
{
    global $latin1SuperScriptSearchReplaceActionsArray;
    $sourceString = searchReplaceText($latin1SuperScriptSearchReplaceActionsArray, $sourceString, true);
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    return $sourceString;
}
Пример #2
0
function standardizeBibtexOutput($bibtexSourceText)
{
    global $contentTypeCharset;
    // these variables are defined in 'ini.inc.php'
    global $convertExportDataToUTF8;
    // The array '$transtab_refbase_bibtex' contains search & replace patterns for conversion from refbase markup to LaTeX/BibTeX markup & entities.
    // Converts refbase fontshape markup (italic, bold) into LaTeX commands of the 'textcomp' package, super- and subscript as well as greek
    // letters get converted into the respective commands in math mode. You may need to adopt the LaTeX markup to suit your individual needs.
    global $transtab_refbase_bibtex;
    // defined in 'transtab_refbase_bibtex.inc.php'
    // The arrays '$transtab_latin1_bibtex' and '$transtab_unicode_bibtex' provide translation tables for best-effort conversion of higher ASCII
    // characters from ISO-8859-1 (or Unicode, respectively) to LaTeX/BibTeX entities.
    global $transtab_latin1_bibtex;
    // defined in 'transtab_latin1_bibtex.inc.php'
    global $transtab_unicode_bibtex;
    // defined in 'transtab_unicode_bibtex.inc.php'
    // Perform search & replace actions on the given BibTeX text:
    $bibtexSourceText = searchReplaceText($transtab_refbase_bibtex, $bibtexSourceText, true);
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    // Attempt to convert higher ASCII chars that were NOT converted by bibutils to their corresponding LaTeX/BibTeX entities:
    if ($convertExportDataToUTF8 == "no" and $contentTypeCharset != "UTF-8") {
        $bibtexSourceText = searchReplaceText($transtab_latin1_bibtex, $bibtexSourceText, false);
    } else {
        $bibtexSourceText = searchReplaceText($transtab_unicode_bibtex, $bibtexSourceText, false);
    }
    return $bibtexSourceText;
}
function unicodeSubScriptToRefbase($sourceString)
{
    global $unicodeSubScriptSearchReplaceActionsArray;
    $sourceString = searchReplaceText($unicodeSubScriptSearchReplaceActionsArray, $sourceString, true);
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    return "[sub:" . $sourceString . "]";
}
function subScriptToUnicode($sourceString)
{
    global $unicodeSubScriptSearchReplaceActionsArray;
    $sourceString = searchReplaceText($unicodeSubScriptSearchReplaceActionsArray, $sourceString, true);
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    return $sourceString;
}
Пример #5
0
function citeRecord($row, $citeStyle, $citeType, $markupPatternsArray, $encodeHTML)
{
    global $defaultTextCitationFormat;
    // defined in 'ini.inc.php'
    global $userOptionsArray;
    // '$userOptionsArray' is made globally available by function 'generateCitations()' in 'search.php'
    // output records suitable for citation within a text, e.g., like: "Ambrose 1991 {3735}", "Ambrose & Renaud 1995 {3243}" or "Ambrose et al. 2001 {4774}"
    if (!empty($userOptionsArray) and $userOptionsArray['use_custom_text_citation_format'] == "yes") {
        // if the user wants to use a custom text citation format
        $textCitationFormat = $userOptionsArray['text_citation_format'];
    } else {
        // use the default text citation format that was specified by the admin in 'ini.inc.php'
        $textCitationFormat = $defaultTextCitationFormat;
    }
    // this is a stupid hack that maps the names of the '$row' array keys to those used
    // by the '$formVars' array (which is required by function 'parsePlaceholderString()')
    // (eventually, the '$formVars' array should use the MySQL field names as names for its array keys)
    $formVars = buildFormVarsArray($row);
    // function 'buildFormVarsArray()' is defined in 'include.inc.php'
    if (preg_match("/RTF|LaTeX/i", $citeType)) {
        $textCitationFormat = preg_replace("/([{}])/i", "\\\\1", $textCitationFormat);
        // in case of RTF or LaTeX output we need to escape braces in placeholder strings
        $fallbackPlaceholderString = "<:authors[2| & | et al.]:>< :year:>< \\{:recordIdentifier:\\}>";
    } else {
        $fallbackPlaceholderString = "<:authors[2| & | et al.]:>< :year:>< {:recordIdentifier:}>";
    }
    // generate a text citation according to the given naming scheme:
    $record = parsePlaceholderString($formVars, $textCitationFormat, $fallbackPlaceholderString);
    // function 'parsePlaceholderString()' is defined in 'include.inc.php'
    // Perform search & replace actions on the text:
    $searchReplaceActionsArray["(et +al\\.)"] = $markupPatternsArray["italic-prefix"] . "\\1" . $markupPatternsArray["italic-suffix"];
    // print 'et al.' in italic
    $record = searchReplaceText($searchReplaceActionsArray, $record, false);
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    return $record;
}
Пример #6
0
function citeRecords($result, $rowsFound, $query, $queryURL, $showQuery, $showLinks, $rowOffset, $showRows, $previousOffset, $nextOffset, $wrapResults, $citeStyle, $citeOrder, $citeType, $orderBy, $headerMsg, $userID, $viewType)
{
    global $officialDatabaseName;
    // these variables are defined in 'ini.inc.php'
    global $databaseBaseURL;
    global $contentTypeCharset;
    global $client;
    // 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'
    $plainTextData = "";
    // make sure that our buffer variable is empty
    // Header:
    if (!empty($headerMsg)) {
        // Decode any HTML entities:
        // (these may occur in the header message e.g. if the user's preferred display language is not English but German or French, etc)
        $headerMsg = decodeHTML($contentTypeCharset, $headerMsg);
        // function 'decodeHTML()' is defined in 'include.inc.php', and '$contentTypeCharset' is defined in 'ini.inc.php'
        // Convert refbase markup in the header message into plain text:
        $headerMsg = searchReplaceText($transtab_refbase_ascii, $headerMsg, true);
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        $plainTextData .= "{$headerMsg}\n\n";
        // prefix any passed header message
    }
    // Initialize array variables:
    $yearsArray = array();
    $typeTitlesArray = array();
    // Define inline text markup to be used by the 'citeRecord()' function:
    $markupPatternsArray = array("bold-prefix" => "", "bold-suffix" => "", "italic-prefix" => "", "italic-suffix" => "", "underline-prefix" => "", "underline-suffix" => "", "endash" => "-", "emdash" => "-", "ampersand" => "&", "double-quote" => '"', "double-quote-left" => '"', "double-quote-right" => '"', "single-quote" => "'", "single-quote-left" => "'", "single-quote-right" => "'", "less-than" => "<", "greater-than" => ">", "newline" => "\n");
    // Defines search & replace 'actions' that will be applied upon TEXT output 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));
    // For CLI queries, we'll allow paging thru the result set, i.e. we honour the values of the CLI options '-S|--start' ('$rowOffset')
    // and '-R|--rows' ('$showRows') ('$rowOffset' and '$showRows' are re-assigned in function 'seekInMySQLResultsToOffset()' in 'include.inc.php')
    if (preg_match("/^cli/i", $client)) {
        // if the query originated from a command line client such as the "refbase" CLI client ("cli-refbase-1.0")
        $showMaxRows = $showRows;
    } else {
        $showMaxRows = $rowsFound;
    }
    // otherwise show all rows
    // LOOP OVER EACH RECORD:
    // Fetch one page of results (or less if on the last page)
    // (i.e., upto the limit specified in $showMaxRows) fetch a row into the $row array and ...
    for ($rowCounter = 0; $rowCounter < $showMaxRows && ($row = @mysql_fetch_array($result)); $rowCounter++) {
        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'])) {
                    $row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $row[$rowFieldName], true);
                }
            }
        }
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        // Order attributes according to the chosen output style & record type:
        $record = citeRecord($row, $citeStyle, $citeType, $markupPatternsArray, false);
        // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'cite' directory of the refbase root directory), see function 'generateCitations()'
        // Print out the current record:
        if (!empty($record)) {
            // Print any section heading(s):
            if (preg_match("/year|type/i", $citeOrder)) {
                list($yearsArray, $typeTitlesArray, $sectionHeading) = generateSectionHeading($yearsArray, $typeTitlesArray, $row, $citeOrder, "", "", "", "\n\n", "", "\n\n");
                // function 'generateSectionHeading()' is defined in 'cite.inc.php'
                $plainTextData .= $sectionHeading;
            }
            // Write plain TEXT paragraph:
            if (preg_match("/^cli/i", $client)) {
                // This is a stupid hack that maps the names of the '$row' array keys to those used
                // by the '$formVars' array (which is required by function 'generateCiteKey()')
                // (eventually, the '$formVars' array should use the MySQL field names as names for its array keys)
                $formVars = buildFormVarsArray($row);
                // function 'buildFormVarsArray()' is defined in 'include.inc.php'
                // Generate or extract the cite key for this record:
                // NOTE: currently, the following placeholders are not available for citation output:
                //       <:keywords:>, <:issn:>, <:area:>, <:notes:>, <:userKeys:>
                //       if the cite key specification uses one of these placeholders, it will get ignored
                $citeKey = generateCiteKey($formVars);
                // function 'generateCiteKey()' is defined in 'include.inc.php'
                $plainTextData .= "[" . $row['serial'] . "] ";
                if (!empty($citeKey)) {
                    // Use the custom cite key that's been build according to the user's individual export options:
                    $plainTextData .= "{" . $citeKey . "} ";
                }
            }
            $plainTextData .= $record . "\n\n";
            // create paragraph with encoded record text
        }
    }
    if (preg_match("/^cli/i", $client)) {
        // Calculate the maximum result number on each page:
        if ($rowOffset + $showRows < $rowsFound) {
            $showMaxRow = $rowOffset + $showRows;
        } else {
            $showMaxRow = $rowsFound;
        }
        // for the last results page, correct the maximum result number if necessary
        if ($rowsFound == 1) {
            $footerInfoPart = " record found";
        } else {
            $footerInfoPart = " records found";
        }
        $rowsFoundInfo = $rowOffset + 1 . "-" . $showMaxRow . " of " . $rowsFound . $footerInfoPart;
        // prints e.g. "1-5 of 23 records found"
        $rowsFoundDelimiter = preg_replace("/./i", "-", $rowsFoundInfo);
        // generate a line of hyphens which has the same length as the string in '$rowsFoundInfo' (e.g. "-----------------------")
        $plainTextData .= $rowsFoundDelimiter . "\n" . $rowsFoundInfo . "\n\n";
        // append info about rows displayed/found
        $plainTextData .= $officialDatabaseName . "\n" . $databaseBaseURL . "\n\n";
        // append database name and URL (comment this line if you don't like that)
        if ($showQuery == "1") {
            // display SQL query:
            $plainTextData .= "Query: " . $query . "\n\n";
        }
    }
    return $plainTextData;
}
Пример #7
0
function citeRecords($result, $rowsFound, $query, $queryURL, $showQuery, $showLinks, $rowOffset, $showRows, $previousOffset, $nextOffset, $wrapResults, $citeStyle, $citeOrder, $citeType, $orderBy, $headerMsg, $userID, $viewType)
{
    global $officialDatabaseName;
    // these variables are defined in 'ini.inc.php'
    global $databaseBaseURL;
    global $contentTypeCharset;
    global $pdfPageSize;
    global $client;
    // The array '$transtab_refbase_pdf' contains search & replace patterns for conversion from refbase markup to PDf markup & entities
    global $transtab_refbase_pdf;
    // defined in 'transtab_refbase_pdf.inc.php'
    // Initialize array variables:
    $yearsArray = array();
    $typeTitlesArray = array();
    // Define inline text markup to be used by the 'citeRecord()' function:
    $markupPatternsArray = array("bold-prefix" => "<b>", "bold-suffix" => "</b>", "italic-prefix" => "<i>", "italic-suffix" => "</i>", "underline-prefix" => "<u>", "underline-suffix" => "</u>", "endash" => "¦", "emdash" => "©", "ampersand" => "&", "double-quote" => '"', "double-quote-left" => "ª", "double-quote-right" => "¬", "single-quote" => "'", "single-quote-left" => "®", "single-quote-right" => "¶", "less-than" => "<", "greater-than" => ">", "newline" => "\n");
    // Defines search & replace 'actions' that will be applied upon PDF output to all those refbase fields that are listed
    // in the corresponding 'fields' element:
    $pdfSearchReplaceActionsArray = array(array('fields' => array("title", "publication", "abbrev_journal", "address", "keywords", "abstract", "orig_title", "series_title", "abbrev_series_title", "notes"), 'actions' => $transtab_refbase_pdf));
    // For CLI queries, we'll allow paging thru the result set, i.e. we honour the values of the CLI options '-S|--start' ('$rowOffset')
    // and '-R|--rows' ('$showRows') ('$rowOffset' and '$showRows' are re-assigned in function 'seekInMySQLResultsToOffset()' in 'include.inc.php')
    if (preg_match("/^cli/i", $client)) {
        // if the query originated from a command line client such as the "refbase" CLI client ("cli-refbase-1.0")
        $showMaxRows = $showRows;
    } else {
        $showMaxRows = $rowsFound;
    }
    // otherwise show all rows
    // Setup the basic PDF document structure (PDF functions defined in 'class.ezpdf.php'):
    $pdf = new Cezpdf($pdfPageSize, 'portrait');
    // initialize PDF object
    if (!empty($headerMsg)) {
        // adjust upper page margin if a custom header message was given
        $pageMarginTop = "70";
    } else {
        $pageMarginTop = "50";
    }
    $pdf->ezSetMargins($pageMarginTop, 70, 50, 50);
    // set document margins (top, bottom, left, right)
    // Set fonts:
    $headingFont = 'includes/classes/org/pdf-php/fonts/Helvetica.afm';
    $textBodyFont = 'includes/classes/org/pdf-php/fonts/Times-Roman.afm';
    // Re-map character numbers from the 0->255 range to a named character, i.e. replace an (unused) character for any other PostScript char;
    // see the PDF reference for a list of supported PostScript/PDF character names: <http://www.adobe.com/devnet/pdf/pdf_reference.html>;
    // for the decimal code numbers of the ISO-8859-1 character set, see e.g.: <http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html>
    $diff = array(166 => 'endash', 169 => 'emdash', 170 => 'quotedblleft', 172 => 'quotedblright', 174 => 'quoteleft', 182 => 'quoteright');
    // Select a font:
    $pdf->selectFont($textBodyFont, array('encoding' => 'WinAnsiEncoding', 'differences' => $diff));
    $pdf->openHere('Fit');
    // Put a footer (and optionally a header) on all the pages:
    $all = $pdf->openObject();
    // start an independent object; all further writes to a page will actually go into this object, until a 'closeObject()' call is made
    $pdf->saveState();
    $pdf->setStrokeColor(0, 0, 0, 1);
    // set line color
    $pdf->setLineStyle(0.5);
    // set line width
    // - print header line and header message at the specified x/y position:
    if (!empty($headerMsg)) {
        // Remove any colon (":") from end of header message:
        $headerMsg = trimTextPattern($headerMsg, ":", false, true);
        // function 'trimTextPattern()' is defined in 'include.inc.php'
        // Decode any HTML entities:
        // (these may occur in the header message e.g. if the user's preferred display language is not English but German or French, etc)
        $headerMsg = decodeHTML($contentTypeCharset, $headerMsg);
        // function 'decodeHTML()' is defined in 'include.inc.php', and '$contentTypeCharset' is defined in 'ini.inc.php'
        // Convert refbase markup in the header message into appropriate PDF markup & entities:
        $headerMsg = searchReplaceText($transtab_refbase_pdf, $headerMsg, true);
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        if ($pdfPageSize == 'a4') {
            $pdf->line(20, 800, 575, 800);
            $pdf->addText(50, 805, 10, $headerMsg);
        } elseif ($pdfPageSize == 'letter') {
            $pdf->line(20, 750, 592, 750);
            $pdf->addText(50, 755, 10, $headerMsg);
        }
    }
    // - print footer line and footer text at the specified x/y position:
    if ($pdfPageSize == 'a4') {
        $pdf->line(20, 40, 575, 40);
        $pdf->addText(50, 28, 10, $officialDatabaseName . ' ¦ ' . $databaseBaseURL);
        // w.r.t. the endash, see notes at '$markupPatternsArray' and '$diff' above
    } elseif ($pdfPageSize == 'letter') {
        $pdf->line(20, 40, 592, 40);
        $pdf->addText(50, 28, 10, $officialDatabaseName . ' ¦ ' . $databaseBaseURL);
    }
    $pdf->restoreState();
    $pdf->closeObject();
    // close the currently open object; further writes will now go to the current page
    $pdf->addObject($all, 'all');
    // note that object can be told to appear on just odd or even pages by changing 'all' to 'odd' or 'even'
    // Start printing page numbers:
    if ($pdfPageSize == 'a4') {
        $pdf->ezStartPageNumbers(550, 28, 10, '', '', 1);
    } elseif ($pdfPageSize == 'letter') {
        $pdf->ezStartPageNumbers(567, 28, 10, '', '', 1);
    }
    // LOOP OVER EACH RECORD:
    // Fetch one page of results (or less if on the last page)
    // (i.e., upto the limit specified in $showMaxRows) fetch a row into the $row array and ...
    for ($rowCounter = 0; $rowCounter < $showMaxRows && ($row = @mysql_fetch_array($result)); $rowCounter++) {
        foreach ($row as $rowFieldName => $rowFieldValue) {
            // Apply search & replace 'actions' to all fields that are listed in the 'fields' element of the arrays contained in '$pdfSearchReplaceActionsArray':
            foreach ($pdfSearchReplaceActionsArray as $fieldActionsArray) {
                if (in_array($rowFieldName, $fieldActionsArray['fields'])) {
                    $row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $row[$rowFieldName], true);
                }
            }
        }
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        // Order attributes according to the chosen output style & record type:
        $record = citeRecord($row, $citeStyle, $citeType, $markupPatternsArray, false);
        // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'cite' directory of the refbase root directory), see function 'generateCitations()'
        // Print out the current record:
        if (!empty($record)) {
            // Print any section heading(s):
            if (preg_match("/year|type/i", $citeOrder)) {
                $headingPrefix = "";
                $headingSuffix = "";
                $sectionMarkupPrefix = "<b>";
                $sectionMarkupSuffix = "</b>\n";
                $subSectionMarkupPrefix = "";
                $subSectionMarkupSuffix = "\n";
                if ($citeOrder == "type-year") {
                    $sectionMarkupSuffix .= "\n";
                }
                list($yearsArray, $typeTitlesArray, $sectionHeading) = generateSectionHeading($yearsArray, $typeTitlesArray, $row, $citeOrder, $headingPrefix, $headingSuffix, $sectionMarkupPrefix, $sectionMarkupSuffix, $subSectionMarkupPrefix, $subSectionMarkupSuffix);
                // function 'generateSectionHeading()' is defined in 'cite.inc.php'
                if (!empty($sectionHeading)) {
                    $pdf->selectFont($headingFont, array('encoding' => 'WinAnsiEncoding', 'differences' => $diff));
                    // use Helvetica
                    $pdf->ezText($sectionHeading, '14', array('justification' => 'left'));
                    // create heading using a font size of 14pt
                }
            }
            // If character encoding is not UTF-8 already, convert record text to UTF-8:
            //				if ($contentTypeCharset != "UTF-8")
            //					$record = convertToCharacterEncoding("UTF-8", "IGNORE", $record); // function 'convertToCharacterEncoding()' is defined in 'include.inc.php'
            // NOTE: Export of cited references to PDF does currently only work with a latin1 database but not with UTF-8 (since I don't know how to write Unicode characters to PDF).
            //       As a workaround, we could convert UTF-8 characters to latin1 if possible (and omit any other higher ASCII chars)
            // TODO: While this workaround indeed fixes display issues with higher ASCII chars that have equivalents in the latin1 charset, this will currently swallow higher ASCII
            //       hyphens/dashes such as endashes (which display correctly without this workaround).
            //				if ($contentTypeCharset == "UTF-8")
            //					$record = convertToCharacterEncoding("ISO-8859-1", "TRANSLIT", $record, "UTF-8"); // function 'convertToCharacterEncoding()' is defined in 'include.inc.php'
            // Set paragraph text options:
            $textOptions = array('justification' => 'full');
            // possible array options:
            // 'left'=> number, gap to leave from the left margin
            // 'right'=> number, gap to leave from the right margin
            // 'aleft'=> number, absolute left position (overrides 'left')
            // 'aright'=> number, absolute right position (overrides 'right')
            // 'justification' => 'left','right','center','centre','full'
            //
            // only set one of the next two items (leading overrides spacing)
            // 'leading' => number, defines the total height taken by the line, independent of the font height.
            // 'spacing' => a real number, though usually set to one of 1, 1.5, 2 (line spacing as used in word processing)
            // Write PDF paragraph:
            $pdf->selectFont($textBodyFont, array('encoding' => 'WinAnsiEncoding'));
            // use Times-Roman
            $pdf->ezText($record . "\n", '12', $textOptions);
            // create text block with record text using "Times Roman" and a font size of 12pt
        }
    }
    return $pdf->ezStream();
}
Пример #8
0
function citeRecords($result, $rowsFound, $query, $queryURL, $showQuery, $showLinks, $rowOffset, $showRows, $previousOffset, $nextOffset, $wrapResults, $citeStyle, $citeOrder, $citeType, $orderBy, $headerMsg, $userID, $viewType)
{
    global $contentTypeCharset;
    // defined in 'ini.inc.php'
    global $client;
    // The array '$transtab_refbase_latex' contains search & replace patterns for conversion from refbase markup to LaTeX markup & entities.
    // Converts refbase fontshape markup (italic, bold) into LaTeX commands of the 'textcomp' package, super- and subscript as well as greek
    // symbols get converted into the respective commands in math mode. You may need to adopt the LaTeX markup to suit your individual needs.
    global $transtab_refbase_latex;
    // defined in 'transtab_refbase_latex.inc.php'
    // The arrays '$transtab_latin1_latex' and '$transtab_unicode_latex' provide translation tables for best-effort conversion of higher ASCII
    // characters from ISO-8859-1 (or Unicode, respectively) to LaTeX entities.
    global $transtab_latin1_latex;
    // defined in 'transtab_latin1_latex.inc.php'
    global $transtab_unicode_latex;
    // defined in 'transtab_unicode_latex.inc.php'
    // --- Begin style-specific settings ----------------------------------
    // NOTE: the given settings are meant to be used with the natbib package;
    //       you'll have to adopt these settings if you'd like to generate a
    //       .bbl file for another style/package
    // 1) Define header with .bst style-specific declarations:
    // NOTE: since this header is normally inserted by BibTeX from the used .bst style, I'm not sure if there's a variant of this header that's
    //       universally accepted by natbib. So, if necessary adopt it to your needs.
    // -- by default, we use this header (as inserted by a .bst style that was generated from 'merlin.mbs' via the docstrip utility):
    $bblHeader = "\\providecommand{\\natexlab}[1]{#1}" . "\n" . "\\providecommand{\\url}[1]{\\texttt{#1}}" . "\n" . "\\providecommand{\\urlprefix}{URL }" . "\n" . "\\providecommand{\\eprint}[2][]{\\url{#2}}" . "\n\n";
    // -- here's another header example (as inserted by 'elsart-harv.bst'):
    //		$bblHeader = "\\expandafter\\ifx\\csname natexlab\\endcsname\\relax\\def\\natexlab#1{#1}\\fi" . "\n"
    //		           . "\\expandafter\\ifx\\csname url\\endcsname\\relax" . "\n"
    //		           . "  \\def\\url#1{\\texttt{#1}}\\fi" . "\n"
    //		           . "\\expandafter\\ifx\\csname urlprefix\\endcsname\\relax\\def\\urlprefix{URL }\\fi" . "\n\n";
    // 2) Define name of \bibitem command:
    $bibItemCommand = "\\bibitem";
    // use "\\harvarditem" for the Harvard family of styles
    // 3) Define variables and placeholder strings which together will form the \bibitem option string:
    // -- variables:
    $betweenShortAuthorsDelim = " & ";
    // used to connect individual author names in the short author list
    $betweenFullAuthorsDelim = ", ";
    // used to connect multiple authors in the full author list
    $betweenLastAuthorsDelim = " & ";
    // used to connect the second-to-last author with the last author in the full author list
    $etalIdentifierString = " et~al.";
    // appended to the first author's last name if the record's number of authors exceeds the number given in '$maxAuthorCountInShortAuthorList'
    $maxAuthorCountInShortAuthorList = 2;
    // maximum number of authors to be used in the short author list
    // -- placeholder strings:
    // (please see the refbase online documentation for more info about placeholders and their syntax: <http://placeholders.refbase.net/>)
    $year = "<:year[4]:>";
    // year format, e.g. "1990"
    $shortAuthorList = "<:authors[" . $maxAuthorCountInShortAuthorList . "|" . $betweenShortAuthorsDelim . "|" . $etalIdentifierString . "]:>";
    // format of the short author list which is used as text citation, e.g. "Jones", "Jones and Baker" or "Jones et al."
    $fullAuthorList = "<:authors[0|_#_§_~_|]:>";
    // format of the full author list, e.g. "Jones, Baker, and Williams"
    // NOTE: in the above placeholder string, we use the string "_#_§_~_" as author delimiter which allows us to uniquely identify that delimiter again below, and replace it with the contents of either '$betweenFullAuthorsDelim' or '$betweenLastAuthorsDelim' (depending on its position)
    // 4) Define \bibitem option format:
    // -- extended natbib 5.3 style:
    $bibItemOptionShort = "[{" . $shortAuthorList . "}(" . $year . ")" . "]";
    // e.g.: \bibitem[{Jones et al.}(1990)]{key}...
    $bibItemOptionFull = "[{" . $shortAuthorList . "}(" . $year . "){" . $fullAuthorList . "}]";
    // e.g.: \bibitem[{Jones et al.}(1990){Jones, Baker, and Williams}]{key}...
    // NOTE: since the author lists may contain parentheses, we need to enclose them in curly brackets to work around a natbib limitation
    // -- native natbib style:
    //		$bibItemOptionShort = "[" . $shortAuthorList . "(" . $year . ")" . "]"; // e.g.: \bibitem[Jones et al.(1990)]{key}...
    //		$bibItemOptionFull = "";
    // -- apalike style:
    //		$bibItemOptionShort = "[" . $shortAuthorList . ", " . $year . "]"; // e.g.: \bibitem[Jones et al., 1990]{key}...
    //		$bibItemOptionFull = "";
    // -- newapa or chicago styles:
    //		$bibItemOptionShort = "[\\protect\\citeauthoryear{" . $fullAuthorList . "}{" . $shortAuthorList . "}{" . $year . "}" . "]"; // this assumes that it's not allowed to omit the full author list, though I dunno)
    //		$bibItemOptionFull = "[\\protect\\citeauthoryear{" . $fullAuthorList . "}{" . $shortAuthorList . "}{" . $year . "}" . "]"; // e.g.: \bibitem[\protect\citeauthoryear{Jones, Baker, and Williams}{Jones et al.}{1990}]{key}...
    // -- named style:
    //		$bibItemOptionShort = "[\\protect\\citeauthoryear{" . $shortAuthorList . "}{" . $year . "}" . "]"; // e.g.: \bibitem[\protect\citeauthoryear{Jones et al.}{1990}]{key}...
    //		$bibItemOptionFull = "";
    // -- astron style:
    //		$bibItemOptionShort = "[\\protect\\astroncite{" . $shortAuthorList . "}{" . $year . "}" . "]"; // e.g.: \bibitem[\protect\astroncite{Jones et al.}{1990}]{key}...
    //		$bibItemOptionFull = "";
    // -- authordate style:
    //		$bibItemOptionShort = "[\\protect\\citename{" . $shortAuthorList . ", }" . $year . "]"; // e.g.: \bibitem[\protect\citename{Jones et al., }1990]{key}...
    //		$bibItemOptionFull = "";
    // -- harvard style:
    //		$bibItemOptionShort = "[" . $shortAuthorList . "]{" . $fullAuthorList . "}{" . $year . "}"; // this assumes that it's not allowed to omit the full author list, though I dunno)
    //		$bibItemOptionFull = "[" . $shortAuthorList . "]{" . $fullAuthorList . "}{" . $year . "}"; // e.g.: \harvarditem[Jones et al.]{Jones, Baker, and Williams}{1990}{key}...
    // 5) Define deduplication prefix and suffix strings:
    //    Identical text citation strings get uniquified by appending letters to the year, e.g. duplicate occurrences
    //    of "Jones et al. 1990" should become "Jones et al. 1990a" and "Jones et al. 1990b" in the final output.
    //    These prefix/suffix strings will be inserted before/after the deduplication letter:
    $dedupPrefix = "{\\natexlab{";
    // these prefix/suffix strings are required by natbib; if any custom command (such as '\natexlab') is used, make sure that the command is also defined above in variable '$bblHeader'
    $dedupSuffix = "}}";
    // --- End style-specific settings ------------------------------------
    // Initialize array variables:
    $yearsArray = array();
    $typeTitlesArray = array();
    $bibItemsArray = array();
    // Define inline text markup to be used by the 'citeRecord()' function:
    $markupPatternsArray = array("bold-prefix" => "\\textbf{", "bold-suffix" => "}", "italic-prefix" => "\\textit{", "italic-suffix" => "}", "underline-prefix" => "\\ul{", "underline-suffix" => "}", "endash" => "--", "emdash" => "---", "ampersand" => "&", "double-quote" => '"', "double-quote-left" => "{\\textquotedblleft}", "double-quote-right" => "{\\textquotedblright}", "single-quote" => "'", "single-quote-left" => "{\\textquoteleft}", "single-quote-right" => "{\\textquoteright}", "less-than" => "<", "greater-than" => ">", "newline" => "\n\n");
    // Defines search & replace 'actions' that will be applied upon LaTeX output to all those refbase fields that are listed
    // in the corresponding 'fields' element:
    $latexSearchReplaceActionsArray = array(array('fields' => array("title", "publication", "abbrev_journal", "address", "keywords", "abstract", "orig_title", "series_title", "abbrev_series_title", "notes"), 'actions' => $transtab_refbase_latex));
    // For CLI queries, we'll allow paging thru the result set, i.e. we honour the values of the CLI options '-S|--start' ('$rowOffset')
    // and '-R|--rows' ('$showRows') ('$rowOffset' and '$showRows' are re-assigned in function 'seekInMySQLResultsToOffset()' in 'include.inc.php')
    if (preg_match("/^cli/i", $client)) {
        // if the query originated from a command line client such as the "refbase" CLI client ("cli-refbase-1.0")
        $showMaxRows = $showRows;
    } else {
        $showMaxRows = $rowsFound;
    }
    // otherwise show all rows
    // Setup the basic .bbl document structure:
    $latexData = "\\begin{thebibliography}{" . $showMaxRows . "}\n\n";
    // Add header with .bst style-specific declarations:
    $latexData .= $bblHeader;
    // LOOP OVER EACH RECORD:
    // Fetch one page of results (or less if on the last page)
    // (i.e., upto the limit specified in $showMaxRows) fetch a row into the $row array and ...
    for ($rowCounter = 0; $rowCounter < $showMaxRows && ($row = @mysql_fetch_array($result)); $rowCounter++) {
        foreach ($row as $rowFieldName => $rowFieldValue) {
            // Apply search & replace 'actions' to all fields that are listed in the 'fields' element of the arrays contained in '$latexSearchReplaceActionsArray':
            foreach ($latexSearchReplaceActionsArray as $fieldActionsArray) {
                if (in_array($rowFieldName, $fieldActionsArray['fields'])) {
                    $row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $row[$rowFieldName], true);
                }
            }
        }
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        // Order attributes according to the chosen output style & record type:
        $record = citeRecord($row, $citeStyle, $citeType, $markupPatternsArray, false);
        // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'cite' directory of the refbase root directory), see function 'generateCitations()'
        // Print out the current record:
        if (!empty($record)) {
            // This is a stupid hack that maps the names of the '$row' array keys to those used
            // by the '$formVars' array (which is required by function 'generateCiteKey()')
            // (eventually, the '$formVars' array should use the MySQL field names as names for its array keys)
            $formVars = buildFormVarsArray($row);
            // function 'buildFormVarsArray()' is defined in 'include.inc.php'
            // Generate or extract the cite key for this record:
            // NOTE: currently, the following placeholders are not available for citation output:
            //       <:keywords:>, <:issn:>, <:area:>, <:notes:>, <:userKeys:>
            //       if the cite key specification uses one of these placeholders, it will get ignored
            $citeKey = generateCiteKey($formVars);
            // function 'generateCiteKey()' is defined in 'include.inc.php'
            // The '\bibitem' command requires a cite key, which is why we'll include the record's serial number
            // even when the user's export options specify 'export_cite_keys=no' or 'autogenerate_cite_keys=no':
            // NOTE: maybe we should always generate a cite key here, even if 'export_cite_keys=no' or 'autogenerate_cite_keys=no'??
            if (empty($citeKey)) {
                $citeKey = $row['serial'];
            }
            // Generate the \bibitem option string that's used to build the proper text citation:
            $bibItemOptionShortString = parsePlaceholderString($formVars, $bibItemOptionShort, "<:authors[2| and | et~al.]:><(:year:)>");
            // function 'parsePlaceholderString()' is defined in 'include.inc.php'
            if (!empty($bibItemOptionFull) and preg_match("/^[^;]+(;[^;]+){" . $maxAuthorCountInShortAuthorList . "}/", $row['author'])) {
                // include full author list:
                $bibItemOptionString = parsePlaceholderString($formVars, $bibItemOptionFull, "<:authors[2| and | et~al.]:><(:year:)><:authors[0|, |]:>");
                $bibItemOptionString = preg_replace("/_#_§_~_(?!.*?_#_§_~_)/", $betweenLastAuthorsDelim, $bibItemOptionString);
                // replace last occurrence of "_#_§_~_"
                $bibItemOptionString = preg_replace("/_#_§_~_/", $betweenFullAuthorsDelim, $bibItemOptionString);
                // replace all other occurrences of "_#_§_~_"
            } else {
                // only include short author list:
                $bibItemOptionString = $bibItemOptionShortString;
            }
            // In case of duplicate text citation strings, append a letter to the year in the \bibitem option string as well as in the formatted reference:
            // NOTE: - this is not fool proof and currently only works if there are no more than 26 duplicate text citations (letters a-z)
            //       - the below replace actions get triggered on the first four-digit number that happens to be identical to the record's year, but depending on the reference format, this may not be the actual year of the reference but some other number!
            for ($i = 0; isset($bibItemsArray[$bibItemOptionShortString]); $i++) {
                // Update the existing \bibitem entry (that has an identical text citation string) and append an "a" to it's year items:
                if ($i == 0) {
                    $dedupPrefixQuoted = preg_quote($dedupPrefix, "/");
                    // escape meta characters (including '/' that is used as delimiter for the PCRE replace functions below and which gets passed as second argument)
                    $dedupSuffixQuoted = preg_quote($dedupSuffix, "/");
                    $oldBibItemOptionShortString = preg_replace("/^\\[(.+)\\]\$/", "\\1", $bibItemOptionShortString);
                    // remove square brackets from short \bibitem option string (which is required for the subsequent 'str_replace()' action to work with short and full option strings)
                    $newBibItemOptionShortString = preg_replace("/(" . $row['year'] . ")(" . $dedupPrefixQuoted . "[a-z]*" . $dedupSuffixQuoted . ")*/", "\\1" . $dedupPrefix . "a" . $dedupSuffix, $oldBibItemOptionShortString, 1);
                    $bibItemsArray[$bibItemOptionShortString] = str_replace($oldBibItemOptionShortString, $newBibItemOptionShortString, $bibItemsArray[$bibItemOptionShortString]);
                    $bibItemsArray[$bibItemOptionShortString] = preg_replace("/(" . $row['year'] . ")(" . $dedupPrefixQuoted . "[a-z]*" . $dedupSuffixQuoted . ")*(?!.*?" . $row['year'] . ")/", "\\1" . $dedupPrefix . "a" . $dedupSuffix, $bibItemsArray[$bibItemOptionShortString], 1);
                    // note that this will fail if the formatted reference contains a number after the year that is identical to the year!
                }
                // Append a letter to the year items of the current \bibitem entry:
                $bibItemOptionShortString = preg_replace("/(" . $row['year'] . ")(" . $dedupPrefixQuoted . "[a-z]*" . $dedupSuffixQuoted . ")*/e", "'\\1{$dedupPrefix}'.chr(98 + {$i}).'{$dedupSuffix}'", $bibItemOptionShortString, 1);
                // the 'e' modifier allows to execute PHP code within the replacement pattern
                $bibItemOptionString = preg_replace("/(" . $row['year'] . ")(" . $dedupPrefixQuoted . "[a-z]*" . $dedupSuffixQuoted . ")*/e", "'\\1{$dedupPrefix}'.chr(98 + {$i}).'{$dedupSuffix}'", $bibItemOptionString, 1);
                $record = preg_replace("/(" . $row['year'] . ")(" . $dedupPrefixQuoted . "[a-z]*" . $dedupSuffixQuoted . ")*/e", "'\\1{$dedupPrefix}'.chr(98 + {$i}).'{$dedupSuffix}'", $record, 1);
            }
            // Attempt to convert higher ASCII chars (i.e., characters with an ASCII value of >= 128) to their corresponding LaTeX entities:
            if ($contentTypeCharset == "UTF-8") {
                $recordEncoded = searchReplaceText($transtab_unicode_latex, $record, false);
            } else {
                $recordEncoded = searchReplaceText($transtab_latin1_latex, $record, false);
            }
            // We have to make sure that the \bibitem option string also contains proper LaTeX entities:
            if ($contentTypeCharset == "UTF-8") {
                $bibItemOptionStringEncoded = searchReplaceText($transtab_unicode_latex, $bibItemOptionString, false);
            } else {
                $bibItemOptionStringEncoded = searchReplaceText($transtab_latin1_latex, $bibItemOptionString, false);
            }
            // Copy the current \bibitem entry to the array of generated \bibitem entries:
            $bibItemsArray[$bibItemOptionShortString] = $bibItemCommand . $bibItemOptionStringEncoded . "{" . $citeKey . "} " . $recordEncoded;
        }
    }
    $latexData .= implode("\n\n", $bibItemsArray) . "\n\n";
    $latexData .= "\\end{thebibliography}\n\n";
    return $latexData;
}
Пример #9
0
function citeRecords($result, $rowsFound, $query, $queryURL, $showQuery, $showLinks, $rowOffset, $showRows, $previousOffset, $nextOffset, $wrapResults, $citeStyle, $citeOrder, $citeType, $orderBy, $headerMsg, $userID, $viewType)
{
    global $contentTypeCharset;
    // defined in 'ini.inc.php'
    global $client;
    // The array '$transtab_refbase_markdown' contains search & replace patterns for conversion from refbase markup to Markdown markup & entities
    global $transtab_refbase_markdown;
    // defined in 'transtab_refbase_markdown.inc.php'
    $markdownData = "";
    // make sure that our buffer variable is empty
    // Header:
    if (!empty($headerMsg)) {
        // Decode any HTML entities:
        // (these may occur in the header message e.g. if the user's preferred display language is not English but German or French, etc)
        $headerMsg = decodeHTML($contentTypeCharset, $headerMsg);
        // function 'decodeHTML()' is defined in 'include.inc.php', and '$contentTypeCharset' is defined in 'ini.inc.php'
        // Convert refbase markup in the header message into appropriate Markdown markup & entities:
        $headerMsg = searchReplaceText($transtab_refbase_markdown, $headerMsg, true);
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        $markdownData .= "# {$headerMsg} #\n\n";
    }
    // Initialize array variables:
    $yearsArray = array();
    $typeTitlesArray = array();
    // Define inline text markup to be used by the 'citeRecord()' function:
    $markupPatternsArray = array("bold-prefix" => "**", "bold-suffix" => "**", "italic-prefix" => "_", "italic-suffix" => "_", "underline-prefix" => "<u>", "underline-suffix" => "</u>", "endash" => "&ndash;", "emdash" => "&mdash;", "ampersand" => "&", "double-quote" => '"', "double-quote-left" => "&ldquo;", "double-quote-right" => "&rdquo;", "single-quote" => "'", "single-quote-left" => "&lsquo;", "single-quote-right" => "&rsquo;", "less-than" => "<", "greater-than" => ">", "newline" => "  \n");
    // Defines search & replace 'actions' that will be applied upon Markdown output to all those refbase fields that are listed
    // in the corresponding 'fields' element:
    $markdownSearchReplaceActionsArray = array(array('fields' => array("title", "publication", "abbrev_journal", "address", "keywords", "abstract", "orig_title", "series_title", "abbrev_series_title", "notes"), 'actions' => $transtab_refbase_markdown));
    // For CLI queries, we'll allow paging thru the result set, i.e. we honour the values of the CLI options '-S|--start' ('$rowOffset')
    // and '-R|--rows' ('$showRows') ('$rowOffset' and '$showRows' are re-assigned in function 'seekInMySQLResultsToOffset()' in 'include.inc.php')
    if (preg_match("/^cli/i", $client)) {
        // if the query originated from a command line client such as the "refbase" CLI client ("cli-refbase-1.0")
        $showMaxRows = $showRows;
    } else {
        $showMaxRows = $rowsFound;
    }
    // otherwise show all rows
    // LOOP OVER EACH RECORD:
    // Fetch one page of results (or less if on the last page)
    // (i.e., upto the limit specified in $showMaxRows) fetch a row into the $row array and ...
    for ($rowCounter = 0; $rowCounter < $showMaxRows && ($row = @mysql_fetch_array($result)); $rowCounter++) {
        foreach ($row as $rowFieldName => $rowFieldValue) {
            // Apply search & replace 'actions' to all fields that are listed in the 'fields' element of the arrays contained in '$markdownSearchReplaceActionsArray':
            foreach ($markdownSearchReplaceActionsArray as $fieldActionsArray) {
                if (in_array($rowFieldName, $fieldActionsArray['fields'])) {
                    $row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $row[$rowFieldName], true);
                }
            }
        }
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        // Order attributes according to the chosen output style & record type:
        $record = citeRecord($row, $citeStyle, $citeType, $markupPatternsArray, false);
        // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'cite' directory of the refbase root directory), see function 'generateCitations()'
        // Print out the current record:
        if (!empty($record)) {
            // Print any section heading(s):
            if (preg_match("/year|type/i", $citeOrder)) {
                $headingPrefix = "";
                $headingSuffix = "";
                if (!empty($headerMsg)) {
                    $sectionMarkupPrefix = "## ";
                    $sectionMarkupSuffix = " ##\n\n";
                    $subSectionMarkupPrefix = "### ";
                    $subSectionMarkupSuffix = " ###\n\n";
                } else {
                    $sectionMarkupPrefix = "# ";
                    $sectionMarkupSuffix = " #\n\n";
                    $subSectionMarkupPrefix = "## ";
                    $subSectionMarkupSuffix = " ##\n\n";
                }
                list($yearsArray, $typeTitlesArray, $sectionHeading) = generateSectionHeading($yearsArray, $typeTitlesArray, $row, $citeOrder, $headingPrefix, $headingSuffix, $sectionMarkupPrefix, $sectionMarkupSuffix, $subSectionMarkupPrefix, $subSectionMarkupSuffix);
                // function 'generateSectionHeading()' is defined in 'cite.inc.php'
                $markdownData .= $sectionHeading;
            }
            // Write plain TEXT paragraph:
            $markdownData .= $record . "\n\n";
            // create paragraph with encoded record text
        }
    }
    return $markdownData;
}
Пример #10
0
function generateRSS($result, $showRows, $rssChannelDescription)
{
    global $officialDatabaseName;
    // these variables are defined in 'ini.inc.php'
    global $databaseBaseURL;
    global $feedbackEmail;
    global $defaultCiteStyle;
    global $contentTypeCharset;
    global $logoImageURL;
    global $transtab_refbase_html;
    // defined in 'transtab_refbase_html.inc.php'
    // Note that we only convert those entities that are supported by XML (by use of the 'encodeHTMLspecialchars()' function).
    // All other higher ASCII chars are left unencoded and valid feed output is only possible if the '$contentTypeCharset' variable is set correctly in 'ini.inc.php'.
    // (The only exception is the item description which will contain HTML tags & entities that were defined by '$transtab_refbase_html' or by the 'reArrangeAuthorContents()' function)
    // Define inline text markup to be used by the 'citeRecord()' function:
    $markupPatternsArray = array("bold-prefix" => "<b>", "bold-suffix" => "</b>", "italic-prefix" => "<i>", "italic-suffix" => "</i>", "underline-prefix" => "<u>", "underline-suffix" => "</u>", "endash" => "&#8211;", "emdash" => "&#8212;", "ampersand" => "&", "double-quote" => "&quot;", "single-quote" => "'", "less-than" => "&lt;", "greater-than" => "&gt;", "newline" => "\n<br>\n");
    $currentDateTimeStamp = generateRFC2822TimeStamp();
    // get the current date & time (in UNIX/RFC-2822 time stamp format => "date('r')" or "date('D, j M Y H:i:s O')")
    // write RSS header:
    $rssData = "<?xml version=\"1.0\" encoding=\"" . $contentTypeCharset . "\"?>" . "\n<rss version=\"2.0\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">";
    // write channel info:
    $rssData .= "\n\t<channel>" . "\n\t\t<title>" . encodeHTMLspecialchars($officialDatabaseName) . "</title>" . "\n\t\t<link>" . $databaseBaseURL . "</link>" . "\n\t\t<description>" . encodeHTMLspecialchars($rssChannelDescription) . "</description>" . "\n\t\t<language>en</language>" . "\n\t\t<pubDate>" . $currentDateTimeStamp . "</pubDate>" . "\n\t\t<lastBuildDate>" . $currentDateTimeStamp . "</lastBuildDate>" . "\n\t\t<webMaster>" . $feedbackEmail . "</webMaster>";
    // write image data:
    $rssData .= "\n\n\t\t<image>" . "\n\t\t\t<url>" . $databaseBaseURL . $logoImageURL . "</url>" . "\n\t\t\t<title>" . encodeHTMLspecialchars($officialDatabaseName) . "</title>" . "\n\t\t\t<link>" . $databaseBaseURL . "</link>" . "\n\t\t</image>";
    // fetch results: upto the limit specified in '$showRows', fetch a row into the '$row' array and write out a RSS item:
    for ($rowCounter = 0; $rowCounter < $showRows && ($row = @mysql_fetch_array($result)); $rowCounter++) {
        $origTitle = $row['title'];
        // save the original title contents before applying any search & replace actions
        // Perform search & replace actions on the text of the 'title' field:
        // (the array '$transtab_refbase_html' in 'transtab_refbase_html.inc.php' defines which search & replace actions will be employed)
        $row['title'] = searchReplaceText($transtab_refbase_html, $row['title'], true);
        // this will provide for correct rendering of italic, super/sub-script and greek letters in item descriptions (which are enclosed by '<![CDATA[...]]>' to ensure well-formed XML);
        // item titles are still served in raw format, though, since the use of HTML in item titles breaks many news readers
        $citeStyleFile = getStyleFile($defaultCiteStyle);
        // fetch the name of the citation style file that's associated with the style given in '$defaultCiteStyle' (which, in turn, is defined in 'ini.inc.php')
        // include the found citation style file *once*:
        include_once "cite/" . $citeStyleFile;
        // instead of 'include_once' we could also use: 'if ($rowCounter == 0) { include "cite/" . $citeStyleFile; }'
        // Generate a proper citation for this record, ordering attributes according to the chosen output style & record type:
        $record = citeRecord($row, $defaultCiteStyle, "", $markupPatternsArray, true);
        // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'styles' directory of the refbase root directory)
        // To avoid advertising email adresses in public RSS output, we remove the email address from contents of the 'modified_by' field which
        // get displayed in item descriptions. However, note that email adresses are NOT stripped from contents of the 'created_by' field
        // since a valid RSS feed must include an email address in the '<author>' element.
        // The following pattern does not attempt to do fancy parsing of email addresses but simply assumes the string format
        // of the 'modified_by' field (table 'refs'). If you change the string format, you must modify this pattern as well!
        $editorName = preg_replace("/(.+?) \\([^)]+\\)/", "\\1", $row['modified_by']);
        // append a RSS item for the current record:
        $rssData .= "\n\n\t\t<item>" . "\n\t\t\t<title>" . encodeHTMLspecialchars($origTitle) . "</title>" . "\n\t\t\t<link>" . $databaseBaseURL . "show.php?record=" . $row['serial'] . "</link>" . "\n\t\t\t<description><![CDATA[" . $record . "\n\t\t\t<br><br>Edited by " . encodeHTMLspecialchars($editorName) . " on " . generateRFC2822TimeStamp($row['modified_date'], $row['modified_time']) . ".]]></description>" . "\n\t\t\t<guid isPermaLink=\"true\">" . $databaseBaseURL . "show.php?record=" . $row['serial'] . "</guid>" . "\n\t\t\t<pubDate>" . generateRFC2822TimeStamp($row['created_date'], $row['created_time']) . "</pubDate>" . "\n\t\t\t<author>" . generateRFC2822EmailAddress($row['created_by']) . "</author>" . "\n\t\t</item>";
    }
    // finish RSS data:
    $rssData .= "\n\n\t</channel>" . "\n</rss>\n";
    return $rssData;
}
Пример #11
0
function standardizeEndnoteXMLInput($endxSourceText)
{
    // The array '$transtab_endnotexml_refbase' contains search & replace patterns for conversion from Endnote XML text style markup to refbase markup.
    // It attempts to convert fontshape markup (italic, bold)  as well as super- and subscript into appropriate refbase markup.
    global $transtab_endnotexml_refbase;
    // defined in 'transtab_endnotexml_refbase.inc.php'
    // Perform search & replace actions on the given Endnote XML source text:
    $endxSourceText = searchReplaceText($transtab_endnotexml_refbase, $endxSourceText, true);
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    return $endxSourceText;
}
Пример #12
0
function parseRecord($row, $odfIndexesToRefbaseFieldsArray, $referenceTypesToRefbaseTypesArray, $universalSearchReplaceActionsArray, $fieldSpecificSearchReplaceActionsArray)
{
    global $officialDatabaseName;
    // these variables are defined in 'ini.inc.php'
    global $databaseBaseURL;
    global $contentTypeCharset;
    global $convertExportDataToUTF8;
    $fieldParametersArray = array();
    // this is a stupid hack that maps the names of the '$row' array keys to those used
    // by the '$formVars' array (which is required by function 'generateCiteKey()')
    // (eventually, the '$formVars' array should use the MySQL field names as names for its array keys)
    $formVars = buildFormVarsArray($row);
    // function 'buildFormVarsArray()' is defined in 'include.inc.php'
    // generate or extract the cite key for this record
    $citeKey = generateCiteKey($formVars);
    // function 'generateCiteKey()' is defined in 'include.inc.php'
    // PARSE RECORD:
    // parse the '$odfIndexesToRefbaseFieldsArray' which maps ODF indexes to refbase field names and assign fields accordingly:
    foreach ($odfIndexesToRefbaseFieldsArray as $odfIndex => $refbaseField) {
        if (empty($odfIndexesToRefbaseFieldsArray[$odfIndex])) {
            $fieldParametersArray[$odfIndex] = "";
            // for any unsupported ODF index we'll insert an empty string
        } else {
            // copy row field data to array of field parameters (using the corresponding ODF index name as element key):
            if (!is_array($odfIndexesToRefbaseFieldsArray[$odfIndex])) {
                if (!empty($refbaseField) and !empty($row[$refbaseField])) {
                    $fieldParametersArray[$odfIndex] = $row[$refbaseField];
                }
            } else {
                $useDefault = true;
                // ...we'll extract field data from different refbase fields depending on the current record's reference type:
                foreach ($odfIndexesToRefbaseFieldsArray[$odfIndex] as $referenceType => $refbaseField) {
                    if ($row['type'] == $referenceType) {
                        $useDefault = false;
                        if (is_array($odfIndexesToRefbaseFieldsArray[$odfIndex][$referenceType])) {
                            foreach ($odfIndexesToRefbaseFieldsArray[$odfIndex][$referenceType] as $refbaseField) {
                                if (!empty($refbaseField) and !empty($row[$refbaseField])) {
                                    $fieldParametersArray[$odfIndex] = $row[$refbaseField];
                                    break;
                                }
                            }
                        } elseif (!empty($refbaseField) and !empty($row[$refbaseField])) {
                            $fieldParametersArray[$odfIndex] = $row[$refbaseField];
                        }
                        break;
                    }
                }
                // 'Other' is used as default for all refbase types that were NOT explicitly specified:
                if ($useDefault and !isset($fieldParametersArray[$odfIndex]) and isset($odfIndexesToRefbaseFieldsArray[$odfIndex]['Other'])) {
                    if (is_array($odfIndexesToRefbaseFieldsArray[$odfIndex]['Other'])) {
                        foreach ($odfIndexesToRefbaseFieldsArray[$odfIndex]['Other'] as $refbaseField) {
                            if (!empty($refbaseField) and !empty($row[$refbaseField])) {
                                $fieldParametersArray[$odfIndex] = $row[$refbaseField];
                                break;
                            }
                        }
                    } elseif (!empty($odfIndexesToRefbaseFieldsArray[$odfIndex]['Other']) and !empty($row[$odfIndexesToRefbaseFieldsArray[$odfIndex]['Other']])) {
                        $fieldParametersArray[$odfIndex] = $row[$odfIndexesToRefbaseFieldsArray[$odfIndex]['Other']];
                    }
                }
                // if this ODF field is still not set, 'Any' is used as default, no matter whether any refbase types were specified explicitly or not:
                if (!isset($fieldParametersArray[$odfIndex]) and isset($odfIndexesToRefbaseFieldsArray[$odfIndex]['Any'])) {
                    if (is_array($odfIndexesToRefbaseFieldsArray[$odfIndex]['Any'])) {
                        foreach ($odfIndexesToRefbaseFieldsArray[$odfIndex]['Any'] as $refbaseField) {
                            if (!empty($refbaseField) and !empty($row[$refbaseField])) {
                                $fieldParametersArray[$odfIndex] = $row[$refbaseField];
                                break;
                            }
                        }
                    } elseif (!empty($odfIndexesToRefbaseFieldsArray[$odfIndex]['Any']) and !empty($row[$odfIndexesToRefbaseFieldsArray[$odfIndex]['Any']])) {
                        $fieldParametersArray[$odfIndex] = $row[$odfIndexesToRefbaseFieldsArray[$odfIndex]['Any']];
                    }
                }
            }
            // if this ODF field isn't set yet, provide an empty string:
            if (!isset($fieldParametersArray[$odfIndex])) {
                $fieldParametersArray[$odfIndex] = "";
            }
        }
    }
    // POST-PROCESS FIELD DATA:
    // currently, we'll always overwrite the record serial in the 'Identifier' field with the generated cite key:
    // (this means that NO identifier will be exported if you've unchecked the export option "Include cite keys on export")
    $fieldParametersArray['Identifier'] = $citeKey;
    // convert refbase type names into ODF type numbers:
    $fieldParametersArray['BibliographyType'] = $referenceTypesToRefbaseTypesArray[$fieldParametersArray['BibliographyType']];
    // for theses, set the correct ODF type:
    if (!empty($row['thesis'])) {
        if ($row['thesis'] == "Ph.D. thesis" or $row['thesis'] == "Doctoral thesis") {
            $fieldParametersArray['BibliographyType'] = "11";
        } else {
            $fieldParametersArray['BibliographyType'] = "9";
        }
        // Thesis
        if (isset($fieldParametersArray['Annote'])) {
            $fieldParametersArray['Annote'] .= "; " . $row['thesis'];
        } else {
            $fieldParametersArray['Annote'] = $row['thesis'];
        }
    }
    // if a DOI was copied to the URL field, we'll need to add the DOI resolver:
    if (!empty($row['doi']) and preg_match("/^\\d{2}\\.\\d{4}\\//", $fieldParametersArray['URL'])) {
        $fieldParametersArray['URL'] = "http://dx.doi.org/" . $fieldParametersArray['URL'];
    }
    // use the series volume as volume if 'series_volume' contains some info, but 'volume' doesn't:
    if (empty($row['volume']) and !empty($row['series_volume'])) {
        $fieldParametersArray['Volume'] = $row['series_volume'];
    }
    // set the fourth ODF custom field to a refbase database attribution string and the database URL:
    $fieldParametersArray['Custom4'] = "exported from " . $officialDatabaseName . " (" . $databaseBaseURL . ")";
    // set the fifth ODF custom field to the record's permanent database URL:
    $fieldParametersArray['Custom5'] = $databaseBaseURL . "show.php?record=" . $row['serial'];
    // apply universal search & replace actions, encode special chars and charset conversions to every field that shall be exported:
    foreach ($fieldParametersArray as $fieldName => $fieldValue) {
        if (!empty($fieldValue)) {
            // perform universal search & replace actions:
            if (!empty($universalSearchReplaceActionsArray)) {
                $fieldParametersArray[$fieldName] = searchReplaceText($universalSearchReplaceActionsArray, $fieldParametersArray[$fieldName], true);
            }
            // function 'searchReplaceText()' is defined in 'include.inc.php'
            // we only convert those special chars to entities which are supported by XML:
            $fieldParametersArray[$fieldName] = encodeHTMLspecialchars($fieldParametersArray[$fieldName]);
            // function 'encodeHTMLspecialchars()' is defined in 'include.inc.php'
            // convert field data to UTF-8 (if '$convertExportDataToUTF8' is set to "yes" in 'ini.inc.php' and character encoding is not UTF-8 already):
            // (note that charset conversion can only be done *after* the cite key has been generated, otherwise cite key generation will produce garbled text!)
            if ($convertExportDataToUTF8 == "yes" and $contentTypeCharset != "UTF-8") {
                $fieldParametersArray[$fieldName] = convertToCharacterEncoding("UTF-8", "IGNORE", $fieldParametersArray[$fieldName]);
            }
            // function 'convertToCharacterEncoding()' is defined in 'include.inc.php'
        }
    }
    // apply field-specific search & replace 'actions' to all fields that are listed in the 'fields' element of the arrays contained in '$fieldSpecificSearchReplaceActionsArray':
    foreach ($fieldSpecificSearchReplaceActionsArray as $fieldActionsArray) {
        foreach ($fieldParametersArray as $fieldName => $fieldValue) {
            if (in_array($fieldName, $fieldActionsArray['fields'])) {
                $fieldParametersArray[$fieldName] = searchReplaceText($fieldActionsArray['actions'], $fieldValue, true);
            }
        }
    }
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    return $fieldParametersArray;
}
Пример #13
0
function atomEntry($row, $markupPatternsArray)
{
    global $databaseBaseURL;
    // these variables are defined in 'ini.inc.php'
    global $contentTypeCharset;
    global $fileVisibility;
    global $fileVisibilityException;
    global $filesBaseURL;
    global $convertExportDataToUTF8;
    global $defaultCiteStyle;
    global $citeStyle;
    global $citeOrder;
    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'
    // The array '$transtab_refbase_unicode' contains search & replace patterns for conversion from refbase markup to Unicode entities.
    global $transtab_refbase_unicode;
    // defined in 'transtab_refbase_unicode.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'
    // The array '$transtab_refbase_html' contains search & replace patterns for conversion from refbase markup to HTML markup & entities.
    // Note that this will only convert markup which wasn't converted to Unicode entities by '$transtab_refbase_unicode'; this will provide
    // for correct rendering of italic and bold letters in 'content' elements (which is of 'type="xhtml"').
    global $transtab_refbase_html;
    // defined in 'transtab_refbase_html.inc.php'
    // NOTE: We remove again some search & replace patterns that are present by default in '$transtab_refbase_html' since they cause
    //       problems here; this is surely hacky but I don't know any better. :-/
    unset($transtab_refbase_html['/ +- +/']);
    // this would incorrectly convert author initials such as "J. - L." to "J. &#8211; L."
    // Define inline text markup to generate a plain text citation string:
    // (to be included within a 'dcterms:bibliographicCitation' element)
    $markupPatternsArrayPlain = array("bold-prefix" => "", "bold-suffix" => "", "italic-prefix" => "", "italic-suffix" => "", "underline-prefix" => "", "underline-suffix" => "", "endash" => "-", "emdash" => "-", "ampersand" => "&", "double-quote" => '"', "double-quote-left" => '"', "double-quote-right" => '"', "single-quote" => "'", "single-quote-left" => "'", "single-quote-right" => "'", "less-than" => "<", "greater-than" => ">", "newline" => "\n");
    // This is a stupid hack that maps the names of the '$row' array keys to those used
    // by the '$formVars' array (which is required by function 'generateCiteKey()')
    // (eventually, the '$formVars' array should use the MySQL field names as names for its array keys)
    $formVars = buildFormVarsArray($row);
    // function 'buildFormVarsArray()' is defined in 'include.inc.php'
    // Generate or extract the cite key for this record:
    // (to be included within a 'dc:identifier' element)
    $citeKey = generateCiteKey($formVars);
    // function 'generateCiteKey()' is defined in 'include.inc.php'
    // Generate OpenURL data:
    // (to be included within a 'dc:identifier' element)
    $openURL = openURL($row, "openurl:");
    // function 'openURL()' is defined in 'openurl.inc.php'
    // Encode special chars and perform charset conversions:
    foreach ($row as $rowFieldName => $rowFieldValue) {
        // We only convert those special chars to entities which are supported by XML:
        // function 'encodeHTMLspecialchars()' is defined in 'include.inc.php'
        $row[$rowFieldName] = encodeHTMLspecialchars($row[$rowFieldName]);
        // Convert field data to UTF-8:
        // (if '$convertExportDataToUTF8' is set to "yes" in 'ini.inc.php' and character encoding is not UTF-8 already)
        // (Note that charset conversion can only be done *after* the cite key has been generated, otherwise cite key
        //  generation will produce garbled text!)
        // function 'convertToCharacterEncoding()' is defined in 'include.inc.php'
        if ($convertExportDataToUTF8 == "yes" and $contentTypeCharset != "UTF-8") {
            $row[$rowFieldName] = convertToCharacterEncoding("UTF-8", "IGNORE", $row[$rowFieldName]);
        }
    }
    // Defines field-specific search & replace 'actions' that will be applied to all those refbase fields that are listed in the corresponding 'fields' element:
    // (If you don't want to perform any search and replace actions, specify an empty array, like: '$fieldSpecificSearchReplaceActionsArray = array();'.
    //  Note that the search patterns MUST include the leading & trailing slashes -- which is done to allow for mode modifiers such as 'imsxU'.)
    //                                          "/Search Pattern/"  =>  "Replace Pattern"
    $fieldSpecificSearchReplaceActionsArray = array();
    if ($convertExportDataToUTF8 == "yes") {
        $fieldSpecificSearchReplaceActionsArray[] = array('fields' => array("title", "publication", "abbrev_journal", "address", "keywords", "abstract", "orig_title", "series_title", "abbrev_series_title", "notes"), 'actions' => $transtab_refbase_unicode);
    }
    // Apply field-specific search & replace 'actions' to all fields that are listed in the 'fields' element of the arrays contained in '$fieldSpecificSearchReplaceActionsArray':
    foreach ($fieldSpecificSearchReplaceActionsArray as $fieldActionsArray) {
        foreach ($row as $rowFieldName => $rowFieldValue) {
            if (in_array($rowFieldName, $fieldActionsArray['fields'])) {
                $row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $rowFieldValue, true);
            }
        }
    }
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    // Fetch the name of the citation style file that's associated with the style given in '$citeStyle':
    $citeStyleFile = getStyleFile($citeStyle);
    // function 'getStyleFile()' is defined in 'include.inc.php'
    if (empty($citeStyleFile)) {
        $citeStyle = $defaultCiteStyle;
        // if the given cite style could not be found, we'll use the default cite style which is defined by the '$defaultCiteStyle' variable in 'ini.inc.php'
        $citeStyleFile = getStyleFile($citeStyle);
    }
    // Include the found citation style file *once*:
    include_once "cite/" . $citeStyleFile;
    // Generate a proper citation for this record, ordering attributes according to the chosen output style & record type:
    // - Plain text version of citation string:
    //   (the plain text version of the citation string will be included in the 'dcterms:bibliographicCitation' element which should contain plain text only)
    $recordCitationPlain = citeRecord($row, $citeStyle, "", $markupPatternsArrayPlain, false);
    // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'styles' directory of the refbase root directory)
    //   Convert any refbase markup that remains in the citation string (such as _italic_ or **bold**) to plain text:
    $recordCitationPlain = searchReplaceText($transtab_refbase_ascii, $recordCitationPlain, true);
    // - HTML version of citation string:
    //   (note that, for output of Atom XML, we do NOT HTML encode higher ASCII characters; thus, the last param in the below function call is 'false')
    $recordCitation = citeRecord($row, $citeStyle, "", $markupPatternsArray, false);
    //   Convert any refbase markup that remains in the citation string (such as _italic_ or **bold**) into HTML markup:
    //   (the HTML version of the citation string will be included in the Atom 'content' element which uses 'type="xhtml"')
    $recordCitation = searchReplaceText($transtab_refbase_html, $recordCitation, true);
    // Save a plain text version of the title to a new variable:
    // (this will be included in the 'dc:title' element which should contain plain text only)
    $titlePlain = searchReplaceText($transtab_refbase_ascii, $row['title'], true);
    // Convert any remaining refbase markup in the abstract & title to HTML markup:
    // (we use 'type="xhtml"' in the Atom 'title' and 'summary' elements)
    $row['title'] = searchReplaceText($transtab_refbase_html, $row['title'], true);
    $row['abstract'] = searchReplaceText($transtab_refbase_html, $row['abstract'], true);
    // Convert keywords to plain text:
    // (keywords will be written to 'dc:subject' elements which should contain plain text only)
    $row['keywords'] = searchReplaceText($transtab_refbase_ascii, $row['keywords'], true);
    // To avoid advertising email adresses in public Atom XML output, we remove the email address from contents of the
    // 'modified_by' and 'created_by' fields which get displayed in the 'author' and 'content' elements.
    // The following pattern does not attempt to do fancy parsing of email addresses but simply assumes the string format of the
    // 'modified_by' and 'created_by' fields (table 'refs'). If you change the string format, you must modify this pattern as well!
    $creatorName = preg_replace("/(.+?) \\([^)]+\\)/", "\\1", $row['created_by']);
    $editorName = preg_replace("/(.+?) \\([^)]+\\)/", "\\1", $row['modified_by']);
    // Strip any " (ed)" or " (eds)" suffix from author/editor string:
    if (preg_match("/ *\\(eds?\\)\$/", $row['author'])) {
        $row['author'] = preg_replace("/[ \r\n]*\\(eds?\\)/i", "", $row['author']);
    }
    if (preg_match("/ *\\(eds?\\)\$/", $row['editor'])) {
        $row['editor'] = preg_replace("/[ \r\n]*\\(eds?\\)/i", "", $row['editor']);
    }
    // Include a link to any corresponding file if one of the following conditions is met:
    // - the variable '$fileVisibility' (defined in 'ini.inc.php') is set to 'everyone'
    // - the variable '$fileVisibility' is set to 'login' AND the user is logged in
    // - the variable '$fileVisibility' is set to 'user-specific' AND the 'user_permissions' session variable contains 'allow_download'
    // - the array variable '$fileVisibilityException' (defined in 'ini.inc.php') contains a pattern (in array element 1) that matches the contents of the field given (in array element 0)
    //
    // TODO: - the URL-generating code should be made into a dedicated function (since it's shared with 'modsxml.inc.php' and 'oaidcxml.inc.php')
    $printURL = false;
    if ($fileVisibility == "everyone" or $fileVisibility == "login" and isset($_SESSION['loginEmail']) or $fileVisibility == "user-specific" and (isset($_SESSION['user_permissions']) and preg_match("/allow_download/", $_SESSION['user_permissions'])) or !empty($fileVisibilityException) and preg_match($fileVisibilityException[1], $row[$fileVisibilityException[0]])) {
        if (!empty($row['file'])) {
            if (preg_match('#^(https?|ftp|file)://#i', $row['file'])) {
                $URLprefix = "";
                // we don't alter the URL given in the 'file' field
            } else {
                // use the base URL of the standard files directory as prefix:
                if (preg_match('#^/#', $filesBaseURL)) {
                    // absolute path -> file dir is located outside of refbase root dir
                    $URLprefix = 'http://' . $_SERVER['HTTP_HOST'] . $filesBaseURL;
                } else {
                    // relative path -> file dir is located within refbase root dir
                    $URLprefix = $databaseBaseURL . $filesBaseURL;
                }
            }
            $printURL = true;
        }
    }
    // ----------------------------------------------------------
    // Start Atom XML entry:
    $entry = new XML("entry");
    // create an XML object for a single record
    // Add entry-level tags:
    // (not yet used: category, contributor, source, rights)
    // - 'id':
    addNewBranch($entry, "id", array(), $databaseBaseURL . generateURL("show.php", "html", array("record" => $row['serial']), true));
    // - 'title':
    //   TODO: - the 'title' element is required for 'entry', so we may need to insert something else if the record's title is missing
    //		addNewBranch($entry, "title", array("type" => "text"), $titlePlain); // plain text version
    addNewBranch($entry, "title", array("type" => "xhtml"), '<div xmlns="http://www.w3.org/1999/xhtml">' . $row['title'] . '</div>');
    // - 'updated':
    addNewBranch($entry, "updated", array(), generateISO8601TimeStamp($row['modified_date'], $row['modified_time']));
    // function 'generateISO8601TimeStamp()' is defined in 'include.inc.php'
    // - 'published':
    //   NOTE: we use the 'published' element to indicate the date/time when the record was created in the refbase database,
    //         and not when the record's resource was originally published
    addNewBranch($entry, "published", array(), generateISO8601TimeStamp($row['created_date'], $row['created_time']));
    // - 'link':
    //   NOTE: According to the Atom spec, a feed is limited to ONE 'rel=alternate' link per type and hreflang!
    //   A) Main display formats:
    //   - HTML output for this record:
    //     NOTE: How can we output an 'alternate' link to the HTML citation with the same 'type'?
    //           But, maybe, this isn't necessary since a client GUI (layered over the Atom XML data) would expose
    //           the record citation (from the 'content' or 'bibliographicCitation' element) anyhow... ?
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "html", array("record" => $row['serial']), true, "", "", $citeStyle), "alternate", "html", "View record in HTML format");
    // function 'generateURL()' is defined in 'include.inc.php'
    //   B) Export formats
    //   NOTE: should we rather generate 'unapi.php' and 'opensearch.php' URLs where possible?
    //   TODO: add links for ADS, ISI, RSS XML and Word XML
    //   - BibTeX data for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "BibTeX", array("record" => $row['serial']), true), "alternate", "BibTeX", "Export record in BibTeX format");
    //   - Endnote data for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "Endnote", array("record" => $row['serial']), true), "alternate", "Endnote", "Export record in Endnote format");
    //   - RIS data for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "RIS", array("record" => $row['serial']), true), "alternate", "RIS", "Export record in RIS format");
    //   - Atom XML data for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "Atom XML", array("record" => $row['serial']), true, "", "", $citeStyle), "alternate", "Atom XML", "Export record as Atom XML");
    //   - MODS XML data for this record:
    //     NOTE: while we include a link to SRW_MODS XML on feed level, we instead include a link to MODS XML on entry level since the SRW overhead isn't really needed here
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "MODS XML", array("record" => $row['serial']), true), "alternate", "MODS XML", "Export record as MODS XML");
    //   - OAI_DC XML data for this record:
    //     NOTE: A link to MODS XML is already used with this type!
    //		atomLink($entry, $databaseBaseURL . generateURL("show.php", "OAI_DC XML", array("record" => $row['serial']), true, "", "", $citeStyle), "alternate", "OAI_DC XML", "Export record as OAI_DC XML");
    //   - ODF XML data for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "ODF XML", array("record" => $row['serial'], "exportType" => "file"), true), "alternate", "ODF XML", "Export record as ODF XML");
    //   - SRW_DC XML data for this record:
    //     NOTE: A link to MODS XML is already used with this type!
    //		atomLink($entry, $databaseBaseURL . generateURL("show.php", "SRW_DC XML", array("record" => $row['serial']), true, "", "", $citeStyle), "alternate", "SRW_DC XML", "Export record as SRW_DC XML");
    //   - SRW_MODS XML data for this record:
    //     NOTE: A link to MODS XML is already used with this type!
    //		atomLink($entry, $databaseBaseURL . generateURL("show.php", "SRW_MODS XML", array("record" => $row['serial']), true), "alternate", "SRW_MODS XML", "Export record as SRW_MODS XML");
    //   C) Citation formats:
    //   - RTF citations for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "RTF", array("record" => $row['serial']), true, "", "", $citeStyle, $citeOrder), "alternate", "RTF", "Output record as citation in RTF format");
    //   - PDF citations for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "PDF", array("record" => $row['serial']), true, "", "", $citeStyle, $citeOrder), "alternate", "PDF", "Output record as citation in PDF format");
    //   - LaTeX citations for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "LaTeX", array("record" => $row['serial']), true, "", "", $citeStyle, $citeOrder), "alternate", "LaTeX", "Output record as citation in LaTeX format");
    //   - LaTeX .bbl citations for this record:
    //     NOTE: A link to a LaTeX citation is already used with this type!
    //		atomLink($entry, $databaseBaseURL . generateURL("show.php", "LaTeX .bbl", array("record" => $row['serial']), true, "", "", $citeStyle, $citeOrder), "alternate", "LaTeX .bbl", "Output record as citation in LaTeX .bbl format");
    //   - Markdown citations for this record:
    atomLink($entry, $databaseBaseURL . generateURL("show.php", "Markdown", array("record" => $row['serial']), true, "", "", $citeStyle, $citeOrder), "alternate", "Markdown", "Output record as citation in Markdown format");
    //   - ASCII citations for this record:
    //     NOTE: A link to a Markdown citation is already used with this type!
    //		atomLink($entry, $databaseBaseURL . generateURL("show.php", "ASCII", array("record" => $row['serial']), true, "", "", $citeStyle, $citeOrder), "alternate", "ASCII", "Output record as citation in ASCII format");
    //   D) Related links:
    //   - Related URL:
    //     TODO: - the 'type' (and 'title'?) attributes should get adopted if something other than an URL pointing to a HTML page is given
    if (!empty($row['url'])) {
        atomLink($entry, $row['url'], "related", "html", "Web page");
    }
    //   - Related FILE:
    //     NOTE: - should we better use the 'enclosure' element instead?
    //     TODO: - the 'type' attribute should get adopted if something other than PDF is given
    if ($printURL) {
        atomLink($entry, $URLprefix . $row['file'], "related", "PDF", "Electronic full text");
    }
    // - 'author':
    //   NOTE: The Atom 'author' element contains the database user who created this record,
    //         while the publication authors are contained within 'dc:creator' elements
    $recAuthorBranch = new XMLBranch("author");
    $recAuthorBranch->setTagContent($creatorName, "author/name");
    $entry->addXMLBranch($recAuthorBranch);
    // - 'contributor':
    //   NOTE: The Atom 'contributor' element contains the database user who edited this record last,
    //         while the publication editors are contained within 'dc:contributor' elements
    if ($creatorName != $editorName) {
        $recEditorBranch = new XMLBranch("contributor");
        $recEditorBranch->setTagContent($editorName, "contributor/name");
        $entry->addXMLBranch($recEditorBranch);
    }
    // - 'content':
    //   NOTE: According to the Atom spec, all HTML markup must be escaped if 'type="html"' is used. In case of
    //         'type="xhtml"', HTML markup is not entity escaped but must be wrapped in a single XHTML 'div' element.
    //         See: <http://atompub.org/rfc4287.html#element.content>
    //              <http://www.atomenabled.org/developers/syndication/#text>
    //		addNewBranch($entry, "content", array("type" => "html"), encodeHTMLspecialchars($recordCitation));
    addNewBranch($entry, "content", array("type" => "xhtml"), '<div xmlns="http://www.w3.org/1999/xhtml">' . '<div class="unapi"><abbr class="unapi-id" title="' . $databaseBaseURL . generateURL("show.php", "html", array("record" => $row['serial']), true) . '"></abbr></div>' . $recordCitation . '</div>');
    // - 'summary':
    if (!empty($row['abstract'])) {
        addNewBranch($entry, "summary", array("type" => "xhtml"), '<div xmlns="http://www.w3.org/1999/xhtml">' . $row['abstract'] . '</div>');
    }
    // ----------------------------------------------------------
    // Add Dublin Core elements:
    // NOTE: With a few exceptions, we try to adhere to the guidelines given at
    //       "Using simple Dublin Core to describe eprints" by Andy Powell et al.
    //       See: <http://eprints-uk.rdn.ac.uk/project/docs/simpledc-guidelines/>
    // - 'dc:title':
    if (!empty($row['title'])) {
        addMetaElement($entry, "dc", "title", array(), $titlePlain);
    }
    // function 'addMetaElement()' is defined in 'webservice.inc.php'
    // - 'dc:creator':
    //   NOTE: should we use 'foaf:maker' instead of (or in addition to) 'dc:creator'?
    //   ( xmlns:foaf="http://xmlns.com/foaf/0.1/" )
    //
    //   <foaf:maker>
    //     <foaf:Person>
    //       <foaf:name> [ Name of author 1 ] </foaf:name>
    //     </foaf:Person>
    //   </foaf:maker>
    if (!empty($row['author']) and $row['author'] != $row['editor']) {
        addMetaElement($entry, "dc", "creator", array(), $row['author']);
    }
    // - 'dc:creator':
    //   TODO: add refbase corporate author(s) as 'dc:creator'
    // - 'dc:contributor':
    if (!empty($row['editor'])) {
        addMetaElement($entry, "dc", "contributor", array(), $row['editor']);
    }
    // - 'dc:description':
    //   NOTE: since we already use the Atom-native 'summary' element for the record
    //         abstract/summary, we don't add the abstract again as 'dc:description'
    // - 'dc:identifier':
    //   - DOI:
    if (!empty($row['doi'])) {
        addMetaElement($entry, "dc", "identifier", array(), $row['doi'], "doi");
    }
    //   - PMID:
    if (!empty($row['notes']) and preg_match("/PMID *: *\\d+/i", $row['notes'])) {
        addMetaElement($entry, "dc", "identifier", array(), $row['notes'], "pmid");
    }
    //   - arXiv:
    if (!empty($row['notes']) and preg_match("/arXiv *: *[^ ;]+/i", $row['notes'])) {
        addMetaElement($entry, "dc", "identifier", array(), $row['notes'], "arxiv");
    }
    //   - ISBN:
    if (!empty($row['isbn'])) {
        addMetaElement($entry, "dc", "identifier", array(), $row['isbn'], "isbn");
    }
    //   - OpenURL:
    addMetaElement($entry, "dc", "identifier", array(), $openURL, "openurl");
    //   - Cite key:
    addMetaElement($entry, "dc", "identifier", array(), $citeKey, "citekey");
    // - 'dcterms:bibliographicCitation':
    //   NOTE: While Andy Powell (see link above) recommends to put this into a
    //         'dc:identifier' element, we'll put it into a 'dcterms:bibliographicCitation'
    //         element instead, since the citation couldn't be uniquely identified within a
    //         'dc:identifier' element without a 'citation:' prefix (or the like) but that
    //         would be non-standard. Within 'dcterms:bibliographicCitation', the citation
    //         can be uniquely identified and extracted easily.
    //         Compare with 'oaidcxml.inc.php' where, for 'oai_dc:dc' output, we put the
    //         bibliographic citation into a 'dc:identifier' element and use a "citation:"
    //         prefix:
    //		addMetaElement($entry, "dc", "identifier", array(), encodeHTMLspecialchars($recordCitationPlain), "citation");
    addMetaElement($entry, "dcterms", "bibliographicCitation", array(), encodeHTMLspecialchars($recordCitationPlain));
    // - 'dc:source':
    //   NOTE: - In <http://eprints-uk.rdn.ac.uk/project/docs/simpledc-guidelines/>,
    //           Andy Powell et al. recommend that this element should NOT be used!
    //           However, for Atom XML output, we do use the 'dc:source' element for series
    //           info (series title plus volume & issue).
    //           Compare with 'oaidcxml.inc.php' where, for 'oai_dc:dc' output, we also
    //           include publication info in a 'dc:source' element.
    //           Example: <dc:source>Polar Biology, Vol. 25, No. 10</dc:source>
    //   - Series info:
    if (!empty($row['series_title']) or !empty($row['abbrev_series_title'])) {
        if (!empty($row['series_title'])) {
            $series = $row['series_title'];
        } elseif (!empty($row['abbrev_series_title'])) {
            $series = $row['abbrev_series_title'];
        }
        if (!empty($row['series_volume'])) {
            $series .= ", Vol. " . $row['series_volume'];
        }
        if (!empty($row['series_issue'])) {
            $series .= ", No. " . $row['series_issue'];
        }
        if (!empty($series)) {
            addMetaElement($entry, "dc", "source", array(), $series);
        }
        // NOTE: To distinguish between regular publication & series info,
        //       should we better use a "series:" prefix here? If so, use:
        //				addMetaElement($entry, "dc", "source", array(), $series, "series");
    }
    // - 'dc:date':
    if (!empty($row['year'])) {
        addMetaElement($entry, "dc", "date", array(), $row['year']);
    }
    // - 'dc:type':
    if (!empty($row['type'])) {
        addMetaElement($entry, "dc", "type", array(), $row['type'], $row['thesis']);
    }
    //   In case of a thesis, we add another 'dc:type' element with the actual thesis type:
    if (!empty($row['thesis'])) {
        addMetaElement($entry, "dc", "type", array(), $row['thesis']);
    }
    // - 'dc:format':
    //   TODO: ideally, we should parse the content of the refbase 'medium' field and map it
    //         to a media-type term from <http://www.iana.org/assignments/media-types/>
    if (!empty($row['medium'])) {
        $mediaType = $row['medium'];
    } else {
        $mediaType = "text";
    }
    addMetaElement($entry, "dc", "format", array(), $mediaType);
    // - 'dc:subject':
    if (!empty($row['keywords'])) {
        addMetaElement($entry, "dc", "subject", array(), $row['keywords']);
    }
    // - 'dc:coverage':
    //   TODO: should we add contents from the refbase 'area' field as 'dc:coverage' element(s)?
    // - 'dc:relation':
    //   NOTE: currently, we only add 'related' links (and not 'alternate' links) as 'dc:relation'
    //   - Related URL:
    if (!empty($row['url'])) {
        addMetaElement($entry, "dc", "relation", array(), $row['url'], "url");
    }
    //   - Related FILE:
    if ($printURL) {
        addMetaElement($entry, "dc", "relation", array(), $URLprefix . $row['file'], "file");
    }
    // - 'dc:publisher':
    if (!empty($row['publisher'])) {
        addMetaElement($entry, "dc", "publisher", array(), $row['publisher']);
    }
    // - 'dc:language':
    //   TODO: convert to ISO notation (i.e. "en" instead of "English", etc)
    if (!empty($row['language'])) {
        addMetaElement($entry, "dc", "language", array(), $row['language']);
    }
    // ----------------------------------------------------------
    // Add PRISM elements:
    // (not yet used: section)
    // - 'prism:issn':
    //   NOTE: see note for ISBN above
    if (!empty($row['issn'])) {
        addMetaElement($entry, "prism", "issn", array(), $row['issn']);
    }
    // - 'prism:publicationName':
    if (!empty($row['publication'])) {
        addMetaElement($entry, "prism", "publicationName", array(), $row['publication']);
    } elseif (!empty($row['abbrev_journal'])) {
        addMetaElement($entry, "prism", "publicationName", array(), $row['abbrev_journal']);
    }
    // - 'prism:publicationDate':
    if (!empty($row['year'])) {
        addMetaElement($entry, "prism", "publicationDate", array(), $row['year']);
    }
    // - 'prism:volume':
    if (!empty($row['volume'])) {
        addMetaElement($entry, "prism", "volume", array(), $row['volume']);
    }
    // - 'prism:number':
    if (!empty($row['issue'])) {
        addMetaElement($entry, "prism", "number", array(), $row['issue']);
    }
    // - 'prism:startingPage', 'prism:endingPage':
    //   TODO: Similar code is used in 'include.in.php', 'modsxml.inc.php' and 'openurl.inc.php',
    //         so this should be made into a dedicated function!
    if (!empty($row['pages']) and preg_match("/\\d+/i", $row['pages'])) {
        $pages = preg_replace("/^\\D*(\\d+)( *[{$dash}]+ *\\d+)?.*/i{$patternModifiers}", "\\1\\2", $row['pages']);
        // extract page range (if there's any), otherwise just the first number
        $startPage = preg_replace("/^\\D*(\\d+).*/i", "\\1", $row['pages']);
        // extract starting page
        $endPage = extractDetailsFromField("pages", $pages, "/\\D+/", "[-1]");
        // extract ending page (function 'extractDetailsFromField()' is defined in 'include.inc.php')
        // NOTE: To extract the ending page, we'll use function 'extractDetailsFromField()'
        //       instead of just grabbing a matched regex pattern since it'll also work
        //       when just a number but no range is given (e.g. when startPage = endPage)
        // - 'prism:startingPage':
        if (preg_match("/\\d+ *[{$dash}]+ *\\d+/i{$patternModifiers}", $row['pages'])) {
            // if there's a page range
            addMetaElement($entry, "prism", "startingPage", array(), $startPage);
        }
        // - 'prism:endingPage':
        addMetaElement($entry, "prism", "endingPage", array(), $endPage);
    }
    // See also other potentially useful elements from arXiv Atom feeds:
    // (arXiv example: <http://export.arxiv.org/api/query?search_query=all:immunology&id_list=&start=0&max_results=30>)
    //
    // <author>
    //   <name>
    //     Margarita Voitikova
    //   </name>
    //   <arxiv:affiliation xmlns:arxiv="http://arxiv.org/schemas/atom">
    //     Institute of Molecular and Atomic Physics, National Academy of Sciences of Belarus
    //   </arxiv:affiliation>
    // </author>
    //
    // <arxiv:comment xmlns:arxiv="http://arxiv.org/schemas/atom">
    //   6 pages, 3 figures, submitted for publication
    // </arxiv:comment>
    //
    // <arxiv:journal_ref xmlns:arxiv="http://arxiv.org/schemas/atom">
    //   Theory in Biosciences, 123, 431 (2005)
    // </arxiv:journal_ref>
    //
    // <link title="doi" href="http://dx.doi.org/10.1016/j.physd.2005.03.004" rel="related" />
    return $entry;
}
Пример #14
0
function oaidcRecord($row, $metadataPrefix = "oai_dc", $addNameSpaceInfo = true)
{
    global $databaseBaseURL;
    // these variables are defined in 'ini.inc.php'
    global $contentTypeCharset;
    global $fileVisibility;
    global $fileVisibilityException;
    global $filesBaseURL;
    global $convertExportDataToUTF8;
    global $defaultCiteStyle;
    global $citeStyle;
    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'
    // The array '$transtab_refbase_unicode' contains search & replace patterns for conversion from refbase markup to Unicode entities.
    global $transtab_refbase_unicode;
    // defined in 'transtab_refbase_unicode.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'
    // Define inline text markup to generate a plain text citation string:
    // (to be included within a 'dcterms:bibliographicCitation' element)
    $markupPatternsArrayPlain = array("bold-prefix" => "", "bold-suffix" => "", "italic-prefix" => "", "italic-suffix" => "", "underline-prefix" => "", "underline-suffix" => "", "endash" => "-", "emdash" => "-", "ampersand" => "&", "double-quote" => '"', "double-quote-left" => '"', "double-quote-right" => '"', "single-quote" => "'", "single-quote-left" => "'", "single-quote-right" => "'", "less-than" => "<", "greater-than" => ">", "newline" => "\n");
    // This is a stupid hack that maps the names of the '$row' array keys to those used
    // by the '$formVars' array (which is required by function 'generateCiteKey()')
    // (eventually, the '$formVars' array should use the MySQL field names as names for its array keys)
    $formVars = buildFormVarsArray($row);
    // function 'buildFormVarsArray()' is defined in 'include.inc.php'
    // Generate or extract the cite key for this record:
    // (to be included within a 'dc:identifier' element)
    $citeKey = generateCiteKey($formVars);
    // function 'generateCiteKey()' is defined in 'include.inc.php'
    // Generate OpenURL data:
    // (to be included within a 'dc:identifier' element)
    $openURL = openURL($row, "openurl:");
    // function 'openURL()' is defined in 'openurl.inc.php'
    // Encode special chars and perform charset conversions:
    foreach ($row as $rowFieldName => $rowFieldValue) {
        // We only convert those special chars to entities which are supported by XML:
        // function 'encodeHTMLspecialchars()' is defined in 'include.inc.php'
        $row[$rowFieldName] = encodeHTMLspecialchars($row[$rowFieldName]);
        // Convert field data to UTF-8:
        // (if '$convertExportDataToUTF8' is set to "yes" in 'ini.inc.php' and character encoding is not UTF-8 already)
        // (Note that charset conversion can only be done *after* the cite key has been generated, otherwise cite key
        //  generation will produce garbled text!)
        // function 'convertToCharacterEncoding()' is defined in 'include.inc.php'
        if ($convertExportDataToUTF8 == "yes" and $contentTypeCharset != "UTF-8") {
            $row[$rowFieldName] = convertToCharacterEncoding("UTF-8", "IGNORE", $row[$rowFieldName]);
        }
    }
    // Defines field-specific search & replace 'actions' that will be applied to all those refbase fields that are listed in the corresponding 'fields' element:
    // (If you don't want to perform any search and replace actions, specify an empty array, like: '$fieldSpecificSearchReplaceActionsArray = array();'.
    //  Note that the search patterns MUST include the leading & trailing slashes -- which is done to allow for mode modifiers such as 'imsxU'.)
    //                                          "/Search Pattern/"  =>  "Replace Pattern"
    $fieldSpecificSearchReplaceActionsArray = array();
    if ($convertExportDataToUTF8 == "yes") {
        $fieldSpecificSearchReplaceActionsArray[] = array('fields' => array("title", "publication", "abbrev_journal", "address", "keywords", "abstract", "orig_title", "series_title", "abbrev_series_title", "notes"), 'actions' => $transtab_refbase_unicode);
    }
    // Apply field-specific search & replace 'actions' to all fields that are listed in the 'fields' element of the arrays contained in '$fieldSpecificSearchReplaceActionsArray':
    foreach ($fieldSpecificSearchReplaceActionsArray as $fieldActionsArray) {
        foreach ($row as $rowFieldName => $rowFieldValue) {
            if (in_array($rowFieldName, $fieldActionsArray['fields'])) {
                $row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $rowFieldValue, true);
            }
        }
    }
    // function 'searchReplaceText()' is defined in 'include.inc.php'
    // Fetch the name of the citation style file that's associated with the style given in '$citeStyle':
    $citeStyleFile = getStyleFile($citeStyle);
    // function 'getStyleFile()' is defined in 'include.inc.php'
    if (empty($citeStyleFile)) {
        $citeStyle = $defaultCiteStyle;
        // if the given cite style could not be found, we'll use the default cite style which is defined by the '$defaultCiteStyle' variable in 'ini.inc.php'
        $citeStyleFile = getStyleFile($citeStyle);
    }
    // Include the found citation style file *once*:
    include_once "cite/" . $citeStyleFile;
    // Generate a proper citation for this record, ordering attributes according to the chosen output style & record type:
    // - Plain text version of citation string:
    $recordCitationPlain = citeRecord($row, $citeStyle, "", $markupPatternsArrayPlain, false);
    // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'styles' directory of the refbase root directory)
    //   Convert any refbase markup that remains in the citation string (such as _italic_ or **bold**) to plain text:
    $recordCitationPlain = searchReplaceText($transtab_refbase_ascii, $recordCitationPlain, true);
    // Convert any remaining refbase markup in the 'title', 'keywords' & 'abstract' fields to plain text:
    $row['title'] = searchReplaceText($transtab_refbase_ascii, $row['title'], true);
    $row['keywords'] = searchReplaceText($transtab_refbase_ascii, $row['keywords'], true);
    $row['abstract'] = searchReplaceText($transtab_refbase_ascii, $row['abstract'], true);
    // Strip any " (ed)" or " (eds)" suffix from author/editor string:
    if (preg_match("/ *\\(eds?\\)\$/", $row['author'])) {
        $row['author'] = preg_replace("/[ \r\n]*\\(eds?\\)/i", "", $row['author']);
    }
    if (preg_match("/ *\\(eds?\\)\$/", $row['editor'])) {
        $row['editor'] = preg_replace("/[ \r\n]*\\(eds?\\)/i", "", $row['editor']);
    }
    // Include a link to any corresponding file if one of the following conditions is met:
    // - the variable '$fileVisibility' (defined in 'ini.inc.php') is set to 'everyone'
    // - the variable '$fileVisibility' is set to 'login' AND the user is logged in
    // - the variable '$fileVisibility' is set to 'user-specific' AND the 'user_permissions' session variable contains 'allow_download'
    // - the array variable '$fileVisibilityException' (defined in 'ini.inc.php') contains a pattern (in array element 1) that matches the contents of the field given (in array element 0)
    //
    // TODO: - the URL-generating code should be made into a dedicated function (since it's shared with 'modsxml.inc.php' and 'atomxml.inc.php')
    $printURL = false;
    if ($fileVisibility == "everyone" or $fileVisibility == "login" and isset($_SESSION['loginEmail']) or $fileVisibility == "user-specific" and (isset($_SESSION['user_permissions']) and preg_match("/allow_download/", $_SESSION['user_permissions'])) or !empty($fileVisibilityException) and preg_match($fileVisibilityException[1], $row[$fileVisibilityException[0]])) {
        if (!empty($row['file'])) {
            if (preg_match('#^(https?|ftp|file)://#i', $row['file'])) {
                $URLprefix = "";
                // we don't alter the URL given in the 'file' field
            } else {
                // use the base URL of the standard files directory as prefix:
                if (preg_match('#^/#', $filesBaseURL)) {
                    // absolute path -> file dir is located outside of refbase root dir
                    $URLprefix = 'http://' . $_SERVER['HTTP_HOST'] . $filesBaseURL;
                } else {
                    // relative path -> file dir is located within refbase root dir
                    $URLprefix = $databaseBaseURL . $filesBaseURL;
                }
            }
            $printURL = true;
        }
    }
    // ----------------------------------------------------------
    // Start OAI_DC XML record:
    if (!empty($metadataPrefix)) {
        $recordPrefix = $metadataPrefix . ":";
    }
    $record = new XML($recordPrefix . "dc");
    // create an XML object for a single record
    if ($addNameSpaceInfo) {
        if ($metadataPrefix == "oai_dc") {
            $record->setTagAttribute("xmlns:oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/");
        } elseif ($metadataPrefix == "srw_dc") {
            $record->setTagAttribute("xmlns:srw_dc", "info:srw/schema/1/dc-v1.1");
        }
        $record->setTagAttribute("xmlns:dc", "http://purl.org/dc/elements/1.1/");
        if ($metadataPrefix == "oai_dc") {
            $record->setTagAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
            $record->setTagAttribute("xsi:schemaLocation", "http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd");
        } elseif ($metadataPrefix == "srw_dc") {
            $record->setTagAttribute("xmlns:prism", "http://prismstandard.org/namespaces/1.2/basic/");
        }
    }
    // Add Dublin Core elements:
    // NOTE: With a few exceptions, we try to adhere to the guidelines given at
    //       "Using simple Dublin Core to describe eprints" by Andy Powell et al.
    //       See: <http://eprints-uk.rdn.ac.uk/project/docs/simpledc-guidelines/>
    // - 'dc:title':
    if (!empty($row['title'])) {
        addMetaElement($record, "dc", "title", array(), $row['title']);
    }
    // function 'addMetaElement()' is defined in 'webservice.inc.php'
    // - 'dc:creator':
    if (!empty($row['author']) and $row['author'] != $row['editor']) {
        addMetaElement($record, "dc", "creator", array(), $row['author']);
    }
    // - 'dc:creator':
    //   TODO: add refbase corporate author(s) as 'dc:creator'
    // - 'dc:contributor':
    if (!empty($row['editor'])) {
        addMetaElement($record, "dc", "contributor", array(), $row['editor']);
    }
    // - 'dc:description':
    if (!empty($row['abstract'])) {
        addMetaElement($record, "dc", "description", array(), $row['abstract']);
    }
    // - 'dc:identifier':
    //   - DOI:
    if (!empty($row['doi'])) {
        addMetaElement($record, "dc", "identifier", array(), $row['doi'], "doi");
    }
    //   - PMID:
    if (!empty($row['notes']) and preg_match("/PMID *: *\\d+/i", $row['notes'])) {
        addMetaElement($record, "dc", "identifier", array(), $row['notes'], "pmid");
    }
    //   - arXiv:
    if (!empty($row['notes']) and preg_match("/arXiv *: *[^ ;]+/i", $row['notes'])) {
        addMetaElement($record, "dc", "identifier", array(), $row['notes'], "arxiv");
    }
    //   - ISBN:
    if (!empty($row['isbn'])) {
        addMetaElement($record, "dc", "identifier", array(), $row['isbn'], "isbn");
    }
    //   - OpenURL:
    addMetaElement($record, "dc", "identifier", array(), $openURL, "openurl");
    //   - refbase ID:
    addMetaElement($record, "dc", "identifier", array(), $databaseBaseURL . generateURL("show.php", "html", array("record" => $row['serial']), true), "url");
    //   - Cite key:
    addMetaElement($record, "dc", "identifier", array(), $citeKey, "citekey");
    //   - Bibliographic citation:
    //     NOTE: In 'atomxml.inc.php', the bibliographic citation is put into a
    //           'dcterms:bibliographicCitation' element so that it can be uniquely
    //           identified and extracted easily. However, in case of simple Dublin
    //           Core output, we just put it into a 'dc:identifier' element and
    //           use a "citation:" prefix.
    addMetaElement($record, "dc", "identifier", array(), encodeHTMLspecialchars($recordCitationPlain), "citation");
    // - 'dc:source':
    //   NOTE: - In <http://eprints-uk.rdn.ac.uk/project/docs/simpledc-guidelines/>,
    //           Andy Powell et al. recommend that this element should NOT be used!
    //           However, we use 'dc:source' elements for publication & series info
    //           (publication/series title plus volume & issue) to provide a dedicated
    //           source string that's easily readable and parsable.
    //           Example: <dc:source>Polar Biology, Vol. 25, No. 10</dc:source>
    //         - While we could also append the page info to the publication
    //           'dc:source' element, this info is more pertinent to the article
    //           itself and is thus not included. For 'srw_dc:dc' output, page info is
    //           included in PRISM elements (see below).
    //         - All metadata (including the page info) are also provided as a machine
    //           parsable citation in form of an OpenURL ContextObject (see above).
    //   - Publication info:
    //     NOTE: We only include the 'dc:source' element for 'oai_dc:dc' output. In case of 'srw_dc:dc'
    //           output, we use the more fine-grained PRISM elements instead (see below)
    if ($metadataPrefix == "oai_dc" and (!empty($row['publication']) or !empty($row['abbrev_journal']))) {
        if (!empty($row['publication'])) {
            $source = $row['publication'];
        } elseif (!empty($row['abbrev_journal'])) {
            $source = $row['abbrev_journal'];
        }
        if (!empty($row['volume'])) {
            $source .= ", Vol. " . $row['volume'];
        }
        if (!empty($row['issue'])) {
            $source .= ", No. " . $row['issue'];
        }
        if (!empty($source)) {
            addMetaElement($record, "dc", "source", array(), $source);
        }
    }
    //   - Series info:
    if (!empty($row['series_title']) or !empty($row['abbrev_series_title'])) {
        if (!empty($row['series_title'])) {
            $series = $row['series_title'];
        } elseif (!empty($row['abbrev_series_title'])) {
            $series = $row['abbrev_series_title'];
        }
        if (!empty($row['series_volume'])) {
            $series .= ", Vol. " . $row['series_volume'];
        }
        if (!empty($row['series_issue'])) {
            $series .= ", No. " . $row['series_issue'];
        }
        if (!empty($series)) {
            addMetaElement($record, "dc", "source", array(), $series);
        }
        // NOTE: To distinguish between regular publication & series info,
        //       should we better use a "series:" prefix here? If so, use:
        //				addMetaElement($record, "dc", "source", array(), $series, "series");
    }
    //   - ISSN:
    //     NOTE: for 'srw_dc:dc' output, we put the ISSN into the 'prism:issn' element
    if ($metadataPrefix == "oai_dc" and !empty($row['issn'])) {
        addMetaElement($record, "dc", "source", array(), $row['issn'], "issn");
    }
    // - 'dc:date':
    if (!empty($row['year'])) {
        addMetaElement($record, "dc", "date", array(), $row['year']);
    }
    // - 'dc:type':
    if (!empty($row['type'])) {
        addMetaElement($record, "dc", "type", array(), $row['type'], $row['thesis']);
    }
    //   In case of a thesis, we add another 'dc:type' element with the actual thesis type:
    if (!empty($row['thesis'])) {
        addMetaElement($record, "dc", "type", array(), $row['thesis']);
    }
    // - 'dc:format':
    //   TODO: ideally, we should parse the content of the refbase 'medium' field and map it
    //         to a media-type term from <http://www.iana.org/assignments/media-types/>
    if (!empty($row['medium'])) {
        $mediaType = $row['medium'];
    } else {
        $mediaType = "text";
    }
    addMetaElement($record, "dc", "format", array(), $mediaType);
    // - 'dc:subject':
    //   TODO: add user-specific keywords (from field 'user_keys') if the user is logged in
    if (!empty($row['keywords'])) {
        addMetaElement($record, "dc", "subject", array(), $row['keywords']);
    }
    // - 'dc:coverage':
    //   TODO: should we add contents from the refbase 'area' field as 'dc:coverage' element(s)?
    // - 'dc:relation':
    //   - Related URL:
    if (!empty($row['url'])) {
        addMetaElement($record, "dc", "relation", array(), $row['url'], "url");
    }
    //   - Related FILE:
    if ($printURL) {
        addMetaElement($record, "dc", "relation", array(), $URLprefix . $row['file'], "file");
    }
    // - 'dc:publisher':
    if (!empty($row['publisher'])) {
        addMetaElement($record, "dc", "publisher", array(), $row['publisher']);
    }
    // - 'dc:language':
    //   TODO: convert to ISO notation (i.e. "en" instead of "English", etc)
    if (!empty($row['language'])) {
        addMetaElement($record, "dc", "language", array(), $row['language']);
    }
    // ----------------------------------------------------------
    // Add PRISM elements:
    // NOTE: When using the 'srw_dc' namespace (i.e. 'info:srw/schema/1/dc-v1.1' as detailed at
    //       <http://www.loc.gov/standards/sru/resources/dc-schema.html>), I don't think it's allowed
    //       to include anything but the fifteen elements from simple Dublin Core. Is this correct?
    //       If so, then:
    //
    // TODO: Do we need to put the PRISM elements in <extraRecordData> instead? Or can we put them within
    //       a separate branch outside of (and next to) the '<srw_dc:dc>' element? Or shall we better omit
    //       them entirely?
    //       More info on SRU Extra Data>: <http://www.loc.gov/standards/sru/specs/extra-data.html>
    //
    //       See also "Mixing DC metadata with other metadata schemas" in "Guidelines for implementing
    //       Dublin Core in XML" <http://dublincore.org/documents/dc-xml-guidelines/>
    if ($metadataPrefix == "srw_dc") {
        // - 'prism:issn':
        if (!empty($row['issn'])) {
            addMetaElement($record, "prism", "issn", array(), $row['issn']);
        }
        // - 'prism:publicationName':
        if (!empty($row['publication'])) {
            addMetaElement($record, "prism", "publicationName", array(), $row['publication']);
        } elseif (!empty($row['abbrev_journal'])) {
            addMetaElement($record, "prism", "publicationName", array(), $row['abbrev_journal']);
        }
        // - 'prism:publicationDate':
        if (!empty($row['year'])) {
            addMetaElement($record, "prism", "publicationDate", array(), $row['year']);
        }
        // - 'prism:volume':
        if (!empty($row['volume'])) {
            addMetaElement($record, "prism", "volume", array(), $row['volume']);
        }
        // - 'prism:number':
        if (!empty($row['issue'])) {
            addMetaElement($record, "prism", "number", array(), $row['issue']);
        }
        // - 'prism:startingPage', 'prism:endingPage':
        //   TODO: Similar code is used in 'include.in.php', 'modsxml.inc.php' and 'openurl.inc.php',
        //         so this should be made into a dedicated function!
        if (!empty($row['pages']) and preg_match("/\\d+/i", $row['pages'])) {
            $pages = preg_replace("/^\\D*(\\d+)( *[{$dash}]+ *\\d+)?.*/i{$patternModifiers}", "\\1\\2", $row['pages']);
            // extract page range (if there's any), otherwise just the first number
            $startPage = preg_replace("/^\\D*(\\d+).*/i", "\\1", $row['pages']);
            // extract starting page
            $endPage = extractDetailsFromField("pages", $pages, "/\\D+/", "[-1]");
            // extract ending page (function 'extractDetailsFromField()' is defined in 'include.inc.php')
            // NOTE: To extract the ending page, we'll use function 'extractDetailsFromField()'
            //       instead of just grabbing a matched regex pattern since it'll also work
            //       when just a number but no range is given (e.g. when startPage = endPage)
            // - 'prism:startingPage':
            if (preg_match("/\\d+ *[{$dash}]+ *\\d+/i{$patternModifiers}", $row['pages'])) {
                // if there's a page range
                addMetaElement($record, "prism", "startingPage", array(), $startPage);
            }
            // - 'prism:endingPage':
            addMetaElement($record, "prism", "endingPage", array(), $endPage);
        }
    }
    return $record;
}
Пример #15
0
function citeRecords($result, $rowsFound, $query, $queryURL, $showQuery, $showLinks, $rowOffset, $showRows, $previousOffset, $nextOffset, $wrapResults, $citeStyle, $citeOrder, $citeType, $orderBy, $headerMsg, $userID, $viewType)
{
    global $contentTypeCharset;
    // defined in 'ini.inc.php'
    global $client;
    // The array '$transtab_refbase_rtf' contains search & replace patterns for conversion from refbase markup to RTF markup & entities
    global $transtab_refbase_rtf;
    // defined in 'transtab_refbase_rtf.inc.php'
    // Initialize array variables:
    $yearsArray = array();
    $typeTitlesArray = array();
    // Define inline text markup to be used by the 'citeRecord()' function:
    $markupPatternsArray = array("bold-prefix" => "{\\b ", "bold-suffix" => "}", "italic-prefix" => "{\\i ", "italic-suffix" => "}", "underline-prefix" => "{\\ul ", "underline-suffix" => "}", "endash" => "\\endash ", "emdash" => "\\emdash ", "ampersand" => "&", "double-quote" => '"', "double-quote-left" => "\\ldblquote ", "double-quote-right" => "\\rdblquote ", "single-quote" => "'", "single-quote-left" => "\\lquote ", "single-quote-right" => "\\rquote ", "less-than" => "<", "greater-than" => ">", "newline" => "\n{\\f1\\fs24 \\par}\n");
    // Defines search & replace 'actions' that will be applied upon RTF output to all those refbase fields that are listed
    // in the corresponding 'fields' element:
    $rtfSearchReplaceActionsArray = array(array('fields' => array("title", "publication", "abbrev_journal", "address", "keywords", "abstract", "orig_title", "series_title", "abbrev_series_title", "notes"), 'actions' => $transtab_refbase_rtf));
    // For CLI queries, we'll allow paging thru the result set, i.e. we honour the values of the CLI options '-S|--start' ('$rowOffset')
    // and '-R|--rows' ('$showRows') ('$rowOffset' and '$showRows' are re-assigned in function 'seekInMySQLResultsToOffset()' in 'include.inc.php')
    if (preg_match("/^cli/i", $client)) {
        // if the query originated from a command line client such as the "refbase" CLI client ("cli-refbase-1.0")
        $showMaxRows = $showRows;
    } else {
        $showMaxRows = $rowsFound;
    }
    // otherwise show all rows
    // Setup the basic RTF document structure (RTF functions defined in 'MINIMALRTF.php'):
    $rtf = new MINIMALRTF();
    // initialize RTF object
    $rtfData = $rtf->openRtf();
    // create RTF opening tag
    $rtf->createFontBlock(0, "Arial");
    // create & set RTF font blocks
    $rtf->createFontBlock(1, "Times New Roman");
    $rtfData .= $rtf->setFontBlock();
    // Header:
    if (!empty($headerMsg)) {
        // Remove any colon (":") from end of header message:
        $headerMsg = trimTextPattern($headerMsg, ":", false, true);
        // function 'trimTextPattern()' is defined in 'include.inc.php'
        // Decode any HTML entities:
        // (these may occur in the header message e.g. if the user's preferred display language is not English but German or French, etc)
        $headerMsg = decodeHTML($contentTypeCharset, $headerMsg);
        // function 'decodeHTML()' is defined in 'include.inc.php', and '$contentTypeCharset' is defined in 'ini.inc.php'
        // Convert refbase markup in the header message into appropriate RTF markup & entities:
        $headerMsg = searchReplaceText($transtab_refbase_rtf, $headerMsg, true);
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        $rtfData .= "{\\header\\pard\\qc {$headerMsg}\\par}\n";
    }
    $rtfData .= $rtf->justify("full", 0.5, 0, -0.5);
    // by default, we'll justify text and set a hanging indent (left indent: 0.5, right indent: 0, first-line indent: -0.5)
    // LOOP OVER EACH RECORD:
    // Fetch one page of results (or less if on the last page)
    // (i.e., upto the limit specified in $showMaxRows) fetch a row into the $row array and ...
    for ($rowCounter = 0; $rowCounter < $showMaxRows && ($row = @mysql_fetch_array($result)); $rowCounter++) {
        foreach ($row as $rowFieldName => $rowFieldValue) {
            // Apply search & replace 'actions' to all fields that are listed in the 'fields' element of the arrays contained in '$rtfSearchReplaceActionsArray':
            foreach ($rtfSearchReplaceActionsArray as $fieldActionsArray) {
                if (in_array($rowFieldName, $fieldActionsArray['fields'])) {
                    $row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $row[$rowFieldName], true);
                }
            }
        }
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        // Order attributes according to the chosen output style & record type:
        $record = citeRecord($row, $citeStyle, $citeType, $markupPatternsArray, false);
        // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'cite' directory of the refbase root directory), see function 'generateCitations()'
        // Print out the current record:
        if (!empty($record)) {
            // Print any section heading(s):
            if (preg_match("/year|type/i", $citeOrder)) {
                $headingPrefix = $rtf->justify("left", 0, 0, 0) . $rtf->paragraph(0, 12);
                // create empty paragraph in front of heading using "Arial" (font block 0) and a font size of 12pt
                $headingSuffix = $rtf->justify("full", 0.5, 0, -0.5);
                // justify any following text and set a hanging indent (left indent: 0.5, right indent: 0, first-line indent: -0.5)
                if ($citeOrder == "type") {
                    // for 'citeOrder=type' we'll always print an empty paragraph after the heading
                    $headingSuffix .= $rtf->paragraph(0, 12);
                }
                // create empty paragraph using "Arial" (font block 0) and a font size of 12pt
                list($yearsArray, $typeTitlesArray, $sectionHeading) = generateSectionHeading($yearsArray, $typeTitlesArray, $row, $citeOrder, $headingPrefix, $headingSuffix, "{\\f0\\fs28 {\\b ", "}\\par}\n", "{\\f0\\fs24 {\\b ", "}\\par}\n");
                // function 'generateSectionHeading()' is defined in 'cite.inc.php'
                // Note that we pass raw RTF commands to the above function instead of using the 'textBlock()' function from 'MINIMALRTF.php'. This is due to a current limitation of the 'generateSectionHeading()' function.
                // For 'citeOrder=year', the appropriate call to the 'textBlock()' function would look like this:
                // $rtfData .= $rtf->textBlock(0, 14, $rtf->bold($row['year'])); // create major heading with the current year using "Arial" (font block 0) and a font size of 14pt, printed in bold
                $rtfData .= $sectionHeading;
            }
            // If character encoding is not UTF-8 already, convert record text to UTF-8:
            if ($contentTypeCharset != "UTF-8") {
                $record = convertToCharacterEncoding("UTF-8", "IGNORE", $record);
            }
            // function 'convertToCharacterEncoding()' is defined in 'include.inc.php'
            // Encode characters with an ASCII value of >= 128 in RTF 1.16 unicode format:
            $recordUnicodeCharEncoded = $rtf->utf8_2_unicode($record);
            // converts UTF-8 chars to unicode character codes
            // Write RTF paragraph:
            $rtfData .= $rtf->textBlock(1, 12, $recordUnicodeCharEncoded);
            // create text block with encoded record text using "Times New Roman" (font block 1) and a font size of 12pt
        }
    }
    $rtfData .= $rtf->closeRtf();
    // create RTF closing tag
    return $rtfData;
}
Пример #16
0
    // generate an URL pointing to the RSS/Atom feed that matches the current query:
    $rssURL = generateURL("show.php", $defaultFeedFormat, array("where" => $queryWhereClause), true, $showRows);
    // function 'generateURL()' is defined in 'include.inc.php', variable '$defaultFeedFormat' is defined in 'ini.inc.php'
    // build a title string that matches the current query:
    // (alternatively we could always use: "records matching current query")
    $rssTitle = "records where " . encodeHTML(explainSQLQuery($queryWhereClause));
    // functions 'encodeHTML()' and 'explainSQLQuery()' are defined in 'include.inc.php'
    $rssURLArray[] = array("href" => $rssURL, "title" => $rssTitle);
}
// Finally, build the appropriate header string (which is required as parameter to the 'showPageHeader()' function):
if (!isset($_SESSION['HeaderString'])) {
    if (!empty($headerMsg)) {
        // ...we use that string as header message ('$headerMsg' could contain something like: "Literature of **Matthias Steffens**:"):
        // Perform search & replace actions on the provided header message (which will e.g. convert '**...**' to '<b>...</b>' etc):
        // (the array '$transtab_refbase_html' in 'transtab_refbase_html.inc.php' defines which search & replace actions will be employed)
        $HeaderString = searchReplaceText($transtab_refbase_html, encodeHTML($headerMsg), true);
        // functions 'searchReplaceText()' and 'encodeHTML()' are defined in 'include.inc.php'
    } else {
        if (preg_match("/^SELECT/i", $query)) {
            if ($rowsFound == 1) {
                if ($displayType == "Browse") {
                    $HeaderStringPart = " item ";
                } else {
                    $HeaderStringPart = " record ";
                }
            } else {
                if ($displayType == "Browse") {
                    $HeaderStringPart = " items ";
                } else {
                    $HeaderStringPart = " records ";
                }
Пример #17
0
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;
}
Пример #18
0
function citeRecords($result, $rowsFound, $query, $queryURL, $showQuery, $showLinks, $rowOffset, $showRows, $previousOffset, $nextOffset, $wrapResults, $citeStyle, $citeOrder, $citeType, $orderBy, $headerMsg, $userID, $viewType)
{
    global $contentTypeCharset;
    // defined in 'ini.inc.php'
    global $client;
    // The array '$transtab_refbase_latex' contains search & replace patterns for conversion from refbase markup to LaTeX markup & entities.
    // Converts refbase fontshape markup (italic, bold) into LaTeX commands of the 'textcomp' package, super- and subscript as well as greek
    // symbols get converted into the respective commands in math mode. You may need to adopt the LaTeX markup to suit your individual needs.
    global $transtab_refbase_latex;
    // defined in 'transtab_refbase_latex.inc.php'
    // The arrays '$transtab_latin1_latex' and '$transtab_unicode_latex' provide translation tables for best-effort conversion of higher ASCII
    // characters from ISO-8859-1 (or Unicode, respectively) to LaTeX entities.
    global $transtab_latin1_latex;
    // defined in 'transtab_latin1_latex.inc.php'
    global $transtab_unicode_latex;
    // defined in 'transtab_unicode_latex.inc.php'
    // Initialize array variables:
    $yearsArray = array();
    $typeTitlesArray = array();
    // Define inline text markup to be used by the 'citeRecord()' function:
    $markupPatternsArray = array("bold-prefix" => "\\textbf{", "bold-suffix" => "}", "italic-prefix" => "\\textit{", "italic-suffix" => "}", "underline-prefix" => "\\ul{", "underline-suffix" => "}", "endash" => "--", "emdash" => "---", "ampersand" => "&", "double-quote" => '"', "double-quote-left" => "{\\textquotedblleft}", "double-quote-right" => "{\\textquotedblright}", "single-quote" => "'", "single-quote-left" => "{\\textquoteleft}", "single-quote-right" => "{\\textquoteright}", "less-than" => "<", "greater-than" => ">", "newline" => "\n\n");
    // Defines search & replace 'actions' that will be applied upon LaTeX output to all those refbase fields that are listed
    // in the corresponding 'fields' element:
    $latexSearchReplaceActionsArray = array(array('fields' => array("title", "publication", "abbrev_journal", "address", "keywords", "abstract", "orig_title", "series_title", "abbrev_series_title", "notes"), 'actions' => $transtab_refbase_latex));
    // For CLI queries, we'll allow paging thru the result set, i.e. we honour the values of the CLI options '-S|--start' ('$rowOffset')
    // and '-R|--rows' ('$showRows') ('$rowOffset' and '$showRows' are re-assigned in function 'seekInMySQLResultsToOffset()' in 'include.inc.php')
    if (preg_match("/^cli/i", $client)) {
        // if the query originated from a command line client such as the "refbase" CLI client ("cli-refbase-1.0")
        $showMaxRows = $showRows;
    } else {
        $showMaxRows = $rowsFound;
    }
    // otherwise show all rows
    // Setup the basic LaTeX document structure:
    $latexData = "%&LaTeX\n" . "\\documentclass{article}\n\n";
    // NOTE: the "Vancouver" & "Harvard 1" citation styles make use of the '\ul' command which requires '\usepackage{soul}'
    // TODO: figure out a better logic when to include the '\usepackage{soul}' statement (or should we simply always include it?)
    if (preg_match("/^(Vancouver|Harvard 1)\$/i", $citeStyle)) {
        $latexData .= "\\usepackage{soul}\n";
    }
    if ($contentTypeCharset == "UTF-8") {
        $latexData .= "\\usepackage[utf8]{inputenc}\n";
    } else {
        $latexData .= "\\usepackage[latin1]{inputenc}\n";
    }
    $latexData .= "\\usepackage[T1]{fontenc}\n" . "\\usepackage{textcomp}\n\n";
    $latexData .= "\\begin{document}\n\n";
    // Header:
    if (!empty($headerMsg)) {
        // Remove any colon (":") from end of header message:
        $headerMsg = trimTextPattern($headerMsg, ":", false, true);
        // function 'trimTextPattern()' is defined in 'include.inc.php'
        // Decode any HTML entities:
        // (these may occur in the header message e.g. if the user's preferred display language is not English but German or French, etc)
        $headerMsg = decodeHTML($contentTypeCharset, $headerMsg);
        // function 'decodeHTML()' is defined in 'include.inc.php', and '$contentTypeCharset' is defined in 'ini.inc.php'
        // Convert refbase markup in the header message into appropriate LaTeX markup & entities:
        $headerMsg = searchReplaceText($transtab_refbase_latex, $headerMsg, true);
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        // Attempt to convert higher ASCII chars (i.e., characters with an ASCII value of >= 128) in the header message to their corresponding LaTeX entities:
        if ($contentTypeCharset == "UTF-8") {
            $headerMsg = searchReplaceText($transtab_unicode_latex, $headerMsg, false);
        } else {
            $headerMsg = searchReplaceText($transtab_latin1_latex, $headerMsg, false);
        }
        $latexData .= "\\title{" . $headerMsg . "}\n\n" . "\\maketitle\n\n";
    }
    if (!preg_match("/type|year/i", $citeOrder)) {
        $latexData .= "\\begin{thebibliography}{" . $showMaxRows . "}\n\n";
    }
    // LOOP OVER EACH RECORD:
    // Fetch one page of results (or less if on the last page)
    // (i.e., upto the limit specified in $showMaxRows) fetch a row into the $row array and ...
    for ($rowCounter = 0; $rowCounter < $showMaxRows && ($row = @mysql_fetch_array($result)); $rowCounter++) {
        foreach ($row as $rowFieldName => $rowFieldValue) {
            // Apply search & replace 'actions' to all fields that are listed in the 'fields' element of the arrays contained in '$latexSearchReplaceActionsArray':
            foreach ($latexSearchReplaceActionsArray as $fieldActionsArray) {
                if (in_array($rowFieldName, $fieldActionsArray['fields'])) {
                    $row[$rowFieldName] = searchReplaceText($fieldActionsArray['actions'], $row[$rowFieldName], true);
                }
            }
        }
        // function 'searchReplaceText()' is defined in 'include.inc.php'
        // Order attributes according to the chosen output style & record type:
        $record = citeRecord($row, $citeStyle, $citeType, $markupPatternsArray, false);
        // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'cite' directory of the refbase root directory), see function 'generateCitations()'
        // Print out the current record:
        if (!empty($record)) {
            // Print any section heading(s):
            if (preg_match("/year|type/i", $citeOrder)) {
                list($yearsArray, $typeTitlesArray, $sectionHeading) = generateSectionHeading($yearsArray, $typeTitlesArray, $row, $citeOrder, "", "", "\\section*{", "}\n\n", "\\subsection*{", "}\n\n");
                // function 'generateSectionHeading()' is defined in 'cite.inc.php'
                $latexData .= $sectionHeading;
            }
            // Attempt to convert higher ASCII chars (i.e., characters with an ASCII value of >= 128) to their corresponding LaTeX entities:
            if ($contentTypeCharset == "UTF-8") {
                $recordEncoded = searchReplaceText($transtab_unicode_latex, $record, false);
            } else {
                $recordEncoded = searchReplaceText($transtab_latin1_latex, $record, false);
            }
            // Write LaTeX paragraph:
            if (!preg_match("/type|year/i", $citeOrder)) {
                // This is a stupid hack that maps the names of the '$row' array keys to those used
                // by the '$formVars' array (which is required by function 'generateCiteKey()')
                // (eventually, the '$formVars' array should use the MySQL field names as names for its array keys)
                $formVars = buildFormVarsArray($row);
                // function 'buildFormVarsArray()' is defined in 'include.inc.php'
                // Generate or extract the cite key for this record:
                // NOTE: currently, the following placeholders are not available for citation output:
                //       <:keywords:>, <:issn:>, <:area:>, <:notes:>, <:userKeys:>
                //       if the cite key specification uses one of these placeholders, it will get ignored
                $citeKey = generateCiteKey($formVars);
                // function 'generateCiteKey()' is defined in 'include.inc.php'
                if (!empty($citeKey)) {
                    // Use the custom cite key that's been build according to the user's individual export options:
                    $latexData .= "\\bibitem{" . $citeKey . "} ";
                } else {
                    // The '\bibitem' command requires a cite key, which is why we'll include the record's serial number
                    // even when the user's export options specify 'export_cite_keys=no' or 'autogenerate_cite_keys=no':
                    $latexData .= "\\bibitem{" . $row['serial'] . "} ";
                }
            }
            $latexData .= $recordEncoded . "\n\n";
            // create paragraph with encoded record text
        }
    }
    if (!preg_match("/type|year/i", $citeOrder)) {
        $latexData .= "\\end{thebibliography}\n\n";
    }
    $latexData .= "\\end{document}\n\n";
    return $latexData;
}
Пример #19
0
function renderRefbase($input, &$parser)
{
    $hostName = "localhost";
    $databaseName = "literature";
    $username = "******";
    $password = "******";
    $tableRefs = "refs";
    $databaseBaseURL = "http://" . $_SERVER['HTTP_HOST'] . "/refbase/";
    $transtab_refbase_html = array("/__(?!_)(.+?)__/" => "<u>\\1</u>", "/_(.+?)_/" => "<i>\\1</i>", "/\\*\\*(.+?)\\*\\*/" => "<b>\\1</b>", "/\\[super:(.+?)\\]/i" => "<sup>\\1</sup>", "/\\[sub:(.+?)\\]/i" => "<sub>\\1</sub>", "/\\[permil\\]/" => "&permil;", "/\\[infinity\\]/" => "&infin;", "/\\[alpha\\]/" => "&alpha;", "/\\[beta\\]/" => "&beta;", "/\\[gamma\\]/" => "&gamma;", "/\\[delta\\]/" => "&delta;", "/\\[epsilon\\]/" => "&epsilon;", "/\\[zeta\\]/" => "&zeta;", "/\\[eta\\]/" => "&eta;", "/\\[theta\\]/" => "&theta;", "/\\[iota\\]/" => "&iota;", "/\\[kappa\\]/" => "&kappa;", "/\\[lambda\\]/" => "&lambda;", "/\\[mu\\]/" => "&mu;", "/\\[nu\\]/" => "&nu;", "/\\[xi\\]/" => "&xi;", "/\\[omicron\\]/" => "&omicron;", "/\\[pi\\]/" => "&pi;", "/\\[rho\\]/" => "&rho;", "/\\[sigmaf\\]/" => "&sigmaf;", "/\\[sigma\\]/" => "&sigma;", "/\\[tau\\]/" => "&tau;", "/\\[upsilon\\]/" => "&upsilon;", "/\\[phi\\]/" => "&phi;", "/\\[chi\\]/" => "&chi;", "/\\[psi\\]/" => "&psi;", "/\\[omega\\]/" => "&omega;", "/\\[Alpha\\]/" => "&Alpha;", "/\\[Beta\\]/" => "&Beta;", "/\\[Gamma\\]/" => "&Gamma;", "/\\[Delta\\]/" => "&Delta;", "/\\[Epsilon\\]/" => "&Epsilon;", "/\\[Zeta\\]/" => "&Zeta;", "/\\[Eta\\]/" => "&Eta;", "/\\[Theta\\]/" => "&Theta;", "/\\[Iota\\]/" => "&Iota;", "/\\[Kappa\\]/" => "&Kappa;", "/\\[Lambda\\]/" => "&Lambda;", "/\\[Mu\\]/" => "&Mu;", "/\\[Nu\\]/" => "&Nu;", "/\\[Xi\\]/" => "&Xi;", "/\\[Omicron\\]/" => "&Omicron;", "/\\[Pi\\]/" => "&Pi;", "/\\[Rho\\]/" => "&Rho;", "/\\[Sigma\\]/" => "&Sigma;", "/\\[Tau\\]/" => "&Tau;", "/\\[Upsilon\\]/" => "&Upsilon;", "/\\[Phi\\]/" => "&Phi;", "/\\[Chi\\]/" => "&Chi;", "/\\[Psi\\]/" => "&Psi;", "/\\[Omega\\]/" => "&Omega;", "/(?:\"|&quot;)(.+?)(?:\"|&quot;)/" => "&ldquo;\\1&rdquo;", "/ +- +/" => " &#8211; ");
    $link = mysql_connect($hostName, $username, $password);
    if (!$link) {
        die("Couldn't connect to MySQL");
    }
    mysql_select_db($databaseName, $link) or die("Couldn't open {$db}: " . mysql_error());
    //select the new updated values
    $result = mysql_query("SELECT type, author, title, year, publication, volume, issue, pages, publisher, place, language, issn, doi FROM {$tableRefs} where serial={$input}") or die("SELECT Error: " . mysql_error());
    $cite = "";
    while ($row = mysql_fetch_array($result)) {
        if ($row["type"] == "Journal Article") {
            $cite .= "{{cite_journal|url={$databaseBaseURL}" . "show.php?record={$input}|";
            if (!empty($row["author"])) {
                $author = $row["author"];
                $aulast = extractAuthorsLastName(" *; *", " *, *", 1, $author);
                $aufirst = extractAuthorsGivenName(" *; *", " *, *", 1, $author);
                if (!empty($aulast)) {
                    $cite .= "last=" . $aulast . "|";
                }
                if (!empty($aufirst)) {
                    $cite .= "first=" . $aufirst . "|";
                    if (!empty($aulast)) {
                        $cite .= "authorlink={$aufirst} {$aulast}" . "|";
                    }
                }
                $authorcount = count(preg_split("/ *; */", $author));
                $au = "";
                for ($i = 0; $i < $authorcount - 1; $i++) {
                    $aul = extractAuthorsLastName(" *; *", " *, *", $i + 2, $author);
                    $auf = extractAuthorsGivenName(" *; *", " *, *", $i + 2, $author);
                    if (!empty($aul)) {
                        if (!empty($auf)) {
                            $au .= "[[{$auf} {$aul}|{$aul}, {$auf}]]; ";
                        }
                    }
                }
                if (!empty($au)) {
                    $cite .= "coauthors=" . trim($au, '; ') . "|";
                }
            }
            if (!empty($row["year"])) {
                $cite .= "year=" . $row['year'] . "|";
            }
            if (!empty($row["title"])) {
                $title = searchReplaceText($transtab_refbase_html, $row['title'], true);
                $cite .= "title=" . $title . "|";
            }
            if (!empty($row["language"])) {
                $cite .= "language=" . $row['language'] . "|";
            }
            if (!empty($row["publication"])) {
                $cite .= "journal=" . $row['publication'] . "|";
            }
            if (!empty($row["volume"])) {
                $cite .= "volume=" . $row['volume'] . "|";
            }
            if (!empty($row["issue"])) {
                $cite .= "issue=" . $row['issue'] . "|";
            }
            if (!empty($row["pages"])) {
                $cite .= "pages=" . $row['pages'] . "|";
            }
            if (!empty($row["place"])) {
                $cite .= "location=" . $row['place'] . "|";
            }
            if (!empty($row["publiser"])) {
                $cite .= "publisher=" . $row['publisher'] . "|";
            }
            if (!empty($row["issn"])) {
                $cite .= "issn=" . $row['issn'] . "|";
            }
            if (!empty($row["doi"])) {
                $cite .= "doi=" . $row['doi'] . "|";
            }
            $cite .= "}}";
        }
    }
    global $wgParser;
    $output = $wgParser->recursiveTagParse($cite);
    return $output;
}