This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
See the COPYING file for more details. */
$BibtexPdfLink = "Attach:pdf.gif";
$BibtexUrlLink = "URL";
$BibtexBibLink = "BibTeX";
$BibtexGenerateDefaultUrlField = false;
$BibtexLang = array();
/*
Markup("bibtexcite","inline","/\\{\\[(.*?),(.*?)\\]\\}/e","BibCite('$1', '$2')");
Markup("bibtexquery","fulltext","/\\bbibtexquery:\\[(.*?)\\]\\[(.*?)\\]\\[(.*?)\\]\\[(.*?)\\]/e","BibQuery('$1', '$2', '$3', '$4')");
Markup("bibtexsummary","fulltext","/\\bbibtexsummary:\\[(.*?),(.*?)\\]/e","BibSummary('$1', '$2')");
Markup("bibtexcomplete","fulltext","/\\bbibtexcomplete:\\[(.*?),(.*?)\\]/e","CompleteBibEntry('$1', '$2')");
Markup("bibtexsummaryauthorbold","fulltext","/\\bbibtexsummaryauthorbold:\\[(.*?),(.*?),(.*?)\\]/e","BibSummaryAuthorFirst('$1', '$2', '$3')");
*/
Markup("bibtexcite","inline","/\\{\\[(.*?),(.*?)\\]\\}/","BibCite_callback");
Markup("bibtexquery","fulltext","/\\bbibtexquery:\\[(.*?)\\]\\[(.*?)\\]\\[(.*?)\\]\\[(.*?)\\]/","BibQuery_callback");
Markup("bibtexsummary","fulltext","/\\bbibtexsummary:\\[(.*?),(.*?)\\]/","BibSummary_callback");
Markup("bibtexcomplete","fulltext","/\\bbibtexcomplete:\\[(.*?),(.*?)\\]/","CompleteBibEntry_callback");
Markup("bibtexsummaryauthorbold","fulltext","/\\bbibtexsummaryauthorbold:\\[(.*?),(.*?),(.*?)\\]/","BibSummaryAuthorFirst_callback");
function BibCite_callback($v){ return BibCite($v[1], $v[2]); }
function BibQuery_callback($v){ return BibQuery($v[1], $v[2], $v[3], $v[4]); }
function BibSummary_callback($v){ return BibSummary($v[1], $v[2]); }
function CompleteBibEntry_callback($v){ return CompleteBibEntry($v[1], $v[2]); }
function BibSummaryAuthorFirst_callback($v){ return BibSummaryAuthorFirst($v[1], $v[2], $v[3]); }
SDV($HandleActions['bibentry'],'HandleBibEntry');
$BibEntries = array();
class BibtexEntry {
var $values = array();
var $bibfile;
var $entryname;
var $entrytype;
function BibtexEntry($bibfile, $entryname)
{
$this->bibfile = $bibfile;
$this->entryname = $entryname;
}
function evalCond($cond)
{
$toeval = "return (" . $cond . ");";
$toeval = str_replace(">", ">", $toeval);
return eval($toeval);
}
function evalGet($get)
{
$get = str_replace("\\\"", "\"", $get);
$get = str_replace(">", ">", $get);
eval('$res = ' . $get . ';');
return $res;
}
function getAuthors()
{
$aut = $this->getFormat('AUTHOR');
if ($aut == FALSE) return FALSE;
$aut = explode(" and ", $aut);
$ret = "";
for ($i = 0; $i < count($aut); $i++)
{
$ret = $ret . $aut[$i];
if ($i == count($aut) - 2)
$ret = $ret . " and ";
else if ($i < count($aut) - 2)
$ret = $ret . ", ";
}
return $ret;
}
function getEditors()
{
$edi = $this->getFormat('EDITOR');
if ($edi == FALSE) return FALSE;
$edi = explode(" and ", $edi);
$ret = "";
for ($i = 0; $i < count($edi); $i++)
{
$ret = $ret . $edi[$i];
if ($i == count($edi) - 2) $ret = $ret . " and ";
else if ($i < count($edi) - 2) $ret = $ret . ", ";
}
return $ret;
}
function getName()
{
return $this->entryname;
}
function getTitle()
{
return $this->getFormat('TITLE');
}
function getAbstract()
{
return $this->get('ABSTRACT');
}
function getComment()
{
return $this->get('COMMENT');
}
function getPages()
{
$pages = $this->get('PAGES');
if ($pages)
{
$found = strpos($pages, "--");
if (found)
return str_replace("--", "-", $pages);
else
return $pages;
}
return "";
}
function getPagesWithLabel()
{
$pages = $this->getPages();
if ($pages)
{
if (is_numeric($pages[0]) && strpos($pages, "-"))
return "pages " . $pages;
elseif (is_numeric($pages))
return "page " . $pages;
}
return $pages;
}
function get($field)
{
$val = $this->values[$field];
if ($val == FALSE) {
$val = $this->values[strtolower($field)];
}
return trim($val);
}
function getFormat($field)
{
$ret = $this->get($field);
if ($ret)
{
$ret = str_replace("{", "", $ret);
$ret = str_replace("}", "", $ret);
}
return $ret;
}
function getCompleteEntryUrl()
{
global $DefaultTitle, $FarmD, $BibtexCompleteEntriesUrl;
global $pagename;
$Bibfile = $this->bibfile;
$Entryname = $this->entryname;
if ($Entryname != " ")
{
if (!$BibtexCompleteEntriesUrl)
$BibtexCompleteEntriesUrl = FmtPageName('$PageUrl', $pagename) . '?action=bibentry&bibfile=$Bibfile&bibref=$Entryname';
$RetUrl = preg_replace('/\$Bibfile/', "$Bibfile", $BibtexCompleteEntriesUrl);
$RetUrl = preg_replace('/\$Entryname/', "$Entryname", $RetUrl);
}
return $RetUrl;
}
function getPreString($dourl = true)
{
// *****************************
// Add LANG, AUTHOR, YEAR, TITLE
// The golden rule is to always insert a ponctuation BEFORE a field not AFTER
// because you're never sure there is going to be something after the field inserted.
// *****************************
global $pagename, $BibtexLang;
$ret = "";
$lang = $this->get("LANG");
if ($lang && $BibtexLang[$lang])
{
$ret = $ret . $BibtexLang[$lang];
}
$author = $this->getAuthors();
if ($author)
{
$ret = $ret . "'''" . $author . "'''";
}
$year = $this->get("YEAR");
if ($year)
{
$ret = $ret . " (";
$ret = $ret . $year . ") ";
}
if ($this->getTitle() != "")
{
if (false && $dourl && $this->entryname != " ")
$ret = $ret . "''[[" . $this->getCompleteEntryUrl() . " | " . $this->getTitle() . "]]";
else
$ret = $ret . "''" . $this->getTitle();
if (strlen($ret) > 2 && $ret[strlen($ret) - 1] != '?')
$ret = $ret . ".";
$ret = $ret . "''";
}
return $ret;
}
function getPostString($dourl = true)
{
// *****************************************
// Add a point, NOTE, URL, PDF and BibTeX
// The golden rule is to always insert a ponctuation BEFORE a field not AFTER
// because you're never sure there is going to be something after the field inserted.
// *****************************************
global $ScriptUrl, $BibtexUrlLink, $BibtexBibLink, $pagename;
$ret = "";
$note = $this->get("NOTE");
if ($note)
{
$ret = $ret . ". " . $note . ".";
} else
$ret = $ret . ".";
// This field comes from JabRef
$files = $this->get("FILE");
if ($files)
{
// from http://stackoverflow.com/a/8519822
$files = preg_split('~(?get("PDF");
if ($pdf)
{
// BibtexPdfUrl is an url path where the pdf are stored
// must be declared in config.php
global $BibtexPdfUrl, $BibtexPdfLink;
// TODO better url detection!
if (strpos($pdf, "http") === FALSE || strpos($pdf, "ftp") === FALSE)
{
if (!$BibtexPdfUrl)
$BibtexPdfUrl = "Attach:";
}
else
$BibtexPdfUrl = "";
$ret = $ret . " [[$BibtexPdfUrl" . $pdf . " | $BibtexPdfLink]]";
}
$url = $this->get("URL");
if ($url)
{
$ret = $ret . " ([[" . $url . " | $BibtexUrlLink]])";
}
if ($dourl && $this->entryname != " ")
$ret = $ret . " ([[" . $this->getCompleteEntryUrl() . "| $BibtexBibLink]])";
return $ret;
}
function cite()
{
$ret = "([[" . $this->getCompleteEntryUrl() . " | " . $this->entryname . "]])";
return $ret;
}
# customized cite author method
function citeAuthorFirst($myName)
{
global $ScriptUrl, $BibtexUrlLink, $BibtexBibLink, $pagename;
$authors = $this->get("AUTHOR");
$tauthors = preg_split("/,/", $authors);
if (count($tauthors) <= 1) $tauthors = preg_split("/ and/", $authors);
$N = count($tauthors);
if ( $N>1 ){
if (strpos($tauthors[0],$myName) !== false) {
$ret.= "'''" . $tauthors[0] . "'''";
}else{
$ret.= "''" . $tauthors[0] . "''";
}
if ( $N > 2){
$ret.=",";
for ($i = 1; $i < $N-2; $i++) {
if (strpos($tauthors[$i],$myName) !== false) {
$ret.= "'''" . $tauthors[$i] . "'''";
}else{
$ret.= "''" . $tauthors[$i] . "''";
}
$ret.=",";
}
if (strpos($tauthors[$N-2],$myName) !== false) {
$ret.= "'''" . $tauthors[$N-2] . "'''";
}else{
$ret.= "''" . $tauthors[$N-2] . "''";
}
}
$ret.= " and ";
if (strpos($tauthors[$N-1],$myName) !== false) {
$ret.= "'''" . $tauthors[$N-1] . "'''";
}else{
$ret.= "''" . $tauthors[$N-1] . "''";
}
$ret .= "\\\\\n ";
}else{
if (strpos($tauthors[0],$myName) !== false) {
$ret.= "'''" . $tauthors[0] . "'''";
}else{
$ret.= "''" . $tauthors[0] . "''";
}
$ret .= "\\\\\n ";
}
$ret .= "[[" . $this->getCompleteEntryUrl() . " | " . $this->getTitle() . "]]" . "";
$booktitle = $this->get("BOOKTITLE");
if ($booktitle)
{
$ret = $ret . ". In " . withAccent($booktitle) . "";
$pages = $this->getPages();
if ($pages) $ret = $ret . ", " . $pages;
$address = $this->get("ADDRESS");
if ($address) $ret = $ret . ", " . $address;
$organization = $this->get("ORGANIZATION");
if ($organization) $ret = $ret . ". " . $organization;
}
$year = $this->get("YEAR");
if ($year)
{
$ret = $ret . ", ";
$month = $this->get("MONTH");
if ($month)
{
$ret = $ret . $month . " ";
}
$ret = $ret . $year;
}
$note = $this->get("NOTE");
if ($note)
{
$ret = $ret . ". (''$note'')";
}
$ret = $ret . ".";
$pdf = $this->get("PDF");
if ($pdf)
{
global $BibtexPdfUrl, $BibtexPdfLink, $UploadUrlFmt;
if (!$BibtexPdfUrl) $BibtexPdfUrl = FmtPageName('$UploadUrlFmt$UploadPrefixFmt', $pagename);
if( substr($pdf,0,7) != "http://" )
$pdf = $BibtexPdfUrl . '/' . $pdf;
$ret = $ret . " [[ " . $pdf . " | $BibtexPdfLink]][==]";
}
$ret .= " [[" . $this->getCompleteEntryUrl() . "#" . $this->entryname . "Bib | $BibtexBibLink]]";
$ret .= $this->getVideo(true);
return $ret;
}
function getBibEntry()
{
global $BibtexSilentFields, $BibtexGenerateDefaultUrlField;
$ret = $ret . "@@@" . $this->entrytype . " { " . $this->entryname . ",\\\\\n";
while (list($key, $value)=each($this->values))
{
if ($BibtexSilentFields && in_array($key, $BibtexSilentFields)) continue;
$ret = $ret . " " . $key . " = { " . $value . " },\\\\\n";
}
if ($BibtexGenerateDefaultUrlField && ($this->get("URL") == false)) $ret = $ret . " URL = { " . $this->getCompleteEntryUrl() . " },\\\\\n";
$ret = $ret . "}@@\n";
return $ret;
}
function getCompleteEntry()
{
$ret = "[[#" . $this->entryname . "]]\n!!!" . $this->entryname . "\n";
$ret = $ret . '
' . $this->getSummary(false) . "
";
$abstract = $this->getAbstract();
if ($abstract)
{
$ret = $ret . "\n'''Abstract:'''\n" . '' . $abstract . "
";
}
$comment = $this->getComment();
if ($comment)
{
$ret = $ret . "\n'''Comment:'''\n" . '' . $comment . "
";
}
$ret = $ret . "[[#" . $this->entryname . "Bib]]\n";
$ret = $ret . "\n'''Bibtex entry:'''\n" . '' . $this->getBibEntry() . "
";
return $ret;
}
function getSolePageEntry()
{
$ret = "!" . $this->entryname . "\n";
$ret = $ret . "\n!!!Summary\n";
$ret = $ret . $this->getSummary(false) . "\n";
$abstract = $this->getAbstract();
if ($abstract)
{
$ret = $ret . "\n!!!Abstract\n" . $abstract . "\n";
}
$comment = $this->getComment();
if ($comment)
{
$ret = $ret . "\n!!!Comment\n" . $comment . "\n";
}
$ret = $ret . "[[#" . $this->entryname . "Bib]]\n";
$ret = $ret . "\n!!!Bibtex entry\n" . $this->getBibEntry() . "\n";
return $ret;
}
}
class PhdThesis extends BibtexEntry {
function PhdThesis($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "PHDTHESIS";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$ret = $ret . " PhD thesis";
$school = parent::get("INSTITUTION");
if ($school)
{
$ret = $ret . ", ''" . $school . "''";
}
return $ret . parent::getPostString($dourl);
}
}
// *****************************
// MasterThesis
// *****************************
class MasterThesis extends BibtexEntry {
function MasterThesis($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "MASTERSTHESIS";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$ret = $ret . " Master's thesis";
$school = parent::get("INSTITUTION");
if ($school)
{
$ret = $ret . ", ''" . $school . "''";
}
return $ret . parent::getPostString($dourl);
}
}
// *****************************
// TechReport
// *****************************
class TechReport extends BibtexEntry {
function TechReport($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "TECHREPORT";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$type = parent::get("TYPE");
if ( $type )
$ret = $ret . " $type";
else
$ret = $ret . " Technical report";
$number = parent::get("NUMBER");
if ($number)
$ret = $ret . " $number";
$institution = parent::get("INSTITUTION");
if ($institution)
{
$ret = $ret . ", " . $institution;
}
return $ret . parent::getPostString($dourl);
}
}
// *****************************
// Article
// *****************************
class Article extends BibtexEntry {
function Article($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "ARTICLE";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
// fmmb: moved JOURNALTITLE to JOURNAL
$journal = parent::get("JOURNAL");
if ($journal)
{
$ret = $ret . " " . $journal;
$volume = parent::get("VOLUME");
if ($volume)
{
$ret = $ret . ", " . $volume;
$number = parent::get("NUMBER");
if ($number)
{
$ret = $ret . "(" . $number . ")";
}
$pages = parent::getPages();
if ($pages)
{
$ret = $ret . ":" . $pages;
}
$publisher = parent::get("PUBLISHER");
if ($publisher)
{
// fmmb: $ret = $ret . ". " . $publisher;
$ret = $ret . "" . $publisher;
}
}
}
// fmmb: return $ret . ". " . parent::getPostString($dourl);
return $ret . "" . parent::getPostString($dourl);
}
}
// *****************************
// InProceedings
// *****************************
class InProceedings extends BibtexEntry
{
function InProceedings($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "INPROCEEDINGS";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$booktitle = parent::get("BOOKTITLE");
if ($booktitle)
{
$ret = $ret . " In " . $booktitle . ".";
$address = parent::get("ADDRESS");
if ($address)
{
if ($ret[strlen($ret) - 1] != '.')
$ret = $ret . ".";
$ret = $ret . " " . $address;
}
$month = parent::get("MONTH");
if ($month)
{
if ($ret[strlen($ret) - 1] != '.')
$ret = $ret . ",";
$ret = $ret . " " . $month;
}
$editor = parent::getEditors();
if ($editor)
{
if ($ret[strlen($ret)-1] != '.')
$ret = $ret . ".";
$ret = $ret . " (" . $editor .", Eds.)";
}
$publisher = parent::get("PUBLISHER");
if ($publisher)
{
if ($ret[strlen($ret)-1] != ')')
$ret = $ret . ".";
$ret = $ret . " " . $publisher;
}
$pages = $this->getPagesWithLabel();
if ($pages)
{
if ($ret[strlen($ret) - 1] != ')')
$ret = $ret . ",";
elseif ($pages[0] == 'p')
$pages[0] = 'P';
$ret = $ret . " " . $pages;
}
$organization = parent::get("ORGANIZATION");
if ($organization)
{
if ($ret[strlen($ret) - 1] != ')')
$ret = $ret . ", ";
$ret = $ret . ". " . $organization;
}
}
return $ret . parent::getPostString($dourl);
}
}
// *****************************
// InCollection
// *****************************
class InCollection extends BibtexEntry {
function InCollection($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "INCOLLECTION";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$booktitle = parent::get("BOOKTITLE");
if ($booktitle)
{
$ret = $ret . " In " . $booktitle . "";
$editor = parent::getEditors();
if ($editor)
{
$ret = $ret . " (" . $editor .", Eds.)";
}
$pages = $this->getPagesWithLabel();
if ($pages)
$ret = $ret . ", " . $pages . ".";
$publisher = parent::get("PUBLISHER");
if ($publisher)
{
if ($ret[strlen($ret)-1] != '.')
$ret = $ret . ". ";
$ret = $ret . " " . $publisher;
}
}
return $ret . parent::getPostString($dourl);
}
}
// *****************************
// Book
// *****************************
class Book extends BibtexEntry {
function Book($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "BOOK";
}
function getSummary($dourl = true)
{
$ret = $ret . parent::getPreString($dourl);
$editor = $this->getEditors();
if ($editor)
$ret = $ret . " (" . $editor .", Eds.)";
$publisher = parent::get("PUBLISHER");
if ($publisher)
$ret = $ret . " " . $publisher;
$address = parent::get("ADDRESS");
if ($address)
{
if ($ret && $ret[strlen($ret) - 1] != "." && $ret[strlen($ret) - 1] != "'")
$ret = $ret . ",";
$ret = $ret . " $address";
}
// Remove the point at the end of the string if only the title was provided
if ($ret && $ret[strlen($ret) - 3] == '.')
$ret = substr_replace($ret, "", strlen($ret) - 3, 1);
$post = parent::getPostString($dourl);
$ret = $ret . $post;
return $ret;
}
}
// *****************************
// InBook
// *****************************
class InBook extends BibtexEntry {
function InBook($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "INBOOK";
}
function getTitle()
{
return $this->getFormat('CHAPTER');
}
function getSummary($dourl = true)
{
$ret = $this->getPreString($dourl);
$booktitle = parent::get("TITLE");
if ($booktitle)
{
$ret = $ret . " In " . $booktitle . ".";
$editor = parent::getEditors();
if ($editor)
{
if ($ret[strlen($ret)-1] != '.')
$ret = $ret . ".";
$ret = $ret . " (" . $editor .", Eds.)";
}
$address = parent::get("ADDRESS");
if ($address)
{
if ($ret[strlen($ret) - 1] != '.')
$ret = $ret . ".";
$ret = $ret . " " . $address;
}
$publisher = parent::get("PUBLISHER");
if ($publisher)
{
if ($ret[strlen($ret)-1] != ',')
$ret = $ret . ",";
$ret = $ret . " " . $publisher;
}
$pages = $this->getPagesWithLabel();
if ($pages)
{
if ($ret[strlen($ret) - 1] != ')')
$ret = $ret . ",";
elseif ($pages[0] == 'p')
$pages[0] = 'P';
$ret = $ret . " " . $pages;
}
$organization = parent::get("ORGANIZATION");
if ($organization)
{
if ($ret[strlen($ret) - 1] != ')')
$ret = $ret . ", ";
$ret = $ret . ". " . $organization;
}
}
return $ret . parent::getPostString($dourl);
}
}
// *****************************
// Proceedings
// *****************************
class Proceedings extends BibtexEntry {
function Proceedings($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "PROCEEDINGS";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$editor = parent::getEditors();
if ($editor)
$ret = $ret . " (" . $editor .", Eds.)";
$volume = parent::get("VOLUME");
if ($volume)
{
$ret = $ret . "volume " . $volume;
$series = parent::get("SERIES");
if ( $series != "" )
$ret = $ret . " of ''$series''";
}
$address = parent::get("ADDRESS");
if ($address)
$ret = $ret . ", $address";
$orga = parent::get("ORGANIZATION");
if ($orga)
$ret = $ret . ", $orga";
$publisher = parent::get("PUBLISHER");
if ($publisher)
$ret = $ret . ", $publisher";
$ret = $ret . parent::getPostString($dourl);
return $ret;
}
}
// *****************************
// Misc
// *****************************
class Misc extends BibtexEntry {
function Misc($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "MISC";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$howpublished = parent::get("HOWPUBLISHED");
if ($howpublished)
$ret = $ret . " " . $howpublished;
$ret = $ret . parent::getPostString($dourl);
return $ret;
}
}
function sortByField($a, $b)
{
global $SortField;
$f1 = $a->evalGet($SortField);
$f2 = $b->evalGet($SortField);
if ($f1 == $f2) return 0;
return ($f1 < $f2) ? -1 : 1;
}
function BibQuery($files, $cond, $sort, $max)
{
global $BibEntries, $SortField;
$ret = '';
$files = trim($files);
$cond = trim($cond);
$sort = trim($sort);
if ($sort[0] == '!')
{
$reverse = true; $sort = substr($sort, 1);
}
else $reverse = false;
if ($cond == '') $cond = 'true';
if (!$BibEntries[$files])
{
if (!ParseBibFile($files))
return "%red%Invalid BibTex File!";
}
$res = array();
$bibselectedentries = $BibEntries[$files];
while (list($key, $value)=each($bibselectedentries))
{
if ($value->evalCond($cond))
$res[] = $value;
}
if ($sort != '')
{
$SortField = $sort;
usort($res, "sortByField");
}
if ($reverse)
$res = array_reverse($res);
if ($max != '')
$res = array_slice($res, 0, (int) $max);
while (list($key, $value)=each($res))
{
$ret .= "#" . $value->getSummary() . "\n";
}
return $ret;
}
function HandleBibEntry($pagename)
{
global $PageStartFmt, $PageEndFmt, $PageHeaderFmt, $ScriptUrl, $bibentry, $bibfile, $bibref;
$bibfile = $_GET['bibfile'];
$bibref = $_GET['bibref'];
SDV($ScriptUrl, FmtPageName('$PageUrl', $pagename));
$bibentry = GetEntry($bibfile, $bibref);
$page = array('timefmt'=>@$GLOBALS['CurrentTime'],
'author'=>@$GLOBALS['Author']);
$PageHeaderFmt = "";
SDV($HandleBibtexFmt,array(&$PageStartFmt,
'function:PrintCompleteEntry',&$PageEndFmt));
PrintFmt($pagename,$HandleBibtexFmt);
}
function PrintCompleteEntry()
{
global $bibentry, $bibfile, $bibref, $pagename;
if ($bibentry == false) echo MarkupToHTML($pagename, "%red%Invalid BibTex Entry: [" . $bibfile . ", " . $bibref . "]!");
else
{
echo MarkupToHTML($pagename, $bibentry->getSolePageEntry());
}
}
function GetEntry($bib, $ref)
{
global $BibEntries;
$ref = trim($ref);
$bib = trim($bib);
$bibtable = $BibEntries[$bib];
if ($bibtable == false)
{
ParseBibFile($bib);
$bibtable = $BibEntries[$bib];
}
reset($bibtable);
while (list($key, $value)=each($bibtable))
{
if ($value->getName() == $ref)
{
$bibref = $value;
break;
}
}
if ($bibref == false)
return false;
return $bibref;
}
function BibCite($bib, $ref)
{
$entry = GetEntry($bib, $ref);
if ($entry == false) return "%red%Invalid BibTex Entry!";
return $entry->cite();
}
function CompleteBibEntry($bib, $ref)
{
$entry = GetEntry($bib, $ref);
if ($entry == false) return "%red%Invalid BibTex Entry!";
return $entry->getCompleteEntry();
}
function BibSummary($bib, $ref)
{
$entry = GetEntry($bib, $ref);
if ($entry == false) return "%red%Invalid BibTex Entry!";
return $entry->getSummary();
}
function BibSummaryAuthorFirst($bib, $ref, $myName)
{
$entry = GetEntry($bib, $ref);
if ($entry == false) return "%red%Invalid BibTex Entry!";
return $entry->citeAuthorFirst($myName);
}
function ParseEntries($fname, $entries)
{
global $BibEntries;
$nb_entries = count($entries[0]);
$bibfileentry = array();
for ($i = 0 ; $i < $nb_entries ; ++$i)
{
$entrytype = strtoupper($entries[1][$i]);
$entryname = $entries[2][$i];
//if ($i < 5)
// print "Allo nb_entries=$nb_entries entryname=$entryname
\n";
if ($entrytype == "ARTICLE") $entry = new Article($fname, $entryname);
else if ($entrytype == "INPROCEEDINGS") $entry = new InProceedings($fname, $entryname);
else if ($entrytype == "PHDTHESIS") $entry = new PhdThesis($fname, $entryname);
else if ($entrytype == "MASTERSTHESIS") $entry = new MasterThesis($fname, $entryname);
else if ($entrytype == "INCOLLECTION") $entry = new InCollection($fname, $entryname);
else if ($entrytype == "BOOK") $entry = new Book($fname, $entryname);
else if ($entrytype == "INBOOK") $entry = new InBook($fname, $entryname);
else if ($entrytype == "TECHREPORT") $entry = new TechReport($fname, $entryname);
else if ($entrytype == "PROCEEDINGS") $entry = new Proceedings($fname, $entryname);
else $entry = new Misc($fname, $entryname);
// match all keys
preg_match_all("/(\w+)\s*=\s*([^¶]+)¶?/", $entries[3][$i], $all_keys);
for ($j = 0 ; $j < count($all_keys[0]) ; $j++)
{
$key = strtoupper($all_keys[1][$j]);
$value = $all_keys[2][$j];
// Remove the leading and ending braces or quotes if they exist.
$value = preg_replace('/^\s*{(.*)}\s*$/', '\1', $value);
// TODO: only run this regexp if the former didn't match
$value = preg_replace('/^\s*"(.*)"\s*$/', '\1', $value);
$entry->values[$key] = $value;
}
//$val = "char = " . $entry->values["AUTHOR"][2]. $entry->values["AUTHOR"][3]. $entry->values["AUTHOR"][4] . "
\n";
//print $val;
$bibfileentry[] = $entry;
}
$BibEntries[$fname] = $bibfileentry;
}
function ParseBib($bib_file, $bib_file_string)
{
// first split the bib file into several part
// first let's do an ugly trick to replace the first { and the last } of each bib entry by another special char (to help with regexp)
$count=0;
for ($i = 0 ; $i < strlen($bib_file_string) ; $i++)
{
if ($bib_file_string[$i] == '{')
{
if ($count==0)
$bib_file_string[$i] = '¤';
$count++;
}
else if ($bib_file_string[$i] == '}')
{
$count--;
if ($count==0)
$bib_file_string[$i] = '¤';
}
else if ($bib_file_string[$i] == ',' && $count == 1)
{
$bib_file_string[$i] = '¶';
}
else if ($bib_file_string[$i] == "\r" && $count == 1)
$bib_file_string[$i] = '¶';
}
$bib_file_string = preg_replace("/¶¶/", "¶", $bib_file_string);
$nb_bibentry = preg_match_all("/@(\w+)\s*¤\s*([^¶]*)¶([^¤]*)¤/", $bib_file_string, $matches);
ParseEntries($bib_file, $matches);
}
function ParseBibFile($bib_file)
{
global $BibtexBibDir, $pagename;
$wikibib_file = MakePageName($pagename, $bib_file);
if (PageExists($wikibib_file))
{
$bib_file_string = ReadPage($wikibib_file, READPAGE_CURRENT);
$bib_file_string = $bib_file_string['text'];
$bib_file_string = preg_replace("/\n/", "\r", $bib_file_string); // %0a
ParseBib($bib_file, $bib_file_string);
return true;
}
else
{
if (!$BibtexBibDir)
$BibtexBibDir = FmtPageName('$UploadDir$UploadPrefixFmt', $pagename);
if (file_exists($BibtexBibDir . $bib_file))
{
$f = fopen($BibtexBibDir . $bib_file, "r");
$bib_file_string = "";
if ($f)
{
while (!feof($f))
{
$bib_file_string = $bib_file_string . fgets($f, 1024);
}
$bib_file_string = preg_replace("/\n/", "", $bib_file_string);
ParseBib($bib_file, $bib_file_string);
return true;
}
return false;
}
}
}
$UploadExts['bib'] = 'text/plain';
?>