Utilisateur:Youni Verciti Bot/Scripts

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
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