Χρήστης:ArielGlenn/κλείδα ταξινόμησης

ο κώδικας:

# -*- 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)
        keimeno = self.addKleidaTaksinomhshsProtypo(keimeno,protypo)
        if self.debug:
            wikipedia.showDiff(palioKeimeno, keimeno)
        return keimeno

    def paragwghKleidaTaksinomhshsProtypo(self):
        u"""
        παραγωγή της παραμέτρου για το πρότυπο κλείδα ταξινόμησης
        γυρίζει το πρότυπο (με τις παραμέτρους) ακριβώς όπως θα έμπαινε σε wikitext
        """
        # αυτό εξαρτάται από το locale;;;
        parametros = self.title().lower()
#        print parametros

#       εξαφάνιση των διακριτικών σημείων

# νεοελληνικά
#ά έ ή ί ϊ ΐ ό ύ ϋ ΰ ώ ς
#α ε η ι ι ι ο υ υ υ ω σ
# αρχαία ελληνικά
#ά έ ή ί ό ύ ώ ᾴ ῄ ῴ ὰ ὲ ὴ ὶ ὸ ὺ ὼ ᾲ ῂ ῲ ᾶ ῆ ῖ ῦ ῶ ᾷ ῇ ῷ ῗ ῧ ῒ ῢ ΐ ΰ ᾳ ῃ ῳ ἀ ἐ ἠ ἰ ὀ ὐ ὠ ᾀ ᾐ ᾠ ἄ ἔ ἤ ἴ ὄ ὔ ὤ ᾄ ᾔ ᾤ
#ἂ ἒ ἢ ἲ ὂ ὒ ὢ ᾂ ᾒ ᾢ ἆ ἦ ἶ ὖ ὦ ᾆ ᾖ ᾦ ἁ ἑ ἡ ἱ ὁ ὑ ὡ ἅ ἕ ἥ ἵ ὅ ὕ ὥ ᾅ ᾕ ᾥ ἃ ἓ ἣ ἳ ὃ ὓ ὣ ᾃ ᾓ ᾣ ἇ ἧ ἷ ὗ ὧ ᾇ ᾗ ᾧ ᾰ ῐ ῠ ᾱ ῑ ῡ ῥ

# γαλλικά
#à â ç é è ê ë î ï ô œ ù û ü 
# γερμανικά
#ä ö ß ſ ü 
# δανικά
#á é ó æ ø å 
# βοσνιακά
#č ć đ š ž 
# αφρικάανς
#ä ê ë é î ï ô ö û ü 
# βένδα
#ḓ ḽ ṋ ṅ ṱ 
# βιετναμικά
#à ả á ạ ã ă ằ ẳ ẵ ắ ặ â ầ ẩ ẫ ấ ậ đ è ẻ ẽ é ẹ ê ề ể ễ ế ệ ỉ ĩ í ị ì ỏ ó ọ ò õ ô ồ ổ ỗ ố ộ ơ ờ ở ỡ ớ ợ ù ủ ũ ú ụ ư ừ ử ữ ứ ự ỳ ỷ ỹ ỵ ý 
# βολαπούκ
#ä ö ü 
# εσθονικά
#č š ž õ ä ö ü 
# εσπεράντο
#ĉ ĝ ĥ ĵ ŝ ŭ 
# ισλανδικά
#á ð é í ó ú ý þ æ ö 
# ισπανικά
#á é í ñ ó ú ü 
# ιταλικά
#á à é è í ì ó ò ú ù  
# καταλανικά
#á à ç é è ë í ï ó ò ö ú ù • 
# κινέζικα
#á à ǎ ā é è ě ē í ì ǐ ī ó ò ǒ ō ú ù ü ǔ ū ǘ ǜ ǚ ǖ 
# κουρδικά
#ç ê ğ ḧ ı î ş û ẍ
# κροατικά
#č ć đ š ž 
# λευκορωσικά
#ć č ł ń ś š ŭ ź ž 
# μαλτέζικα
#ċ ġ ħ ż 
# μολδαβικά
#ă â î ş ţ 
# νορβηγικά
#á é ó æ ø å 
# ουαλλέζικα
#á à â ä é è ê ë ì î ï ó ò ô ö ù û ẁ ŵ ẅ ý ỳ ŷ ÿ 
# πολωνικά
#ą ć ę ł ń ó ś ź ż 
# πορτογαλικά
#á à â ã ç é ê í ó ô õ ú ü 
# ρουμανικά
#ă â î ş ţ 
# σλοβακικά
#á ä č ď é í ĺ ľ ň ó ô ŕ š ť ú ý ž 
# σότο 
#ê ô š 
# σουηδικά
#é å ä ö
# τουρκικά
#â ç ğ ı i î ş 
# τσεχικά
#á č ď é ě í ň ó ř š ť ú ů ý ž 
# τσουάνα
#ê ô š 
# χαβανέζικα
#ā ē ī ō ū 

        mtg_apo = u'à â ç é è ê ë î ï ô œ ù û ü'  + u' ä ö ß ſ ü'  + u' á é ó æ ø å'  + u' č ć đ š ž'
        mtg_se =   u'a a c e e e e i i o oe u u u' + u' a o ss ? u' + u' a e o ae o a' + u' c c d s z'

        mtg_apo = mtg_apo + u' ä ê ë é î ï ô ö û ü' + u' ḓ ḽ ṋ ṅ ṱ'
        mtg_se =   mtg_se +   u' a e e e i i o o u u' + u' d l n n t'

        mtg_apo = mtg_apo + u' à ả á ạ ã ă ằ ẳ ẵ ắ ặ â ầ ẩ ẫ ấ ậ đ è ẻ ẽ é ẹ ê ề ể ễ ế ệ ỉ ĩ í ị ì'
        mtg_se =   mtg_se   + u' a a a a a a a a a a a a a a a a a d e e e e e e e e e e e i i i i i'

        mtg_apo = mtg_apo + u' ỏ ó ọ ò õ ô ồ ổ ỗ ố ộ ơ ờ ở ỡ ớ ợ ù ủ ũ ú ụ ư ừ ử ữ ứ ự ỳ ỷ ỹ ỵ ý'
        mtg_se =   mtg_se   + u' o o o o o o o o o o o o o o o o o u u u u u u u u u u u y y y y y'

        mtg_apo = mtg_apo + u' ä ö ü' + u' č š ž õ ä ö ü' + u' ĉ ĝ ĥ ĵ ŝ ŭ' + u' á ð é í ó ú ý þ æ ö'
        mtg_se =   mtg_se   + u' a o u' + u' c s z o a o u' + u' c g h j s u' + u' a ? e i o u y ? ae o'

        mtg_apo = mtg_apo + u' á é í ñ ó ú ü' + u' á à é è í ì ó ò ú ù' + u' á à ç é è ë í ï ó ò ö ú ù'
        mtg_se = mtg_se     + u' a e i n o u u' + u' a a e e i i o o u u' + u' a a c e e e i i o o o u u'

        mtg_apo = mtg_apo + u' á à ǎ ā é è ě ē í ì ǐ ī ó ò ǒ ō ú ù ü ǔ ū ǘ ǜ ǚ ǖ' + u' ç ê ğ ḧ ı î ş û ẍ'
        mtg_se = mtg_se     + u' a a a a e e e e i i i i o o o o u u u u u u u u u' + u' c e g h i i s u x'

        mtg_apo = mtg_apo + u' č ć đ š ž' + u' ć č ł ń ś š ŭ ź ž' + u' ċ ġ ħ ż' + u' ă â î ş ţ' + u' á é ó æ ø å'
        mtg_se = mtg_se     + u' c c d s z' + u' c c ? n s s u z z' + u' c g h z' + u' a a i s t' + u' a e o ae o a'

        mtg_apo = mtg_apo + u' á à â ä é è ê ë ì î ï ó ò ô ö ù û ẁ ŵ ẅ ý ỳ ŷ ÿ' + u' ą ć ę ł ń ó ś ź ż'
        mtg_se = mtg_se     + u' a a a a e e e e i i i o o o o u u w w w y y y y' + u' a c e ? n o s z z'

        mtg_apo = mtg_apo + u' á à â ã ç é ê í ó ô õ ú ü' + u' ă â î ş ţ' + u' á ä č ď é í ĺ ľ ň ó ô ŕ š ť ú ý ž'
        mtg_se = mtg_se     + u' a a a a c e e i o o o u u' + u' a a i s t' + u' a a c d e i l l n o o r s t u y z'

        mtg_apo = mtg_apo + u' ê ô š' + u' é å ä ö' + u' â ç ğ ı i î ş' + u' á č ď é ě í ň ó ř š ť ú ů ý ž'
        mtg_se = mtg_se     + u' e o s' + u' e a a o' + u' a c g i i i s' + u' a c d e e i n o r s t u u y z'

        mtg_apo = mtg_apo + u' ê ô š' + u' ā ē ī ō ū' + u' ά έ ή ί ϊ ΐ ό ύ ϋ ΰ ώ ς'
        mtg_se = mtg_se     + u' e o s' + u' a e i o u' + u' α ε η ι ι ι ο υ υ υ ω σ'

        mtg_apo = mtg_apo + u' ά έ ή ί ό ύ ώ ᾴ ῄ ῴ ὰ ὲ ὴ ὶ ὸ ὺ ὼ ᾲ ῂ ῲ ᾶ ῆ ῖ ῦ ῶ ᾷ ῇ ῷ ῗ ῧ ῒ ῢ ΐ ΰ ᾳ ῃ ῳ ἀ ἐ ἠ'
        mtg_se = mtg_se     + u' α ε η ι ο υ ω α η ω α ε η ι ο υ ω α η ω α η ι υ ω α η ω ι υ ι υ ι υ α η ω α ε η'

        mtg_apo = mtg_apo + u' ἰ ὀ ὐ ὠ ᾀ ᾐ ᾠ ἄ ἔ ἤ ἴ ὄ ὔ ὤ ᾄ ᾔ ᾤ ἂ ἒ ἢ ἲ ὂ ὒ ὢ ᾂ ᾒ ᾢ ἆ ἦ ἶ ὖ ὦ ᾆ ᾖ ᾦ ἁ ἑ ἡ ἱ ὁ'
        mtg_se = mtg_se     + u' ι ο υ ω α η ω α ε η ι ο υ ω α η ω α ε η ι ο υ ω α η ω α η ι υ ω α η ω α ε η ι ο'

        mtg_apo = mtg_apo + u' ὑ ὡ ἅ ἕ ἥ ἵ ὅ ὕ ὥ ᾅ ᾕ ᾥ ἃ ἓ ἣ ἳ ὃ ὓ ὣ ᾃ ᾓ ᾣ ἇ ἧ ἷ ὗ ὧ ᾇ ᾗ ᾧ ᾰ ῐ ῠ ᾱ ῑ ῡ ῥ'
        mtg_se = mtg_se     + u' υ ω α ε η ι ο υ ω α η ω α ε η ι ο υ ω α η ω α η ι υ ω α η ω α ι υ α ι υ ρ'

        trkeys = mtg_apo.split(u' ')
        for i in range(len(trkeys)):
            trkeys[i] = ord(trkeys[i]) 

        trvals = mtg_se.split(u' ')
        trtable = dict(zip(trkeys,trvals)) 

# TODO:
# σημεία στίξης;
# όπου έβαλα ερωτηματικό πάνω
# άλλες γλώσσες 
# αν διαφορετικές γλώσσες έχουν διαφορετική αλφαβητική σειρά, τι θα κάνουμε;
# τα λήμματα που αρχίζουν με κεφαλαία γράμματα θα πάνε σε ξεχωριστή θέση ή όχι;
 
        parametros = parametros.translate(trtable)

# για ελληνικές λέξεις *μόνο*
        parametros = re.sub(u'[^αβγδεζηθικλμνξοπρστυφχψω]', u'', parametros)

        protypo = u'{{κλείδα ταξινόμησης|' + parametros + '}}'
        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,protypo):
        u"""
        stuff provided protypo into the wikitext 
        right before categories and interwiki links.
        """

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

        site = self.site 
        protypo = self.paragwghKleidaTaksinomhshsProtypo()
        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()

τα πρότυπα

επεξεργασία

Κατευθείαν από το γαλλικό ΒΛ: {{κλείδα ταξινόμησης}}, {{κλείδα ταξινόμησης/el}}, {{κλείδα ταξινόμησης/παραγωγή}}

Τα γαλλικά: clé de tri, clé de tri/fr, clé de tri/composée

ό,τι ξέχασα

επεξεργασία