Difference between revisions of "Caretaker.pl"

From Organic Design wiki
(not needed in sub anymore cos not called by wikid.pl)
(updated after solapac run)
Line 2: Line 2:
 
# {{perl}}
 
# {{perl}}
 
use DBI;
 
use DBI;
 +
require "wiki.pl";
  
sub formatLink {
+
# Wiki settings
my $link = shift;
+
$::wiki = "http://www.organicdesign.co.nz/wiki/index.php";
$link =~ tr/_/ /;
+
$::wikiuser = 'bender';
$link =~ s/\s*([\[\]\|])\s*/$1/g;
+
$::wikipass = '******';
return $link;
+
 
}
+
# DB settings
 +
$::dbname = 'od';
 +
$::dbpfix = '';
 +
$::dbuser = $::wikiuser;
 +
$::dbpass = $::wikipass;
 +
 
 +
# Login to wiki
 +
wikiLogin($::wiki, $::wikiuser, $::wikipass);
 +
my %ns = wikiGetNamespaces($::wiki);
  
my $dbh = DBI->connect('DBI:mysql:od',lc $::peer,$::pwd1) or die DBI->errstr;
+
# Connect to DB
my @ns = ('','Talk:','User:','User talk:','Project:','Project talk:',
+
my $dbh = DBI->connect('DBI:mysql:'.$::dbname, lc $::dbuser, $::dbpass) or die DBI->errstr;
'Image:','Image talk:','Mediawiki:','Mediawiki talk:','Template:',
 
'Template talk:','Help:','Help talk:','Category:','Category talk:');
 
  
 
# Get id of first article after mediawiki built in articles
 
# Get id of first article after mediawiki built in articles
my $sth = $dbh->prepare('SELECT cur_id FROM cur WHERE cur_title = "Zhconversiontable"');
+
my $sth = $dbh->prepare('SELECT page_id FROM '.$::dbpfix.'page WHERE page_title = "Zhconversiontable"');
 
$sth->execute();
 
$sth->execute();
 
my @row = $sth->fetchrow_array;
 
my @row = $sth->fetchrow_array;
Line 23: Line 30:
  
 
# Get last article id
 
# Get last article id
my $sth = $dbh->prepare('SELECT cur_id FROM cur ORDER BY cur_id DESC');
+
my $sth = $dbh->prepare('SELECT page_id FROM '.$::dbpfix.'page ORDER BY page_id DESC');
 
$sth->execute();
 
$sth->execute();
 
@row = $sth->fetchrow_array;
 
@row = $sth->fetchrow_array;
Line 30: Line 37:
  
 
# Loop through all articles one per second
 
# Loop through all articles one per second
my $sth = $dbh->prepare('SELECT cur_namespace,cur_title,cur_is_redirect FROM cur WHERE cur_id=?');
+
my $sth = $dbh->prepare('SELECT page_namespace,page_title,page_is_redirect FROM '.$::dbpfix.'page WHERE page_id=?');
 
my $done = 'none';
 
my $done = 'none';
 
for ($first..$last) {
 
for ($first..$last) {
Line 36: Line 43:
 
@row = $sth->fetchrow_array;
 
@row = $sth->fetchrow_array;
 
my @comments = ();
 
my @comments = ();
my $title = $ns[$row[0]].$row[1];
+
my $title = $ns{$row[0]} ? $ns{$row[0]}.':'.$row[1] : $row[1];
 
if ($title && ($row[2] == 0)) {
 
if ($title && ($row[2] == 0)) {
 +
print "$title\n";
  
 
# Read the article content
 
# Read the article content
$::article = wikiRawPage $::wiki, $title;
+
$text = wikiRawPage($::wiki, $title);
$::article =~ s/^\s+//;
+
$text =~ s/^\s+//;
$::article =~ s/\s+$//;
+
$text =~ s/\s+$//;
my $backup = $::article;
+
my $backup = $text;
my $isCode = $title =~ /\.(as|c|cpp|c\+\+|h|sh|css|html?|pl|php|R|tex|xml|xslt)$/i;
 
 
 
# --------------------------------------------------------------------------------------------------------------------- #
 
 
 
if (!$isCode) {
 
 
 
# Format catlinks and normal links
 
my $tmp = $::article;
 
my @links = $::article =~ /\[{2}category:([^\]]+)\]{2}/ig;
 
my %links = (); $links{$_} = 1 for @links;
 
my $cats = '';
 
if ($title =~ /^[a-z0-9-]+\.(com?|edu|govt?|net|org|mil|info|school|iwi|ac|geek|aero|biz|coop|museum|name|pro)(\.[a-z]{2})?$/i) {
 
push @comments, 'cat in [[Category:Domain names|Domain names]]'
 
unless $links{'Domain names'}++;
 
}
 
if ($::article =~ /<\/math>/) {
 
push @comments, 'cat in [[Category:Articles containing maths|Maths]]'
 
unless $links{'Articles containing maths'}++;
 
}
 
@links = sort keys %links;
 
if ($#links >= 0) {
 
for (@links) { tr/_/ /; $cats .= "[[Category:$_]]"; }
 
$::article =~ s/\s*\[{2}\s*category:[^\]]+\s*\]{2} *//sig;
 
$::article =~ s/^\s+//;
 
$::article =~ s/\s+$//;
 
$::article = "$cats\n$::article";
 
push @comments, 'categories' if $::article ne $tmp;
 
}
 
 
 
# Format normal links
 
$tmp = $::article;
 
$::article =~ s/(\[{2}[^\]\r\n]+\]{2})/formatLink($1)/eg;
 
push @comments, 'links' if $::article ne $tmp;
 
  
# Format headings
+
# ------ REPLACEMENT RULES --------------------------------------------------------------- #
$tmp = $::article;
 
my $min = 10;
 
for ($::article =~ /^(=+) *.+? *=+ *$/mg) { $min = length if $min > length }
 
$::article =~ s/[\r\n]+ *={$min}(=*) *([^=\r\n]+?) *=+ *[\r\n]+/\n\n$1 $2 $1\n/g if --$min;
 
push @comments, 'headings' if $::article ne $tmp;
 
}
 
  
 
# Common typo's - put square brackets around first letter so it doesn't get caretaken itself!
 
# Common typo's - put square brackets around first letter so it doesn't get caretaken itself!
 
my $typos
 
my $typos
= $::article =~ s/[i]mpliment/implement/g
+
= $text =~ s/[i]mpliment/implement/g
+ $::article =~ s/[d]ependance/dependence/g
+
+ $text =~ s/[d]ependance/dependence/g
+ $::article =~ s/[h]ardwire/hard-wire/g;
+
+ $text =~ s/[f]reind/friend/g;
 +
 
push @comments, ($typos == 1 ? 'typo' : 'typos') if $typos;
 
push @comments, ($typos == 1 ? 'typo' : 'typos') if $typos;
  
# Apply rules to Xml:Articles
+
# ---------------------------------------------------------------------------------------- #
if ($title =~ /^Xml:/) {
 
 
 
# Remove empty elements
 
push @comments, 'removed empty elements' if $::article =~ s/^\s*<(read|write|category|init|data|view|edit|save)>\s*<\/\w+>[\r\n]*//gms;
 
 
 
}
 
 
 
# --------------------------------------------------------------------------------------------------------------------- #
 
  
 
# If article changed, write and comment
 
# If article changed, write and comment
$::article =~ s/^\s+//;
+
$text =~ s/^\s+//;
$::article =~ s/\s+$//;
+
$text =~ s/\s+$//;
if ($::article ne $backup) {
+
if ($text ne $backup) {
wikiPageEdit $::wiki, $title, $::article, '[[talk:caretaker.pl|Caretaker]]: '.join(', ',@comments), 1;
+
wikiPageEdit($::wiki, $title, $text, join(', ',@comments), 1);
 
$done = $done + 1;
 
$done = $done + 1;
 
}
 
}
 
}
 
}
sleep(1);
+
sleep(0.2);
 
}
 
}
  
my $comment = "Daily [[talk:caretaker.pl|caretaking]] tasks completed: ".($last-$first)." articles examined, ".($done-1)." adjusted.";
 
logAdd $comment;
 
wikiPageAppend($::wiki, $::wikilog, "\n*".localtime()." : $comment", $comment);
 
 
$sth->finish;
 
$sth->finish;
 
$dbh->disconnect;
 
$dbh->disconnect;

Revision as of 06:34, 12 July 2008

  1. !/usr/bin/perl
  2. Our Perl scripts.

use DBI; require "wiki.pl";

  1. Wiki settings

$::wiki = "http://www.organicdesign.co.nz/wiki/index.php"; $::wikiuser = 'bender'; $::wikipass = '******';

  1. DB settings

$::dbname = 'od'; $::dbpfix = ; $::dbuser = $::wikiuser; $::dbpass = $::wikipass;

  1. Login to wiki

wikiLogin($::wiki, $::wikiuser, $::wikipass); my %ns = wikiGetNamespaces($::wiki);

  1. Connect to DB

my $dbh = DBI->connect('DBI:mysql:'.$::dbname, lc $::dbuser, $::dbpass) or die DBI->errstr;

  1. Get id of first article after mediawiki built in articles

my $sth = $dbh->prepare('SELECT page_id FROM '.$::dbpfix.'page WHERE page_title = "Zhconversiontable"'); $sth->execute(); my @row = $sth->fetchrow_array; $sth->finish; my $first = $row[0]+1;

  1. Get last article id

my $sth = $dbh->prepare('SELECT page_id FROM '.$::dbpfix.'page ORDER BY page_id DESC'); $sth->execute(); @row = $sth->fetchrow_array; $sth->finish; my $last = $row[0];

  1. Loop through all articles one per second

my $sth = $dbh->prepare('SELECT page_namespace,page_title,page_is_redirect FROM '.$::dbpfix.'page WHERE page_id=?'); my $done = 'none'; for ($first..$last) { $sth->execute($_); @row = $sth->fetchrow_array; my @comments = (); my $title = $ns{$row[0]} ? $ns{$row[0]}.':'.$row[1] : $row[1]; if ($title && ($row[2] == 0)) { print "$title\n";

# Read the article content $text = wikiRawPage($::wiki, $title); $text =~ s/^\s+//; $text =~ s/\s+$//; my $backup = $text;

# ------ REPLACEMENT RULES --------------------------------------------------------------- #

# Common typo's - put square brackets around first letter so it doesn't get caretaken itself! my $typos = $text =~ s/[i]mpliment/implement/g + $text =~ s/[d]ependance/dependence/g + $text =~ s/[f]reind/friend/g;

push @comments, ($typos == 1 ? 'typo' : 'typos') if $typos;

# ---------------------------------------------------------------------------------------- #

# If article changed, write and comment $text =~ s/^\s+//; $text =~ s/\s+$//; if ($text ne $backup) { wikiPageEdit($::wiki, $title, $text, join(', ',@comments), 1); $done = $done + 1; } } sleep(0.2); }

$sth->finish; $dbh->disconnect;