Utilisateur:Hector/tdmtransclusion.py

#!/usr/bin/python
"""
Exemple d'entrées & descriptions :
langue="fr"                                          : langue du wiki
site="wikisource"                                    : quel wiki (a priori wikisource...)
tdmfilename="tdm.txt"                                : nom du fichier où sera écrite la table des matières
transclusionfilename="transclusion.txt"              : nom du fichier où sera écrit le contenu des pages transcluses
livre=u"Mérimée, Lettres à une inconnue 1,1874.djvu" : nom du livre dans wikisource
nomtransclusion=u"Lettres à une inconnue"            : nom de la page de transclusion dans le wiki
pagemin=1                                            : la première page où commence la recherche de chapitres dans le livre.
pagemax=410                                          : la dernière page où finit la recherche de chapitres dans le livre.
listeModeleChap=[["t3", "T3"],["t4", "T4"]],         : Liste des niveaux de chapitres ;
                                                     : chaque niveau est représenté par une liste de noms de modèles
                                                     : (du fait que certains modèles peuvent avoir des abréviations)
listeModeleRemarques=[["d","droite"],["d","droite"]] : Liste des modèles de remarques pour chaque niveau de chapitre
                                                     : (même nombre de listes que listeModeleChap)
                                                     : chaque modèle de remarque est une liste, car il peut lui aussi avoir plusieurs noms.
                                                     : un modèle de chapitre (par exemple t4) peut être suivi d'une remarque
                                                     : incluse dans un modèle (exemple : modèle droite) et cette information peut être
                                                     : intéressante à ajouter dans le titre du chapitre. D'où l'intérêt de ce
                                                     : paramètre.
                                                     : à noter que seuls le modèle de remarques situés juste après le modèle de chapitre
                                                     : correspondant sera incorporé.
listeModeleStyle=[[1,". ", 3],[1]]  : Liste de construction du nom de chapitre
                                                     : (même nombre de listes que listeModeleChap)
                                                     : chaque construction est constituée d'une liste d'entiers (1 à 4) et de chaînes de caractères.
                                                     : les entiers représentent les argument des modèles :
                                                     : 1 : 1er argument du modèle chapitre
                                                     : 2 : 2nd argument du modèle chapitre
                                                     : 3 : 1er argument du modèle remarque
                                                     : 4 : 2nd argument du modèle remarque
                                                     : Le nom du chapitre sera la concaténation des différents éléments de la liste de la construction.
decalagePage=46                                      : décalage entre la numérotation du fichier djvu ou pdf et de celle du livre.
listeLargeurp=[25, 35]                               : liste de largeurp utilisée dans la création de la table, pour chaque niveau de chapitre
televersement=0                                      : !!! ATTENTION !!!
                                                     : si 1, le téléversement sur le wiki des chapitres de la transclusion est effectuée !
                                                     : vérifiez dans un premier temps que le résultat (dans le fichier transclusionfilename)
                                                     : est satisfaisant, sans téléverser (en affectant televersement à 0),
                                                     : avant de téléverser le résultat.
commentaire=u"transclusion automatique"              : commentaire des modifications des pages de la transclusion sur le wiki.
                                                     : uniquement si televersement = 1.

&params;
"""
#
# (C) Hector, 2021
# Distributed under the terms of the MIT license.
#
import pywikibot


######## PARAMETRISATION #####################
langue="fr"
site="wikisource"
tdmfilename="tdm.txt"
transclusionfilename="transclusion.txt"
livre=u"Mérimée, Lettres à une inconnue 1,1874.djvu"
nomtransclusion=u"Lettres à une inconnue"
pagemin=1
pagemax=410
listeModeleChap=[["t4", "T4"]]
listeModeleRemarques=[["d","droite"]]
listeModeleStyle=[["{{tm|",1,".|4}} ", 3]]
decalagePage=46
listeLargeurp=[35]
televersement=0
commentaire=u"transclusion automatique"
############################################


def myorder(dict):
    return dict['deb']


def fermemodele(txt, deb, bo, bf, k):
    a = txt.find(bo, deb + len(bo))
    b = txt.find(bf, deb + len(bf))
    if a < b and a > -1:  # balise ouvrante
        k = k + 1
        fin = fermemodele(txt, a, bo, bf, k)
    else:  # balise fermante
        k = k - 1
        if k > 0:  # balise fermante interne
            fin = fermemodele(txt, b, bo, bf, k)
        else:  # balise fermante trouvée !
            return b
    return fin


def getmodelfields(page, txt, lmodelName, deb, listf):
    listpro = []
    for i in range(len(lmodelName)):
        modelName = lmodelName[i]
        deb0 = txt.find("{{" + modelName + "|", deb)
        if (deb0 >= 0):
            deb = deb0
            # end = txt.find("}}", deb)
            k = 1
            end = fermemodele(txt, deb, "{{", "}}", k)
            if end == -1:
                end = len(txt)
            if deb == 0:
                isdeb = 1
            else:
                isdeb = 0
            modeltext = txt[deb + 3 + len(modelName):end]
            print(modeltext)
            if modeltext.find("{{corr|") >= 0:  # supprime les modèles corr
                listcorr = getmodelfields(page, modeltext, ["corr"], 0, [])
                for j in range(len(listcorr)):
                    dia = listcorr[j]['args']
                    modeltext = modeltext.replace("{{corr|" + dia[0] + "|" + dia[1] + "}}", dia[1])
            if modeltext.find("<ref>") >= 0:
                modeltext = modeltext.split("<ref>")[0]
            fields = {"modelName": modelName, "page": page, "deb": deb, "isdeb": isdeb, "args": modeltext.split("|")}
            listpro.append(fields)
            getmodelfields(page, txt, [modelName], end, listpro)
    listpro.sort(key=myorder)
    listf.extend(listpro)
    return listf


def getmodelfieldsbook(lang, site, livre, pagemin, pagemax, listmodele):
    site = pywikibot.Site(lang, site)  # The site we want to run our bot on
    listf = []
    for i in range(pagemin, pagemax):
        page = pywikibot.Page(site, 'Page:' + livre + '/' + str(i))
        txt = page.text
        if txt.find("</noinclude>", 1) >= 0:
            txt = txt.split("</noinclude>", 1)[1]
        if txt.find("<section begin=\"s1\"/>") >= 0:
            txt = txt.split("<section begin=\"s1\"/>", 1)[1]
        txt = txt.lstrip()
        listf = getmodelfields(i, txt, listmodele, 0, listf)
    return listf


def writetdm(filename, listTool, nomtransclusion, listeModeleChap, listeModeleRemarques, listeModeleStyle,
             listeLargeurp, decalagePage):
    numChap = 0
    nbmodel = len(listTool)
    with open(filename, 'w') as tdm:
        for i in range(nbmodel):
            d = listTool[i]
            for j in range(len(listeModeleChap)):
                if d['modelName'] in listeModeleChap[j]:
                    numChap = numChap + 1
                    titres = d['args']
                    if i + 1 < len(listTool):
                        dd = listTool[i + 1]
                        if dd['modelName'] in listeModeleRemarques[j]:
                            remarques = dd['args']
                    nom = ""
                    for k in range(len(listeModeleStyle[j])):
                        param = listeModeleStyle[j][k]
                        if isinstance(param, str):
                            nom = nom + param
                        if isinstance(param, int):
                            if param == 1:
                                nom = nom + titres[0].rstrip()
                            elif param == 2:
                                nom = nom + titres[1].rstrip()
                            elif param == 3:
                                nom = nom + remarques[0].rstrip()
                            elif param == 4:
                                nom = nom + remarques[1].rstrip()
                    tab = "{{Table|largeurp=" + \
                          str(listeLargeurp[j]) + \
                          "|titre=[[" + nomtransclusion + "/" + \
                          str(numChap) + \
                          "|" + nom + "]]|page={{pli|" + \
                          str(d['page'] - decalagePage) + "|" + \
                          str(decalagePage) + "}}}}\n"
                    tdm.write(tab)
    return 0

def writetransclusion(langue, site, filename, listTool, livre, nomtransclusion, listeModeleChap, pagemax, televersement, commentaire):

    sitew = pywikibot.Site(langue, site)

    pagedeb = []
    isdeb = []
    nbmodel = len(listTool)

    for i in range(nbmodel):
        d = listTool[i]
        for j in range(len(listeModeleChap)):
            if d['modelName'] in listeModeleChap[j]:
                pagedeb.append(d['page'])
                isdeb.append(d['isdeb'])

    numChap = 0
    with open(filename, 'w') as transclusion:
        for i in range(len(listTool)):
            d = listTool[i]
            for j in range(len(listeModeleChap)):
                if d['modelName'] in listeModeleChap[j]:
                    if numChap + 1 < len(isdeb):
                        if isdeb[numChap + 1] == 1:
                            pagefin = pagedeb[numChap + 1] - 1
                            tosec = ""
                        else:
                            pagefin = pagedeb[numChap + 1]
                            tosec = "tosection=s1"
                    else:
                        pagefin = pagemax
                        tosec = ""
                    if isdeb[numChap] == 1:
                        fromsec = ""
                    else:
                        fromsec = "fromsection=s2"
                    tab = "<pages index=\"" + livre + "\" header=1 from=" + str(pagedeb[numChap]) + " to=" + str(
                            pagefin) + " " + fromsec + " " + tosec + "/>\n"
                    transclusion.write(tab)
                    if televersement == 1:
                        paget = pywikibot.Page(sitew, nomtransclusion + '/' + str(numChap + 1))
                        paget.text = tab
                        paget.save(commentaire)
                    numChap = numChap + 1
    return 0


def gettdmtransclusion(langue, site, tdmfilename, transclusionfilename, livre, nomtransclusion, pagemin, pagemax,
                       listeModeleChap, listeModeleRemarques, listeModeleStyle, decalagePage, listeLargeurp,
                       televersement, commentaire):
    listeModeleAPlat=[item for l in listeModeleChap for item in l]
    b=[item for l in listeModeleRemarques for item in l]
    print(listeModeleAPlat)
    print(b)
    listeModeleAPlat.extend(b)
    print(listeModeleAPlat)
    listTool = getmodelfieldsbook(langue, site, livre, pagemin, pagemax, listeModeleAPlat)
    res = writetdm(tdmfilename, listTool, nomtransclusion, listeModeleChap, listeModeleRemarques, listeModeleStyle,
                                listeLargeurp, decalagePage)
    if res != 0:
        return res
    res = writetransclusion(langue, site, transclusionfilename, listTool, livre, nomtransclusion,
                                listeModeleChap, pagemax, televersement, commentaire)
    return res

#######################################################################
gettdmtransclusion(langue,
                   site,
                   tdmfilename,
                   transclusionfilename,
                   livre,
                   nomtransclusion,
                   pagemin,
                   pagemax,
                   listeModeleChap,
                   listeModeleRemarques,
                   listeModeleStyle,
                   decalagePage,
                   listeLargeurp,
                   televersement,
                   commentaire)