Utilisateur:Youni Verciti Bot/Scripts

Une page de Wikiversité, la communauté pédagogique libre.
Le script va scanner les pages dans l'espace de nom donné en argument, chercher le vocabulaire dans les modèles 'traductions' et 'prononciations', créer la liste dans Département/Index_vocabulaire/vcb-Nom_de_la_page.
#!/usr/bin/python
# -*- coding: latin-1 -*-

import urllib, re, sys, pywikibot, codecs # PWB now
from vcbscan import *
from vcbformat import *
from international import *
srv="https://fr.wikiversity.org/w/api.php" # Adresse du serveur API
site = pywikibot.Site('fr', u'wikiversity') ### Variables PWB The site we want to run our bot on
arg1 = sys.argv[1]
uArg1 = unicode(arg1, 'utf-8') # Encodage den UNICODE pour PWB 
lPath = pathname(arg1, srv)

[name, rootName, lastName, nbName, lSec, linker] = lPath
[className, titleS, linkTo, link, reLink, retplk, defaultKey ] = linker
print className
# Si Chapitre liste = arg1
# Si Leçon fonction shortliste appliquée à query=allfiles
# Si departement ufileList lpage
# Si none undefine => leçon

reClassName = re.compile(className)

title = uArg1 # L'espace de nom passé en ligne de commande
page = pywikibot.Page(site, title)
### Variables API
# TOUS LES MODÊLES CONTENUS DANS LA PAGE Parse templates
# rqParseTpl = '?action=parse&format=xml&page=%s&prop=templates' % name
rqRootLang = '?action=languagesearch&format=xml&search=%s' % rootName
fromPage = arg1
toPage = arg1 + 'a'
rqAllPages = '?action=query&list=allpages&format=xml&apfrom='+fromPage+'&apto='+toPage+'&aplimit=275'
rqParseWkt = '?action=parse&format=xml&page=%s&prop=wikitext&contentdataZone=wikitext' % arg1 # REQUETE PARSE Format XML content WIKITEXT

### RECHERCHE PAGELANG
sts = str(site)
i=sts.find(':')
sts = sts[i+1:]
pageLang = sts
### RECHERCHE ROOTLANG
askRootLang = srv + rqRootLang
objr = urllib.urlopen(askRootLang)
varf = objr.read()
strl1 = str(varf)
reRootLang = re.compile('languagesearch":{"\w*"')
moRootLang = reRootLang.search(strl1)
rootLang = moRootLang.group()
rootLang = rootLang[ 18 : len(rootLang)-1 ]
print rootLang + '-' + pageLang 
###
strLog = '' # Variable pour le journal
lAudio = [] # Liste pour la 3ème colonne de modèle Prononciation
globalDict = {} # Dictionnaire global 
###
fileList = urllib.urlopen(srv + rqAllPages) ### ATTENTION Si Dept, Leçon, Chap: liste des fichiers à traiter
vfileList = fileList.read()
ufileList = unicode(vfileList, 'utf-8')
#allFiles = len(ufileList) # Liste de TOus les fichiers dans l'espace de nom fournit en argument

rePg=re.compile('title=".*"') # recherche du nom de page
rePron = re.compile('[P|p]rononciation\w*') # recherche le modèle
reTrad = re.compile('[T|t]raduction\w*') # ''
reEq = re.compile('=') # recherche des parametres
l1 = re.compile('langue1') # First raw (filtre param Langue1)
l2 = re.compile('langue2') # Second raw ('' langue2)

### Analyse ufileList pour créer liste de page lPage
listePg = ufileList.split('>') # divise pour filtre nom page
lPage = [] # liste pour pages
for l in listePg: # pour chaque chaine dans xml listePg
  moPg = rePg.search(l)   # Cherche le titre
  if moPg:                # 
    p=moPg.group()        # 
    cp = p[7:len(p)-1]    # filtre la chaine nom de page
    lPage.append(cp)      # enregistre liste des pages
allFiles = len(lPage) # Voir nbPages
if className == 'Leçon': # L 
  lPage = shortlist(lPage, arg1)   # Filtre les fichiers de la leçon

### Analyse modèles de chaque page, creation de listes distinctes pour chaque modèle, 
lPron = [] # Liste des modèles Prononcition
lTrad = [] # Liste des modèles Traduction
for p in lPage: # chaque pages
  title = p
  page = pywikibot.Page(site, p)
  gen = page.templatesWithParams() # liste les modèles et contenu
  linkIn = 'none'
  if gen:# si  modeles
    for g in gen: #pour chaque item du generator
      a = g[0] # a le nom de la pge du modele
      b = g[1] # b a liste des params
      stra = str(a)
      moTrad = reTrad.search(stra) # cherche trad dans liste des modele
      if moTrad:
	lTrad.append(g) # si trad enregistre dans LISTE TRAD
      moPron = rePron.search(stra)
      if moPron:
	lPron.append(g) # si pron enregistre dans LISTE PRON
nbPages = len(lPage)
nbPron = len(lPron)
nbTrad = len(lTrad)
part1Log = str(nbPages) + ' pages\n' + str(nbPron) + ' modèle PRON, ' + str(nbTrad) + ' modèle TRAD\n'
strLog = strLog + part1Log
print strLog
print '### Les Listes sont prêtes ###' # On a une liste pour chaque modele


if nbPron > 0:
  for l in lPron: # LPRON
    # Ce modèle propose une qutrimr colonne transcritpion
    # quand cette 4èmme colonne existe
    # les données ne sont pas collectée cf strLog
    a = l[0] # Nom du modele
    lb = l[1] # Liste des parametres
    lrm = []  # liste des elemennts à supprimer
    count = 1 # initialise le compteur
    for b in lb:  # pour chaque parametre
      i = lb.index(b)  # calcul l'index du parametre
      moEq = reEq.search(b)   # cherche symbol egual, param nommé
      if moEq: # Si le param est nommé
	pass 
      else:  # c’est une cellule
	if count % 3 == 0: # si elle est multiple de trois
	 lAudio.append(b) # copie dans la liste lAudio
	 lrm.append(b) # copie dans liste à supprmer
      count =count + 1     # prochain param
    for rm in lrm:   #  chaque element
      lb.remove(rm)   # est supprimé
    lTrad.append(l)   # copie les param restants dans lTrad
  # Il faudrait detecter la quatrième colonne si existe

nbMod = len(lTrad)
strLog = strLog + str(nbMod) + ' modèles à traiter\n'

if nbMod > 0:
  for l in lTrad: # LTRAD
    a = l[0]      # le nom du modèle
    lb = l[1]     # la liste des paramètres
    lParam = []   # Nouvelle liste pour les parametres nommés
    raw1 = rootLang   # initialise les langues
    raw2 = pageLang   # avec paramètres par défaut
    for b in lb:    # PARAMETRES
    # print b ATTENTION API retourne lzh pour chinois mais wikversité utilise zh
      moEq = reEq.search(b)   # cherche symbole egual parm nommés
      if moEq:    # Si symbol
        lParam.append(lb.index(b))   # enregistre son index dans liste lParam
        mol2 = l2.search(b) # Cherche langue2
        if mol2:   # SI langue2
	 spl2 = b.split('=') # split sur symbol=
	 raw2 = spl2[1] # enregistre dans raw2
	 raw2 = raw2.strip() # retire éspaces inutiles
        mol1 = l1.search(b)   # Cherche langue1
        if mol1:   # SI langue1
          spl1 = b.split('=') # split egual
	 raw1 = spl1[1] # stock valeur
	 raw1 = raw1.strip() # enleve espaces
    cdl = raw1+'-'+raw2  # variable cdl = langue1-langue2
    #lb.append(cdl)  # place cdl dans la liste (dernière position # ATTENTION on deplace cdl dans tplParam
    iMaxData = min(lParam) # Calcul dernière donnée = premier paramètre nommé ???
    data = lb[0:iMaxData]   # Calcul la zone de données
    nbCel = len(data)
    tplParam = [cdl, iMaxData, nbCel]
    lb.append(tplParam)
    
    
    if nbCel %2 <> 0:
      lastCel = lb[iMaxData-1]
      print '######'
      print lastCel
      print '#######'
      reSpaces = re.compile('\s\n') # resoud le cas Anglais/Grammaire/Conjugaison/Impératif
      # Attention le problème reste relatif à la 4ème colonne de prononciation
      moSpaces = reSpaces.match(lastCel)
      if lastCel == '':
        print 'DERNIERE CELLULE VIDE A DETRUIRE'
        # resoud le cas de la dernière cellule vide sans espaces ni saut de ligne
        # il reste à supprimer l'element de la liste lb
      if moSpaces:
        print 'Celule vide à détruire'
        print moSpaces.group()
        #lb.remove[lastCel]
        
    if cdl == rootLang + '-' + pageLang and nbCel % 2 == 0: # Si defaut
      for d in data:   # Pour chaque donnée dans dataZone
        if data.index(d) % 2 == 0:   # si son index est paire
	 iTmp = data.index(d)+1 # Calcul index prochaine valeur
	 tmp = data[iTmp] # tmp = prochaine valeur
	 globalDict[d] = tmp # Dictionnaire Global reçoit mot_PT : mot_FR
        else:   #   ce n’est pas une clé
	 pass
    elif cdl == pageLang + '-' + rootLang and nbCel % 2 == 0:   # INVERSE fr-pt
      for d in data:
        if data.index(d) % 2 == 0:   # si son index est paire
	 iTmp = data.index(d) + 1
	 tmp = data[iTmp] # tmp = prochaine valeur
	 globalDict[tmp] = d # On inverse d et tmp dans le dictionnaire
        else: # IMPAIR PASS
          pass
    else:
      errorLog = 'Template error:\nVérifier le nombre de cellules: '
      print errorLog
      print nbCel
      # si nbCel impair alors verifier si dernière cellule vide
      error2 = 'Titres de colonnes: \n'
      print cdl
      print page #Affiche page erronée
      print a
      print data
      # chinois code langue sur 3 caractères tronque le l, lzh devient zh
      #tplErrorLog = unicode(str(page), 'utf-8') +'\n'+ unicode(str(lb), 'utf-8') +'\n'
      #print  tplErrorLog
      #strLog = strLog + errorLog + tplErrorLog
ligd = len(globalDict)
strLog = strLog + str(ligd) + ' lignes dans dictionnaire global\n'

### Traitement des APOSTROPHES et des espaces inutiles
finalDict = {}
for t in globalDict:
  v = globalDict[t]
  t = aposoff(t)
  v = aposoff(v)
  t = t.strip()
  v = v.strip()
  finalDict[t] = v

# On aff¡che le resultat contenu dans tupCleaned
#for g in sorted(tupCleaned):
  #v = tupCleaned[g]
  #print g
  #print v
nbLine = len(finalDict)

wlp = divdict(finalDict)
[tupWord, tupLocution, tupPhrase] = wlp

chkword(tupLocution, tupWord) 

for lang in langPack:
  pack = langPack[lang]
  if lang == rootLang:
    chkarticle(tupLocution, tupWord, pack)
  else:
    print ' Pas de langPack'

words = len(tupWord)
locutions = len(tupLocution)
phrases = len(tupPhrase)
format1Log = str(words) + ' mots, ' + str(locutions) + ' locutions, ' + str(phrases) + ' phrases.\n'
strLog = strLog + format1Log

secW = ''
for k in sorted(tupWord): 
  v = tupWord[k]
  kSplit = k.split()
  kSize = len(kSplit)
  if kSize ==2: # Deux mots dans la clé, l’article est en seconde position
    if ',' in k:
      kCut = k.split(',')   # on split sur la virgule et on cré les liens avec premier element du split
      line = '* [[wikt:' + rootLang +':'+ kCut[0] + '|' + k + ']] : [[wikt:' + kCut[0] + '#'+ rootLang + '|' + v + ']]<br />\n'
      secW = secW +line
    else: # Deux mots sans virgule
      line = u'* [[wikt:' + rootLang +u':'+ kSplit[0] + u'|' + k + u']] : [[wikt:' + kSplit[0] + u'#' + rootLang + u'|' + v + u']]<br />\n'
      secW = secW +line
  else: # Un seul mot dans la clé création des liens wikt
    line = u'* [[wikt:'+ rootLang + u':' + k + u'|' + k + u']] : [[wikt:' + k + u'#' + rootLang + u'|' + v + u']]<br />\n'
    secW = secW +line

secL = linesans(tupLocution)
secP = linesans(tupPhrase)

scriptName = sys.argv[0]
writePack = [scriptName, allFiles, nbMod, nbLine, uArg1, secW, secL, secP]

if nbLine < 5:
  print 'Pas suffisament de données pour créer une page. Minimum 5 lignes.'
  print nbLine
else:
  txtin = writelist(writePack)
  comment = 'Indexation automatique du vocabulaire pour les langues étrangères. Youni Verciti Bot'
  print u'Page à publier:       ' + titleS
  page = pywikibot.Page(site, titleS)
  page.text = txtin
  try:
    page.save(comment)
  except:
    print 'Pas sauvegardé, pas de lien'
  else:
    print 'Beleza muleque, agora vai criar o atalho.'
    print 'Hote du lien à créer:  ' + linkTo
    print link
    print defaultKey

print '### Log: ###'
print strLog