Utilisateur:Hector/tdmtransclusion.py
Apparence
#!/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.
¶ms;
"""
#
# (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)