bibfile = $bibfile;
$this->entryname = $entryname;
}
function evalCond($cond)
{
$toeval = "return (" . $cond . ");";
$toeval = str_replace(">", ">", $toeval);
//print $toeval."\n";
return eval($toeval);
}
function evalGet($get)
{
$get = str_replace("\\\"", "\"", $get);
$get = str_replace(">", ">", $get);
eval('$res = ' . $get . ';');
return $res;
}
function getAuthors()
{
$aut = $this->get('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 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 get($field)
{
//echo("
".$field."
");
$val = $this->values[$field];
if ($val == FALSE) {
$val = $this->values[strtolower($field)];
//echo("
".strtolower($field)."
");
}
return $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 (!$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)
{
global $pagename, $BibtexLang;
$ret = "";
$lang = $this->get("LANG");
if ($lang && $BibtexLang[$lang])
{
$ret = $ret . $BibtexLang[$lang];
}
if ($dourl)
$ret = $ret . "''[[" . $this->getCompleteEntryUrl() . " | " . $this->getTitle() . "]]" . "''. " . $this->getAuthors();
else
$ret = $ret . "''" . $this->getTitle() . "''. " . $this->getAuthors();
return $ret;
}
function getPostString($dourl = true)
{
global $ScriptUrl, $BibtexUrlLink, $BibtexBibLink, $pagename;
$ret = "";
$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 . ".";
/* if (!$dourl)
{ */
$url = $this->get("URL");
// Try and get url from bib2html_dl_pdf
if (!$url) $url = $this->get("bib2html_dl_pdf");
if ($url) {
$ret = $ret . " [[" . $url . " | $BibtexUrlLink]]";
}
/* } */
$pdf = $this->get("PDF");
if ($pdf)
{
global $BibtexPdfUrl, $BibtexPdfLink, $UploadUrlFmt;
if (!$BibtexPdfUrl) $BibtexPdfUrl = FmtPageName('$UploadUrlFmt$UploadPrefixFmt', $pagename);
$ret = $ret . " [[$BibtexPdfUrl" . $pdf . " | $BibtexPdfLink]][==]";
}
if ($dourl) $ret = $ret . " [[" . $this->getCompleteEntryUrl() . "#" . $this->entryname . "Bib | $BibtexBibLink]]";
return $ret;
}
function cite()
{
$ret = "([[" . $this->getCompleteEntryUrl() . " | " . $this->entryname . "]])";
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("SCHOOL");
if ($school)
{
$ret = $ret . ", ''" . $school . "''";
}
return $ret . parent::getPostString($dourl);
}
}
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("SCHOOL");
if ($school)
{
$ret = $ret . ", ''" . $school . "''";
}
return $ret . parent::getPostString($dourl);
}
}
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);
}
}
class Article extends BibtexEntry {
function Article($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "ARTICLE";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$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;
}
}
}
return $ret . parent::getPostString($dourl);
}
}
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 . "";
$pages = $this->getPages();
if ($pages) $ret = $ret . ", " . $pages;
$address = parent::get("ADDRESS");
if ($address) $ret = $ret . ", " . $address;
$organization = parent::get("ORGANIZATION");
if ($organization) $ret = $ret . ". " . $organization;
}
return $ret . parent::getPostString($dourl);
}
function getPages()
{
$pages = parent::getPages();
if ($pages)
{
if (strpos($pages, "-")) return "pages " . $pages;
else return "page " . $pages;
}
return $pages;
}
}
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 . "";
$pages = $this->getPages();
if ($pages) $ret = $ret . ", " . $pages . ".";
$publisher = parent::get("PUBLISHER");
if ($publisher) $ret = $ret . $publisher . ", ";
}
return $ret . parent::getPostString($dourl);
}
function getPages()
{
$pages = parent::getPages();
if ($pages)
{
if (strpos($pages, "-")) return "pages " . $pages;
else return "page " . $pages;
}
return $pages;
}
}
class Book extends BibtexEntry {
function Book($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "BOOK";
}
function getSummary($dourl = true)
{
$ret = parent::getPreString($dourl);
$publisher = parent::get("PUBLISHER");
if ($publisher) $ret = $ret . $publisher . ", ";
$ret = $ret . parent::getPostString($dourl);
return $ret;
}
}
class InBook extends BibtexEntry {
function InBook($bibfile, $entryname)
{
parent::BibtexEntry($bibfile, $entryname);
$this->entrytype = "INBOOK";
}
function getPreString($dourl = true)
{
global $pagename, $BibtexLang;
$ret = "";
$lang = $this->get("LANG");
if ($lang && $BibtexLang[$lang])
{
$ret = $ret . $BibtexLang[$lang];
}
$chapter = parent::get("CHAPTER");
if ($dourl)
$ret = $ret . "''[[" . $this->getCompleteEntryUrl() . " | " . $chapter . "]]" . "''. " . $this->getAuthors();
else
$ret = $ret . "''" . $chapter . "''. " . $this->getAuthors();
return $ret;
}
function getSummary($dourl = true)
{
$ret = $this->getPreString($dourl);
$ret = $ret . ", in " . parent::getTitle();
$publisher = parent::get("PUBLISHER");
if ($publisher) $ret = $ret . ". $publisher";
$ret = $ret . parent::getPostString($dourl);
return $ret;
}
}
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::get("EDITOR");
if ($editor)
$ret = $ret . $editor .", editor. ";
$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;
}
}
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]) ParseBibFile($files);
$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 $HTTP_GET_VARS, $PageStartFmt, $PageEndFmt, $PageHeaderFmt, $ScriptUrl, $bibentry, $bibfile, $bibref;
$bibfile = $HTTP_GET_VARS['bibfile'];
$bibref = $HTTP_GET_VARS['bibref'];
SDV($ScriptUrl, FmtPageName('$PageUrl', $pagename));
$bibentry = GetEntry($bibfile, $bibref);
$page = array('timefmt'=>@$GLOBALS['CurrentTime'],
'author'=>@$GLOBALS['Author']);
// SetPageVars($pagename,$page, (bibentry != false ? $bibentry->getTitle() : ""));
$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];
}
$bibref = $bibtable[$ref];
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 ParseEntries($fname, $entries)
{
global $BibEntries;
// entries is a array with already splitted bib file
// $entries[0] -> not interessting
// $entries[1] -> array filled with entries type
// $entries[2] -> array filled with entries key
// $entries[3] -> array filled with the key = value....
$nb_entries = count($entries[0]);
$bibfileentry = array();
for ($i = 0 ; $i < $nb_entries ; ++$i)
{
$entrytype = strtoupper($entries[1][$i]);
$entryname = $entries[2][$i];
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;
// $all_keys[0] -> not interessting
// $all_keys[1] -> array filled with keys
// $all_keys[2] -> array filled with values
}
$bibfileentry[$entryname] = $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] = '¶';
}
$nb_bibentry = preg_match_all("/@(\w+)\s*¤\s*([^¶]+)¶([^¤]*)¤/", $bib_file_string, $matches);
ParseEntries($bib_file, $matches);
}
function ParseBibFile($bib_file)
{
global $BibtexBibDir, $pagename;
if (!$BibtexBibDir) $BibtexBibDir = FmtPageName('$UploadDir$UploadPrefixFmt', $pagename);
//print $BibtexBibDir;
//print $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);
//print $bib_file_string;
return true;
}
print "Can't open file
\n";
return false;
}
$UploadExts['bib'] = 'text/plain';
?>