BibliographicExtension/bibliography.php

From PeacockWiki

(Difference between revisions)
Jump to: navigation, search
Revision as of 01:10, 27 August 2006 (edit)
Trevorp (Talk | contribs)

← Previous diff
Revision as of 15:17, 16 October 2006 (edit)
137.166.127.86 (Talk)

Next diff →
Line 1: Line 1:
<pre><?php <pre><?php
 +
 +
require('extensions/bibliographyformat.php'); require('extensions/bibliographyformat.php');
 +
 +
if(isset($_GET['bibfile'])) if(isset($_GET['bibfile']))
 +
doFileBib(); doFileBib();
 +
 +
$wgExtensionCredits["parserhook"][]=array( $wgExtensionCredits["parserhook"][]=array(
 +
'name' => 'Bibliographic Extension', 'name' => 'Bibliographic Extension',
 +
'version' => '0.1', 'version' => '0.1',
 +
'url' => 'http://wiki.peacocktech.com/wiki/BibliographicExtension', 'url' => 'http://wiki.peacocktech.com/wiki/BibliographicExtension',
 +
'author' => '[http://about.peacocktech.com/trevorp/ Trevor Peacock]', 'author' => '[http://about.peacocktech.com/trevorp/ Trevor Peacock]',
 +
'description' => 'Adds a bibliographic engine' ); 'description' => 'Adds a bibliographic engine' );
 +
$wgExtensionFunctions[] = "BibliographicExtension"; $wgExtensionFunctions[] = "BibliographicExtension";
 +
 +
function BibliographicExtension() function BibliographicExtension()
 +
{ {
 +
global $wgParser; global $wgParser;
 +
 +
class Bibliography { class Bibliography {
 +
 +
var $mBibliography = array(); var $mBibliography = array();
 +
var $citeTag="bcite"; var $citeTag="bcite";
 +
 +
function Bibliography() function Bibliography()
 +
{ {
 +
global $wgParser, $wgHooks; global $wgParser, $wgHooks;
 +
$wgParser->setHook("reference", array( &$this, "renderReference")); $wgParser->setHook("reference", array( &$this, "renderReference"));
 +
$wgParser->setHook($this->citeTag, array( &$this, "renderCite")); $wgParser->setHook($this->citeTag, array( &$this, "renderCite"));
 +
$wgParser->setHook("bibliography", array( &$this, "renderBibliography")); $wgParser->setHook("bibliography", array( &$this, "renderBibliography"));
 +
$wgHooks['SkinTemplateSetupPageCss'][] = array( &$this, 'cssBibliography'); $wgHooks['SkinTemplateSetupPageCss'][] = array( &$this, 'cssBibliography');
 +
#$wgHooks['OutputPageBeforeHTML'][] = array( &$this, 'PostProcess'); #$wgHooks['OutputPageBeforeHTML'][] = array( &$this, 'PostProcess');
 +
} }
 +
 +
function renderWikiText($input, &$parser) function renderWikiText($input, &$parser)
 +
{ {
 +
return $parser->parse($input, $parser->mTitle, $parser->mOptions, return $parser->parse($input, $parser->mTitle, $parser->mOptions,
 +
false, false)->getText(); false, false)->getText();
 +
} }
- function cssBibliography()+ 
 + 
 + function cssBibliography(&$css)
 + 
{ {
 +
global $wgScriptPath; global $wgScriptPath;
- $css = "/*<![CDATA[*/".+ 
- " @import \"$wgScriptPath/?file=bibliography.css\"; ".+ $css.= "/*<![CDATA[*/".
- "/*]]>*/";+ 
 + " @import \"$wgScriptPath/?bibfile=bibliography.css\"; ";
 + 
 + if(isset($_GET['printable']) && $_GET['printable']=='yes')
 + $css.= " @import \"$wgScriptPath/?bibfile=bibliographyPrint.css\"; ";
 + 
 + if(isset($_GET['final']) && $_GET['printable']=='yes')
 + $css.= " @import \"$wgScriptPath/?bibfile=bibliographyPrintFinal.css\"; ";
 + 
 + $css.= "/*]]>*/";
 + 
return true; return true;
 +
} }
 +
 +
function renderReference($str, $argv, $parser) function renderReference($str, $argv, $parser)
 +
{ {
 +
$text=$this->renderWikiText($str, $parser); $text=$this->renderWikiText($str, $parser);
 +
 + $this->mBibliography=BibliographyFormat::orderReferences($this->mBibliography);
# var_dump($this->mBibliography); # var_dump($this->mBibliography);
 +
while(preg_match('/<'.$this->citeTag.' (.*?)\/>/ms', $text, $match, PREG_OFFSET_CAPTURE)) while(preg_match('/<'.$this->citeTag.' (.*?)\/>/ms', $text, $match, PREG_OFFSET_CAPTURE))
 +
{ {
 +
preg_match_all('/(.*?)=\"(.*?)\"/ms', $match[1][0], $match2); preg_match_all('/(.*?)=\"(.*?)\"/ms', $match[1][0], $match2);
 +
# var_dump($match2); # var_dump($match2);
 +
$params=array(); $params=array();
 +
foreach($match2[1] as $key=>$item) foreach($match2[1] as $key=>$item)
 +
{ {
 +
if(trim($item)=='article') if(trim($item)=='article')
 +
{ {
 +
if(!key_exists('articles', $params)) if(!key_exists('articles', $params))
 +
$params['articles']=array(); $params['articles']=array();
 +
$params['articles'][$match2[2][$key]]=array('article'=>$this->mBibliography[$match2[2][$key]]); $params['articles'][$match2[2][$key]]=array('article'=>$this->mBibliography[$match2[2][$key]]);
 +
$lastarticle=$match2[2][$key]; $lastarticle=$match2[2][$key];
 +
} }
 +
else else
 +
{ {
 +
if(trim($item)=='note') if(trim($item)=='note')
 +
$params['articles'][$lastarticle]['note']=$match2[2][$key]; $params['articles'][$lastarticle]['note']=$match2[2][$key];
 +
else else
 +
$params[trim($item)]=$match2[2][$key]; $params[trim($item)]=$match2[2][$key];
 +
} }
 +
} }
 +
# var_dump($params); # var_dump($params);
 +
$start=$match[0][1]; $start=$match[0][1];
 +
$len=strlen($match[0][0]); $len=strlen($match[0][0]);
 +
$reference=BibliographyFormat::intextcite($params); $reference=BibliographyFormat::intextcite($params);
 +
$text=substr_replace($text, $reference, $start, $len); $text=substr_replace($text, $reference, $start, $len);
 +
} }
 +
 +
$reference=null; $reference=null;
 +
while(preg_match('/<bibliography\/>/ms', $text, $match, PREG_OFFSET_CAPTURE)) while(preg_match('/<bibliography\/>/ms', $text, $match, PREG_OFFSET_CAPTURE))
 +
{ {
 +
$start=$match[0][1]; $start=$match[0][1];
 +
$len=strlen($match[0][0]); $len=strlen($match[0][0]);
 +
if(!isset($reference)) $reference=BibliographyFormat::referenceList($this->mBibliography); if(!isset($reference)) $reference=BibliographyFormat::referenceList($this->mBibliography);
 +
$text=substr_replace($text, $reference, $start, $len); $text=substr_replace($text, $reference, $start, $len);
 +
} }
 +
return $text; return $text;
 +
} }
 +
 +
var $mCite; var $mCite;
 +
function renderCite($str, $argv, $parser) function renderCite($str, $argv, $parser)
 +
{ {
 +
if(!isset($this->mCite)) if(!isset($this->mCite))
 +
{ {
 +
$this->mCite=array(); $this->mCite=array();
 +
} }
 +
else else
 +
{ {
 +
if(key_exists('article', $argv)) if(key_exists('article', $argv))
 +
$this->mCite[$argv['article']]=key_exists('note', $argv)?$argv['note']:''; $this->mCite[$argv['article']]=key_exists('note', $argv)?$argv['note']:'';
 +
$this->renderWikiText($str, $parser); $this->renderWikiText($str, $parser);
 +
return; return;
 +
} }
 +
if(key_exists('article', $argv)) if(key_exists('article', $argv))
 +
$this->mCite[$argv['article']]=key_exists('note', $argv)?$argv['note']:''; $this->mCite[$argv['article']]=key_exists('note', $argv)?$argv['note']:'';
 +
$this->renderWikiText($str, $parser); $this->renderWikiText($str, $parser);
 +
$text="<".$this->citeTag." type=\"".(key_exists('type', $argv)?$argv['type']:'normal')."\""; $text="<".$this->citeTag." type=\"".(key_exists('type', $argv)?$argv['type']:'normal')."\"";
 +
foreach($this->mCite as $item=>$note) foreach($this->mCite as $item=>$note)
 +
{ {
 + $item=BibliographyFormat::getArticleName($item);
 +
$text.=" article=\"".$item."\""; $text.=" article=\"".$item."\"";
 +
if ($note!='') if ($note!='')
 +
$text.=" note=\"".$note."\""; $text.=" note=\"".$note."\"";
 +
if(!key_exists($item, $this->mBibliography)) if(!key_exists($item, $this->mBibliography))
 +
$this->mBibliography[$item]=new BibliographyFormat($item); $this->mBibliography[$item]=new BibliographyFormat($item);
 +
} }
 +
$text.="/>"; $text.="/>";
 +
unset($this->mCite); unset($this->mCite);
 +
return $text; return $text;
 +
} }
 +
 +
function renderBibliography($str, $argv, $parser) function renderBibliography($str, $argv, $parser)
 +
{ {
 +
return "<bibliography/>"; return "<bibliography/>";
 +
} }
 +
 +
function PostProcess($parserOutput, $text) function PostProcess($parserOutput, $text)
 +
{ {
 +
$text=$text; $text=$text;
 +
} }
 +
 +
} }
 +
 +
new Bibliography(); new Bibliography();
 +
 +
} }
 +
 +
function doFileBib() function doFileBib()
 +
{ {
 +
switch ($_GET['bibfile']) switch ($_GET['bibfile'])
 +
{ {
 +
case "bibliography.css": case "bibliography.css":
 +
header("Content-type: text/css"); header("Content-type: text/css");
 +
?> ?>
-//CSS here+ 
 +p {
 + text-indent: 10px;
 +}
 + 
 +h1 {
 + page-break-before: always;
 +}
 + 
 +h1.firstHeading {
 + page-break-before: avoid;
 +}
 + 
 +p.bibliographicReference {
 +}
 + 
 +.bibliographicReferences{
 + padding-left: 20px;
 + text-indent: -20px;
 + line-height: 2em;
 +}
<?php <?php
die(); die();
 +
 + case "bibliographyPrint.css":
 +
 + header("Content-type: text/css");
 +
 + ?>
 +
 +.firstHeading,
 +.printfooter,
 +#footer,
 +#catlinks {
 + display: none;
 +}
 +<?php
 + die();
 +
 + case "bibliographyPrintFinal.css":
 +
 + header("Content-type: text/css");
 +
 + ?>
 +
 +p {
 + margin: .5em 0 .5em 0;
 + line-height: 2em;
 +}
 +<?php
 + die();
 +
} }
 +
} }
 +
 +
?></pre> ?></pre>

Revision as of 15:17, 16 October 2006

<?php



require('extensions/bibliographyformat.php');



if(isset($_GET['bibfile']))

  doFileBib();



$wgExtensionCredits["parserhook"][]=array(

  'name' => 'Bibliographic Extension',

  'version' => '0.1',

  'url' => 'http://wiki.peacocktech.com/wiki/BibliographicExtension',

  'author' => '[http://about.peacocktech.com/trevorp/ Trevor Peacock]',

  'description' => 'Adds a bibliographic engine' );

$wgExtensionFunctions[] = "BibliographicExtension";



function BibliographicExtension()

{

  global $wgParser;



  class Bibliography {



    var $mBibliography = array();

    var $citeTag="bcite";



    function Bibliography()

    {

      global $wgParser, $wgHooks;

      $wgParser->setHook("reference", array( &$this, "renderReference"));

      $wgParser->setHook($this->citeTag, array( &$this, "renderCite"));

      $wgParser->setHook("bibliography", array( &$this, "renderBibliography"));

      $wgHooks['SkinTemplateSetupPageCss'][] = array( &$this, 'cssBibliography');

      #$wgHooks['OutputPageBeforeHTML'][] = array( &$this, 'PostProcess');

    }



    function renderWikiText($input, &$parser)

    {

      return $parser->parse($input, $parser->mTitle, $parser->mOptions, 

        false, false)->getText();

    }



    function cssBibliography(&$css)

    {

      global $wgScriptPath;

      $css.= "/*<![CDATA[*/".

        " @import \"$wgScriptPath/?bibfile=bibliography.css\"; ";

      if(isset($_GET['printable']) && $_GET['printable']=='yes')
        $css.= " @import \"$wgScriptPath/?bibfile=bibliographyPrint.css\"; ";

      if(isset($_GET['final']) && $_GET['printable']=='yes')
        $css.= " @import \"$wgScriptPath/?bibfile=bibliographyPrintFinal.css\"; ";

      $css.= "/*]]>*/";

      return true;

    }



    function renderReference($str, $argv, $parser)

    {

      $text=$this->renderWikiText($str, $parser);

      $this->mBibliography=BibliographyFormat::orderReferences($this->mBibliography);
#      var_dump($this->mBibliography);

      while(preg_match('/<'.$this->citeTag.' (.*?)\/>/ms', $text, $match, PREG_OFFSET_CAPTURE))

      {

        preg_match_all('/(.*?)=\"(.*?)\"/ms', $match[1][0], $match2);

#        var_dump($match2);

        $params=array();

        foreach($match2[1] as $key=>$item)

        {

          if(trim($item)=='article')

          {

            if(!key_exists('articles', $params))

              $params['articles']=array();

            $params['articles'][$match2[2][$key]]=array('article'=>$this->mBibliography[$match2[2][$key]]);

            $lastarticle=$match2[2][$key];

          }

          else

          {

            if(trim($item)=='note')

              $params['articles'][$lastarticle]['note']=$match2[2][$key];

            else

              $params[trim($item)]=$match2[2][$key];

          }

        }

#        var_dump($params);

        $start=$match[0][1];

        $len=strlen($match[0][0]);

        $reference=BibliographyFormat::intextcite($params);

        $text=substr_replace($text, $reference, $start, $len);

      }



      $reference=null;

      while(preg_match('/<bibliography\/>/ms', $text, $match, PREG_OFFSET_CAPTURE))

      {

        $start=$match[0][1];

        $len=strlen($match[0][0]);

        if(!isset($reference)) $reference=BibliographyFormat::referenceList($this->mBibliography);

        $text=substr_replace($text, $reference, $start, $len);

      }

      return $text;

    }



    var $mCite;

    function renderCite($str, $argv, $parser)

    {

      if(!isset($this->mCite))

      {

        $this->mCite=array();

      }

      else

      {

        if(key_exists('article', $argv))

          $this->mCite[$argv['article']]=key_exists('note', $argv)?$argv['note']:'';

        $this->renderWikiText($str, $parser);

        return;

      }

      if(key_exists('article', $argv))

        $this->mCite[$argv['article']]=key_exists('note', $argv)?$argv['note']:'';

      $this->renderWikiText($str, $parser);

      $text="<".$this->citeTag." type=\"".(key_exists('type', $argv)?$argv['type']:'normal')."\"";

      foreach($this->mCite as $item=>$note)

      {
        $item=BibliographyFormat::getArticleName($item);

        $text.=" article=\"".$item."\"";

        if ($note!='')

          $text.=" note=\"".$note."\"";

        if(!key_exists($item, $this->mBibliography))

          $this->mBibliography[$item]=new BibliographyFormat($item);

      }

      $text.="/>";

      unset($this->mCite);

      return $text;

    }



    function renderBibliography($str, $argv, $parser)

    {

      return "<bibliography/>";

    }



    function PostProcess($parserOutput, $text)

    {

      $text=$text;

    }



  }



  new Bibliography();



}



function doFileBib()

{

  switch ($_GET['bibfile'])

  {

    case "bibliography.css":

      header("Content-type: text/css");

        ?>

p {
  text-indent: 10px;
}

h1 {
  page-break-before: always;
}

h1.firstHeading {
  page-break-before: avoid;
}

p.bibliographicReference {
}

.bibliographicReferences{
  padding-left: 20px;
  text-indent: -20px;
  line-height: 2em;
}
<?php
      die();

    case "bibliographyPrint.css":

      header("Content-type: text/css");

        ?>

.firstHeading,
.printfooter,
#footer,
#catlinks {
  display: none;
}
<?php
      die();

    case "bibliographyPrintFinal.css":

      header("Content-type: text/css");

        ?>

p {
  margin: .5em 0 .5em 0;
  line-height: 2em;
}
<?php
      die();

  }

}



?>
Personal tools