Lizenz
- Der Quelltext wurde wie alle Artikel dieses Wikis unter der CC-BY-SA 3.0-Lizenz veröffentlicht.
Quelltext
#!/usr/bin/perl -w
use MediaWiki::API;
use Tree::Simple;
use Digest::MD5 qw(md5_hex);
use utf8;
#
#
# READ THE SITE STRUCTURE
#
#
my $mw = MediaWiki::API->new();
$mw->{config}->{api_url} = 'http://wiki.piratenpartei.de/wiki/api.php';
# log in
$mw->login( { lgname => 'Wibogel', lgpassword => '*****' } ) || die "Wikibot wibogel: ".$mw->{error}->{code} . ': ' . $mw->{error}->{details};
# get all pages with Prefix "Landesverband" in namespace 246 (LSA)
my $articles = $mw->list ( {
action => 'query',
list => 'allpages',
apprefix => 'Landesverband',
apnamespace => '246',
apfilterredir => 'nonredirects',
aplimit => '2000'
} ) || die "Wikibot wibogel: ".$mw->{error}->{code} . ': ' . $mw->{error}->{details};
# to collect all data, we use a simple graph and assume tree structure caused by wiki name conventions
my $tree = Tree::Simple->new("/", Tree::Simple->ROOT);
# hang in subtrees
foreach (@{$articles}) {
addTree( $tree, $_->{title} );
}
# uncomment to get a html encoded preview
#use Tree::Simple::View::HTML;
#my $viewer = Tree::Simple::View::HTML->new( $tree );
#print $viewer->expandAll();
# inform users about the bots acitvity
$wikiheader = qq~<noinclude>
{{Achtung|Diese Wikiseite wird durch den Wiki-Bot [[Benutzer:Wibogel|Wibogel]] automatisch gepflegt. Wende Dich zuerst an die Betreiber des Bots, bevor Du Änderungen vornimmst, der Bot wird sonst Deine Änderungen ungeprüft überschreiben.}}
</noinclude>~;
# header of the whole frame
$wikiheader = $wikiheader.qq~{{LSA-Menu}}{{#ifeq: {{#titleparts:{{FULLPAGENAME}}|1|0}} | LSA:Landesverband | {{#ifeq: {{FULLPAGENAME}} | LSA:Landesverband | <!-- LSA-Menu wird auf der Startseite durch ein individuelles Menü ersetzt --> | <div style="padding:0px;margin:0px;float:right;width:320px;overflow:auto;">{{Vorlage:Textbox-Orange|Navigation|2=\n~;#<span><!-- span as workaround --></span>~;
# get the menu itself
my $menu = printTree( $tree->getChild(0), -1 , "LSA:Landesverband", 1, 0 , "");
# finish with footer, usage and licence information
my $wikifooter ="<p style=\"text-align:center;font-size:10pt;\">[[Benutzer:Wibogel|Menü bearbeiten]]</p>}}";
$wikifooter = $wikifooter.qq~
</div>
{{#if: {{{1|}}}
|<div style="margin-right:270px;">{{{1}}}</div>
}} | <!-- Menü wird nur im Bereich des Landesverbandes angezeigt --> }}
}}
<noinclude>
= Verwendung =
<pre>
{{PST:Header|1=
Seiteninhalt
}}
</pre>
Der Seiteninhalt muss nicht zwingend in die Header-Vorlage übernommen wird. Bei sich überlappenden Div-Boxen (beispielsweise mit dem Menü) oder Überlappungen mit anderen Vorlagen aus dem Wiki, ist das allerdigns empfehlenswert.
= Info =
* Filter für den Internet Explorer (IE) werden zur Zeit nicht vom Wiki unterstützt.
* Rückfragen bitte per http://www.twitter.com/0l1h7
= Grundlage für diese Arbeit =
* Theme Name: PiratenSachsenTheme
* Theme URI: http://www.piraten-sachsen.de/theme
* Descripxion: This theme is made for the pirate party saxony. The whole * Template, Design and it containing files are licencend under CC-BY-SA
* Author: Thomas
* Author URI: http://twitter.com/dasllama
* Version: 0.9
* Tags: orange, multiple sidebars, cms, widgets
</noinclude>
~;
# connect all information for output
$content = $wikiheader.$menu.$wikifooter;
#
#
# CHECK IF CHANGES EXIST
#
#
my $lastmd5 = "";
open( FILE, "+>/PATH/TO/lsamd5" ) || die "WikiBot wibogel: Couldn't read former md5sum.";
read(FILE, $lastmd5, 32);
my $newmd5 = md5_hex( $content );
# uncomment for debugging
# print $content."\n";
if( $lastmd5 ne $newmd5 ) # && 0 == 1 ) # include for debugging
{
#
#
# APPLY CHANGES
#
#
# write information to the wiki
my $pagename = "Vorlage:LSA-Header";
my $ref = $mw->get_page( { title => $pagename } );
unless ( $ref->{missing} ) {
my $timestamp = $ref->{timestamp};
$mw->edit( {
action => 'edit',
title => $pagename,
basetimestamp => $timestamp, # to avoid edit conflicts
text => $content
} )
|| die "Wikibot wibogel: ".$mw->{error}->{code} . ': ' . $mw->{error}->{details};
}
print FILE $newmd5;
}
close( FILE );
#
# addTree( Tree::Simple $tree, String $wikipagename)
#
sub addTree {
my $tree = shift; # tree/subtree node
my $wikipagename = shift; # pagename of the node/subtree, which should be added
my $result = -1;
# take out the next node's value
if($wikipagename =~ /\//g)
{
$result = pos($wikipagename);
}
my $nextNodeValue;
# check if its a leaf
if( $result > 1 )
{
$nextNodeValue = substr( $wikipagename, 0, $result - 1 );
$wikipagename = substr( $wikipagename, $result );
}
else
{
$nextNodeValue = $wikipagename;
$wikipagename = "";
}
my $nextNode;
# for each child node add new subtree recursively
# first check, if new node allready exists
my @children = $tree->getAllChildren();
foreach (@children)
{
if( $_->getNodeValue() eq $nextNodeValue )
{
$nextNode = $_;
last;
}
}
# create new subtree, if the new node does not exist in the tree
if( !defined( $nextNode ) )
{
$nextNode = Tree::Simple->new( $nextNodeValue, $tree );
}
# add the new node to the tree
if( $wikipagename ne "" )
{
addTree( $nextNode, $wikipagename );
}
}
#
# printTree( Tree::Simple $tree, int $depth, String $link, int $siblingsc, int $siblingscc, String $depthline )
#
sub printTree {
my $tree = shift; # tree structure for recursive traverse
my $depth = shift; # depth of traverse
my $link = shift; # wikilink according to the node
my $siblingsc = shift; # number of siblings
my $siblingscc = shift; # sibling id of the node
my $depthline = shift; # visualisation of the tree structure
my $nodeValue = $tree->getNodeValue();
my $menu = "";
my $fork = "├";
my @children = $tree->getAllChildren();
my $childrenc = scalar @children;
my $depthlineAddition = "│";
if( $siblingscc + 1 == $siblingsc )
{
$fork = "└";
$depthlineAddition = " ";
}
else
{
if( $siblingscc == 0 && $depth < 0 )
{
$fork = "┌";
}
}
my $newtree = "┬";
# check if we are root
if( $nodeValue eq "LSA:Landesverband" )
{
$nodeValue = "Startseite";
$depthline = "";
}
# if there are no children, make a simple menu entry
# if there are children, print submenu frame and call prinTree recursively
if( $childrenc == 0 )
{
$menu = "<div style=\"white-space:nowrap;\">{{PST:MenuTree|$depthline$fork|▪}} [[$link|$nodeValue]]</div>\n";
}
else
{
$menu = "{{#ifeq: {{#titleparts:{{FULLPAGENAME}}|".($depth+2)."|0}} | $link | <div style=\"white-space:nowrap;\">{{PST:MenuTree|$depthline$fork$newtree|▾}} [[$link|$nodeValue]]</div>\n";
my $childrencc = 0;
foreach (@children)
{
$menu = $menu.printTree($_, $depth + 1, $link."/".$_->getNodeValue(), $childrenc, $childrencc, $depthline.$depthlineAddition );
$childrencc++;
}
$menu = $menu."| <div style=\"white-space:nowrap;\">{{PST:MenuTree|$depthline$fork|▸}} [[$link|$nodeValue]]</div>}}\n";
}
return($menu);
}
$mw->logout();
$tree->DESTROY;
exit;