BibliographicExtension/bibliographyformat.php

From PeacockWiki

Jump to: navigation, search
<?php

class BibliographicPageParser {

  static function parse($wikiText)
  {
    preg_match('/\{\{.*?\/(.*?)(\|.*)\}\}/ms', $wikiText, $match);
    $fields=array('type'=>$match[1]);
    preg_match_all('/\|(.*?)=(.*?)(\||$)/ms', $match[2], $match);
    foreach($match[1] as $key => $value)
      $fields[$value]=$match[2][$key];
    return $fields;
  }

  static function names($names)
  {
    $names=split(',', $names);
    foreach($names as $key=>$item)
    {
      $item=trim($item);
      $name=split(' ', $item);
      $lastname=array_pop($name);
      $givennames=BibliographyFormat::makeList($name, ' ', ' ');
      $initials=array();
      if(count($name)>0)
        foreach(split('[ -]', $givennames) as $initial)
        {
          if($initial==strtoupper($initial))
            for($letter=0; $letter<strlen($initials); $letter++)
              $initials[]=$initial[$letter];
          else
            $initials[]=$initial[0];
        }
      $names[$key]=array($givennames, $lastname, $initials, $name);
    }
    return $names;
  }

}

class BibliographyFormat {

  var $mFields=array();
  var $displayYear=null;
  static $styleClass = '';

  static function renderWikiText($input)
  {
    global $wgOut;
    return $wgOut->parse($input, false);
  }

  function BibliographyFormat($reference)
  {
    $this->mFields=BibliographicPageParser::parse($this->getArticleText($reference));
    $this->mFields['reference']=$reference;
    if(BibliographyFormat::$styleClass=='')
      BibliographyFormat::setStyle('CSUHarvard_Style', 'extensions/bibliographystyle-csu.php');
  }

  static function getArticleName($name)
  {
    if($name=='')
      return null;
    $title=Title::newFromText($name);
    return $title->mDbkeyform;
  }
    
  static function getArticleText($name)
  {
    if($name=='')
      return null;
    $title=Title::newFromText($name);
    $title=Revision::newFromTitle( $title );
    if($title==null)
      return null;
    return $title->getText();
  }

  static function setStyle($style, $file)
  {
    require_once($file);
    BibliographyFormat::$styleClass=$style;
  }

  function intext($argv)
  {
    return call_user_func(array(BibliographyFormat::$styleClass, 'intext'), $argv, $this);
  }

  static function intextcite($articles)
  {
    return call_user_func(array(BibliographyFormat::$styleClass, 'intextcite'), $articles);
  }

  function reference($argv)
  {
    return call_user_func(array(BibliographyFormat::$styleClass, 'reference'), $this);
  }
  
  function referenceList($argv)
  {
    return call_user_func(array(BibliographyFormat::$styleClass, 'referenceList'), $argv);
  }
  
  function orderReferences($articles)
  {
    return call_user_func(array(BibliographyFormat::$styleClass, 'orderReferences'), $articles);
  }
  
  function bibliography($refrenceList)
  {
    $bibliography="bibliography:\n";
    foreach ($refrenceList as $item)
    {
      $bibliography.="#".$item->reference($str, $argv)."\n";
    }
    return $bibliography;
  }

  function authors()
  {
    if($this->field('author'))
      return BibliographicPageParser::names($this->mFields['author']);
    if($this->field('editor'))
      return $this->editors();
    return "";
  }

  function editors()
  {
    return BibliographicPageParser::names($this->mFields['editor']);
  }

  function year()
  {
    if($this->displayYear) return $this->displayYear;
    return $this->rawYear();
  }

  function rawYear()
  {
    if(key_exists('year', $this->mFields))
      return $this->mFields['year'];
    if(key_exists('date', $this->mFields))
    {
      $date=split('/', $this->mFields['date']);
      return date('Y', strtotime('1/1/'.$date[0]));
    }
    return '?';
  }

  function title()
  {
    return $this->mFields['name'];
  }

  function type()
  {
    return $this->mFields['type'];
  }

  function field($name)
  {
    if(!key_exists($name, $this->mFields))
      return NULL;
    return $this->mFields[$name];
  }

  function referencename()
  {
    return $this->mFields['reference'];
  }
  
  function formatCount($num)
  {
    if(!is_numeric($num))
      return $num;
    if($num>3 && $num<21)
      return $num.'th';
    switch($num % 10)
    {
      case 1:
        return $num.'st';
      case 1:
        return $num.'nd';
      case 1:
        return $num.'rd';
    }
    return $num.'th';
  }

  static function makeList($items, $delim=', ', $finalDelim=' & ')
  {
    $list='';
    if(count($items)==1)
      return array_shift($items);
    foreach($items as $key=>$item)
      if($key+1==count($items))
        $list.=$finalDelim.$item;
      else
        $list.=$delim.$item;
    return substr($list, strlen($delim)+0);
  }
  
}

?>
Personal tools