Simplybibtex 07022005 > SimplyBibTeX / Include / Bibtex.php

Questions? Need Help? Want to share? » PHP Forum
Script Name:
Simplybibtex 07022005

Download:
simplybibtex-07022005.zip

Category:
Blog

Archive Content:

SimplyBibTeX

SimplyBibTeX > Docs

SimplyBibTeX

SimplyBibTeX > Include

SimplyBibTeX > Templates

SimplyBibTeX > Templates > Images

SimplyBibTeX > Templates

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:

WebMaster Resources Home

©RingsWorld.com