Difference between revisions of "Caretaker.pl"

From Organic Design wiki
(Add rule to upgrade security ready for 1.9.3 migration)
($::article)
Line 14: Line 14:
 
my $y = shift;
 
my $y = shift;
 
my $security = "{{#security:$x|$y}}";
 
my $security = "{{#security:$x|$y}}";
$article = "$security\n$article";
+
$::article = "$security\n$::article";
 
push @comments, $security;
 
push @comments, $security;
 
}
 
}
Line 49: Line 49:
  
 
# Read the article content
 
# Read the article content
my $article = wikiRawPage $::wiki, $title;
+
my $::article = wikiRawPage $::wiki, $title;
$article =~ s/^\s+//;
+
$::article =~ s/^\s+//;
$article =~ s/\s+$//;
+
$::article =~ s/\s+$//;
my $backup = $article;
+
my $backup = $::article;
 
my $isCode = $title =~ /\.(as|c|cpp|c\+\+|h|sh|css|html?|pl|php|R|tex|xml|xslt)$/i;
 
my $isCode = $title =~ /\.(as|c|cpp|c\+\+|h|sh|css|html?|pl|php|R|tex|xml|xslt)$/i;
  
Line 60: Line 60:
  
 
# Format catlinks and normal links
 
# Format catlinks and normal links
my $tmp = $article;
+
my $tmp = $::article;
my @links = $article =~ /\[{2}category:([^\]]+)\]{2}/ig;
+
my @links = $::article =~ /\[{2}category:([^\]]+)\]{2}/ig;
 
my %links = (); $links{$_} = 1 for @links;
 
my %links = (); $links{$_} = 1 for @links;
 
my $cats = '';
 
my $cats = '';
Line 68: Line 68:
 
unless $links{'Domain names'}++;
 
unless $links{'Domain names'}++;
 
}
 
}
if ($article =~ /<\/math>/) {
+
if ($::article =~ /<\/math>/) {
 
push @comments, 'cat in [[Category:Articles containing maths|Maths]]'
 
push @comments, 'cat in [[Category:Articles containing maths|Maths]]'
 
unless $links{'Articles containing maths'}++;
 
unless $links{'Articles containing maths'}++;
Line 75: Line 75:
 
if ($#links >= 0) {
 
if ($#links >= 0) {
 
for (@links) { tr/_/ /; $cats .= "[[Category:$_]]"; }
 
for (@links) { tr/_/ /; $cats .= "[[Category:$_]]"; }
$article =~ s/\s*\[{2}\s*category:[^\]]+\s*\]{2} *//sig;
+
$::article =~ s/\s*\[{2}\s*category:[^\]]+\s*\]{2} *//sig;
$article =~ s/^\s+//;
+
$::article =~ s/^\s+//;
$article =~ s/\s+$//;
+
$::article =~ s/\s+$//;
$article = "$cats\n$article";
+
$::article = "$cats\n$::article";
push @comments, 'categories' if $article ne $tmp;
+
push @comments, 'categories' if $::article ne $tmp;
 
}
 
}
  
 
# Format normal links
 
# Format normal links
$tmp = $article;
+
$tmp = $::article;
$article =~ s/(\[{2}[^\]\r\n]+\]{2})/formatLink($1)/eg;
+
$::article =~ s/(\[{2}[^\]\r\n]+\]{2})/formatLink($1)/eg;
push @comments, 'links' if $article ne $tmp;
+
push @comments, 'links' if $::article ne $tmp;
  
 
# Format headings
 
# Format headings
$tmp = $article;
+
$tmp = $::article;
 
my $min = 10;
 
my $min = 10;
for ($article =~ /^(=+) *.+? *=+ *$/mg) { $min = length if $min > length }
+
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;
+
$::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;
+
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
+
= $::article =~ s/[i]mpliment/implement/g
+ $article =~ s/[d]ependance/dependence/g
+
+ $::article =~ s/[d]ependance/dependence/g
+ $article =~ s/[h]ardwire/hard-wire/g;
+
+ $::article =~ s/[h]ardwire/hard-wire/g;
 
push @comments, ($typos == 1 ? 'typo' : 'typos') if $typos;
 
push @comments, ($typos == 1 ? 'typo' : 'typos') if $typos;
  
Line 106: Line 106:
  
 
# Remove empty elements
 
# 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;
+
push @comments, 'removed empty elements' if $::article =~ s/^\s*<(read|write|category|init|data|view|edit|save)>\s*<\/\w+>[\r\n]*//gms;
  
 
}
 
}
Line 118: Line 118:
  
 
# If article changed, write and comment
 
# If article changed, write and comment
$article =~ s/^\s+//;
+
$::article =~ s/^\s+//;
$article =~ s/\s+$//;
+
$::article =~ s/\s+$//;
if ($article ne $backup) {
+
if ($::article ne $backup) {
wikiPageEdit $::wiki, $title, $article, '[[talk:caretaker.pl|Caretaker]]: '.join(', ',@comments), 1;
+
wikiPageEdit $::wiki, $title, $::article, '[[talk:caretaker.pl|Caretaker]]: '.join(', ',@comments), 1;
 
$done = $done + 1;
 
$done = $done + 1;
 
}
 
}

Revision as of 04:23, 16 April 2007

use DBI;

sub formatLink { my $link = shift; $link =~ tr/_/ /; $link =~ s/\s*([\[\]\|])\s*/$1/g; return $link; }

sub upgradeSecurity { my $x = shift; if ($x eq 'read') { $x = '*' } if ($x eq 'write') { $x = 'edit' } my $y = shift; my $security = "{{#security:$x|$y}}"; $::article = "$security\n$::article"; push @comments, $security; }

sub caretaker { my $dbh = DBI->connect('DBI:mysql:wiki',lc $::peer,$::pwd1) or die DBI->errstr; my @ns = (,'Talk:','User:','User talk:','Project:','Project talk:', '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 my $sth = $dbh->prepare('SELECT cur_id FROM cur WHERE cur_title = "Zhconversiontable"'); $sth->execute(); my @row = $sth->fetchrow_array; $sth->finish; my $first = $row[0]+1;

# Get last article id my $sth = $dbh->prepare('SELECT cur_id FROM cur ORDER BY cur_id DESC'); $sth->execute(); @row = $sth->fetchrow_array; $sth->finish; my $last = $row[0];

# 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 $done = 'none'; for ($first..$last) { $sth->execute($_); @row = $sth->fetchrow_array; my @comments = (); my $title = $ns[$row[0]].$row[1]; if ($title && ($row[2] == 0)) {

# Read the article content my $::article = wikiRawPage $::wiki, $title; $::article =~ s/^\s+//; $::article =~ s/\s+$//; my $backup = $::article; 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' unless $links{'Domain names'}++; } if ($::article =~ /<\/math>/) { push @comments, 'cat in' unless $links{'Articles containing maths'}++; } @links = sort keys %links; if ($#links >= 0) { for (@links) { tr/_/ /; $cats .= ""; } $::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 $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! my $typos = $::article =~ s/[i]mpliment/implement/g + $::article =~ s/[d]ependance/dependence/g + $::article =~ s/[h]ardwire/hard-wire/g; 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;

} # Convert XML permissions to Simple-Security format else { my $xml = wikiRawPage $::wiki, "Xml:$title"; $xml =~ s/<(read|write)>(.+?)<\//upgradeSecurity($1,$2)/eg; }

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

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

my $comment = "Daily caretaking tasks completed: ".($last-$first)." articles examined, ".($done-1)." adjusted."; logAdd $comment; wikiPageAppend($::wiki, $::wikilog, "\n*".localtime()." : $comment", $comment); $sth->finish; $dbh->disconnect; }