User:Jpatokal/post.py

__metaclass__ = type __version__ = "$Id: post.py,v 1.1.1.1 2006/04/25 17:15:44 gnosis Exp $" sig = u"Automated upload"
 * 1) !/usr/bin/python
 * 2) Edit a Wikipedia article with your favourite editor. Requires Python 2.3.
 * 3) See Talk page for usage instructions
 * 4) (C) Jpatokal 2005-2006
 * 5) Heavily based on editarticle.py by Gerrit Holl 2004
 * 6) Distribute under the terms of the PSF license.
 * 7) Heavily based on
 * 1) Heavily based on
 * 1) Heavily based on
 * 1) sig = u"Automated import of CIA World Factbook 2002"

import sys import os import httplib import urllib import getpass import difflib import optparse import tempfile import re import codecs

import wikipedia import login import config

class EditArticle: import string joinchars = string.letters + '[]' + string.digits # join lines if line starts with this ones

def __init__(self, args): """Takes one argument, usually this is sys.argv[1:]""" self.all_args = args self.set_options

def initialise_data(self): """Login, set editor, page and pagelink attributes""" self.login#anonymous=self.options.anonymous)       self.editor = self.options.editor or wikipedia.input(u"Editor to use:")

def login(self):#, anonymous):       """Initialises site and username data"""#, or anonymous"""        if False:#anonymous:            self.site = wikipedia.getSite(user=None)        else:            self.username = self.options.username or wikipedia.input(u"Username:")            self.site = wikipedia.getSite(user=self.username)            #self.site._fill # load cookies            #if not self.site._loggedin:            #    password = getpass.getpass("Password: ")            #    cookie = login.login(self.site, self.username, password)            #    if not cookie:            #        sys.exit("Login failed")            #    login.storecookiedata(cookie, self.site, self.username)            #    wikipedia.output(u"Login succesful")

def set_options(self): """Parse commandline and set options attribute""" my_args = [] for arg in self.all_args: arg = wikipedia.argHandler(arg, 'editarticle') if arg: my_args.append(arg) parser = optparse.OptionParser parser.add_option("-r", "--edit_redirect", action="store_true", default=False, help="Ignore/edit redirects") parser.add_option("-u", "--username", help="Username to login with (ignored with -a)") parser.add_option("-p", "--page", help="Page to edit") parser.add_option("-e", "--editor", help="Editor to use") parser.add_option("-j", "--join_lines", action="store_true", default=False, help="Join consecutive lines if possible") parser.add_option("-w", "--watch", action="store_true", default=False, help="Watch article after edit") parser.add_option("-n", "--new_data", default="", help="Data to insert in template") parser.add_option("-t", "--template", default="", help="Template for article creation") self.options = parser.parse_args(args=my_args)[0]
 * 1)        parser.add_option("-a", "--anonymous", action="store_true", default=False, help="Login anonymously")

def setpage(self): """Sets page and pagelink""" self.pagelink = wikipedia.Page(self.site, self.page) if not self.options.edit_redirect and self.pagelink.isRedirectPage: self.pagelink = wikipedia.Page(site, self.pagelink.getRedirectTarget)

def repair(self, content): """Removes single newlines and prepare encoding for local wiki""" if self.options.join_lines: lines = content.splitlines result = [] for i, line in enumerate(lines): try: nextline = lines[i+1] except IndexError: nextline = "last" result.append(line) if line.strip == "" or line[0] not in self.joinchars or \ nextline.strip == "" or nextline[0] not in self.joinchars: result.append('\n') else: result.append(" ") s = "".join(result) else: s = content return wikipedia.unicode2html(s, self.site.encoding)

def edit(self): """Edit the page using the editor.       It returns two strings: the old version and the new version."""

# Parse data file to figure out article variables and sub them into template newcontent = codecs.open(self.options.template, 'r', 'utf8').read for line in codecs.open(self.options.new_data, 'r', 'utf8').readlines: data = line.strip.split('=') newcontent = re.sub('\$' + data[0], data[1], newcontent) if(data[0] == 'NAME'): self.page = data[1]

# Change any remaining unresolved variables into question marks for x in ['CAPITAL', 'LANGUAGE', 'CURRENCY', 'TEL', 'DOMAIN', 'AREA', 'POPULATION']: newcontent = re.sub('\$' + x, '?', newcontent)

# Read existing article for comparison self.setpage try: oldcontent = self.pagelink.get except wikipedia.NoPage: oldcontent = "" except wikipedia.IsRedirectPage: if self.options.redirect: oldcontent = self.pagelink.get(force=True, get_redirect=redirect) else: raise return oldcontent, newcontent

def getcomment(self): comment = sig # wikipedia.input(u"What did you change? ") + sig comment = wikipedia.unicode2html(comment, self.site.encoding) return wikipedia.unicode2html(comment, self.site.encoding)

def handle_edit_conflict(self): fn = os.path.join(tempfile.gettempdir, self.page) fp = open(fn, 'w') fp.write(new) fp.close wikipedia.output(u"An edit conflict has arisen. Your edit has been saved to %s. Please try again." % fn) def showdiff(self,old, new): diff = difflib.context_diff(old.splitlines, new.splitlines) wikipedia.output(u"\n".join(diff))

def run(self): self.initialise_data # check if blocked allowed = self.site.allowed if False: sys.exit("Bot blocked!");

try: old, new = self.edit except wikipedia.LockedPage: sys.exit("You do not have permission to edit %s" % self.pagelink.sectionFreeTitle)

if old != new: new = self.repair(new) self.showdiff(old, new) comment = self.getcomment try: self.pagelink.put(new, comment=comment, minorEdit=False, watchArticle=self.options.watch)#, anon=self.options.anonymous)           except wikipedia.EditConflict:                self.handle_edit_conflict        else:            wikipedia.output(u"Nothing changed")

def main: app = EditArticle(sys.argv[1:]) app.run

if __name__ == "__main__": try: main except: wikipedia.stopme raise wikipedia.stopme