Wie finde ich übermäßig unterdrückte Weiterleitungen in MediaWiki?

7

Ich bin ein Wiki-Editor und ein Administrator in einem Wiki, das an andere Personen weitergegeben wird. Einige von ihnen verwenden eine übermäßige Unterdrückung für mögliche Weiterleitungen aus einem mir unbekannten Grund. Zum Beispiel, wenn es eine Seite FOO gibt:

#REDIRECT [[BAR]]

sie können oft verwenden:

[[FOO|BAR]]

Ich finde es sehr übertrieben und wirklich unnötig. Das einzige andere Ergebnis dieses Ansatzes ist, soweit ich sehen kann, die Unterdrückung der Meldung "Von FOO umgeleitet", die ich informativ finde.

Wie finde ich all diese unterdrückten Weiterleitungen?

Lyubomyr Shaydariv
quelle
Haben Sie Datenbankzugriff auf diese Site? Es sollte nicht zu schwierig sein, eine Datenbankabfrage für diese durchzuführen, wenn Sie Zugriff haben.
Stephen Ostermiller
@StephenOstermiller nein, ich darf nur MediaWiki verwenden und habe keinen Datenbankzugriff.
Lyubomyr Shaydariv
Es wäre eine gute Idee, die suppressredirectBerechtigung aus der Gruppe zu entfernen, zu der diese Benutzer gehören.
Nemo
@Nemo gut, selbst wenn eine solche Erlaubnis existiert, wäre es nicht sehr höflich, die Erlaubnis von anderen Besatzungsmitgliedern zu entfernen, die ebenfalls Administratoren sind. Aber danke für den Vorschlag. :)
Lyubomyr Shaydariv
@LyubomyrShaydariv Sofern Ihr Wiki keine Regeln enthält, die das Löschen von Weiterleitungen in bestimmten Fällen vorschreiben, gibt es keinen Grund, die Unterdrückung von Weiterleitungen überhaupt erst zuzulassen. Brechen Sie nicht das Web!
Nemo

Antworten:

2

Wenn Sie in der Lage sind, einige Zeilen in Python zu schreiben, sollten Sie das Pywikibot- Framework ausprobieren.

Sie sollten einen Blick darauf werfen redirect.py. pywikibot ist besonders leistungsfähig, wenn Sie es interaktiv verwenden, z ipython. B. durch . Mit wiki.allpages(includeredirects=True))können Sie eine Liste aller Seiten erhalten und Sie können z

    incl_redir = map(lambda p: p.title(), wiki.allpages(includeredirects=True))
    excl_redir = map(lambda p: p.title(), wiki.allpages(includeredirects=False))
    redirects = filter(lambda p: not p in excl_redir, incl_redir)
    # We now have a list of all redirects.

    processed_redirects = ... # Here you need to find the exact strings of the redirects and turn them into a dict

    for p_title in excl_redir:
        page = Page(wiki, p_title)
        txt = page.get()
        for r in processed_redirects:
            if r['from'] in txt:
                # Here you want to process your txt and then
                page.put(txt, "Processed redirect")
kqw
quelle
Vielen Dank. Ich bin mir nicht sicher, ob dies die Frage beantwortet. Soweit ich Python verstehe, extrahiert dieser Code nur die Weiterleitungen aus der Liste der Seitenbereiche. Ich brauche so etwas wie Textsuche [[FOO|BAR]]auf allen Seiten, wenn es eine Seite "Foo" mit gibt #REDIRECT [[BAR]]. Oder ... deckt Ihr Code auch diesen Fall ab?
Lyubomyr Shaydariv
Ihr Fall erfordert mehr Code. Diese Zeilen sind nur ein Anfang. Ich kann später nach weiteren Leben suchen, um Ihnen den Einstieg zu erleichtern.
kqw
Ich werde es testen, wenn ich mehr Zeit habe, um in meinem Test-Wiki zu experimentieren. Vielen Dank für Ihre Idee.
Lyubomyr Shaydariv
Schließlich hatte ich einen Monat später etwas Zeit, um die Experimente durchzuführen. Vielen Dank, dass Sie auf das Pywikibot-Framework hingewiesen haben - es ist wirklich cool. Ich habe meine Lösung in einer Antwort auf diese Frage veröffentlicht, aber Ihre Hilfe hat wirklich viel geholfen: Ihr Snipping reichte aus, um grundlegende Funktionen zu erstellen, da keine Pywikibot-Dokumentation vorhanden ist (als Nicht-Pythonist ist das Lesen des Quellcodes des Frameworks ausreichend nicht so einfach). Vielen Dank!
Lyubomyr Shaydariv
Ich denke, dieser sollte akzeptiert werden, nicht meiner, da Sie mir eine sehr gute Idee gegeben haben, wie ich das umsetzen kann, was ich brauchte. Vielen Dank. :)
Lyubomyr Shaydariv
2

Nach einigen Experimenten habe ich das folgende Python-Skript für Pywikibot erhalten. Ich bin sehr neu in Python, daher sieht der folgende Code möglicherweise nicht gut aus. Ich habe es für ein sehr kleines Test-Wiki getestet, daher weiß ich nicht, wie die eigentliche Leistung des Skripts ist. Das page.put(...)dauert übrigens extrem lange (~ 15 s oder so) - ich weiß nicht einmal, was der Grund sein könnte. Vielleicht hilft es auch jemand anderem.

Hinweis: Dieses Skript ändert die Seiten und gilt als nicht gut getestet.

#!/usr/bin/python
# -*- coding: utf-8  -*-

import pywikibot
import re
import sys

try:
    # Win32
    from msvcrt import getch
except ImportError:
    # UNIX
    def getch():
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            return sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old)

def process_excessive_redirects(modify = False, pause = False):

    wiki = pywikibot.Site()
    alt_link_re = re.compile('\[\[\s*([^\|\]]+)\s*\|\s*([^\]]+)\s*\]\]')

    redirects_index = {}
    print 'Parsing redirects:'
    for redirect in wiki.allpages(filterredir = True):
        print '\t', redirect.title().encode('utf8'), '->',
        redirects_index[redirect.title()] = redirect.getRedirectTarget().title()
        print redirects_index[redirect.title()].encode('utf8')

    print 'Processing:'
    for page in wiki.allpages(filterredir = False):
        print '\t', page.title().encode('utf8'), '-',
        statistics = {'modification_count': 0} # python 3: nonlocal
        def fix_redirect(match_object):
            target = match_object.group(1)
            title = match_object.group(2)
            if title.replace("_", " ") in redirects_index.keys() and redirects_index[title] == target:
                if statistics['modification_count'] == 0:
                    print
                print '\t\texcessive redirect', target, '~~~>', title, '~~~>', target
                statistics['modification_count'] += 1
                return '[[' + title + ']]'
            return match_object.group(0)
        text = alt_link_re.sub(fix_redirect, page.get())
        if statistics['modification_count'] > 0:
            print "\t\t", statistics['modification_count'], 'excessive redirect(s) detected.',
            if modify:
                print 'Fixing redirects...',
                page.put(text, str(statistics['modification_count']) + ' excessive redirect(s) fixed')
                if pause:
                    print 'Press any key . . .'
                    getch()
            else:
                print
        else:
            print 'clean!'

def main(*args):
    modify = False
    pause = False
    for arg in pywikibot.handleArgs(*args):
        if arg == '--modify':
            modify = True
        elif arg == '--pause':
            pause = True
    process_excessive_redirects(modify = modify, pause = pause)

if __name__ == '__main__':
    main()
Lyubomyr Shaydariv
quelle