Benutzer:Martin Lemke/extensions/Zitat
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
- verlässliches 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.1',
'description'=>'Wissenschaftlich zitieren. Kompatibel zur Extension Cite.'
);
if (defined('MW_SUPPORTS_PARSERFIRSTCALLINIT'))
{
$wgHooks['ParserFirstCallInit'][]='initZitat';
}
else $wgExtensionsFunctions[]='initZitat';
function initZitat(Parser $parser)
{
new zitat($parser);
return true;
}
class zitat {
private $refs=array();
private $zitate=array();
function __construct(Parser $parser)
{
// HOOKS aus Introspektion
$methods=get_class_methods($this);
foreach($methods as $method)
if (substr($method,0,5)=='HOOK_')
$parser->setHook(substr($method,5), array(&$this,$method));
}
private function pimpup($line, $char)
// wenn ein Autor mehr als eine Pubikation in dem einen Jahr hat, Anfügen von a,b,c ...
{
$pos=strpos($line,')');
if (false!=$pos)
{
$pos--;
if (is_numeric($line[$pos]))
{
$ret= str_replace(')',"$char)", $line);
return $ret;
}
else
{
$line[$pos]=$char;
return $line;
}
}
}
private function Nachname($name) {
/* neu in V 2
Trennt zum Schluss genannte Vornamenkürzel ab
Übergabeformat: van Helsing JP => van Helsing
Lemke M => Lemke
aber 'World Spider Catalog Association' darf nicht gekürzt werden! Merkmal: letzter Bst. kein Großbuchstabe: 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 großer Buchstabe, also abgekürzter Vorname
$name=trim($name); // sicher ist sicher
$i=strlen($name)-2; // Leerzeichen bei Vornamen einfacher Länge
while($i>0 AND $name[$i]!==' ')
$i--;
return substr($name,0,$i);
} else return $name; //letzter Buchstabe ist ein kleiner Buchstabe, Name soll nicht geändert werden
}
private function extractAutor($inp)
{
$sub=substr($inp, strpos($inp, '>')+1);
if (strstr($sub,'et al.')!==false)
$additional=' et al.';
else $additional='';
$roh= substr($sub, 0, strpos($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
?>