import time from HTMLParser import HTMLParser from htmlentitydefs import name2codepoint import errors class OldPage(object): @staticmethod def save(self, text = u'', summary = u'', minor = False): data = {} data['wpTextbox1'] = text data['wpSummary'] = summary data['wpSave'] = 'Save page' data['wpEditToken'] = self.get_token('edit') if self.last_rev_time: data['wpEdittime'] = time.strftime('%Y%m%d%H%M%S', self.last_rev_time) else: data['wpEdittime'] = time.strftime('%Y%m%d%H%M%S', time.gmtime()) if self.edit_time: data['wpStarttime'] = time.strftime('%Y%m%d%H%M%S', self.edit_time) else: data['wpStarttime'] = time.strftime('%Y%m%d%H%M%S', time.gmtime()) data['wpStarttime'] = time.strftime('%Y%m%d%H%M%S', time.gmtime()) if minor: data['wpMinoredit'] = '1' data['title'] = self.name page_data = self.site.raw_index('submit', **data) page = EditPage('editform') page.feed(page_data) page.close() if page.data: if page.readonly: raise errors.ProtectedPageError(self) self.get_token('edit', True) raise errors.EditError(page.title, data) @staticmethod def move(self, new_title, reason = '', move_talk = True): postdata = {'wpNewTitle': new_title, 'wpOldTitle': self.name, 'wpReason': reason, 'wpMove': '1', 'wpEditToken': self.get_token('move')} if move_talk: postdata['wpMovetalk'] = '1' postdata['title'] = 'Special:Movepage' page_data = self.site.raw_index('submit', **data) page = EditPage('movepage') page.feed(page_data.decode('utf-8', 'ignore')) page.close() if 'wpEditToken' in page.data: raise errors.EditError(page.title, postdata) @staticmethod def delete(self, reason = ''): postdata = {'wpReason': reason, 'wpConfirmB': 'Delete', 'mw-filedelete-submit': 'Delete', 'wpEditToken': self.get_token('delete'), 'title': self.name} page_data = self.site.raw_index('delete', **postdata) class EditPage(HTMLParser): def __init__(self, form): HTMLParser.__init__(self) self.form = form self.in_form = False self.in_text = False self.in_title = False self.data = {} self.textdata = [] self.title = u'' self.readonly = True def handle_starttag(self, tag, attrs): self.in_title = (tag == 'title') if (u'id', self.form) in attrs: attrs = dict(attrs) self.in_form = True self.action = attrs['action'] if tag == 'input' and self.in_form and (u'type', u'submit') \ not in attrs and (u'type', u'checkbox') not in attrs: attrs = dict(attrs) if u'name' in attrs: self.data[attrs[u'name']] = attrs.get(u'value', u'') if self.in_form and tag == 'textarea': self.in_text = True self.readonly = (u'readonly', u'readonly') in attrs def handle_endtag(self, tag): if self.in_title and tag == 'title': self.in_title = False if self.in_form and tag == 'form': self.in_form = False if self.in_text and tag == 'textarea': self.in_text = False def handle_data(self, data): if self.in_text: self.textdata.append(data) if self.in_title: self.title += data def handle_entityref(self, name): if name in name2codepoint: self.handle_data(unichr(name2codepoint[name])) else: self.handle_data(u'&%s;' % name) def handle_charref(self, name): try: self.handle_data(unichr(int(name))) except ValueError: self.handle_data(u'&#$s;' % name)