BibliographicExtension/bibliographyformat.php
From PeacockWiki
(Difference between revisions)
Revision as of 15:17, 16 October 2006 (edit) 137.166.127.86 (Talk) ← Previous diff |
Current revision (15:24, 16 October 2006) (edit) 137.166.127.86 (Talk) |
||
Line 1: | Line 1: | ||
<pre><?php | <pre><?php | ||
- | |||
- | |||
class BibliographicPageParser { | class BibliographicPageParser { | ||
- | |||
- | |||
static function parse($wikiText) | static function parse($wikiText) | ||
- | |||
{ | { | ||
- | |||
preg_match('/\{\{.*?\/(.*?)(\|.*)\}\}/ms', $wikiText, $match); | preg_match('/\{\{.*?\/(.*?)(\|.*)\}\}/ms', $wikiText, $match); | ||
- | |||
$fields=array('type'=>$match[1]); | $fields=array('type'=>$match[1]); | ||
- | |||
preg_match_all('/\|(.*?)=(.*?)(\||$)/ms', $match[2], $match); | preg_match_all('/\|(.*?)=(.*?)(\||$)/ms', $match[2], $match); | ||
- | |||
foreach($match[1] as $key => $value) | foreach($match[1] as $key => $value) | ||
- | |||
$fields[$value]=$match[2][$key]; | $fields[$value]=$match[2][$key]; | ||
- | |||
return $fields; | return $fields; | ||
- | |||
} | } | ||
- | |||
- | |||
static function names($names) | static function names($names) | ||
- | |||
{ | { | ||
- | |||
$names=split(',', $names); | $names=split(',', $names); | ||
- | |||
foreach($names as $key=>$item) | foreach($names as $key=>$item) | ||
- | |||
{ | { | ||
- | |||
$item=trim($item); | $item=trim($item); | ||
- | |||
$name=split(' ', $item); | $name=split(' ', $item); | ||
- | |||
$lastname=array_pop($name); | $lastname=array_pop($name); | ||
- | |||
$givennames=BibliographyFormat::makeList($name, ' ', ' '); | $givennames=BibliographyFormat::makeList($name, ' ', ' '); | ||
- | |||
$initials=array(); | $initials=array(); | ||
- | |||
if(count($name)>0) | if(count($name)>0) | ||
- | |||
foreach(split('[ -]', $givennames) as $initial) | foreach(split('[ -]', $givennames) as $initial) | ||
- | |||
{ | { | ||
- | |||
if($initial==strtoupper($initial)) | if($initial==strtoupper($initial)) | ||
- | |||
for($letter=0; $letter<strlen($initials); $letter++) | for($letter=0; $letter<strlen($initials); $letter++) | ||
- | |||
$initials[]=$initial[$letter]; | $initials[]=$initial[$letter]; | ||
- | |||
else | else | ||
- | |||
$initials[]=$initial[0]; | $initials[]=$initial[0]; | ||
- | |||
} | } | ||
- | |||
$names[$key]=array($givennames, $lastname, $initials, $name); | $names[$key]=array($givennames, $lastname, $initials, $name); | ||
- | |||
} | } | ||
- | |||
return $names; | return $names; | ||
- | |||
} | } | ||
- | |||
- | |||
} | } | ||
- | |||
- | |||
class BibliographyFormat { | class BibliographyFormat { | ||
- | |||
- | |||
var $mFields=array(); | var $mFields=array(); | ||
var $displayYear=null; | var $displayYear=null; | ||
- | |||
static $styleClass = ''; | static $styleClass = ''; | ||
- | |||
- | |||
static function renderWikiText($input) | static function renderWikiText($input) | ||
- | |||
{ | { | ||
- | |||
global $wgOut; | global $wgOut; | ||
- | |||
return $wgOut->parse($input, false); | return $wgOut->parse($input, false); | ||
- | |||
} | } | ||
- | |||
- | |||
function BibliographyFormat($reference) | function BibliographyFormat($reference) | ||
- | |||
{ | { | ||
- | |||
$this->mFields=BibliographicPageParser::parse($this->getArticleText($reference)); | $this->mFields=BibliographicPageParser::parse($this->getArticleText($reference)); | ||
- | |||
$this->mFields['reference']=$reference; | $this->mFields['reference']=$reference; | ||
- | |||
if(BibliographyFormat::$styleClass=='') | if(BibliographyFormat::$styleClass=='') | ||
- | |||
BibliographyFormat::setStyle('CSUHarvard_Style', 'extensions/bibliographystyle-csu.php'); | BibliographyFormat::setStyle('CSUHarvard_Style', 'extensions/bibliographystyle-csu.php'); | ||
- | |||
} | } | ||
- | |||
static function getArticleName($name) | static function getArticleName($name) | ||
{ | { | ||
if($name=='') | if($name=='') | ||
- | |||
return null; | return null; | ||
- | |||
$title=Title::newFromText($name); | $title=Title::newFromText($name); | ||
return $title->mDbkeyform; | return $title->mDbkeyform; | ||
} | } | ||
- | |||
static function getArticleText($name) | static function getArticleText($name) | ||
- | |||
{ | { | ||
- | |||
if($name=='') | if($name=='') | ||
- | |||
return null; | return null; | ||
- | |||
$title=Title::newFromText($name); | $title=Title::newFromText($name); | ||
$title=Revision::newFromTitle( $title ); | $title=Revision::newFromTitle( $title ); | ||
- | |||
if($title==null) | if($title==null) | ||
- | |||
return null; | return null; | ||
- | |||
return $title->getText(); | return $title->getText(); | ||
- | |||
} | } | ||
- | |||
- | |||
static function setStyle($style, $file) | static function setStyle($style, $file) | ||
- | |||
{ | { | ||
- | |||
require_once($file); | require_once($file); | ||
- | |||
BibliographyFormat::$styleClass=$style; | BibliographyFormat::$styleClass=$style; | ||
- | |||
} | } | ||
- | |||
- | |||
function intext($argv) | function intext($argv) | ||
- | |||
{ | { | ||
- | |||
return call_user_func(array(BibliographyFormat::$styleClass, 'intext'), $argv, $this); | return call_user_func(array(BibliographyFormat::$styleClass, 'intext'), $argv, $this); | ||
- | |||
} | } | ||
- | |||
- | |||
static function intextcite($articles) | static function intextcite($articles) | ||
- | |||
{ | { | ||
- | |||
return call_user_func(array(BibliographyFormat::$styleClass, 'intextcite'), $articles); | return call_user_func(array(BibliographyFormat::$styleClass, 'intextcite'), $articles); | ||
- | |||
} | } | ||
- | |||
- | |||
function reference($argv) | function reference($argv) | ||
- | |||
{ | { | ||
- | |||
return call_user_func(array(BibliographyFormat::$styleClass, 'reference'), $this); | return call_user_func(array(BibliographyFormat::$styleClass, 'reference'), $this); | ||
- | |||
} | } | ||
- | |||
- | |||
function referenceList($argv) | function referenceList($argv) | ||
- | |||
{ | { | ||
- | |||
return call_user_func(array(BibliographyFormat::$styleClass, 'referenceList'), $argv); | return call_user_func(array(BibliographyFormat::$styleClass, 'referenceList'), $argv); | ||
- | |||
} | } | ||
Line 202: | Line 107: | ||
{ | { | ||
return call_user_func(array(BibliographyFormat::$styleClass, 'orderReferences'), $articles); | return call_user_func(array(BibliographyFormat::$styleClass, 'orderReferences'), $articles); | ||
- | |||
} | } | ||
- | |||
- | |||
function bibliography($refrenceList) | function bibliography($refrenceList) | ||
- | |||
{ | { | ||
- | |||
$bibliography="bibliography:\n"; | $bibliography="bibliography:\n"; | ||
- | |||
foreach ($refrenceList as $item) | foreach ($refrenceList as $item) | ||
- | |||
{ | { | ||
- | |||
$bibliography.="#".$item->reference($str, $argv)."\n"; | $bibliography.="#".$item->reference($str, $argv)."\n"; | ||
- | |||
} | } | ||
- | |||
return $bibliography; | return $bibliography; | ||
- | |||
} | } | ||
- | |||
- | |||
function authors() | function authors() | ||
- | |||
{ | { | ||
if($this->field('author')) | if($this->field('author')) | ||
- | |||
return BibliographicPageParser::names($this->mFields['author']); | return BibliographicPageParser::names($this->mFields['author']); | ||
- | |||
if($this->field('editor')) | if($this->field('editor')) | ||
- | |||
return $this->editors(); | return $this->editors(); | ||
return ""; | return ""; | ||
- | |||
} | } | ||
- | |||
- | |||
function editors() | function editors() | ||
- | |||
{ | { | ||
- | |||
return BibliographicPageParser::names($this->mFields['editor']); | return BibliographicPageParser::names($this->mFields['editor']); | ||
- | |||
} | } | ||
- | |||
- | |||
function year() | function year() | ||
- | |||
{ | { | ||
if($this->displayYear) return $this->displayYear; | if($this->displayYear) return $this->displayYear; | ||
return $this->rawYear(); | return $this->rawYear(); | ||
- | |||
} | } | ||
- | |||
function rawYear() | function rawYear() | ||
- | |||
{ | { | ||
if(key_exists('year', $this->mFields)) | if(key_exists('year', $this->mFields)) | ||
- | |||
return $this->mFields['year']; | return $this->mFields['year']; | ||
- | |||
if(key_exists('date', $this->mFields)) | if(key_exists('date', $this->mFields)) | ||
- | |||
{ | { | ||
- | |||
$date=split('/', $this->mFields['date']); | $date=split('/', $this->mFields['date']); | ||
- | |||
return date('Y', strtotime('1/1/'.$date[0])); | return date('Y', strtotime('1/1/'.$date[0])); | ||
- | |||
} | } | ||
- | |||
return '?'; | return '?'; | ||
- | |||
} | } | ||
- | |||
- | |||
function title() | function title() | ||
- | |||
{ | { | ||
- | |||
return $this->mFields['name']; | return $this->mFields['name']; | ||
- | |||
} | } | ||
- | |||
- | |||
function type() | function type() | ||
- | |||
{ | { | ||
- | |||
return $this->mFields['type']; | return $this->mFields['type']; | ||
- | |||
} | } | ||
- | |||
- | |||
function field($name) | function field($name) | ||
- | |||
{ | { | ||
- | |||
if(!key_exists($name, $this->mFields)) | if(!key_exists($name, $this->mFields)) | ||
- | |||
return NULL; | return NULL; | ||
- | |||
return $this->mFields[$name]; | return $this->mFields[$name]; | ||
- | |||
} | } | ||
- | |||
- | |||
function referencename() | function referencename() | ||
- | |||
{ | { | ||
- | |||
return $this->mFields['reference']; | return $this->mFields['reference']; | ||
- | |||
} | } | ||
- | |||
- | |||
function formatCount($num) | function formatCount($num) | ||
- | |||
{ | { | ||
- | |||
if(!is_numeric($num)) | if(!is_numeric($num)) | ||
- | |||
return $num; | return $num; | ||
- | |||
if($num>3 && $num<21) | if($num>3 && $num<21) | ||
- | |||
return $num.'th'; | return $num.'th'; | ||
- | |||
switch($num % 10) | switch($num % 10) | ||
- | |||
{ | { | ||
- | |||
case 1: | case 1: | ||
- | |||
return $num.'st'; | return $num.'st'; | ||
- | |||
case 1: | case 1: | ||
- | |||
return $num.'nd'; | return $num.'nd'; | ||
- | |||
case 1: | case 1: | ||
- | |||
return $num.'rd'; | return $num.'rd'; | ||
- | |||
} | } | ||
- | |||
return $num.'th'; | return $num.'th'; | ||
- | |||
} | } | ||
- | |||
- | |||
static function makeList($items, $delim=', ', $finalDelim=' & ') | static function makeList($items, $delim=', ', $finalDelim=' & ') | ||
- | |||
{ | { | ||
- | |||
$list=''; | $list=''; | ||
- | |||
if(count($items)==1) | if(count($items)==1) | ||
- | |||
return array_shift($items); | return array_shift($items); | ||
- | |||
foreach($items as $key=>$item) | foreach($items as $key=>$item) | ||
- | |||
if($key+1==count($items)) | if($key+1==count($items)) | ||
- | |||
$list.=$finalDelim.$item; | $list.=$finalDelim.$item; | ||
- | |||
else | else | ||
- | |||
$list.=$delim.$item; | $list.=$delim.$item; | ||
- | |||
return substr($list, strlen($delim)+0); | return substr($list, strlen($delim)+0); | ||
- | |||
} | } | ||
- | |||
- | |||
} | } | ||
- | |||
- | |||
?></pre> | ?></pre> |
Current revision
<?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); } } ?>