Revision: 5293 Author: siebrand Date: 2008-05-02 00:13:27 +0000 (Fri, 02 May 2008)
Log Message: ----------- More eol-style:native props
Modified Paths: -------------- trunk/pywikipedia/blockpageschecker.py trunk/pywikipedia/commonsdelinker/plugins/__init__.py trunk/pywikipedia/commonsdelinker/plugins/books.py trunk/pywikipedia/commonsdelinker/plugins/debug.py trunk/pywikipedia/commonsdelinker/plugins/flags.py trunk/pywikipedia/families/wikia_family.py trunk/pywikipedia/fixing_redirects.py trunk/pywikipedia/maintenance/readtalk.py
Property Changed: ---------------- trunk/pywikipedia/blockpageschecker.py trunk/pywikipedia/commonsdelinker/plugins/__init__.py trunk/pywikipedia/commonsdelinker/plugins/books.py trunk/pywikipedia/commonsdelinker/plugins/debug.py trunk/pywikipedia/commonsdelinker/plugins/flags.py trunk/pywikipedia/families/wikia_family.py trunk/pywikipedia/fixing_redirects.py trunk/pywikipedia/maintenance/readtalk.py
Modified: trunk/pywikipedia/blockpageschecker.py =================================================================== --- trunk/pywikipedia/blockpageschecker.py 2008-05-02 00:05:37 UTC (rev 5292) +++ trunk/pywikipedia/blockpageschecker.py 2008-05-02 00:13:27 UTC (rev 5293) @@ -1,402 +1,402 @@ -# -*- coding: utf-8 -*- -""" -This is a script originally written by Wikihermit and then rewritten by Filnik, -to delete the templates used to warn in the pages that a page is blocked, -when the page isn't blocked at all. Indeed, very often sysops block the pages -for a setted time but then the forget to delete the warning! This script is useful -if you want to delete those useless warning left in these pages. - -Parameters: - -These command line parameters can be used to specify which pages to work on: - -¶ms; - --xml Retrieve information from a local XML dump (pages-articles - or pages-meta-current, see http://download.wikimedia.org). - Argument can also be given as "-xml:filename". - --page Only edit a specific page. - Argument can also be given as "-page:pagetitle". You can - give this parameter multiple times to edit multiple pages. - --protectedpages: Check all the blocked pages (useful when you have not categories - or when you have problems with them. (add the namespace after ":" where - you want to check - default checks all protected pages) - --moveprotected: Same as -protectedpages, for moveprotected pages - -Furthermore, the following command line parameters are supported: - --always Doesn't ask every time if the bot should make the change or not, do it always. - --debug When the bot can't delete the template from the page (wrong regex or something like that) - it will ask you if it should open the page on your browser. - (attention: pages included may give false positives..) - --move The bot will check if the page is blocked also for the move option, not only for edit - ---- Warning! --- -You have to edit this script in order to add your preferences -otherwise the script won't work! - -If you have problems, ask on botwiki ( http://botwiki.sno.cc ) -or on IRC (#pywikipediabot) - ---- Example of how to use the script --- - -python blockpageschecker.py -always - -python blockpageschecker.py -cat:Geography -always - -python blockpageschecker.py -debug -protectedpages:4 - -""" -# -# (C) Monobi a.k.a. Wikihermit, 2007 -# (C) Filnik, 2007-2008 -# (C) NicDumZ, 2008 -# -# Distributed under the terms of the MIT license. -# -__version__ = '$Id: blockpageschecker.py,v 1.5 2008/04/24 19.40.00 filnik Exp$' -# - -import re, webbrowser -import wikipedia, catlib, pagegenerators, config - -# This is required for the text that is shown when you run this script -# with the parameter -help. -docuReplacements = { - '¶ms;': pagegenerators.parameterHelp, -} - -####################################################### -#--------------------- PREFERENCES -------------------# -################### -- Edit below! -- ################# - -# Added a new feature! Please update and add the settings in order -# to improve the intelligence of this script ;-) -# Regex to get the semi-protection template -templateSemiProtection = { - 'en': None, - 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccoparziale(?:|[ _]scad|.*?||.*?)}}', - r'{{(?:[Tt]emplate:|)[Aa]bp(?:|[ _]scad|(?:.*?))}}'], - 'fr': [ur'{{(?:[Tt]emplate:|[Mm]odèle:|)[Ss]emi[- ]?protection(|[^}]*)}}'], - 'ja':[ur'{{(?:[Tt]emplate:|)半保護(?:[Ss]|)(?:|.+|)}}(\n+?|)'], - 'zh':[ur'{{(?:[Tt]emplate:|)Protected|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Mini-protected|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Protected-logo|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)'], - } -# Regex to get the total-protection template -templateTotalProtection = { - 'en': None, - 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisoblocco(?:|[ _]scad|(?:.*?)|minaccia|cancellata)}}', - r'{{(?:[Tt]emplate:|)(?:[Cc][Tt]|[Cc]anc fatte|[Cc][Ee].*?)}}', r'<div class="toccolours[ _]itwiki[ _]template[ _]avviso">(?:\s|\n)*?[Qq]uesta pagina'], - 'fr':[ur'{{(?:[Tt]emplate:|[Mm]odèle:|)[Pp]rotection(|[^}]*)}}', - ur'{{(?:[Tt]emplate:|[Mm]odèle:|)(?:[Pp]age|[Aa]rchive|[Mm]odèle) protégée?(|[^}]*)}}'], - 'ja':[ur'{{(?:[Tt]emplate:|)保護(?:[Ss]|)(?:|.+|)}}(\n+?|)'], - 'zh':[r'{{(?:[Tt]emplate:|)Protected|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Mini-protected|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Protected-logo|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)'], - } -# Regex to get the semi-protection move template -templateSemiMoveProtection = { - 'en': None, - 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccospostamento(?:|[ _]scad|.*?||.*?)}}'], - 'ja':[ur'{{(?:[Tt]emplate:|)移動半保護(?:[Ss]|)(?:|.+|)}}(\n+?|)'], - 'zh':[r'{{(?:[Tt]emplate:|)Protected|(?:MS|ms)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Mini-protected|(?:MS|ms)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Protected-logo|(?:MS|ms)(?:|.+|)}}(\n+?|)'], - } -# Regex to get the total-protection move template -templateTotalMoveProtection = { - 'en': None, - 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccospostamento(?:|[ _]scad|.*?||.*?)}}'], - 'ja':[ur'{{(?:[Tt]emplate:|)移動保護(?:[Ss]|)(?:|.+|)}}(\n+?|)'], - 'zh':[ur'{{(?:[Tt]emplate:|)Protected|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Mini-protected|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Protected-logo|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)'], - } -# Array: 0 => Semi-block, 1 => Total Block, 2 => Semi-Move, 3 => Total-Move -templateNoRegex = { - 'it':['{{Avvisobloccoparziale}}', '{{Avvisoblocco}}', None, None], - 'fr':['{{Semi-protection}}', '{{Protection}}', None, None], - 'ja':[u'{{半保護}}', u'{{保護}}', u'{{移動半保護}}',u'{{移動保護}}'], - 'zh':[u'{{Protected/semi}}',u'{{Protected}}',u'{{Protected/ms}}',u'{{Protected/move}}'], - } - -# Category where the bot will check -categoryToCheck = { - 'en':[u'Category:Protected'], - 'fr':[u'Category:Page semi-protégée', u'Category:Page protégée', u'Catégorie:Article protégé'], - 'he':[u'קטגוריה:ויקיפדיה: דפים מוגנים', u'קטגוריה:ויקיפדיה: דפים מוגנים חלקית'], - 'it':[u'Categoria:Pagine semiprotette', u'Categoria:Voci_protette'], - 'ja':[u'Category:編集保護中の記事',u'Category:編集半保護中の記事', - u'Category:移動保護中の記事',], - 'pt':[u'Category:!Páginas protegidas', u'Category:!Páginas semiprotegidas'], - 'zh':[u'Category:被保护的页面',u'Category:被保護的模板',u'Category:暂时不能移动的页面', - u'Category:被半保护的页面',], - } -# Comment used when the Bot edits -comment = { - 'en':u'Bot: Deleting out-dated template', - 'fr':u'Robot: Mise à jour des bandeaux de protection', - 'he':u'בוט: מסיר תבנית שעבר זמנה', - 'it':u'Bot: Tolgo o sistemo template di avviso blocco', - 'ja':u'ロボットによる: 保護テンプレート除去', - 'pt':u'Bot: Retirando predefinição de proteção', - 'zh':u'機器人: 移除過期的保護模板', - } -# Check list to block the users that haven't set their preferences -project_inserted = ['en', 'fr', 'it', 'ja', 'pt', 'zh'] - -####################################################### -#------------------ END PREFERENCES ------------------# -################## -- Edit above! -- ################## - -def understandBlock(text, TTP, TSP, TSMP, TTMP): - """ Understand if the page is blocked and if it has the right template """ - for catchRegex in TTP: # TTP = templateTotalProtection - resultCatch = re.findall(catchRegex, text) - if resultCatch: - return ('sysop-total', catchRegex) - for catchRegex in TSP: - resultCatch = re.findall(catchRegex, text) - if resultCatch: - return ('autoconfirmed-total', catchRegex) - if TSMP != None and TTMP != None and TTP != TTMP and TSP != TSMP: - for catchRegex in TSMP: - resultCatch = re.findall(catchRegex, text) - if resultCatch: - return ('sysop-move', catchRegex) - for catchRegex in TTMP: - resultCatch = re.findall(catchRegex, text) - if resultCatch: - return ('autoconfirmed-move', catchRegex) - return ('editable', r'\A\n') # If editable means that we have no regex, won't change anything with this regex - -def debugQuest(site, page): - quest = wikipedia.input(u'Do you want to open the page on your [b]rowser, [g]ui or [n]othing?') - pathWiki = site.family.nicepath(site.lang) - url = 'http://%s%s%s?&redirect=no' % (wikipedia.getSite().hostname(), pathWiki, page.urlname()) - while 1: - if quest.lower() in ['b', 'B']: - webbrowser.open(url) - break - elif quest.lower() in ['g', 'G']: - import editarticle - editor = editarticle.TextEditor() - text = editor.edit(page.get()) - break - elif quest.lower() in ['n', 'N']: - break - else: - wikipedia.output(u'wrong entry, type "b", "g" or "n"') - continue - -def main(): - """ Main Function """ - # Loading the comments - global categoryToCheck; global comment; global project_inserted - if config.mylang not in project_inserted: - wikipedia.output(u"Your project is not supported by this script. You have to edit the script and add it!") - wikipedia.stopme() - # always, define a generator to understand if the user sets one, defining what's genFactory - always = False; generator = False; debug = False - moveBlockCheck = False; genFactory = pagegenerators.GeneratorFactory() - # To prevent Infinite loops - errorCount = 0 - # Load the right site - site = wikipedia.getSite() - # Loading the default options. - for arg in wikipedia.handleArgs(): - if arg == '-always': - always = True - elif arg == '-move': - moveBlockCheck = True - elif arg == '-debug': - debug = True - elif arg.startswith('-protectedpages'): - if len(arg) == 15: - generator = site.protectedpages(namespace = 0) - else: - generator = site.protectedpages(namespace = int(arg[16:])) - elif arg.startswith('-moveprotected'): - if len(arg) == 14: - generator = site.protectedpages(namespace = 0, type = 'move') - else: - generator = site.protectedpages(namespace = int(arg[16:]), - type = 'move') - elif arg.startswith('-page'): - if len(arg) == 5: - generator = [wikipedia.Page(wikipedia.getSite(), wikipedia.input(u'What page do you want to use?'))] - else: - generator = [wikipedia.Page(wikipedia.getSite(), arg[6:])] - else: - generator = genFactory.handleArg(arg) - # Take the right templates to use, the category and the comment - TSP = wikipedia.translate(site, templateSemiProtection) - TTP = wikipedia.translate(site, templateTotalProtection) - TSMP = wikipedia.translate(site, templateSemiMoveProtection) - TTMP = wikipedia.translate(site, templateTotalMoveProtection) - TNR = wikipedia.translate(site, templateNoRegex) - - category = wikipedia.translate(site, categoryToCheck) - commentUsed = wikipedia.translate(site, comment) - if not generator: - generator = list() - wikipedia.output(u'Loading categories...') - # Define the category if no other generator has been setted - for CAT in category: - cat = catlib.Category(site, CAT) - # Define the generator - gen = pagegenerators.CategorizedPageGenerator(cat) - for pageCat in gen: - generator.append(pageCat) - wikipedia.output(u'Categories loaded, start!') - # Main Loop - preloadingGen = pagegenerators.PreloadingGenerator(generator, pageNumber = 60) - for page in preloadingGen: - pagename = page.aslink() - wikipedia.output('Loading %s...' % pagename) - try: - text = page.get() - restrictions = page.getRestrictions() - except wikipedia.NoPage: - wikipedia.output("%s doesn't exist! Skipping..." % pagename) - continue - except wikipedia.IsRedirectPage: - wikipedia.output("%s is a redirect! Skipping..." % pagename) - if debug: - debugQuest(site, page) - continue - """ - # This check does not work : - # PreloadingGenerator cannot set correctly page.editRestriction - # (see bug #1949476 ) - if not page.canBeEdited(): - wikipedia.output("%s is sysop-protected : this account can't edit it! Skipping..." % pagename) - continue - """ - editRestr = restrictions['edit'] - if editRestr and editRestr[0] == 'sysop': - try: - config.sysopnames[site.family.name][site.lang] - except: - wikipedia.output("%s is sysop-protected : this account can't edit it! Skipping..." % pagename) - continue - - # Understand, according to the template in the page, what should be the protection - # and compare it with what there really is. - TemplateInThePage = understandBlock(text, TTP, TSP, TSMP, TTMP) - # Only to see if the text is the same or not... - oldtext = text - # keep track of the changes for each step (edit then move) - changes = -1 - - if not editRestr: - # page is not edit-protected - # Deleting the template because the page doesn't need it. - replaceToPerform = u'|'.join(TTP + TSP) - texti, changes = re.subn('(?:<noinclude>|)(%s)(?:</noinclude>|)' % replaceToPerform, '', text) - wikipedia.output(u'The page is editable for all, deleting the template...') - - elif editRestr[0] == 'sysop': - # total edit protection - if TemplateInThePage[0] == 'sysop-total' and TTP != None: - msg = 'The page is protected to the sysop' - if not moveBlockCheck: - msg += ', skipping...' - wikipedia.output(msg) - else: - wikipedia.output(u'The page is protected to the sysop, but the template seems not correct. Fixing...') - text, changes = re.subn(TemplateInThePage[1], TNR[1], text) - - elif TSP != None: - # implicitely editRestr[0] = 'autoconfirmed', edit-Semi-protection - if TemplateInThePage[0] == 'autoconfirmed-total': - msg = 'The page is editable only for the autoconfirmed users' - if not moveBlockCheck: - msg += ', skipping...' - wikipedia.output(msg) - else: - wikipedia.output(u'The page is editable only for the autoconfirmed users, but the template seems not correct. Fixing...') - text, changes = re.subn(TemplateInThePage[1], TNR[0], text) - - if changes == 0: - # We tried to fix edit-protection templates, but it did not work. - wikipedia.output('Warning : No edit-protection template could be found') - - if moveBlockCheck: - # checking move protection now - moveRestr = restrictions['move'] - changes = -1 - - if not moveRestr: - wikipedia.output(u'The page is movable for all, deleting the template...') - # Deleting the template because the page doesn't need it. - replaceToPerform = u'|'.join(TSMP + TTMP) - text, changes = re.subn('(?:<noinclude>|)(%s)(?:</noinclude>|)' % replaceToPerform, '', text) - - elif moveRestr[0] == 'sysop': - # move-total-protection - if TemplateInThePage[0] == 'sysop-move' and TTMP != None: - wikipedia.output(u'The page is protected from moving to the sysop, skipping...') - else: - wikipedia.output(u'The page is protected from moving to the sysop, but the template seems not correct. Fixing...') - text, changes = re.subn(TemplateInThePage[1], TNR[3], text) - - elif TSMP != None: - # implicitely moveRestr[0] = 'autoconfirmed', move-semi-protection - if TemplateInThePage[0] == 'autoconfirmed-move': - wikipedia.output(u'The page is movable only for the autoconfirmed users, skipping...') - else: - wikipedia.output(u'The page is movable only for the autoconfirmed users, but the template seems not correct. Fixing...') - text, changes = re.subn(TemplateInThePage[1], TNR[2], text) - - if changes == 0: - # We tried to fix move-protection templates, but it did not work. - wikipedia.output('Warning : No move-protection template could be found') - - - if oldtext != text: - # Ok, asking if the change has to be performed and do it if yes. - wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title()) - wikipedia.showDiff(oldtext, text) - choice = '' - while 1: - if not always: - choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N') - if choice.lower() in ['a', 'all']: - always = True - if choice.lower() in ['n', 'no']: - break - if choice.lower() in ['y', 'yes'] or always: - try: - page.put(text, commentUsed, force=True) - except wikipedia.EditConflict: - wikipedia.output(u'Edit conflict! skip!') - break - except wikipedia.ServerError: - # Sometimes there is this error that's quite annoying because - # can block the whole process for nothing. - errorCount += 1 - if errorCount < 5: - wikipedia.output(u'Server Error! Wait..') - time.sleep(3) - continue - else: - # Prevent Infinite Loops - raise wikipedia.ServerError(u'Fifth Server Error!') - except wikipedia.SpamfilterError, e: - wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url)) - break - except wikipedia.PageNotSaved, error: - wikipedia.output(u'Error putting page: %s' % (error.args,)) - break - except wikipedia.LockedPage: - wikipedia.output(u'The page is still protected. Skipping...') - break - else: - # Break only if the errors are one after the other - errorCount = 0 - break - -if __name__ == "__main__": - try: - main() - finally: - wikipedia.stopme() +# -*- coding: utf-8 -*- +""" +This is a script originally written by Wikihermit and then rewritten by Filnik, +to delete the templates used to warn in the pages that a page is blocked, +when the page isn't blocked at all. Indeed, very often sysops block the pages +for a setted time but then the forget to delete the warning! This script is useful +if you want to delete those useless warning left in these pages. + +Parameters: + +These command line parameters can be used to specify which pages to work on: + +¶ms; + +-xml Retrieve information from a local XML dump (pages-articles + or pages-meta-current, see http://download.wikimedia.org). + Argument can also be given as "-xml:filename". + +-page Only edit a specific page. + Argument can also be given as "-page:pagetitle". You can + give this parameter multiple times to edit multiple pages. + +-protectedpages: Check all the blocked pages (useful when you have not categories + or when you have problems with them. (add the namespace after ":" where + you want to check - default checks all protected pages) + +-moveprotected: Same as -protectedpages, for moveprotected pages + +Furthermore, the following command line parameters are supported: + +-always Doesn't ask every time if the bot should make the change or not, do it always. + +-debug When the bot can't delete the template from the page (wrong regex or something like that) + it will ask you if it should open the page on your browser. + (attention: pages included may give false positives..) + +-move The bot will check if the page is blocked also for the move option, not only for edit + +--- Warning! --- +You have to edit this script in order to add your preferences +otherwise the script won't work! + +If you have problems, ask on botwiki ( http://botwiki.sno.cc ) +or on IRC (#pywikipediabot) + +--- Example of how to use the script --- + +python blockpageschecker.py -always + +python blockpageschecker.py -cat:Geography -always + +python blockpageschecker.py -debug -protectedpages:4 + +""" +# +# (C) Monobi a.k.a. Wikihermit, 2007 +# (C) Filnik, 2007-2008 +# (C) NicDumZ, 2008 +# +# Distributed under the terms of the MIT license. +# +__version__ = '$Id: blockpageschecker.py,v 1.5 2008/04/24 19.40.00 filnik Exp$' +# + +import re, webbrowser +import wikipedia, catlib, pagegenerators, config + +# This is required for the text that is shown when you run this script +# with the parameter -help. +docuReplacements = { + '¶ms;': pagegenerators.parameterHelp, +} + +####################################################### +#--------------------- PREFERENCES -------------------# +################### -- Edit below! -- ################# + +# Added a new feature! Please update and add the settings in order +# to improve the intelligence of this script ;-) +# Regex to get the semi-protection template +templateSemiProtection = { + 'en': None, + 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccoparziale(?:|[ _]scad|.*?||.*?)}}', + r'{{(?:[Tt]emplate:|)[Aa]bp(?:|[ _]scad|(?:.*?))}}'], + 'fr': [ur'{{(?:[Tt]emplate:|[Mm]odèle:|)[Ss]emi[- ]?protection(|[^}]*)}}'], + 'ja':[ur'{{(?:[Tt]emplate:|)半保護(?:[Ss]|)(?:|.+|)}}(\n+?|)'], + 'zh':[ur'{{(?:[Tt]emplate:|)Protected|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Mini-protected|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Protected-logo|(?:[Ss]|[Ss]emi|半)(?:|.+|)}}(\n+?|)'], + } +# Regex to get the total-protection template +templateTotalProtection = { + 'en': None, + 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisoblocco(?:|[ _]scad|(?:.*?)|minaccia|cancellata)}}', + r'{{(?:[Tt]emplate:|)(?:[Cc][Tt]|[Cc]anc fatte|[Cc][Ee].*?)}}', r'<div class="toccolours[ _]itwiki[ _]template[ _]avviso">(?:\s|\n)*?[Qq]uesta pagina'], + 'fr':[ur'{{(?:[Tt]emplate:|[Mm]odèle:|)[Pp]rotection(|[^}]*)}}', + ur'{{(?:[Tt]emplate:|[Mm]odèle:|)(?:[Pp]age|[Aa]rchive|[Mm]odèle) protégée?(|[^}]*)}}'], + 'ja':[ur'{{(?:[Tt]emplate:|)保護(?:[Ss]|)(?:|.+|)}}(\n+?|)'], + 'zh':[r'{{(?:[Tt]emplate:|)Protected|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Mini-protected|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Protected-logo|(?:[Nn]|[Nn]ormal)(?:|.+|)}}(\n+?|)'], + } +# Regex to get the semi-protection move template +templateSemiMoveProtection = { + 'en': None, + 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccospostamento(?:|[ _]scad|.*?||.*?)}}'], + 'ja':[ur'{{(?:[Tt]emplate:|)移動半保護(?:[Ss]|)(?:|.+|)}}(\n+?|)'], + 'zh':[r'{{(?:[Tt]emplate:|)Protected|(?:MS|ms)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Mini-protected|(?:MS|ms)(?:|.+|)}}(\n+?|)',r'{{(?:[Tt]emplate:|)Protected-logo|(?:MS|ms)(?:|.+|)}}(\n+?|)'], + } +# Regex to get the total-protection move template +templateTotalMoveProtection = { + 'en': None, + 'it':[r'{{(?:[Tt]emplate:|)[Aa]vvisobloccospostamento(?:|[ _]scad|.*?||.*?)}}'], + 'ja':[ur'{{(?:[Tt]emplate:|)移動保護(?:[Ss]|)(?:|.+|)}}(\n+?|)'], + 'zh':[ur'{{(?:[Tt]emplate:|)Protected|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Mini-protected|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)',ur'{{(?:[Tt]emplate:|)Protected-logo|(?:[Mm]|[Mm]ove|移[動动])(?:|.+|)}}(\n+?|)'], + } +# Array: 0 => Semi-block, 1 => Total Block, 2 => Semi-Move, 3 => Total-Move +templateNoRegex = { + 'it':['{{Avvisobloccoparziale}}', '{{Avvisoblocco}}', None, None], + 'fr':['{{Semi-protection}}', '{{Protection}}', None, None], + 'ja':[u'{{半保護}}', u'{{保護}}', u'{{移動半保護}}',u'{{移動保護}}'], + 'zh':[u'{{Protected/semi}}',u'{{Protected}}',u'{{Protected/ms}}',u'{{Protected/move}}'], + } + +# Category where the bot will check +categoryToCheck = { + 'en':[u'Category:Protected'], + 'fr':[u'Category:Page semi-protégée', u'Category:Page protégée', u'Catégorie:Article protégé'], + 'he':[u'קטגוריה:ויקיפדיה: דפים מוגנים', u'קטגוריה:ויקיפדיה: דפים מוגנים חלקית'], + 'it':[u'Categoria:Pagine semiprotette', u'Categoria:Voci_protette'], + 'ja':[u'Category:編集保護中の記事',u'Category:編集半保護中の記事', + u'Category:移動保護中の記事',], + 'pt':[u'Category:!Páginas protegidas', u'Category:!Páginas semiprotegidas'], + 'zh':[u'Category:被保护的页面',u'Category:被保護的模板',u'Category:暂时不能移动的页面', + u'Category:被半保护的页面',], + } +# Comment used when the Bot edits +comment = { + 'en':u'Bot: Deleting out-dated template', + 'fr':u'Robot: Mise à jour des bandeaux de protection', + 'he':u'בוט: מסיר תבנית שעבר זמנה', + 'it':u'Bot: Tolgo o sistemo template di avviso blocco', + 'ja':u'ロボットによる: 保護テンプレート除去', + 'pt':u'Bot: Retirando predefinição de proteção', + 'zh':u'機器人: 移除過期的保護模板', + } +# Check list to block the users that haven't set their preferences +project_inserted = ['en', 'fr', 'it', 'ja', 'pt', 'zh'] + +####################################################### +#------------------ END PREFERENCES ------------------# +################## -- Edit above! -- ################## + +def understandBlock(text, TTP, TSP, TSMP, TTMP): + """ Understand if the page is blocked and if it has the right template """ + for catchRegex in TTP: # TTP = templateTotalProtection + resultCatch = re.findall(catchRegex, text) + if resultCatch: + return ('sysop-total', catchRegex) + for catchRegex in TSP: + resultCatch = re.findall(catchRegex, text) + if resultCatch: + return ('autoconfirmed-total', catchRegex) + if TSMP != None and TTMP != None and TTP != TTMP and TSP != TSMP: + for catchRegex in TSMP: + resultCatch = re.findall(catchRegex, text) + if resultCatch: + return ('sysop-move', catchRegex) + for catchRegex in TTMP: + resultCatch = re.findall(catchRegex, text) + if resultCatch: + return ('autoconfirmed-move', catchRegex) + return ('editable', r'\A\n') # If editable means that we have no regex, won't change anything with this regex + +def debugQuest(site, page): + quest = wikipedia.input(u'Do you want to open the page on your [b]rowser, [g]ui or [n]othing?') + pathWiki = site.family.nicepath(site.lang) + url = 'http://%s%s%s?&redirect=no' % (wikipedia.getSite().hostname(), pathWiki, page.urlname()) + while 1: + if quest.lower() in ['b', 'B']: + webbrowser.open(url) + break + elif quest.lower() in ['g', 'G']: + import editarticle + editor = editarticle.TextEditor() + text = editor.edit(page.get()) + break + elif quest.lower() in ['n', 'N']: + break + else: + wikipedia.output(u'wrong entry, type "b", "g" or "n"') + continue + +def main(): + """ Main Function """ + # Loading the comments + global categoryToCheck; global comment; global project_inserted + if config.mylang not in project_inserted: + wikipedia.output(u"Your project is not supported by this script. You have to edit the script and add it!") + wikipedia.stopme() + # always, define a generator to understand if the user sets one, defining what's genFactory + always = False; generator = False; debug = False + moveBlockCheck = False; genFactory = pagegenerators.GeneratorFactory() + # To prevent Infinite loops + errorCount = 0 + # Load the right site + site = wikipedia.getSite() + # Loading the default options. + for arg in wikipedia.handleArgs(): + if arg == '-always': + always = True + elif arg == '-move': + moveBlockCheck = True + elif arg == '-debug': + debug = True + elif arg.startswith('-protectedpages'): + if len(arg) == 15: + generator = site.protectedpages(namespace = 0) + else: + generator = site.protectedpages(namespace = int(arg[16:])) + elif arg.startswith('-moveprotected'): + if len(arg) == 14: + generator = site.protectedpages(namespace = 0, type = 'move') + else: + generator = site.protectedpages(namespace = int(arg[16:]), + type = 'move') + elif arg.startswith('-page'): + if len(arg) == 5: + generator = [wikipedia.Page(wikipedia.getSite(), wikipedia.input(u'What page do you want to use?'))] + else: + generator = [wikipedia.Page(wikipedia.getSite(), arg[6:])] + else: + generator = genFactory.handleArg(arg) + # Take the right templates to use, the category and the comment + TSP = wikipedia.translate(site, templateSemiProtection) + TTP = wikipedia.translate(site, templateTotalProtection) + TSMP = wikipedia.translate(site, templateSemiMoveProtection) + TTMP = wikipedia.translate(site, templateTotalMoveProtection) + TNR = wikipedia.translate(site, templateNoRegex) + + category = wikipedia.translate(site, categoryToCheck) + commentUsed = wikipedia.translate(site, comment) + if not generator: + generator = list() + wikipedia.output(u'Loading categories...') + # Define the category if no other generator has been setted + for CAT in category: + cat = catlib.Category(site, CAT) + # Define the generator + gen = pagegenerators.CategorizedPageGenerator(cat) + for pageCat in gen: + generator.append(pageCat) + wikipedia.output(u'Categories loaded, start!') + # Main Loop + preloadingGen = pagegenerators.PreloadingGenerator(generator, pageNumber = 60) + for page in preloadingGen: + pagename = page.aslink() + wikipedia.output('Loading %s...' % pagename) + try: + text = page.get() + restrictions = page.getRestrictions() + except wikipedia.NoPage: + wikipedia.output("%s doesn't exist! Skipping..." % pagename) + continue + except wikipedia.IsRedirectPage: + wikipedia.output("%s is a redirect! Skipping..." % pagename) + if debug: + debugQuest(site, page) + continue + """ + # This check does not work : + # PreloadingGenerator cannot set correctly page.editRestriction + # (see bug #1949476 ) + if not page.canBeEdited(): + wikipedia.output("%s is sysop-protected : this account can't edit it! Skipping..." % pagename) + continue + """ + editRestr = restrictions['edit'] + if editRestr and editRestr[0] == 'sysop': + try: + config.sysopnames[site.family.name][site.lang] + except: + wikipedia.output("%s is sysop-protected : this account can't edit it! Skipping..." % pagename) + continue + + # Understand, according to the template in the page, what should be the protection + # and compare it with what there really is. + TemplateInThePage = understandBlock(text, TTP, TSP, TSMP, TTMP) + # Only to see if the text is the same or not... + oldtext = text + # keep track of the changes for each step (edit then move) + changes = -1 + + if not editRestr: + # page is not edit-protected + # Deleting the template because the page doesn't need it. + replaceToPerform = u'|'.join(TTP + TSP) + texti, changes = re.subn('(?:<noinclude>|)(%s)(?:</noinclude>|)' % replaceToPerform, '', text) + wikipedia.output(u'The page is editable for all, deleting the template...') + + elif editRestr[0] == 'sysop': + # total edit protection + if TemplateInThePage[0] == 'sysop-total' and TTP != None: + msg = 'The page is protected to the sysop' + if not moveBlockCheck: + msg += ', skipping...' + wikipedia.output(msg) + else: + wikipedia.output(u'The page is protected to the sysop, but the template seems not correct. Fixing...') + text, changes = re.subn(TemplateInThePage[1], TNR[1], text) + + elif TSP != None: + # implicitely editRestr[0] = 'autoconfirmed', edit-Semi-protection + if TemplateInThePage[0] == 'autoconfirmed-total': + msg = 'The page is editable only for the autoconfirmed users' + if not moveBlockCheck: + msg += ', skipping...' + wikipedia.output(msg) + else: + wikipedia.output(u'The page is editable only for the autoconfirmed users, but the template seems not correct. Fixing...') + text, changes = re.subn(TemplateInThePage[1], TNR[0], text) + + if changes == 0: + # We tried to fix edit-protection templates, but it did not work. + wikipedia.output('Warning : No edit-protection template could be found') + + if moveBlockCheck: + # checking move protection now + moveRestr = restrictions['move'] + changes = -1 + + if not moveRestr: + wikipedia.output(u'The page is movable for all, deleting the template...') + # Deleting the template because the page doesn't need it. + replaceToPerform = u'|'.join(TSMP + TTMP) + text, changes = re.subn('(?:<noinclude>|)(%s)(?:</noinclude>|)' % replaceToPerform, '', text) + + elif moveRestr[0] == 'sysop': + # move-total-protection + if TemplateInThePage[0] == 'sysop-move' and TTMP != None: + wikipedia.output(u'The page is protected from moving to the sysop, skipping...') + else: + wikipedia.output(u'The page is protected from moving to the sysop, but the template seems not correct. Fixing...') + text, changes = re.subn(TemplateInThePage[1], TNR[3], text) + + elif TSMP != None: + # implicitely moveRestr[0] = 'autoconfirmed', move-semi-protection + if TemplateInThePage[0] == 'autoconfirmed-move': + wikipedia.output(u'The page is movable only for the autoconfirmed users, skipping...') + else: + wikipedia.output(u'The page is movable only for the autoconfirmed users, but the template seems not correct. Fixing...') + text, changes = re.subn(TemplateInThePage[1], TNR[2], text) + + if changes == 0: + # We tried to fix move-protection templates, but it did not work. + wikipedia.output('Warning : No move-protection template could be found') + + + if oldtext != text: + # Ok, asking if the change has to be performed and do it if yes. + wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title()) + wikipedia.showDiff(oldtext, text) + choice = '' + while 1: + if not always: + choice = wikipedia.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N') + if choice.lower() in ['a', 'all']: + always = True + if choice.lower() in ['n', 'no']: + break + if choice.lower() in ['y', 'yes'] or always: + try: + page.put(text, commentUsed, force=True) + except wikipedia.EditConflict: + wikipedia.output(u'Edit conflict! skip!') + break + except wikipedia.ServerError: + # Sometimes there is this error that's quite annoying because + # can block the whole process for nothing. + errorCount += 1 + if errorCount < 5: + wikipedia.output(u'Server Error! Wait..') + time.sleep(3) + continue + else: + # Prevent Infinite Loops + raise wikipedia.ServerError(u'Fifth Server Error!') + except wikipedia.SpamfilterError, e: + wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), e.url)) + break + except wikipedia.PageNotSaved, error: + wikipedia.output(u'Error putting page: %s' % (error.args,)) + break + except wikipedia.LockedPage: + wikipedia.output(u'The page is still protected. Skipping...') + break + else: + # Break only if the errors are one after the other + errorCount = 0 + break + +if __name__ == "__main__": + try: + main() + finally: + wikipedia.stopme()
Property changes on: trunk/pywikipedia/blockpageschecker.py ___________________________________________________________________ Name: svn:eol-style + native
Modified: trunk/pywikipedia/commonsdelinker/plugins/__init__.py =================================================================== --- trunk/pywikipedia/commonsdelinker/plugins/__init__.py 2008-05-02 00:05:37 UTC (rev 5292) +++ trunk/pywikipedia/commonsdelinker/plugins/__init__.py 2008-05-02 00:13:27 UTC (rev 5293) @@ -1 +1 @@ -__version__ = '$Id: $' +__version__ = '$Id: $'
Property changes on: trunk/pywikipedia/commonsdelinker/plugins/__init__.py ___________________________________________________________________ Name: svn:eol-style + native
Modified: trunk/pywikipedia/commonsdelinker/plugins/books.py =================================================================== --- trunk/pywikipedia/commonsdelinker/plugins/books.py 2008-05-02 00:05:37 UTC (rev 5292) +++ trunk/pywikipedia/commonsdelinker/plugins/books.py 2008-05-02 00:13:27 UTC (rev 5293) @@ -1,15 +1,15 @@ -__version__ = '$Id: $' - -import re - -class FrPhotographie(object): - hook = 'before_replace' - def __init__(self, CommonsDelinker): - self.CommonsDelinker = CommonsDelinker - def __call__(self, page, summary, image, replacement): - site = page.site() - if (site.lang, site.family.name) == ('fr', 'wikibooks') and replacement.get() is None: - if page.title().startswith('Photographie/') or page.title().startswith('Tribologie/'): - replacement.set('IMG.svg') - self.CommonsDelinker.output(u'%s Replaced %s by IMG.svg on %s.' % \ - (self, image.get(), replacement.get())) +__version__ = '$Id: $' + +import re + +class FrPhotographie(object): + hook = 'before_replace' + def __init__(self, CommonsDelinker): + self.CommonsDelinker = CommonsDelinker + def __call__(self, page, summary, image, replacement): + site = page.site() + if (site.lang, site.family.name) == ('fr', 'wikibooks') and replacement.get() is None: + if page.title().startswith('Photographie/') or page.title().startswith('Tribologie/'): + replacement.set('IMG.svg') + self.CommonsDelinker.output(u'%s Replaced %s by IMG.svg on %s.' % \ + (self, image.get(), replacement.get()))
Property changes on: trunk/pywikipedia/commonsdelinker/plugins/books.py ___________________________________________________________________ Name: svn:eol-style + native
Modified: trunk/pywikipedia/commonsdelinker/plugins/debug.py =================================================================== --- trunk/pywikipedia/commonsdelinker/plugins/debug.py 2008-05-02 00:05:37 UTC (rev 5292) +++ trunk/pywikipedia/commonsdelinker/plugins/debug.py 2008-05-02 00:13:27 UTC (rev 5293) @@ -1,17 +1,17 @@ -import difflib -__version__ = '$Id: $' - -class Diff(object): - hook = 'before_save' - def __init__(self, CommonsDelinker): - self.CommonsDelinker = CommonsDelinker - def __call__(self, page, text, new_text, summary): - diff = difflib.context_diff( - text.encode('utf-8').splitlines(True), - new_text.get().encode('utf-8').splitlines(True)) - - f = open((u'diff/%s-%s-%s.txt' % (page.urlname().replace('/', '-'), - page.site().dbName(), page.editTime())).encode('utf-8', 'ignore'), 'w') - - f.writelines(diff) +import difflib +__version__ = '$Id: $' + +class Diff(object): + hook = 'before_save' + def __init__(self, CommonsDelinker): + self.CommonsDelinker = CommonsDelinker + def __call__(self, page, text, new_text, summary): + diff = difflib.context_diff( + text.encode('utf-8').splitlines(True), + new_text.get().encode('utf-8').splitlines(True)) + + f = open((u'diff/%s-%s-%s.txt' % (page.urlname().replace('/', '-'), + page.site().dbName(), page.editTime())).encode('utf-8', 'ignore'), 'w') + + f.writelines(diff) f.close() \ No newline at end of file
Property changes on: trunk/pywikipedia/commonsdelinker/plugins/debug.py ___________________________________________________________________ Name: svn:eol-style + native
Modified: trunk/pywikipedia/commonsdelinker/plugins/flags.py =================================================================== --- trunk/pywikipedia/commonsdelinker/plugins/flags.py 2008-05-02 00:05:37 UTC (rev 5292) +++ trunk/pywikipedia/commonsdelinker/plugins/flags.py 2008-05-02 00:13:27 UTC (rev 5293) @@ -1,32 +1,32 @@ -__version__ = '$Id: $' - -import re - -class NlWiki(object): - hook = 'gallery_replace' - def __init__(self, CommonsDelinker): - self.CommonsDelinker = CommonsDelinker - def __call__(self, page, summary, image, replacement, match, groups): - site = page.site() - if (site.lang, site.family.name) == ('nl', 'wikipedia') and replacement.get() is None: - commands = self.CommonsDelinker.SummaryCache.get(site, 'Vlaggen', default = '') - - flags = re.findall(r'(?s)<!--begin-flags (.*?)-->(.*?)<!--end-flags-->', commands) - text = page.get() - - namespace = site.namespace(14) - r_namespace = r'(?:[Cc]ategory)|(?:[%s%s]%s)' % \ - (namespace[0], namespace[0].lower(), namespace[1:]) - - for new_image, categories in flags: - for category in categories.split('\n'): - if category.strip() == '': continue - - r_cat = r'[[\s*%s\s*:\s*%s\s*(?:|.*?)?\s*]]' % (r_namespace, - re.sub(r'\[ _]', '[ _]', re.escape(category.strip()))) - if re.search(r_cat, text): - self.CommonsDelinker.output( - u'%s %s replaced by %s in category %s' % \ - (self, image, new_image, category)) - replacement.set(new_image.replace(' ', '_')) +__version__ = '$Id: $' + +import re + +class NlWiki(object): + hook = 'gallery_replace' + def __init__(self, CommonsDelinker): + self.CommonsDelinker = CommonsDelinker + def __call__(self, page, summary, image, replacement, match, groups): + site = page.site() + if (site.lang, site.family.name) == ('nl', 'wikipedia') and replacement.get() is None: + commands = self.CommonsDelinker.SummaryCache.get(site, 'Vlaggen', default = '') + + flags = re.findall(r'(?s)<!--begin-flags (.*?)-->(.*?)<!--end-flags-->', commands) + text = page.get() + + namespace = site.namespace(14) + r_namespace = r'(?:[Cc]ategory)|(?:[%s%s]%s)' % \ + (namespace[0], namespace[0].lower(), namespace[1:]) + + for new_image, categories in flags: + for category in categories.split('\n'): + if category.strip() == '': continue + + r_cat = r'[[\s*%s\s*:\s*%s\s*(?:|.*?)?\s*]]' % (r_namespace, + re.sub(r'\[ _]', '[ _]', re.escape(category.strip()))) + if re.search(r_cat, text): + self.CommonsDelinker.output( + u'%s %s replaced by %s in category %s' % \ + (self, image, new_image, category)) + replacement.set(new_image.replace(' ', '_')) \ No newline at end of file
Property changes on: trunk/pywikipedia/commonsdelinker/plugins/flags.py ___________________________________________________________________ Name: svn:eol-style + native
Modified: trunk/pywikipedia/families/wikia_family.py =================================================================== --- trunk/pywikipedia/families/wikia_family.py 2008-05-02 00:05:37 UTC (rev 5292) +++ trunk/pywikipedia/families/wikia_family.py 2008-05-02 00:13:27 UTC (rev 5293) @@ -1,43 +1,43 @@ -# -*- coding: utf-8 -*- - -__version__ = '$Id: $' - -import family - -# The Wikia Search family -# user-config.py: usernames['wikia']['wikia'] = 'User name' - -class Family(family.Family): - def __init__(self): - family.Family.__init__(self) - self.name = u'wikia' - - self.langs = { - u'wikia': u'search.wikia.com', - } - - self.namespaces[4] = { - '_default': [u'search', self.namespaces[4]['_default']], - } - self.namespaces[5] = { - '_default': [u'search talk', self.namespaces[5]['_default']], - } - self.namespaces[100] = { - '_default': u'Forum', - } - self.namespaces[101] = { - '_default': u'Forum talk', - } - self.namespaces[112] = { - '_default': u'Mini', - } - self.namespaces[113] = { - '_default': u'Mini talk', - } - - def code2encoding(self, code): - return 'iso-8859-1' - - def version(self, code): - return "1.12alpha" - +# -*- coding: utf-8 -*- + +__version__ = '$Id: $' + +import family + +# The Wikia Search family +# user-config.py: usernames['wikia']['wikia'] = 'User name' + +class Family(family.Family): + def __init__(self): + family.Family.__init__(self) + self.name = u'wikia' + + self.langs = { + u'wikia': u'search.wikia.com', + } + + self.namespaces[4] = { + '_default': [u'search', self.namespaces[4]['_default']], + } + self.namespaces[5] = { + '_default': [u'search talk', self.namespaces[5]['_default']], + } + self.namespaces[100] = { + '_default': u'Forum', + } + self.namespaces[101] = { + '_default': u'Forum talk', + } + self.namespaces[112] = { + '_default': u'Mini', + } + self.namespaces[113] = { + '_default': u'Mini talk', + } + + def code2encoding(self, code): + return 'iso-8859-1' + + def version(self, code): + return "1.12alpha" +
Property changes on: trunk/pywikipedia/families/wikia_family.py ___________________________________________________________________ Name: svn:eol-style + native
Modified: trunk/pywikipedia/fixing_redirects.py =================================================================== --- trunk/pywikipedia/fixing_redirects.py 2008-05-02 00:05:37 UTC (rev 5292) +++ trunk/pywikipedia/fixing_redirects.py 2008-05-02 00:13:27 UTC (rev 5293) @@ -1,191 +1,191 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -""" -This script has the intention to correct all redirect -links in featured pages or only one page of each wiki. - -Can be using with: --featured Run over featured pages --page:XXX Run over only one page - -""" -# -# This script based on disambredir.py and solve_disambiguation.py -# -# Distributed under the terms of the MIT license. -# -__version__='$Id: disambredir.py 4407 2007-10-03 17:27:14Z leogregianin $' -# -import wikipedia -import pagegenerators -import re, sys - -msg = { - 'ar': u'بوت: إصلاح التحويلات', - 'en': u'Bot: Fixing redirects', - 'he': u'בוט: מתקן הפניות', - 'ja': u'ロボットによる:リダイレクト回避', - 'nn': u'robot: retta omdirigeringar', - 'no': u'Robot: Retter omdirigeringer', - 'pt': u'Bot: Arrumando redirects', - 'sv': u'Bot: Rättar omdirigeringar', - 'zh': u'機器人: 修復重定向', -} - -featured_articles = { - 'ar': u'ويكيبيديا:مقالات مختارة', - 'de': u'Wikipedia:Exzellente_Artikel', - 'en': u'Wikipedia:Featured_articles', - 'es': u'Wikipedia:Artículos_destacados', - 'fr': u'Wikipédia:Articles_de_qualité', - 'he': u'פורטל:ערכים_מומלצים', - 'it': u'Wikipedia:Articoli_in_vetrina', - 'ja': u'Wikipedia:秀逸な記事', - 'nl': u'Wikipedia:Etalage', - 'nn': u'Wikipedia:Gode artiklar', - 'no': u'Wikipedia:Anbefalte artikler', - 'pt': u'Wikipedia:Os_melhores_artigos', - 'sv': u'Wikipedia:Utvalda_artiklar', - 'zh': u'Wikipedia:特色条目', -} - -def firstcap(string): - return string[0].upper()+string[1:] - -def treat(text, linkedPage, targetPage): - """ - Based on the method of the same name in solve_disambiguation.py - """ - # make a backup of the original text so we can show the changes later - linkR = re.compile(r'[[(?P<title>[^]|#]*)(?P<section>#[^]|]*)?(|(?P<label>[^]]*))?]](?P<linktrail>' + linktrail + ')') - curpos = 0 - # This loop will run until we have finished the current page - while True: - m = linkR.search(text, pos = curpos) - if not m: - break - # Make sure that next time around we will not find this same hit. - curpos = m.start() + 1 - # ignore interwiki links and links to sections of the same page - if m.group('title') == '' or mysite.isInterwikiLink(m.group('title')): - continue - else: - actualLinkPage = wikipedia.Page(page.site(), m.group('title')) - # Check whether the link found is to page. - if actualLinkPage != linkedPage: - continue - - # how many bytes should be displayed around the current link - context = 15 - # at the beginning of the link, start red color. - # at the end of the link, reset the color to default - wikipedia.output(text[max(0, m.start() - context) : m.start()] + '\03{lightred}' + text[m.start() : m.end()] + '\03{default}' + text[m.end() : m.end() + context]) - choice = 'y' - - # The link looks like this: - # [[page_title|link_text]]trailing_chars - page_title = m.group('title') - link_text = m.group('label') - - if not link_text: - # or like this: [[page_title]]trailing_chars - link_text = page_title - if m.group('section') == None: - section = '' - else: - section = m.group('section') - trailing_chars = m.group('linktrail') - if trailing_chars: - link_text += trailing_chars - - if choice in "uU": - # unlink - we remove the section if there's any - text = text[:m.start()] + link_text + text[m.end():] - continue - replaceit = choice in "rR" - - if link_text[0].isupper(): - new_page_title = targetPage.title() - else: - new_page_title = targetPage.title()[0].lower() + targetPage.title()[1:] - if replaceit and trailing_chars: - newlink = "[[%s%s]]%s" % (new_page_title, section, trailing_chars) - elif replaceit or (new_page_title == link_text and not section): - newlink = "[[%s]]" % new_page_title - # check if we can create a link with trailing characters instead of a pipelink - elif len(new_page_title) <= len(link_text) and firstcap(link_text[:len(new_page_title)]) == firstcap(new_page_title) and re.sub(re.compile(linktrail), '', link_text[len(new_page_title):]) == '' and not section: - newlink = "[[%s]]%s" % (link_text[:len(new_page_title)], link_text[len(new_page_title):]) - else: - newlink = "[[%s%s|%s]]" % (new_page_title, section, link_text) - text = text[:m.start()] + newlink + text[m.end():] - continue - return text - -def workon(page): - try: - text = page.get() - except wikipedia.IsRedirectPage: - return - wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title()) - links = page.linkedPages() - wikipedia.getall(mysite,links) - for page2 in links: - try: - target = page2.getRedirectTarget() - except (wikipedia.Error,wikipedia.SectionError): - continue - text = treat(text, page2, target) - if text != page.get(): - comment = wikipedia.translate(mysite, msg) - page.put(text, comment) - -try: - start = '!' - featured = False - title = None - namespace = None - - for arg in wikipedia.handleArgs(): - if arg.startswith('-start'): - if len(arg) == 6: - start = wikipedia.input(u'Which start where?') - else: - start = arg[7:] - elif arg == '-featured': - featured = True - elif arg.startswith('-page'): - if len(arg) == 5: - title = wikipedia.input(u'Which page should be processed?') - else: - title = arg[6:] - elif arg.startswith('-namespace'): - if len(arg) == 10: - namespace = int(wikipedia.input(u'Which namespace should be processed?')) - else: - namespace = int(arg[11:]) - +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +This script has the intention to correct all redirect +links in featured pages or only one page of each wiki. + +Can be using with: +-featured Run over featured pages +-page:XXX Run over only one page + +""" +# +# This script based on disambredir.py and solve_disambiguation.py +# +# Distributed under the terms of the MIT license. +# +__version__='$Id: disambredir.py 4407 2007-10-03 17:27:14Z leogregianin $' +# +import wikipedia +import pagegenerators +import re, sys + +msg = { + 'ar': u'بوت: إصلاح التحويلات', + 'en': u'Bot: Fixing redirects', + 'he': u'בוט: מתקן הפניות', + 'ja': u'ロボットによる:リダイレクト回避', + 'nn': u'robot: retta omdirigeringar', + 'no': u'Robot: Retter omdirigeringer', + 'pt': u'Bot: Arrumando redirects', + 'sv': u'Bot: Rättar omdirigeringar', + 'zh': u'機器人: 修復重定向', +} + +featured_articles = { + 'ar': u'ويكيبيديا:مقالات مختارة', + 'de': u'Wikipedia:Exzellente_Artikel', + 'en': u'Wikipedia:Featured_articles', + 'es': u'Wikipedia:Artículos_destacados', + 'fr': u'Wikipédia:Articles_de_qualité', + 'he': u'פורטל:ערכים_מומלצים', + 'it': u'Wikipedia:Articoli_in_vetrina', + 'ja': u'Wikipedia:秀逸な記事', + 'nl': u'Wikipedia:Etalage', + 'nn': u'Wikipedia:Gode artiklar', + 'no': u'Wikipedia:Anbefalte artikler', + 'pt': u'Wikipedia:Os_melhores_artigos', + 'sv': u'Wikipedia:Utvalda_artiklar', + 'zh': u'Wikipedia:特色条目', +} + +def firstcap(string): + return string[0].upper()+string[1:] + +def treat(text, linkedPage, targetPage): + """ + Based on the method of the same name in solve_disambiguation.py + """ + # make a backup of the original text so we can show the changes later + linkR = re.compile(r'[[(?P<title>[^]|#]*)(?P<section>#[^]|]*)?(|(?P<label>[^]]*))?]](?P<linktrail>' + linktrail + ')') + curpos = 0 + # This loop will run until we have finished the current page + while True: + m = linkR.search(text, pos = curpos) + if not m: + break + # Make sure that next time around we will not find this same hit. + curpos = m.start() + 1 + # ignore interwiki links and links to sections of the same page + if m.group('title') == '' or mysite.isInterwikiLink(m.group('title')): + continue + else: + actualLinkPage = wikipedia.Page(page.site(), m.group('title')) + # Check whether the link found is to page. + if actualLinkPage != linkedPage: + continue + + # how many bytes should be displayed around the current link + context = 15 + # at the beginning of the link, start red color. + # at the end of the link, reset the color to default + wikipedia.output(text[max(0, m.start() - context) : m.start()] + '\03{lightred}' + text[m.start() : m.end()] + '\03{default}' + text[m.end() : m.end() + context]) + choice = 'y' + + # The link looks like this: + # [[page_title|link_text]]trailing_chars + page_title = m.group('title') + link_text = m.group('label') + + if not link_text: + # or like this: [[page_title]]trailing_chars + link_text = page_title + if m.group('section') == None: + section = '' + else: + section = m.group('section') + trailing_chars = m.group('linktrail') + if trailing_chars: + link_text += trailing_chars + + if choice in "uU": + # unlink - we remove the section if there's any + text = text[:m.start()] + link_text + text[m.end():] + continue + replaceit = choice in "rR" + + if link_text[0].isupper(): + new_page_title = targetPage.title() + else: + new_page_title = targetPage.title()[0].lower() + targetPage.title()[1:] + if replaceit and trailing_chars: + newlink = "[[%s%s]]%s" % (new_page_title, section, trailing_chars) + elif replaceit or (new_page_title == link_text and not section): + newlink = "[[%s]]" % new_page_title + # check if we can create a link with trailing characters instead of a pipelink + elif len(new_page_title) <= len(link_text) and firstcap(link_text[:len(new_page_title)]) == firstcap(new_page_title) and re.sub(re.compile(linktrail), '', link_text[len(new_page_title):]) == '' and not section: + newlink = "[[%s]]%s" % (link_text[:len(new_page_title)], link_text[len(new_page_title):]) + else: + newlink = "[[%s%s|%s]]" % (new_page_title, section, link_text) + text = text[:m.start()] + newlink + text[m.end():] + continue + return text + +def workon(page): + try: + text = page.get() + except wikipedia.IsRedirectPage: + return + wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title()) + links = page.linkedPages() + wikipedia.getall(mysite,links) + for page2 in links: + try: + target = page2.getRedirectTarget() + except (wikipedia.Error,wikipedia.SectionError): + continue + text = treat(text, page2, target) + if text != page.get(): + comment = wikipedia.translate(mysite, msg) + page.put(text, comment) + +try: + start = '!' + featured = False + title = None + namespace = None + + for arg in wikipedia.handleArgs(): + if arg.startswith('-start'): + if len(arg) == 6: + start = wikipedia.input(u'Which start where?') + else: + start = arg[7:] + elif arg == '-featured': + featured = True + elif arg.startswith('-page'): + if len(arg) == 5: + title = wikipedia.input(u'Which page should be processed?') + else: + title = arg[6:] + elif arg.startswith('-namespace'): + if len(arg) == 10: + namespace = int(wikipedia.input(u'Which namespace should be processed?')) + else: + namespace = int(arg[11:]) + mysite = wikipedia.getSite() if mysite.sitename() == 'wikipedia:nl': wikipedia.output(u'\03{lightred}There is consensus on the Dutch Wikipedia that bots should not be used to fix redirects.\03{default}') sys.exit() - - linktrail = mysite.linktrail() - if featured: - featuredList = wikipedia.translate(mysite, featured_articles) - ref = wikipedia.Page(wikipedia.getSite(), featuredList) - gen = pagegenerators.ReferringPageGenerator(ref) - generator = pagegenerators.NamespaceFilterPageGenerator(gen, [0]) - for page in generator: - workon(page) - elif title is not None: - page = wikipedia.Page(wikipedia.getSite(), title) - workon(page) - elif namespace is not None: - for page in pagegenerators.AllpagesPageGenerator(start=start, namespace=namespace, includeredirects=False): - workon(page) - else: - wikipedia.showHelp('fixing_redirects') - sys.exit() - -finally: - wikipedia.stopme() + + linktrail = mysite.linktrail() + if featured: + featuredList = wikipedia.translate(mysite, featured_articles) + ref = wikipedia.Page(wikipedia.getSite(), featuredList) + gen = pagegenerators.ReferringPageGenerator(ref) + generator = pagegenerators.NamespaceFilterPageGenerator(gen, [0]) + for page in generator: + workon(page) + elif title is not None: + page = wikipedia.Page(wikipedia.getSite(), title) + workon(page) + elif namespace is not None: + for page in pagegenerators.AllpagesPageGenerator(start=start, namespace=namespace, includeredirects=False): + workon(page) + else: + wikipedia.showHelp('fixing_redirects') + sys.exit() + +finally: + wikipedia.stopme()
Property changes on: trunk/pywikipedia/fixing_redirects.py ___________________________________________________________________ Name: svn:eol-style + native
Modified: trunk/pywikipedia/maintenance/readtalk.py =================================================================== --- trunk/pywikipedia/maintenance/readtalk.py 2008-05-02 00:05:37 UTC (rev 5292) +++ trunk/pywikipedia/maintenance/readtalk.py 2008-05-02 00:13:27 UTC (rev 5293) @@ -1,30 +1,30 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -""" -Tool to read all your talk pages. - -This tool will go through all the normal (not sysop) accounts configured in user-config and output the contents of the talk page. - -TODO: -*Error checking -""" -import sys, re -sys.path.append(re.sub('/[^/]*$', '', sys.path[0])) #sys.path.append('..') -import wikipedia, config - -def main(): - # Get a dictionary of all the usernames - namedict = config.usernames - for familyName in namedict.iterkeys(): - for lang in namedict[familyName].iterkeys(): - site = wikipedia.getSite(code=lang, fam=familyName) - username = config.usernames[familyName][lang] - page = wikipedia.Page(site, u'User_Talk:' + username) - wikipedia.output(u'Reading talk page from ' + lang + u' ' + familyName) - wikipedia.output(page.get (nofollow_redirects=True)) - -if __name__ == "__main__": - try: - main() - finally: - wikipedia.stopme() +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +Tool to read all your talk pages. + +This tool will go through all the normal (not sysop) accounts configured in user-config and output the contents of the talk page. + +TODO: +*Error checking +""" +import sys, re +sys.path.append(re.sub('/[^/]*$', '', sys.path[0])) #sys.path.append('..') +import wikipedia, config + +def main(): + # Get a dictionary of all the usernames + namedict = config.usernames + for familyName in namedict.iterkeys(): + for lang in namedict[familyName].iterkeys(): + site = wikipedia.getSite(code=lang, fam=familyName) + username = config.usernames[familyName][lang] + page = wikipedia.Page(site, u'User_Talk:' + username) + wikipedia.output(u'Reading talk page from ' + lang + u' ' + familyName) + wikipedia.output(page.get (nofollow_redirects=True)) + +if __name__ == "__main__": + try: + main() + finally: + wikipedia.stopme()
Property changes on: trunk/pywikipedia/maintenance/readtalk.py ___________________________________________________________________ Name: svn:eol-style + native