<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.robnugen.com/w/index.php?action=history&amp;feed=atom&amp;title=Wiki-image-upload.pl</id>
	<title>Wiki-image-upload.pl - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.robnugen.com/w/index.php?action=history&amp;feed=atom&amp;title=Wiki-image-upload.pl"/>
	<link rel="alternate" type="text/html" href="https://wiki.robnugen.com/w/index.php?title=Wiki-image-upload.pl&amp;action=history"/>
	<updated>2026-04-07T00:24:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.robnugen.com/w/index.php?title=Wiki-image-upload.pl&amp;diff=10&amp;oldid=prev</id>
		<title>Thunderrabbit: New page: From [http://www.xs4all.nl/~itsme/projects/sites/wiki-image-upload.pl]  ----  &lt;source lang=&quot;perl&quot;&gt; #!perl -w use strict;  # this script takes pairs of filename, description as parameters, ...</title>
		<link rel="alternate" type="text/html" href="https://wiki.robnugen.com/w/index.php?title=Wiki-image-upload.pl&amp;diff=10&amp;oldid=prev"/>
		<updated>2007-10-29T10:06:08Z</updated>

		<summary type="html">&lt;p&gt;New page: From [http://www.xs4all.nl/~itsme/projects/sites/wiki-image-upload.pl]  ----  &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; #!perl -w use strict;  # this script takes pairs of filename, description as parameters, ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;From [http://www.xs4all.nl/~itsme/projects/sites/wiki-image-upload.pl]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!perl -w&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
# this script takes pairs of filename, description as parameters, and&lt;br /&gt;
# uploads them to the wiki.&lt;br /&gt;
#&lt;br /&gt;
# example:&lt;br /&gt;
# perl wiki-upload.pl image.jpg &amp;quot;first image&amp;quot; image2.jpg &amp;quot;second image&amp;quot;&lt;br /&gt;
#&lt;br /&gt;
# you need to create a file c:\local\etc\wiki.cfg&lt;br /&gt;
# containing 2 lines:&lt;br /&gt;
# user=USERNAME&lt;br /&gt;
# pass=PASSWORD&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#####################################&lt;br /&gt;
#   some included support nodules&lt;br /&gt;
package WebServer;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use HTTP::Request::Common qw(POST GET);&lt;br /&gt;
use LWP::UserAgent;&lt;br /&gt;
use HTTP::Cookies;&lt;br /&gt;
&lt;br /&gt;
use List::Util qw(first);&lt;br /&gt;
&lt;br /&gt;
sub new {&lt;br /&gt;
    my ($class, $baseurl)= @_;&lt;br /&gt;
&lt;br /&gt;
    my $ua= LWP::UserAgent-&amp;gt;new(agent=&amp;gt;&amp;#039;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040501&amp;#039;);&lt;br /&gt;
    $ua-&amp;gt;cookie_jar(HTTP::Cookies-&amp;gt;new(hide_cookie2=&amp;gt;1));&lt;br /&gt;
    $ua-&amp;gt;env_proxy();&lt;br /&gt;
&lt;br /&gt;
    return bless {&lt;br /&gt;
        ua=&amp;gt;$ua,&lt;br /&gt;
        baseurl=&amp;gt;$baseurl,&lt;br /&gt;
    }, $class;&lt;br /&gt;
}&lt;br /&gt;
sub clearcookies {&lt;br /&gt;
    my $self= shift;&lt;br /&gt;
&lt;br /&gt;
    $self-&amp;gt;{ua}-&amp;gt;cookie_jar(HTTP::Cookies-&amp;gt;new(hide_cookie2=&amp;gt;1));&lt;br /&gt;
}&lt;br /&gt;
# almost interface compatible with httpost&lt;br /&gt;
#   - optional hashref with parameters is merged with parameters.&lt;br /&gt;
#&lt;br /&gt;
# httpget(&amp;quot;/some.cgi&amp;quot;, key1=&amp;gt;123, key2=&amp;gt;455);&lt;br /&gt;
# httpget(&amp;quot;/some.cgi&amp;quot;, { urlkey1=&amp;gt;999 }, key1=&amp;gt;123, key2=&amp;gt;455);&lt;br /&gt;
#&lt;br /&gt;
sub httpget {&lt;br /&gt;
    my $self= shift;&lt;br /&gt;
    my $path= shift;&lt;br /&gt;
&lt;br /&gt;
    my $query;&lt;br /&gt;
    if (@_) {&lt;br /&gt;
        $query= shift;&lt;br /&gt;
        if (ref $query ne &amp;quot;HASH&amp;quot;) {&lt;br /&gt;
            unshift @_, $query;&lt;br /&gt;
            $query=undef;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    my %params= @_;&lt;br /&gt;
&lt;br /&gt;
    my $uri= URI-&amp;gt;new($self-&amp;gt;{baseurl});&lt;br /&gt;
    $uri-&amp;gt;path($path);&lt;br /&gt;
    $uri-&amp;gt;query_form($query?%$query:(), %params);&lt;br /&gt;
    my $rq= GET $uri;&lt;br /&gt;
&lt;br /&gt;
    # todo: get rid of &amp;#039;TE&amp;#039; header, and &amp;#039;Connection&amp;#039;-TE flag. and &amp;#039;Cookie2&amp;#039; header&lt;br /&gt;
    $rq-&amp;gt;header(&lt;br /&gt;
        &amp;#039;User-Agent&amp;#039;=&amp;gt; &amp;#039;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040501&amp;#039;,&lt;br /&gt;
        &amp;#039;Accept&amp;#039;=&amp;gt; ($path =~ /\.aspx|\.htm/ &lt;br /&gt;
            ? &amp;#039;text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5&amp;#039;&lt;br /&gt;
            : $path =~ /\.css/&lt;br /&gt;
            ? &amp;#039;text/css,*/*;q=0.1&amp;#039;&lt;br /&gt;
            : &amp;#039;*/*&amp;#039;) ,&lt;br /&gt;
        &amp;#039;Accept-Language&amp;#039;=&amp;gt; &amp;#039;en-us,en;q=0.5&amp;#039;,&lt;br /&gt;
        #&amp;#039;Accept-Encoding&amp;#039;=&amp;gt; &amp;#039;gzip,deflate&amp;#039;,&lt;br /&gt;
        &amp;#039;Accept-Charset&amp;#039;=&amp;gt; &amp;#039;ISO-8859-1,utf-8;q=0.7,*;q=0.7&amp;#039;,&lt;br /&gt;
    );&lt;br /&gt;
    #print &amp;quot;request:\n&amp;quot;, $rq-&amp;gt;as_string, &amp;quot;\n&amp;quot;;&lt;br /&gt;
    #warn &amp;quot;network access disabled\n&amp;quot;;&lt;br /&gt;
    #return;&lt;br /&gt;
    my $rp= $self-&amp;gt;{ua}-&amp;gt;request($rq) or die &amp;quot;httperror: $@\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    return $rp-&amp;gt;content;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# can be called in several ways:&lt;br /&gt;
# httppost(&amp;quot;/some.cgi&amp;quot;, key1=&amp;gt;123, key2=&amp;gt;455);&lt;br /&gt;
#   -&amp;gt; just form values&lt;br /&gt;
# httppost(&amp;quot;/some.cgi&amp;quot;, { urlkey1=&amp;gt;999 }, key1=&amp;gt;123, key2=&amp;gt;455);&lt;br /&gt;
#   -&amp;gt; both url and form params&lt;br /&gt;
# httppost(&amp;quot;/some.cgi&amp;quot;, key1=&amp;gt;123, key2=&amp;gt;455, file1=&amp;gt;[&amp;quot;filename&amp;quot;]);&lt;br /&gt;
#   -&amp;gt; form-data file upload&lt;br /&gt;
sub httppost {&lt;br /&gt;
    my $self= shift;&lt;br /&gt;
    my $path= shift;&lt;br /&gt;
&lt;br /&gt;
    my $query;&lt;br /&gt;
    if (@_) {&lt;br /&gt;
        $query= shift;&lt;br /&gt;
        if (ref $query ne &amp;quot;HASH&amp;quot;) {&lt;br /&gt;
            unshift @_, $query;&lt;br /&gt;
            $query=undef;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    my %params= @_;&lt;br /&gt;
&lt;br /&gt;
    my $useformdata= grep { defined ref $_ &amp;amp;&amp;amp; ref $_ eq &amp;quot;ARRAY&amp;quot; } values %params;&lt;br /&gt;
&lt;br /&gt;
    my $uri= URI-&amp;gt;new($self-&amp;gt;{baseurl});&lt;br /&gt;
    $uri-&amp;gt;path($path);&lt;br /&gt;
    $uri-&amp;gt;query_form(%$query) if ($query);&lt;br /&gt;
    my $rq;&lt;br /&gt;
    if ( $useformdata ) {&lt;br /&gt;
        $rq = POST $uri, Content_Type=&amp;gt;&amp;quot;form-data&amp;quot;, Content=&amp;gt;[ %params ];&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        $rq = POST $uri, [ %params ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # -- for http uploads : &lt;br /&gt;
    # ( Content_Type=&amp;gt;&amp;quot;form-data&amp;quot;, Content=&amp;gt;[ %params ]);&lt;br /&gt;
    $rq-&amp;gt;header(&lt;br /&gt;
        &amp;#039;User-Agent&amp;#039;=&amp;gt; &amp;#039;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040501&amp;#039;,&lt;br /&gt;
        &amp;#039;Accept&amp;#039;=&amp;gt; &amp;#039;text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5&amp;#039;,&lt;br /&gt;
        &amp;#039;Accept-Language&amp;#039;=&amp;gt; &amp;#039;en-us,en;q=0.5&amp;#039;,&lt;br /&gt;
        #&amp;#039;Accept-Encoding&amp;#039;=&amp;gt; &amp;#039;gzip,deflate&amp;#039;,&lt;br /&gt;
        &amp;#039;Accept-Charset&amp;#039;=&amp;gt; &amp;#039;ISO-8859-1,utf-8;q=0.7,*;q=0.7&amp;#039;,&lt;br /&gt;
    );&lt;br /&gt;
    #print &amp;quot;request:\n&amp;quot;, $rq-&amp;gt;as_string, &amp;quot;\n&amp;quot;;&lt;br /&gt;
    #warn &amp;quot;network access disabled\n&amp;quot;;&lt;br /&gt;
    #return;&lt;br /&gt;
    my $rp= $self-&amp;gt;{ua}-&amp;gt;request($rq) or die &amp;quot;httperror: $@\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    #print $rp-&amp;gt;status_line, &amp;quot;\n&amp;quot;;&lt;br /&gt;
    #print $rp-&amp;gt;headers-&amp;gt;as_string();&lt;br /&gt;
&lt;br /&gt;
    return $rp-&amp;gt;content;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub httprequest {&lt;br /&gt;
    my ($self, $method, @params)= @_;&lt;br /&gt;
    if (lc($method) eq &amp;quot;get&amp;quot;) {&lt;br /&gt;
        return $self-&amp;gt;httpget(@params);&lt;br /&gt;
    }&lt;br /&gt;
    elsif (lc($method) eq &amp;quot;post&amp;quot;) {&lt;br /&gt;
        return $self-&amp;gt;httppost(@params);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        die &amp;quot;invalid http request method &amp;#039;$method&amp;#039;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
package MediaWiki;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use HTML::TreeBuilder;&lt;br /&gt;
&lt;br /&gt;
sub new {&lt;br /&gt;
    my $class= shift;&lt;br /&gt;
&lt;br /&gt;
    my $self= bless {&lt;br /&gt;
        server=&amp;gt; WebServer-&amp;gt;new(&amp;quot;http://wiki.whatthehack.org&amp;quot;),&lt;br /&gt;
        url=&amp;gt; &amp;quot;/index.php&amp;quot;,&lt;br /&gt;
    }, $class;&lt;br /&gt;
&lt;br /&gt;
    return $self;&lt;br /&gt;
}&lt;br /&gt;
sub post {&lt;br /&gt;
    my ($self, @params)= @_;&lt;br /&gt;
    $self-&amp;gt;{server}-&amp;gt;httppost($self-&amp;gt;{url}, @params);&lt;br /&gt;
}&lt;br /&gt;
sub get {&lt;br /&gt;
    my ($self, @params)= @_;&lt;br /&gt;
    if (!$self-&amp;gt;{loggedin}) {&lt;br /&gt;
        $self-&amp;gt;login();&lt;br /&gt;
    }&lt;br /&gt;
    $self-&amp;gt;{server}-&amp;gt;httpget($self-&amp;gt;{url}, @params);&lt;br /&gt;
}&lt;br /&gt;
sub cachedget {&lt;br /&gt;
    my ($self, @params)= @_;&lt;br /&gt;
&lt;br /&gt;
    my $filename= encodeurlasfile(@params);&lt;br /&gt;
&lt;br /&gt;
    if (-e $filename) {&lt;br /&gt;
        return readfile($filename);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    my $data= $self-&amp;gt;get(@params);&lt;br /&gt;
    savefile($filename, $data);&lt;br /&gt;
    return $data;&lt;br /&gt;
}&lt;br /&gt;
sub DESTROY {&lt;br /&gt;
    my $self= shift;&lt;br /&gt;
}&lt;br /&gt;
########################################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub getwikisource {&lt;br /&gt;
    my ($self, $page)= @_;&lt;br /&gt;
    my $xml= $self-&amp;gt;post(&lt;br /&gt;
        title=&amp;gt;&amp;#039;Special:Export&amp;#039;, &lt;br /&gt;
        action=&amp;gt;&amp;#039;submit&amp;#039;,&lt;br /&gt;
        pages=&amp;gt;$page,&lt;br /&gt;
        curonly=&amp;gt;&amp;#039;true&amp;#039;,&lt;br /&gt;
    );&lt;br /&gt;
    if ($xml =~ /&amp;lt;text[^&amp;gt;]*&amp;gt;(.*?)&amp;lt;\/text&amp;gt;/s) {&lt;br /&gt;
        return $1;&lt;br /&gt;
    }&lt;br /&gt;
    die &amp;quot;could not find &amp;lt;text&amp;gt; xml tag in\n$xml\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
sub getcategoryitems {&lt;br /&gt;
    my ($self, $page)= @_;&lt;br /&gt;
    my $html= $self-&amp;gt;get(&lt;br /&gt;
        title=&amp;gt;$page,&lt;br /&gt;
    );&lt;br /&gt;
    my $tree = HTML::TreeBuilder-&amp;gt;new();&lt;br /&gt;
    $tree-&amp;gt;parse($html);&lt;br /&gt;
    $tree-&amp;gt;eof();&lt;br /&gt;
&lt;br /&gt;
    my ($table)= $tree-&amp;gt;look_down(&lt;br /&gt;
        &amp;quot;_tag&amp;quot;=&amp;gt;&amp;quot;table&amp;quot;,&lt;br /&gt;
    ) or die &amp;quot;could not find category table for $page\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    my @items;&lt;br /&gt;
    for $a ($table-&amp;gt;look_down(&amp;quot;_tag&amp;quot;, &amp;quot;a&amp;quot;)) {&lt;br /&gt;
        push @items, $a-&amp;gt;as_text();&lt;br /&gt;
    }&lt;br /&gt;
    return @items;&lt;br /&gt;
}&lt;br /&gt;
sub uploadfile {&lt;br /&gt;
    my ($self, $imgname, $imgdesc)= @_;&lt;br /&gt;
    $imgname =~ s/\\/\//g;&lt;br /&gt;
    ( my $imgdestname= $imgname ) =~ s/.*\///;&lt;br /&gt;
&lt;br /&gt;
    my $answer= $self-&amp;gt;post(&lt;br /&gt;
        { title=&amp;gt;&amp;#039;Special:Upload&amp;#039;, },&lt;br /&gt;
        wpUploadFile=&amp;gt;[$imgname],&lt;br /&gt;
        wpDestFile=&amp;gt;$imgdestname,&lt;br /&gt;
        wpUploadDescription=&amp;gt;$imgdesc,&lt;br /&gt;
        wpUpload=&amp;gt;&amp;quot;Upload file&amp;quot;,&lt;br /&gt;
    );&lt;br /&gt;
    print $answer-&amp;gt;content;&lt;br /&gt;
}&lt;br /&gt;
sub logout {&lt;br /&gt;
    my $self= shift;&lt;br /&gt;
    my $answer= $self-&amp;gt;get(title=&amp;gt;&amp;#039;Special:Userlogout&amp;#039;);&lt;br /&gt;
    $self-&amp;gt;{loggedin}= 0;&lt;br /&gt;
    $self-&amp;gt;{server}-&amp;gt;clearcookies();&lt;br /&gt;
}&lt;br /&gt;
sub login {&lt;br /&gt;
    my ($self, $username, $password)= @_;&lt;br /&gt;
&lt;br /&gt;
    my $answer= $self-&amp;gt;post(&lt;br /&gt;
        { action=&amp;gt;&amp;#039;submitlogin&amp;#039;, title=&amp;gt;&amp;#039;Special:Userlogin&amp;#039; },&lt;br /&gt;
        wpName =&amp;gt; $username,&lt;br /&gt;
        wpPassword =&amp;gt; $password,&lt;br /&gt;
        wpLoginattempt =&amp;gt; &amp;#039;Log in&amp;#039;,&lt;br /&gt;
    );&lt;br /&gt;
    $self-&amp;gt;{loggedin}= 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# title=&amp;gt;&amp;#039;Template:UpcomingTable&amp;#039;&lt;br /&gt;
# action=&amp;gt;&amp;#039;submit&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# text   wpSummary&lt;br /&gt;
# flag   wpMinoredit 1&lt;br /&gt;
# flag   wpWatchthis&lt;br /&gt;
# button wpSave      Save page&lt;br /&gt;
# button wpPreview   Show preview&lt;br /&gt;
# button wpDiff      Show changes&lt;br /&gt;
# hidden wpSection&lt;br /&gt;
# hidden wpEdittime  20050730124636&lt;br /&gt;
# hidden wpEditToken cd44d6f6003e41d1d44b9a79266a846f&lt;br /&gt;
# text   wpTextbox1 &lt;br /&gt;
&lt;br /&gt;
sub geteditform {&lt;br /&gt;
    my ($self, $page, $section)= @_;&lt;br /&gt;
    my $answer= $self-&amp;gt;get(&lt;br /&gt;
        action=&amp;gt;&amp;#039;edit&amp;#039;, &lt;br /&gt;
        title=&amp;gt;$page,&lt;br /&gt;
        defined $section ? ( section=&amp;gt;$section ) : (),&lt;br /&gt;
    );&lt;br /&gt;
    my $tree = HTML::TreeBuilder-&amp;gt;new();&lt;br /&gt;
    $tree-&amp;gt;parse($answer);&lt;br /&gt;
    $tree-&amp;gt;eof();&lt;br /&gt;
&lt;br /&gt;
    my ($formtag)= $tree-&amp;gt;look_down(&lt;br /&gt;
        &amp;quot;_tag&amp;quot;=&amp;gt;&amp;quot;form&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;=&amp;gt;&amp;quot;editform&amp;quot;,&lt;br /&gt;
    );&lt;br /&gt;
    my @inputelements= $formtag-&amp;gt;look_down(&lt;br /&gt;
        &amp;quot;_tag&amp;quot;=&amp;gt;&amp;quot;input&amp;quot;,&lt;br /&gt;
        sub { $_[0]-&amp;gt;attr(&amp;#039;type&amp;#039;) ne &amp;#039;submit&amp;#039; &amp;amp;&amp;amp; $_[0]-&amp;gt;attr(&amp;#039;type&amp;#039;) ne &amp;#039;radio&amp;#039; }&lt;br /&gt;
    );&lt;br /&gt;
    my @textelements= $formtag-&amp;gt;look_down(&lt;br /&gt;
        &amp;quot;_tag&amp;quot;=&amp;gt;&amp;quot;textarea&amp;quot;,&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my %form;&lt;br /&gt;
    # not handling radio buttons yet.&lt;br /&gt;
    for my $field (@inputelements) {&lt;br /&gt;
        $form{$field-&amp;gt;attr(&amp;#039;name&amp;#039;)}= $field-&amp;gt;attr(&amp;#039;value&amp;#039;)&lt;br /&gt;
    }&lt;br /&gt;
    for my $field (@textelements) {&lt;br /&gt;
        $form{$field-&amp;gt;attr(&amp;#039;name&amp;#039;)}= $field-&amp;gt;as_text;&lt;br /&gt;
    }&lt;br /&gt;
    return \%form;&lt;br /&gt;
}&lt;br /&gt;
sub saveeditform {&lt;br /&gt;
    my ($self, $page, $form)= @_;&lt;br /&gt;
    my $answer= $self-&amp;gt;post(&lt;br /&gt;
        { action=&amp;gt;&amp;#039;submit&amp;#039;, title=&amp;gt;$page, },&lt;br /&gt;
        wpSave=&amp;gt;&amp;quot;Save page&amp;quot;,&lt;br /&gt;
        %$form,&lt;br /&gt;
    );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub createpage {&lt;br /&gt;
    my ($self, $page, $content)= @_;&lt;br /&gt;
&lt;br /&gt;
    my $f= $self-&amp;gt;geteditform($page);&lt;br /&gt;
    if ($f-&amp;gt;{wpTextbox1}) {&lt;br /&gt;
        print &amp;quot;----$page\n$f-&amp;gt;{wpTextbox1}\n\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    $f-&amp;gt;{wpTextbox1}= $content;&lt;br /&gt;
    print map { sprintf(&amp;quot;%-20s= %s\n&amp;quot;, $_, defined $f-&amp;gt;{$_} ? &amp;quot;&amp;#039;$f-&amp;gt;{$_}&amp;#039;&amp;quot;:&amp;quot;&amp;lt;undef&amp;gt;&amp;quot;) } keys %$f;&lt;br /&gt;
    $self-&amp;gt;saveeditform($page, $f);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use IO::File;&lt;br /&gt;
$|=1;&lt;br /&gt;
my $m= MediaWiki-&amp;gt;new();&lt;br /&gt;
&lt;br /&gt;
if (@ARGV%2) {&lt;br /&gt;
    die &amp;quot;expected an even nr of params\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
my $config= readconfig();&lt;br /&gt;
$m-&amp;gt;login($config-&amp;gt;{user}, $config-&amp;gt;{pass});&lt;br /&gt;
&lt;br /&gt;
for (my $i=0 ; $i&amp;lt;@ARGV ; $i+=2) {&lt;br /&gt;
    if (!-f $ARGV[$i]) {&lt;br /&gt;
        die &amp;quot;file $ARGV[$i] not found\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    $m-&amp;gt;uploadfile($ARGV[$i], $ARGV[$i+1]);&lt;br /&gt;
}&lt;br /&gt;
sub readconfig {&lt;br /&gt;
    my %params;&lt;br /&gt;
    my $fh= IO::File-&amp;gt;new(&amp;quot;c:/local/etc/wiki.cfg&amp;quot;, &amp;quot;r&amp;quot;) or die &amp;quot;wiki.cfg: $!&amp;quot;;&lt;br /&gt;
    while (&amp;lt;$fh&amp;gt;) {&lt;br /&gt;
        s/\s+$//;&lt;br /&gt;
        if (/(\w+)\s*=\s*(.*)/) {&lt;br /&gt;
            my ($k, $v)= ($1, $2);&lt;br /&gt;
            $params{$k}= $v;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    $fh-&amp;gt;close();&lt;br /&gt;
    return \%params;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thunderrabbit</name></author>
	</entry>
</feed>