Διαγράφει την παλιά κλείδα ταξινόμησης και βάζει στη θέση της το {{κλείδα-ελλ}} (μόνο για ελληνικές λέξεις)

# -*- coding: utf-8  -*-
u"""
Αυτό το script μεταφέρει όλους τους πολυγλωσσικούς συνδέσμους στο κάτω μέρος
της σελίδας, όλες τις κατηγορίες στο κάτω μέρος πριν από τους πολυγλωσσικούς, 
και προσθέτει το πρότυπο {{κλείδα ταξινόμησης}} μόλις πριν από τις κατηγορίες.

Το πρότυπο καλείται με την κατάλληλη παράμετρο για την γλώσσα (fr, en, κλπ),
ανάλογα με το πρότυπο γλώσσας στην αρχή της σελίδας ({{=nn=}}). (Ψέματα!)

Υποστηρίζονται οι εξής παράμετροι:

&params;

Much of this code was stolen from cosmetic_changes.py.

"""
__version__ = '$Id: default_kleidaTaksinomhshs.py 4260 2007-09-12 22:12:11Z wikipedian $'
import wikipedia, pagegenerators, string
import sys
import re

warning = u"""Προσοχή! Αν σκοπεύετε να εκτελέσετε αυτό το μποτ κάπου αλλού εκτός από
το el.wiktionary, ξανασκεφτείτε το!"""

docuReplacements = {
    '&params;': pagegenerators.parameterHelp,
    '&warning;': warning,
}

# Summary message when using this module as a stand-alone script
msg_standalone = {
    'el': u'Bot: εισαγωγή κλείδας ταξινόμησης',
}

class EpiloghKleidaTaksinomhshsToolkit:
    def __init__(self, site, title, exceptions = [], debug = False):
        self.site = site
        self.debug = debug
        self.title = title
        self.exceptions = exceptions

    def allagh(self, keimeno):
        """
        Given a wiki source code text, returns the cleaned up version.
        FIXME σύνοψη εδώ
        """
        palioKeimeno = keimeno
        #protypo = u'{{κλείδα-ελλ}}'
        # αφαιρούμε την επόμενη κενή γραμμή μαζί με το πρότυπο αν υπάρχει
        protyporegexp = u'\{\{κλείδα ταξινόμησης\|[^\}]*\}\}(\r\n\r\n|$)'
        keimeno = self.removeKleidaTaksinomhshsProtypo(keimeno,protyporegexp)
        protyporegexp1 = u'\{\{κλείδα ταξινόμησης\|[^\}]*\}\}\r\n'
        keimeno = self.removeKleidaTaksinomhshsProtypo(keimeno,protyporegexp1)
        protyporegexp2 = u'\{\{κλείδα-ελλ\}\}(\r\n\r\n|$)'
        keimeno = self.removeKleidaTaksinomhshsProtypo(keimeno,protyporegexp2)
        protyporegexp3 = u'\{\{κλείδα-ελλ\}\}(\r\n|$)'
        keimeno = self.removeKleidaTaksinomhshsProtypo(keimeno,protyporegexp3)
        keimeno = self.addKleidaTaksinomhshsProtypo(keimeno)
        if self.debug:
            wikipedia.showDiff(palioKeimeno, keimeno)
        return keimeno

    def paragwghKleidaTaksinomhshsProtypo(self):
        protypo = u'{{κλείδα-ελλ}}'
        return protypo

    def removeKleidaTaksinomhshsProtypo(self,keimeno,protypo):
        u"""
        remove old template if it is there
        """
        teliko_keimeno = re.sub(protypo,u'',keimeno)
        return teliko_keimeno

    def addKleidaTaksinomhshsProtypo(self,keimeno):
        u"""
        stuff provided protypo into the wikitext 
        right before categories and interwiki links.
        """

        # βρίσκουμε σημάδι που δεν περιέχεται ήδη στο κείμενο
        marker = '@@'
        while marker in keimeno:
            marker += '@'

        site = self.site 
        protypo = u'{{κλείδα-ελλ}}'
        kathgories = wikipedia.getCategoryLinks(keimeno, site = site)
        xwris_kathgories = wikipedia.removeCategoryLinks(keimeno, site = site, marker = '')
        interwiki = wikipedia.getLanguageLinks(xwris_kathgories, insite = site)
        textnocatsnoiws = wikipedia.removeLanguageLinks(xwris_kathgories.replace(marker,'').strip(), site = self.site) + site.family.category_text_separator + protypo + site.family.category_text_separator
        # βάζουμε τώρα τις κατηγορίες, τους συνδέσμους
        me_kathgories = wikipedia.replaceCategoryLinks(textnocatsnoiws, kathgories, site = self.site)
        teliko_keimeno = wikipedia.replaceLanguageLinks(me_kathgories, interwiki, site = self.site)
        return teliko_keimeno

class EpiloghKleidaTaksinomhshsBot:
    def __init__(self, generator, exceptions=[], acceptall = False):
        self.generator = generator
        self.acceptall = acceptall
        self.exceptions = exceptions
        # Load default summary message.
        wikipedia.setAction(wikipedia.translate(wikipedia.getSite(), msg_standalone))

    def checkExceptions(self, original_text):
        """                                                                                         
        If one of the exceptions applies for the given text, returns the                               
        substring which matches the exception. Otherwise it returns None.                                     
        """
        for exception in self.exceptions:
            hit = exception.search(original_text)
            if hit:
                return hit.group(0)
        return None

    def treat(self, page):
        try:
            # Show the title of the page we're working on.
            # Highlight the title in purple.
            wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title())
            ccToolkit = EpiloghKleidaTaksinomhshsToolkit(page.site(), page.title, debug = True)
            keimeno = page.get()
            match = self.checkExceptions(keimeno)
            # skip all pages that contain certain texts          
            if match:
                wikipedia.output(u'Skipping %s because it contains %s' % (page.aslink(), match))
            else:
                allages = ccToolkit.allagh(keimeno)
                if allages != keimeno:
                    if not self.acceptall:
                        choice = wikipedia.inputChoice(u'Do you want to accept these changes?',  ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
                        if choice in ['a', 'A']:
                            self.acceptall = True
                    if self.acceptall or choice in ['y', 'Y']:
                        page.put(allages)
                else:
                    wikipedia.output(u"Καμία αλλαγή δεν χρειάστηκε στο %s" % page.title())
        except wikipedia.NoPage:
            wikipedia.output(u"Η σελίδα %s δεν υπάρχει;!" % page.aslink())
        except wikipedia.IsRedirectPage:
            wikipedia.output("Η σελίδα %s είναι ανακατεύθυνση, skipping." % page.aslink())
        except wikipedia.LockedPage:
            wikipedia.output(u"Η σελίδα %s είναι κλειδωμένη;!" % page.aslink())

    def run(self):
        for page in self.generator:
            self.treat(page)
            original_text = page.get()

def main():
    #page generator
    gen = None
    PageTitles = []
    exceptions=[]
    namespaces = []
    regex = False
    caseInsensitive = False
    # This factory is responsible for processing command line arguments
    # that are also used by other scripts and that determine on which pages
    # to work on.
    genFactory = pagegenerators.GeneratorFactory()

    for arg in wikipedia.handleArgs():
        if arg.startswith('-except:'):
            exceptions.append(arg[8:])
        elif arg == '-regex':
            regex = True
        elif arg == '-nocase':
            caseInsensitive = True
        elif arg.startswith('-namespace:'):
            try:
                namespaces.append(int(arg[11:]))
            except ValueError:
                namespaces.append(arg[11:])
        elif arg.startswith('-page'):
            if len(arg) == 5:
                PageTitles.append(wikipedia.input(u'Which page do you want to change?'))
            else:
                PageTitles.append(arg[6:])
        else:
            generator = genFactory.handleArg(arg)
            if generator:
                gen = generator
            else:
                wikipedia.showHelp()
                
    for i in range(len(exceptions)):
        exception = exceptions[i]
        if not regex:
            exception = re.escape(exception)
        if caseInsensitive:
            exceptionR = re.compile(exception, re.UNICODE | re.IGNORECASE)
        else:
            exceptionR = re.compile(exception, re.UNICODE)
        exceptions[i] = exceptionR

    if PageTitles:
        pages = [wikipedia.Page(wikipedia.getSite(), PageTitle) for PageTitle in PageTitles]
        gen = iter(pages)
    if not gen:
        wikipedia.showHelp()
    elif wikipedia.inputChoice(warning + u'\nΘέλετε σίγουρα να συνεχίσετε;', ['yes', 'no'], ['y', 'N'], 'N') == 'y':
        if namespaces != []:
            gen =  pagegenerators.NamespaceFilterPageGenerator(gen, namespaces)
        preloadingGen = pagegenerators.PreloadingGenerator(gen)
        bot = EpiloghKleidaTaksinomhshsBot(preloadingGen, exceptions)
        bot.run()

if __name__ == "__main__":
    try:
        main()
    finally:
        wikipedia.stopme()