Bibtex.php:
<?php
// ---------------------------------------------------------------------------
// SimplyBibTeX - simple PHP BibTeX viewer
// ---------------------------------------------------------------------------
// Module : bibtex parser class
// Description : generates a 2d array of all bibtex items
// Author : Hartmut Seichter
// Acknowledgement : Zhe Wu at Univ. of Rochester, http://qcite.com
// License : GPL
// CVS : $Id: bibtex.php, v 1.18 2005/01/24 06:18:38 seichter Exp $
// ---------------------------------------------------------------------------
require_once('template.php');
class BibTeX
{
var $count;
var $items;
var $types;
var $filename;
function BibTeX($file) {
$this->items = array(
'note' => array(),
'abstract' => array(),
'year' => array(),
'group' => array(),
'publisher' => array(),
'page-start' => array(),
'page-end' => array(),
'pages' => array(),
'address' => array(),
'url' => array(),
'volume' => array(),
'chapter' => array(),
'journal' => array(),
'author' => array(),
'raw' => array(),
'title' => array(),
'booktitle' => array(),
'folder' => array(),
'type' => array(),
'linebegin' => array(),
'lineend' => array());
$this->filename = $file;
}
function parse() {
$value = array();
$var = array();
$this->count=-1;
$lineindex = 0;
$fieldcount = -1;
$lines = file($this->filename);
if (!$lines) return;
foreach($lines as $line) {
$lineindex++;
$this->items['lineend'][$this->count] = $lineindex;
$line = trim($line);
$raw_line = $line + '\n';
$line=str_replace("'", "`", $line);
$seg=str_replace("\"", "`", $line);
$ps=strpos($seg, '=');
$segtest=strtolower($seg);
// some funny comment string
if (strpos($segtest, '@string')!==false) {continue;}
// pybliographer comments
if (strpos($segtest, '@comment')!==false) {continue;}
// normal TeX style comment
if (strpos($seg, '%%')!==false) {continue;}
/* ok when there is nothing to see, skip it! */
if (!strlen($seg)) continue;
if ("@" == $seg[0]) {
$this->count++;
$this->items['raw'][$this->count] = $line . "\r\n";
$ps=strpos($seg, '@');
$pe=strpos($seg, '{');
$this->types[$this->count]=trim(substr($seg, 1, $pe-1));
$fieldcount=-1;
$this->items['linebegin'][$this->count] = $lineindex;
} // #of item increase
elseif ($ps!==false ) { // one field begins
$this->items['raw'][$this->count] .= $line . "\r\n";
$ps=strpos($seg, '=');
$fieldcount++;
$var[$fieldcount]=strtolower(trim(substr($seg, 0, $ps)));
if ($var[$fieldcount]=='pages') {
$ps=strpos($seg, '=');
$pm=strpos($seg, '--');
$pe=strpos($seg, '}, ');
$pagefrom[$this->count] = substr($seg, $ps, $pm-$ps);
$pageto[$this->count]=substr($seg, $pm, $pe-$pm);
$bp=str_replace('=', '', $pagefrom[$this->count]); $bp=str_replace('{', '', $bp);$bp=str_replace('}', '', $bp);$bp=trim(str_replace('-', '', $bp));
$ep=str_replace('=', '', $pageto[$this->count]); $bp=str_replace('{', '', $bp);$bp=str_replace('}', '', $bp);;$ep=trim(str_replace('-', '', $ep));
}
$pe=strpos($seg, '}, ');
if ($pe===false) {
$value[$fieldcount]=strstr($seg, '=');
} else {
$value[$fieldcount]=substr($seg, $ps, $pe);
}
} else {
$this->items['raw'][$this->count] .= $line . "\r\n";
$pe=strpos($seg, '}, ');
if ($fieldcount > -1) {
if ($pe===false) {
$value[$fieldcount].=' '.strstr($seg, ' ');
} else {
$value[$fieldcount] .=' '.substr($seg, $ps, $pe);
}
}
}
if ($fieldcount > -1) {
$v = $value[$fieldcount];
$v=str_replace('=', '', $v);
$v=str_replace('{', '', $v);
$v=str_replace('}', '', $v);
$v=str_replace(', ', ' ', $v);
$v=str_replace('\'', ' ', $v);
$v=str_replace('\"', ' ', $v);
// test!
$v=str_replace('`', ' ', $v);
$v=trim($v);
$this->items["$var[$fieldcount]"][$this->count]="$v";
}
}
} // parse
function set(&$template, $name, $id, $default, $encode, $trans) {
$template->set($name, (isset($this->items[$name][$id])? ($encode) ? strtr($this->items[$name][$id], $trans) : $this->items[$name][$id] : $default));
}
function render_id(&$template, $encode, $id, &$trans)
{
$output = NULL;
if ($encode && !$trans)
$trans = get_html_translation_table(HTML_ENTITIES);
// fill the template engine with the respective values
$template->set("type", $this->types[$id]);
if ($id % 2)
$template->set("oddeven", "odd");
else
$template->set("oddeven", "even");
$template->set("number", $id);
$this->set($template, 'journal', $id, "", $encode, $trans);
$this->set($template, 'booktitle', $id, "", $encode, $trans);
$this->set($template, 'author', $id, "", $encode, $trans);
$this->set($template, 'volume', $id, "", $encode, $trans);
$this->set($template, 'chapter', $id, "", $encode, $trans);
$this->set($template, 'note', $id, "", $encode, $trans);
$this->set($template, 'abstract', $id, "", $encode, $trans);
$this->set($template, 'year', $id, "", $encode, $trans);
$this->set($template, 'folder', $id, "", $encode, $trans);
$this->set($template, 'publisher', $id, "", $encode, $trans);
$this->set($template, 'page-start', $id, "", $encode, $trans);
$this->set($template, 'page-end', $id, "", $encode, $trans);
$this->set($template, 'pages', $id, "", $encode, $trans);
$this->set($template, 'address', $id, "", $encode, $trans);
$this->set($template, 'raw', $id, "", $encode, $trans);
$this->set($template, 'url', $id, "", $encode, $trans);
$this->set($template, 'title', $id, "", $encode, $trans);
$this->set($template, 'linebegin', $id, "", $encode, $trans);
$this->set($template, 'lineend', $id, "", $encode, $trans);
$template->fetch(true);
$output .= $template->output;
return $output;
}
function render_search(&$template, $encode, $fallbacks, $search)
{
$output = NULL;
$atoms = explode('=', $search);
for ($i = 0; $i <= $this->count; $i++ ) {
if (isset($this->items[$atoms[0]][$i]))
if (strstr($this->items[$atoms[0]][$i], $atoms[1])) {
$output .= $this->render_id($template, $encode, $i, $trans);
}
}
return $output;
}
function render_all(&$template, $encode, $fallbacks, &$trans)
{
$output = NULL;
for ($i = 0; $i <= $this->count; $i++)
{
$output .= $this->render_id($template, $encode, $i, $trans);
}
return $output;
}
}
?>
Other Blog Scripts: