Alkalmi bot, amit a Kategória:Csonkok (település) felosztására használtam. Megpróbált országot rendelni a csonkokhoz, és kilistázta őket, illetve ellenőrzés után elvégezte a cserét. Ez az első botom a „core” keretrendszerben.

Forráskód szerkesztés

"""Ideiglenes vacak a települési csonkok szétdobálására."""
USA = ['Alabama', 'Alaszka', 'Arizona', 'Arkansas', 'Colorado', 'Connecticut',
    'Delaware', 'Dél-Dakota', 'Dél-Karolina', 'Észak-Dakota', 'Észak-Karolina',
    'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa',
    'Kalifornia', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland',
    'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri',
    'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New York',
    'Nyugat-Virginia', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania',
    'Rhode Island', 'Tennessee', 'Texas', 'Új-Mexikó', 'Utah', 'Vermont',
    'Virginia', 'Washington', 'Wisconsin', 'Wyoming', 'Puerto Rico',]

MO = ['Bács-Kiskun', 'Baranya', 'Békés', 'Borsod-Abaúj-Zemplén',
    'Csongrád-Csanád', 'Fejér', 'Győr-Moson-Sopron', 'Hajdú-Bihar', 'Heves',
    'Jász-Nagykun-Szolnok', 'Komárom-Esztergom', 'Nógrád', 'Pest', 'Somogy',
    'Szabolcs-Szatmár-Bereg', 'Tolna', 'Vas', 'Veszprém', 'Zala',]

SK = ['Besztercebánya', 'Eperjes', 'Kassa', 'Nagyszombat', 'Nyitra', 'Pozsony',
    'Trencsén', 'Zsolna',]

RO = ['Arad', 'Argeș', 'Bákó', 'Beszterce-Naszód', 'Bihar', 'Botoșani',
    'Brăila', 'Brassó', 'Buzău', 'Călărași', 'Constanța', 'Dâmbovița', 'Dolj',
    'Fehér', 'Galați', 'Giurgiu', 'Gorj', 'Hargita', 'Hunyad', 'Iași',
    'Ialomița', 'Ilfov', 'Kolozs', 'Kovászna', 'Krassó-Szörény', 'Máramaros',
    'Maros', 'Mehedinți', 'Neamț', 'Olt', 'Prahova', 'Suceava', 'Szatmár',
    'Szeben', 'Szilágy', 'Teleorman', 'Temes', 'Tulcea', 'Vâlcea', 'Vaslui',
    'Vrancea',]

TR = ['Adana', 'Ankara', 'Antalya', 'Çorum', 'Edirne', 'Kırıkkale', 'Kırşehir',
    'Muğla', 'Sakarya',]

CH = ['Aargau', 'Appenzell Innerrhoden', 'Basel-Landschaft', 'Basel-Stadt',
    'Bern', 'Freiburg', 'Genf', 'Glarus', 'Graubünden', 'Jura', 'Luzern',
    'Neuchâtel', 'Nidwalden', 'Obwalden', 'Sankt Gallen', 'Schaffhausen',
    'Schwyz', 'Solothurn', 'Thurgau', 'Ticino', 'Uri', 'Valais', 'Vaud',

    'Zug', 'Zürich',]

stubSettlementList = [
    'albán', 'ausztrál', 'belga', 'brazil', 'brit', 'cseh', 'dán', 'észt',
    'észak-macedón', 'finn', 'francia', 'görög', 'holland', 'horvát', 'ír',
    'iráni', 'izlandi', 'izraeli', 'japán', 'kanadai', 'kínai', 'lengyel',
    'lett', 'magyar', 'német', 'norvég', 'olasz', 'orosz', 'osztrák',
    'romániai', 'skót', 'spanyol', 'svájci', 'szerb', 'szlovák', 'szlovén',
    'török', 'tunéz', 'USA', 'vietnámi', 'gambiai', 'bolgár', 'svéd', 'ukrán',
    'kolumbiai', 'andorrai', 'argentin', 'chilei', 'togói', 'indiai', 'nepáli',
    'zöld-foki', 'portugál', 'Srí Lanka-i', 'tanzániai', 'malajziai',
    'Bissau-guineai', 'Costa Rica-i', 'egyenlítői-guineai', 'egyiptomi',
    'gaboni', 'grönlandi', 'grúziai', 'guineai', 'kameruni', 'kirgizisztáni',
    'kongói demokratikus köztársasági', 'kubai', 'marokkói', 'moldovai',
    'nicaraguai', 'nigériai', 'örmény', 'panamai', 'San Marinó-i', 'benini', 
    'venezuelai', 'Fülöp-szigeteki', 'líbiai', 'mauritiusi', 'ománi',
    'bangladesi', 'bosznia-hercegovinai', 'elefántcsontparti', 'guatemalai', 
    ] 

import re

import pywikibot
from pywikibot.pagegenerators import CategorizedPageGenerator
site = pywikibot.Site()
INFrex = re.compile(r'\{\{ *([^{]+?) település infobox')
USArex = re.compile(r'%s (települései|városai|megyeszékhelyei)' % '|'.join(USA))
ROrex = re.compile(r'%s megye (települései|városai)' % '|'.join(RO))
CHrex = re.compile(r'%s kanton (települései|városai)' % '|'.join(CH))
TRrex = re.compile(r'%s tartomány körzetei és települései' % '|'.join(TR))
UNKNOWNrex = re.compile(r'Kategória:(.+?) települései')

def create_country_pairs():
    global countries
    countries = dict()
    rex = re.compile(r'Kategória:(.*?) települései')
    for nation in stubSettlementList:
        name= 'Csonkok (%s település)' % nation
        cat = pywikibot.Category(site, name)
        print(cat)
        supercats = list(cat.categories())
        for supercat in supercats:
            try:
                country = rex.search(supercat.title()).group(1)
                # if country == 'Törökország körzetei és':
                    # country = 'Törökország'
                countries[country] = nation
                break
            except AttributeError:
                pass
    print(countries)

def process():
    cat = pywikibot.Category(site, 'Csonkok (település)')
    i = 0 # ideiglenes a tesztelés idejére
    scat = None
    global lista, esetleg, kuka, selejt
    lista = []
    esetleg = []
    kuka = []
    selejt = []
    for page in CategorizedPageGenerator(cat):
        if page.title() == 'Újfalu (Dunaszerdahely)':
            continue
        country = None
        supercat = None
        # i += 1
        # if i > 350:
            # break # ideiglenes
        print(page.title())
        text = page.get()[:100]
        if INFrex.search(text):
            _c = INFrex.search(text).group(1).lower()
            if _c =='kirgiz':
                _c = 'kirgizisztáni'
            print(_c)
            try:
                country = list(countries.keys())[list(countries.values()).index(_c)]
                print('______________'+country)
            except ValueError:
                if _c not in ['amerikai', 'román', 'török', 'svájci']:
                    kuka.append((page, page.title(), _c, text))
        if not country:
            cats = page.categories()
            for supercat in cats:
                sct = supercat.title()
                if USArex.search(sct):
                    country = 'Az Amerikai Egyesült Államok'
                    break
                if ROrex.search(sct):
                    country = 'Románia'
                    break
                if CHrex.search(sct):
                    country = 'Svájc'
                    break
                if TRrex.search(sct):
                    country = 'Törökország körzetei és'
                    break
                try:
                    country = GENrex.search(sct).group(1)
                    break
                except AttributeError:
                    pass
                try:
                    country = UNKNOWNrex.search(sct).group(1)
                    if country not in countries:
                        countries[country] = None
                    break
                except AttributeError:
                    pass
        if country:
            print(country)
            try:
                scat = supercat.title()
            except AttributeError:
                scat = ''
            if countries[country]:
                lista.append((page, page.title(), country, scat, countries[country], text))
            else:
                esetleg.append((page, page.title(), country, scat, text))
        else:
            selejt.append(page.title())

def replacetemplates():
    """Végrehajtja a korábban vizuálisan ellenőrzött cseréket."""
    templ = 'Településcsonkok rendezése; [[Sablon:csonk-település]] → ' \
            '[[Sablon:csonk-%s település]] bottal'
    for article in lista:
        page = article[0]
        nation = article[4]
        text = page.get()
        text= text.replace('sonk-település', ('sonk-%s település' % nation))
        summary = templ % nation
        pywikibot.output(text)
        pywikibot.output(summary)
        page.put(text, summary)

def listatable():
    text = "'''A listában nem szerepelnek azok a csonkok, amiket se kategória, se jellemző infobox alapján nem tudtam besorolni.'''\n\n"
    text += '== Megtaláltam az országot és a sablont ==\n'
    text += '{| {{széptáblázat-r}}\n'
    text += '! Lap !! Talált ország !! Kategória !! ' \
            'Javasolt sablon !! A szöveg eleje\n'
    for article in lista:
        text += '|-\n| [['
        text += article[1] + ']] || ' + ' || '.join(article[2:4])
        text += ' || {{sl|csonk-%s település}} || ' % article[4]
        text += '<nowiki>' + article[5] + '</nowiki>'
        text += '\n'
    text += '|}\nDarabszám:%d\n\n' % len(lista)
    return text

def esetlegtable():
    text = '== Megtalálni vélem az országot kategória alapján, de nincs sablon ==\n'
    text += '{| {{széptáblázat-r}}\n'
    text += '! Lap !! Talált ország !! Kategória !! A szöveg eleje\n'

    for article in esetleg:
        text += '|-\n| [['
        text += article[1] + ']] || ' + ' || '.join(article[2:4])
        text += ' || <nowiki>' + article[4] + '</nowiki>'
        text += '\n'
    text += '|}\nDarabszám:%d\n\n' % len(esetleg)
    return text

def kukatable():
    text = '== Infoboxból kinyert ország nem létező sablonnal ==\n'
    text += '{| {{széptáblázat-r}}\n'
    text += '! Lap !! Talált ország !! Javasolt sablon !! A szöveg eleje\n'
    for article in kuka:
        text += '|-\n| [['
        text += article[1] + ']] || '+ article[2]
        text += ' || {{sl|csonk-%s település}} || ' % article[2]
        text += '<nowiki>' + article[3] + '</nowiki>'
        text += '\n'
    text += '|}\nDarabszám:%d\n\n' % len(kuka)
    return text

def selejttable():
    text = '== Nem sikerült azonosítani az országot ==\n* [['
    text += ']]\n* [['.join(selejt)
    text += ']]\n'
    text += 'Darabszám:%d\n' % len(selejt)
    return text

create_country_pairs()
r1 = '|'.join(countries.keys())
r2 = 'tagállamai|megyéi|települései|városai|megyeszékhelyei|kerületei|tartományai'
print(r'(%s) (%s)' % (r1, r2))
GENrex = re.compile(r'(%s) (%s)' % (r1, r2))
process()
# A lista kiírása a képernyőre
# print(lista)
# print(kuka)
text = listatable() + esetlegtable() + kukatable() + selejttable()
# pywikibot.output(text)
# A lista kiírása a munkapadra (kell a fenti text = sor is)
target = pywikibot.Page(site,
         'Szerkesztő:Bináris/Tervek/Csonkok és csonksablonok/munkapad')
summary = 'Javasolt szubcsonksalonok a településekre'
target.put(text, summary)
# A tényleges csere elvégzése az első táblázat lapjain, ellenőrzés után!
# replacetemplates()