Source code for scripts.fixing_redirects

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Correct all redirect links in featured pages or only one page of each wiki.

Can be used with:

-featured         Run over featured pages (for some wikimedia wikis only)

&params;
"""
#
# (C) Pywikibot team, 2004-2019
#
# Distributed under the terms of the MIT license.
#
from __future__ import absolute_import, division, unicode_literals

import re

import pywikibot
from pywikibot import pagegenerators
from pywikibot.bot import (SingleSiteBot, ExistingPageBot, NoRedirectPageBot,
                           AutomaticTWSummaryBot, suggest_help)
from pywikibot.exceptions import InvalidTitle
from pywikibot.textlib import does_text_contain_section, isDisabled
from pywikibot.tools.formatter import color_format
from pywikibot.tools import first_lower, first_upper as firstcap

# This is required for the text that is shown when you run this script
# with the parameter -help.
docuReplacements = {'&params;': pagegenerators.parameterHelp}  # noqa: N816

# Featured articles categories
featured_articles = 'Q4387444'


[docs]class FixingRedirectBot(SingleSiteBot, ExistingPageBot, NoRedirectPageBot, AutomaticTWSummaryBot): """Run over pages and resolve redirect links.""" ignore_save_related_errors = True ignore_server_errors = True summary_key = 'fixing_redirects-fixing'
[docs] def treat_page(self): """Change all redirects from the current page to actual links.""" links = self.current_page.linkedPages() newtext = self.current_page.text i = None for i, page in enumerate(links): if not page.exists(): try: target = page.moved_target() except (pywikibot.NoMoveTarget, pywikibot.CircularRedirect, pywikibot.InvalidTitle): continue elif page.isRedirectPage(): try: target = page.getRedirectTarget() except (pywikibot.CircularRedirect, pywikibot.InvalidTitle): continue else: section = target.section() if section and not does_text_contain_section(target.text, section): pywikibot.warning( 'Section #{0} not found on page {1}'.format( section, target.title(as_link=True, with_section=False))) continue else: continue # no fix to user namespaces if target.namespace() in [2, 3] and page.namespace() not in [2, 3]: continue newtext = self.replace_links(newtext, page, target) if i is None: pywikibot.output('Nothing left to do.') else: self.put_current(newtext)
[docs]def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: str """ featured = False gen = None # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if arg == '-featured': featured = True elif genFactory.handleArg(arg): pass mysite = pywikibot.Site() if mysite.sitename == 'wikipedia:nl': pywikibot.output(color_format( '{lightred}There is consensus on the Dutch Wikipedia that ' 'bots should not be used to fix redirects.{default}')) return if featured: ref = mysite.page_from_repository(featured_articles) if ref is not None: gen = ref.articles(namespaces=0, content=True) if not gen: suggest_help( unknown_parameters=['-featured'], additional_text='Option is not available for this site.') return False else: gen = genFactory.getCombinedGenerator() if gen: gen = mysite.preloadpages(gen) if gen: bot = FixingRedirectBot(generator=gen) bot.run() else: suggest_help(missing_generator=True)
if __name__ == '__main__': main()