Benutzer:Martin Lemke/extensions/Zitat

Aus Wiki der Arachnologischen Gesellschaft e. V.
Wechseln zu: Navigation, Suche

Zitat anstatt Cite

Die Extension Cite zeigt leider den Fehler, dass die Referenzliste der Zitate nicht eingeloggten Besuchern des Wikis nicht angezeigt werden. Der Quellcode der Extension Cite ist dabei derart komplex, dass bisher niemand herausfinden konnte, warum das so ist. Der Autor von Cite teile mir mit, dass er die Extension nicht mehr pflege und lies mich mit dem Problem allein.

Ich will nun versuchen, eine Altternative zu Cite, nämlich Zitat zu entwickeln. Zitat soll bei der Gelegenheit in der wissenschaftlich üblichen Weise zitieren (mit Orientierung an den Vorgaben für Autoren der Arachnologischen Mitteilungen der AraGes).

Zitat einfügen

Als Literaturangabe wird die hier im Spinnen-Wiki verwendete Vorlage {{Literatur}} (Link: Vorlage:Literatur) vorausgesetzt.

Referenzen werden wie folgt eingefügt: <ref>{{Lit Domes et al 2007 Reevolution}}</ref>, bzw. <ref name='blick 2003'>{{Lit Blick Nentwig 2003 Aculepeira lapponica}}</ref> und .

Dabei ist darauf zu achten, dass die Defininition <ref name='blick 2003'>{{Lit Blick Nentwig 2003 Aculepeira lapponica}}</ref> im Text unbegingt vor der namensbasierten Referenz <ref name='blick 2003/> auftaucht.

Eine alphabetisch sorfierte Quelleliste erhält man durch Angabe von <references/>

Attribut zur Anzeige des vollständigen Zitats

anzeige='ganzes Zitat'

Zweck: Anzeige der gesamten Referenz (z.B. im Artikel Phantomarten verwendet)

Bsp.:

  • Ohne dieses Attribut

<ref name='blick 2003'>{{Lit Blick Nentwig 2003 Aculepeira lapponica}}</ref>
=> (Blick & Nentwig 2003)

  • Mit diesem Attribut

<ref anzeige='ganzes Zitat' name='blick 2003'>{{Lit Blick Nentwig 2003 Aculepeira lapponica}}</ref>
=> Blick T & Nentwig W (2003): Taxonomische Notiz zu Aculepeira lapponica (Arachnida: Araneae: Araneidae). Arachnologische Mitteilungen 25, S. 38–41, ISSN 1018-4171, doi:10.5431/aramit2503.

Source

<?php

/*
ver 1.0.1 2013-05-01
\n entfernt

ver 2.0 2020-01-10
- verlssliches Abtrennen des Vornamens aufgrund neuer Eingabe-Norm: van Helsdingen JP, Lemke M & Bauer H
*/

$wgExtensionCredits['parserhook'][]=
  array(
    
'name'=>'Zitat',
    
'author'=>'Martin Lemke',
    
'url'=>'/index.php?title=Benutzer:Martin/extensions/Zitat',
    
'version'=>'2.0',
    
'description'=>'Wissenschaftlich zitieren. Kompatibel zur Extension Cite.'
  
);

  if (
defined('MW_SUPPORTS_PARSERFIRSTCALLINIT'))
  {
    
$wgHooks['ParserFirstCallInit'][]='initZitat';
  }
  else 
$wgExtensionsFunctions[]='initZitat';

function 
initZitat()
{
    new 
zitat;
    return 
true;
}


class 
zitat {


    private 
$refs=array();
    private 
$zitate=array();

  function 
__construct()
  {
     global 
$wgParser;

      
// HOOKS aus Introspektion
    
$methods=get_class_methods($this);
    foreach(
$methods as $method)
      if (
substr($method,0,5)=='HOOK_')
         
$wgParser->setHook(substr($method,5), array(&$this,$method));

    }

  private function 
pimpup($line$char)
  
//  wenn ein Autor mehr als eine Pubikation in dem einen Jahr hat, Anfgen von a,b,c ...
  
{
    
$pos=strpos($line,')');
    if (
false!=$pos)
    {
      
$pos--;
      if (
is_numeric($line[$pos]))
      {
        
$retstr_replace(')',"$char)"$line);
        return 
$ret;
      }
      else
      {
        
$line[$pos]=$char;
        return 
$line;
      }
    }
  }

    private function 
Nachname($name) {
        
/*  neu in V 2
        Trennt zum Schluss genannte Vornamenkrzel ab
        bergabeformat: van Helsing JP => van Helsing
        Lemke M => Lemke
        aber 'World Spider Catalog Association' darf nicht gekrzt werden!  Merkmal: letzter Bst. kein Grobuchstabe: preg_match('~^\p{Lu}~u',$name[strlen($name)-1])
        */
        
$name=trim($name);
        if (
preg_match('~^\p{Lu}~u',$name[strlen($name)-1])) {
            
// letzter Buchstabe ist ein groer Buchstabe, also abgekrzter Vorname
            
$name=trim($name); // sicher ist sicher
            
$i=strlen($name)-2// Leerzeichen bei Vornamen einfacher Lnge
            
while($i>AND $name[$i]!==' ')
                
$i--;
            return 
substr($name,0,$i);
        } else return 
$name//letzter Buchstabe ist ein kleiner Buchstabe, Name soll nicht gendert werden
    
}


  private function 
extractAutor($inp)
  {
    
$sub=substr($inpstrpos($inp'>')+1);
    if (
strstr($sub,'et al.')!==false)
      
$additional=' et al.';
    else 
$additional='';
    
$rohsubstr($sub0strpos($sub,'<'));

    
$namen=array();
    
$roh=str_replace('&',','$roh);
    
$namen=explode(',',$roh);
    for(
$i=0$i<count($namen); $i++)
        
$namen[$i]=$this->Nachname($namen[$i]);
    if (
count($namen)>2)
      
$autor=sprintf("<span style='font-variant: small-caps;'>%s</span> et al."$namen[0]);
    else
    {
      
//$namen=explode('&', $roh);
      
if (count($namen)==2)
        
$autor=sprintf("<span style='font-variant: small-caps;'>%s & %s</span>"$namen[0], $namen[1]);
      else 
$autor=sprintf("<span style='font-variant: small-caps;'>%s</span>%s"$namen[0], $additional);
    }
    return 
$autor;
  }

  function 
HOOK_ref($input$args$parser$frame)
  {
    
// Einlesen Parameter
    
$lit=$parser->recursiveTagParse($input$frame);
    if (isset(
$args['name']))
      
$name=$args['name'];
    else 
$name=NULL;

    if (isset(
$args['anzeige']))
    {
        if (
strtolower($args['anzeige'])=='ganzes zitat')
            
$anzeige='fullref';
            else 
$anzeige='shortref';
    }
  else
    
$anzeige='';

    if (!empty(
$lit))
    {
      
$n=strpos($lit,'(');
      
$autor=$this->extractAutor($lit);
      
$jahr=substr($lit$n+1,4);

      if (
$anzeige=='fullref')
        
$refanzeige=$lit;
      else 
$refanzeige=sprintf(" <span class='litref'>(%s %s)</span>"$autor$jahr);


      if (!
is_null($name))
      {
        if (!
array_key_exists($name$this->refs ))
        {
           
$ref=array('shortref'=>$refanzeige'fullref'=>$lit);
           
$this->refs[$name]=$ref;
        }
      }
      elseif (!
array_key_exists($refanzeige$this->refs))
      {
         
$ref=array('shortref'=>$refanzeige'fullref'=>$lit);
         
$this->refs[$refanzeige]=$ref;
      }
      else
      {
         
$buchstaben='abcdefghiklmnopqrstuvwxyz';
         
$index=0;
         
$refanzeige=$this->pimpup($refanzeige'a');
         while(
array_key_exists($refanzeige$this->refs))
         {
           
$index++;
           
$refanzeige=$this->pimpup($refanzeige$buchstaben[$index]);
         }
         
$lit=$this->pimpup($lit$buchstaben[$index]);
         
$ref=array('shortref'=>$refanzeige'fullref'=>$lit);
         
$this->refs[$refanzeige]=$ref;
      }
      if (!
in_array($lit$this->zitate))
        
$this->zitate[]=$lit;
      return 
$refanzeige;
    }
    elseif ((
$name!=NULL) && (!empty($this->refs[$name])))
    {
       
$ref=$this->refs[$name];
       return 
$ref['shortref'];
    }
    else return 
sprintf("<span style='color: red; '> Fehler! Referenz name='%s' kann nicht zugeordnet werden</span>"$name);
  }

  function 
HOOK_references()
  {
    
natsort($this->zitate);
    
//Es treten bei Wiki-Notation Formatierungsfehler auf.
    
$result="<ul>"// \n entfernt ver 1.0.1
    
foreach($this->zitate as $eintrag)
      
$result.="<li>$eintrag</li>\n";
    
$result.="</ul>"// \n entfernt ver 1.0.1
    
return $result;
  }

    function 
HOOK_zitat_source() {
      
// formatierte Anzeige des aktuellen Quellcodes
        
$source=highlight_string(file_get_contents(__FILE__), true);
        
// gelbe Kommentare grau drucken. Sonst ausgedruckt nicht lesbar.
        
$source=str_replace('#5C5C5C"','#5C5C5C"'$source);
        return 
$source;
    }

//END CLASS
?>