Utilisateur:ArsèneR.D./nouvelle entree eo
Apparence
### Programme python pour faciliter la création d’une nouvelle entrée wiktionnaire en espéranto ## Data # Imports from clipboard import copy terminaisons = { "a":"adjectif", "o":"nom", "i":"verbe", "e":"adverbe", "u":"imp", "s": { "as":"pre", "is":"pas", "os":"fut", "us":"cond" } } table_conversion_variantes = { 'x': { "ŝ" : "sx", "ĉ" : "cx", "ĵ" : "jx", "ĝ" : "gx", "ĥ" : "hx", "ŭ" : "ux" }, 'h': { "ŝ" : "sh", "ĉ" : "ch", "ĵ" : "jh", "ĝ" : "gh", "ĥ" : "hh", "ŭ" : "u" } } toAPI = { "t(" : "t͡", "d(" : "d͡", "g" : "ɡ", "c" : "t͡s", "ŝ" : "ʃ", "ĉ" : "t͡ʃ", "ĵ" : "ʒ", "ĝ" : "d͡ʒ", "ĥ" : "x", "ŭ" : "w", "S" : "ʃ", "C" : "t͡ʃ", "J" : "ʒ", "G" : "d͡ʒ", "H" : "x", "U" : "w", "’" : "ˈ", "'" : "ˈ", } ponctuation = ".!?… ,;:’()/\"'" # Lists liste_auteurs = {} all_steps = dict( form = "forme du mot (obligatoire)" , pron = "prononciation" , etym = "étymologie (modèle eo-étym)" , val = "valence (si verbe)" , defs = "définitions (et exemples)" , var = "variante avec/sans voyelle d'appui" , glos = "glossaires" , syn = "synonymes" , ant = "antonymes" , hypr = "hyperonymes" , hypo = "hyponymes" , wik = "lien vers wikipédia" , ref = "références" , img = "image" , chek = "valider la génération du wikicode", anx = "annexes (flexions du mot et var. x et h)" ) help_message = "Aide - commandes spéciales\nA tout moment, il est possible de changer les 'étapes' du déroulé du programme. \nPour ce faire, quelques mots spéciaux sont à utiliser :\n all\t\tactive toutes les étapes du programme (certaines sont désactivées par défaut)\n end\t\tdésactive toutes les étapes suivantes jusqu'à la fin du programme\n + \t\tpermet d'ajouter une ou plusieurs étapes\n - \t\tpermet d'enlever une ou plusieurs étapes\n only\t\tpermet de désactiver toutes les étapes sauf celles indiquées\n nur\t\talias de 'only'\n help\t\tpermet d'afficher cette aide\nPour seulement visualiser les étapes activées, faire '+', '-', 'only' ou 'nur' et ne rien entrer ensuite\n" selected_steps = ["form", "pron", "etym", "val", "defs", "var", "syn", "glos", "wik", "ref", "chek", "anx"] #étapes activées par défaut forced_steps = ["form"] ## ## ##Fonctions ## ### Fonctions générales def show_enabled_steps(autoprint=False): text = "" for abr, step_name in all_steps.items(): if abr in selected_steps: enabled = "o" else: enabled = " " text += "\n [{}] {}\t{}".format(enabled, abr, step_name) if autoprint: print(text) else: return text def saisir(message): #variante de input() permettant de ne rien rentrer si non nécessaire global selected_steps e = "" if current_step in (selected_steps + forced_steps): e = input(message) keywords = ["all", "end", "+", "-", "only", "nur", "help"] if e in keywords: if e == "all": selected_steps = list(all_steps.keys()) print("\t## Programme complet : toutes les étapes sont activées.") if e == "end": selected_steps = forced_steps if e == "+": print("Étapes activées :" + show_enabled_steps()) entree_stps = input("Saisissez les étapes à ajouter (séparées par les virgules) : ") entree_stps = entree_stps.split(",") for s in entree_stps: s = s.strip() if s in all_steps and s not in selected_steps: selected_steps.append(s) if e == "-": print("Étapes activées :" + show_enabled_steps()) entree_stps = input("Saisissez les étapes à enlever (séparées par les virgules) : ") entree_stps = entree_stps.split(",") for s in entree_stps: s = s.strip() if s in all_steps and s in selected_steps and s not in forced_steps: selected_steps.remove(s) if e == "only" or e == "nur": print("Étapes activées :" + show_enabled_steps()) entree_stps = input("Saisissez les étapes à garder (toutes les autres seront enlevées) : ") entree_stps = entree_stps.split(",") cat_videe = False for s in entree_stps: s = s.strip() if s in all_steps: if cat_videe == False: selected_steps = [] cat_videe = True selected_steps.append(s) for fs in forced_steps: if fs not in selected_steps: selected_steps.append(fs) if e == "help": print(help_message) e = saisir(message) else: e = "" return e def wcrypt(wikicode): #remplace les {{ par des << dans le wikicode wikicode = wikicode.replace("{{","<<").replace("}}",">>") return wikicode def wdecrypt(wikicode): #restitue les {{ dans le wikicode wikicode = wikicode.replace("<<","{{").replace(">>","}}") return wikicode def maj(string): #Met en majuscule la première lettre de la chaîne, sans toucher au reste (contrairement à capitalize()) string = string[0].upper() + string[1:] return string ### Fonctions spécifiques au programme def detectercarspecial(forme): #renvoie True si la forme entrée contient une lettre avec chapeau lettres_spéciales = 'ŝĉĵĝĥŭ' trouvé = False for letter in lettres_spéciales: if letter in forme: trouvé = True return trouvé def varier(forme, système): #Calcul la variante d’une forme par système x ou système h variante = forme for a, b in table_conversion_variantes[système].items(): variante = variante.replace(a,b) return variante def getnature(mot): #détermine la nature grammaticale d'un mot finale = mot[-1] if finale in terminaisons: if finale == "s": nature = terminaisons["s"][mot[-2:]] else: nature = terminaisons[finale] else: nature = "rac" return nature ### Fonctions de formatage def formatpron(sequence): #formate la prononciation dans l'API if " " in sequence and not "." in sequence: sequence = sequence.split(" ") mots = [] for mot in sequence: mot = mot.split(" ") mot[-2] = "ˈ" + mot[-2] mot = ".".join(mot) mots.append(mot) sequence = " ".join(mots) for i in toAPI: sequence = sequence.replace(i, toAPI[i]) return sequence def formatdef(definition): #Formate la définition (mise en majuscule du premier mot etc.) if definition != "": if definition[0] == "!": definition = definition[1:] else: definition = definition.replace("'''", "!gras!").replace("''", "!ital!") definition = definition.replace("'", "’") definition = definition.replace("!gras!", "'''").replace("!ital!", "''") if definition[0:2] == "[[": premier_mot = definition[2:definition.find("]")] if not "|" in premier_mot: definition = definition.replace(premier_mot,premier_mot+"#fr|"+maj(premier_mot)) else: definition = maj(definition) if definition[-1] not in ponctuation[0:4]: definition = definition + "." if definition.count("[") != definition.count("]"): definition = "(Attention !! erreur de crochets détéctée) "+definition return definition def formatex(eo, fr="", source="", lien=""): #1) mettre le mot vedette de l'exemple (eo) en gras eo = eo.strip() eo = eo + "!end!" # éviter les bugs si l'ex se termine par le mot vedette eo = eo.replace("'", "’") if nature in ["nom", "adjectif", "adverbe", "verbe"]: mot_vedette = forme[0:-1] #captation de la racine if mot_vedette in eo or maj(mot_vedette) in eo: if maj(mot_vedette) in eo : mot_vedette = maj(mot_vedette) term = ['', 'o', 'oj', 'on', 'ojn','a','aj','an','ajn','e','i','as','is','os','u','us'] newterm = '' for i in term: if mot_vedette+i in eo: newterm = i mot_vedette = mot_vedette + newterm for i in ponctuation: if eo[eo.find(mot_vedette)+len(mot_vedette)] == i: eo = eo.replace(mot_vedette,"'''"+mot_vedette+"'''") break eo = eo.replace("!end!", "") #2) traitement de la traduction fr = fr.replace("'", "’") if fr != "": fr = maj(fr) if fr[-1] not in ponctuation[0:4]: fr = fr + "." #3) traitement de la source source = source.strip() if source != "": if source[0] == "!": source = source[1:] else: if ",," in source: source = source.split(",,") else: source = source.split(",") source = list(item.strip() for item in source) if len(source) == 3: titre = source[0] titre = "''{}''".format(titre) auteur = source[1] if auteur in liste_auteurs: auteur = liste_auteurs[auteur] else: auteur = auteur.lower() auteur = auteur.title() if auteur[0] == "!": auteur = auteur[1:] else: auteur = "{{w|" + auteur + "}}" année = source[2] source = ", ".join([auteur, titre, année]) elif len(source) == 1: #Si pas de virgule source = source[0] else:source = ", ".join(source) #4) traitement du lien lien = lien.strip() if lien.startswith("https://tekstaro.com/t?nomo="): découpe = lien.split("&") lien = [] for i in découpe: if i.startswith("https") or i.startswith("id=") or i.startswith("sekcio="): lien.append(i) if '#' in découpe[-1]: lien.append("#"+découpe[-1].split('#')[-1]) lien = "&".join(lien) #5) traitement des paramètres vides exemple = {"eo":eo} if fr != "" : exemple["fr"] = fr if source != "" : exemple["source"] = source if lien != "" : exemple["lien"] = lien return exemple ## ## Saisie des infos ## # Saisie de la forme current_step = "form" forme = saisir("mot : ") nature = getnature(forme) #Traitement des caractères spéciaux précence_car_special = detectercarspecial(forme) if précence_car_special: var_x = varier(forme, 'x') var_h = varier(forme, 'h') #Prononciation current_step = "pron" pron = formatpron(saisir("prononciation : ")) while True: confirm = saisir("\taperçu : /"+pron+"/\n") if confirm == "" : break else : pron = formatpron(confirm) #Etymologie current_step = "etym" eoetym = saisir("eo-étym|") while True: confirm = saisir("\taperçu : {{eo-étym|"+eoetym+"}}\n") if confirm == "" : break else : eoetym = confirm #Traitement des racines du mot racines = [] if "/" in eoetym: for i in eoetym.split('|'): if i.endswith('/'): i = i.replace('/','') racines.append(i) #Récupération des racines qui composent le mot #Valence (si verbe) current_step = "val" if nature == "verbe": valence = saisir("valence (t/i/?) : ") if valence == "" : valence = "?" #Definition current_step = "defs" defs = {} i = 0 while True: definition = formatdef(saisir("définition {} : ".format(i+1))) if i > 0 and definition == "": break defs[i] = {} while True: confirm = saisir("\taperçu : "+definition+"\n") if confirm == "" : break else : definition = formatdef(confirm) defs[i]["def"] = definition relation = saisir("relation : ") if relation != "" : defs[i]["rel"] = [] while True: defs[i]["rel"].append(relation) relation = saisir("autre relation : ") if relation == "": break defs[i]["ex"] = [] while True: eo = saisir("exemple : ") if eo == "" : break fr = saisir("traduction : ") source = saisir("source : ") lien = saisir("lien : ") defs[i]["ex"].append(formatex(eo,fr,source,lien)) i = i + 1 #Glossaires current_step = "glos" glossaires = saisir("glossaire(s) : ") if not "épices, " in glossaires: # glossaire "épices" automatiquement remplacé par "épices, aromates et condiments" autom glossaires = glossaires.replace("épices", "épices, aromates et condiments") # Variante -o- current_step = "var" variante_voyelle_appui = [] if eoetym.count('/') == 2: if saisir("Variante avec/sans voyelle d’appui ? (o/n) ") == "o" : if "-o-" in eoetym: variante = eoetym.replace('-o-','') #Retrait de la voyelle d'appui variante_voyelle_appui.append('sans') else: index = eoetym.find('/') variante = eoetym[:index] + 'o' + eoetym[index:] #Ajout de la voyelle d'appui variante_voyelle_appui.append('avec') variante = variante.replace('|','').replace('/','').replace('-','') variante_voyelle_appui.append(variante) # Synonymes current_step = "syn" synonymes = [] while True: syno = saisir("synonyme(s) : ") if syno == '': break syno = syno.split('=') couple = [] for i in syno: couple.append(i.strip()) synonymes.append(couple) # Antonymes current_step = "ant" antonymes = [] while True: anto = saisir("antonyme(s) : ") if anto == '': break anto = anto.split('=') couple = [] for i in anto: couple.append(i.strip()) antonymes.append(couple) # Hyperonymes current_step = "hypr" hyperonymes = [] while True: hypero = saisir("hyperonyme(s) : ") if hypero == '': break hypero = hypero.split('=') couple = [] for i in hypero: couple.append(i.strip()) hyperonymes.append(couple) # Hyponymes current_step = "hypo" hyponymes = [] while True: hypo = saisir("hyponyme(s) : ") if hypo == '': break hypo = hypo.split('=') couple = [] for i in hypo: couple.append(i.strip()) hyponymes.append(couple) Hypo = 0 # Lien vers WP current_step = "wik" if saisir("lien wikipedia ? (o/n) ") == "o": wp = True else: wp = False # Références current_step = "ref" references = [] if saisir("Références utilisées (o/n) :\n\tPIV ? ") == "o" : references.append('piv') if saisir("\tRetavortaro ? ") == "o" : references.append('ret') if saisir("\tWaringhien ? ") == "o" : references.append('war') # Images current_step = "img" images = [] while True: img = saisir("image : ") if img == "": break if img.startswith("File:"): img = img.replace("File:", "") if saisir("image format portrait ? (o/n) ") == "o": redresse = True else: redresse = False leg_eo = saisir("légende (eo) : ") leg_eo = formatex(leg_eo)["eo"] leg_fr = saisir("légende (fr) : ") images.append({"file":img, "redresse":redresse, "leg_eo":leg_eo, "leg_fr":leg_fr}) current_step = "chek" saisir("Faites [Entrée] pour générer le wikicode >") ## ## ## Construction du wikicode ## ## w = "" if précence_car_special: if 'ŭ' in forme and len(var_h) == len(forme): w+= "<<voir|{}>>\n\n".format(var_h) w+= "== <<langue|eo>> ==" # page wikicode if précence_car_special: w+= "\n<<voir autres systèmes|eo|{}|{}>>".format(var_x,var_h) #Section grammaticale et ligne de forme w+= "\n=== <<S|étymologie>> ===\n" if eoetym == "": w+= ": <<ébauche-étym|eo>>" else: w+= ": <<date|lang=eo>> <<eo-étym|{}>>.".format(eoetym) w+= "\n\n=== <<S|{}|eo>> ===".format(nature) if nature in ['nom', 'adjectif']: w+= "\n<<eo-flexions|{}>>".format(pron) elif nature == 'verbe': w+= "\n<<eo-verbe>>" w+= "\n'''{}''' <<pron|{}|eo>>".format(forme,pron) if nature == 'verbe': if valence == '?': w+= " <<valence ?|eo>>" else: w+= " <<{}|eo>>".format(valence) #Image(s) if len(images) > 0: for image in images: w+= "\n[[Image:{}|vignette".format(image['file']) if image['redresse'] == True: w+= "|redresse" if image['leg_eo'] != "": w+= "|''{}''".format(image['leg_eo']) if image['leg_fr'] != "": w+= " (« {} »)".format(image['leg_fr']) w+= "]]" #Définition(s) d = 0 #numéro de définition while d in defs: w+= "\n# " if 'rel' in defs[d]: for r in defs[d]['rel']: w+= "<<{}|eo>> ".format(r) if defs[d]['def'] == '': w+= "<<ébauche-déf|eo>>" else: w+= defs[d]['def'] if len(defs[d]['ex']) == 0: w+= "\n#* <<exemple|lang=eo>>" else: for numex, v in enumerate(defs[d]['ex']): w+= "\n#* <<exemple|lang=eo" w+= "\n |" + defs[d]['ex'][numex]['eo'] if 'fr' in defs[d]['ex'][numex]: w+= "\n |" + defs[d]['ex'][numex]['fr'] if 'source' in defs[d]['ex'][numex]: w+= "\n |source=" + defs[d]['ex'][numex]['source'] if 'lien' in defs[d]['ex'][numex]: w+= "\n |lien=" + defs[d]['ex'][numex]['lien'] w+= ">>" d = d+1 #Variante voyelle d'appui if len(variante_voyelle_appui) > 0: w+= "\n\n==== <<S|variantes>> ====" w+="\n* {} la voyelle d’appui <<lien|-o-|eo>> : <<lien|{}|eo>>".format(variante_voyelle_appui[0],variante_voyelle_appui[1]) # Synonymes if len(synonymes) > 0: w+= "\n\n==== <<S|synonymes>> ====" for s in synonymes: w+= "\n* <<lien|{}|eo".format(s[0]) if len(s) == 2: w+= "|sens=" + s[1] w+=">>" # Antonymes if len(antonymes) > 0: w+= "\n\n==== <<S|antonymes>> ====" for a in antonymes: w+= "\n* <<lien|{}|eo".format(a[0]) if len(a) == 2: w+= "|sens=" + a[1] w+=">>" # Apparentés if len(racines) > 0: w+= "\n\n==== <<S|apparentés>> ====" for r in racines: w+= "\n<<liste dérivés racine|eo|{}>>".format(r) # Vocabulaire if glossaires != "": w+= "\n\n==== <<S|vocabulaire>> ====" w+= "\n<<glossaire|{}|eo>>".format(glossaires) # Hyperonymes if len(hyperonymes) > 0: w+= "\n\n==== <<S|hyperonymes>> ====" for a in hyperonymes: w+= "\n* <<lien|{}|eo".format(a[0]) if len(a) == 2: w+= "|sens=" + a[1] w+=">>" # Hyponymes if len(hyponymes) > 0: w+= "\n\n==== <<S|hyponymes>> ====" for a in hyponymes: w+= "\n* <<lien|{}|eo".format(a[0]) if len(a) == 2: w+= "|sens=" + a[1] w+=">>" # Prononciation w+="\n\n=== <<S|prononciation>> ===" w+="\n* <<pron|{}|eo>>".format(pron) w+="\n* <<écouter|lang=eo|France (Toulouse)|audio=LL-Q143 (epo)-Lepticed7-{}.wav>>\n<<ébauche-pron-audio|eo>>".format(forme) # Voir aussi if wp: w+="\n\n=== <<S|voir aussi>> ===\n* <<WP|lang=eo>>" #Références if len(references) > 0: w+= "\n\n=== <<S|références>> ===" w+= "\n==== <<S|bibliographie>> ====" if 'piv' in references: w+= "\n* <<R:PIV|mot={}>>".format(forme) if 'ret' in references: rac = varier(racines[-1],'x') w+= "\n* <<R:Retavort|rac={}|mot={}>>".format(rac,forme) if 'war' in references: w+= "\n* <<R:Waringhien1957>>" if précence_car_special: w+= "\n\n<<clé de tri|{}>>".format(var_x) w = wdecrypt(w) copy(w) print("\nCode wikisource copié dans le presse-papier.") # # Post-traitement : # Pages annexes # # current_step = "anx" def w_var(forme,pron,système): # Variante-x ou -h (ex regxo/regho) # fonction qui prend en entrée la forme, la pron du mot de base et le système duquel il est une variante # revoie le wikicode de la page associée sys_pr = système sys_sec = ['h', 'x'] sys_sec.remove(système) sys_sec = sys_sec[0] v_pr = varier(forme, sys_pr) #variante locale par système principal (indiqué par système) v_sec = varier(forme, sys_sec) #variante locale par système secondaire wikicode = "== <<langue|eo>> ==" wikicode+= "\n<<voir autres systèmes|eo|{}|{}>>".format(forme,v_sec) wikicode+= "\n=== <<S|variante typographique|eo>> ===" wikicode+= "\n'''{}''' <<pron|{}|eo>>".format(v_pr, pron) wikicode+= "\n# <<eo-sys-{}|{}>>.".format(système, forme) wikicode = wdecrypt(wikicode) return wikicode, v_pr def w_flex(forme_base,pron_base,flexion): #flexion (ex reĝoj, reĝon, reĝojn) # fonction qui prend en entrée la forme de base, la pron du mot de base et la flexion à lui appliquer # revoie le wikicode de la page associée txt = dict(j="Nominatif pluriel de",n="Accusatif singulier de", jn="Accusatif pluriel de") forme_flex = forme_base + flexion pron_flex = pron_base + flexion wikicode = "== <<langue|eo>> ==" if précence_car_special: wikicode+= "\n<<voir autres systèmes|eo|{}|{}>>".format(varier(forme_flex,'x'),varier(forme_flex,'h')) wikicode+= "\n=== <<S|nom|eo|flexion>> ===" wikicode+= "\n<<eo-flexions|{}>>".format(pron_base) wikicode+= "\n'''{}''' <<pron|{}|eo>>".format(forme_flex, pron_flex) wikicode+= "\n# ''{} ''[[{}#eo|{}]].".format(txt[flexion], forme_base, forme_base) wikicode+= "\n#* <<exemple|lang=eo>>" if précence_car_special: wikicode+= "\n\n<<clé de tri|{}>>".format(varier(forme_flex,'x')) wikicode = wdecrypt(wikicode) return wikicode, forme_flex, pron_flex if précence_car_special: if saisir("\nGénérer les pages des variantes x et h ? (o/n) ") == "o": w_x, var_x = w_var(forme,pron,'x') copy(w_x) saisir("\t Page de {} copiée dans le presse-papier. [Entrée] pour continuer…".format(var_x)) w_h, var_h = w_var(forme,pron,'h') copy(w_h) print("\t Page de {} copiée dans le presse-papier.".format(var_h)) if nature in ['nom', 'adjectif']: if saisir("Générer les pages des flexions -j, -n et -jn ? (o/n) ") == "o": if précence_car_special and saisir("\nGénérer aussi les variantes x et h de ces flexions ? (o/n) ") == "o": wj, flexj, pronj = w_flex(forme,pron,'j') copy(wj) saisir("\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(flexj)) wj_x, varj_x = w_var(flexj, pronj, 'x') copy(wj_x) saisir("\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(varj_x)) wj_h, varj_h = w_var(flexj, pronj, 'h') copy(wj_h) saisir("\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(varj_h)) wn, flexn, pronn = w_flex(forme,pron,'n') copy(wn) saisir("\n\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(flexn)) wn_x, varn_x = w_var(flexn, pronn, 'x') copy(wn_x) saisir("\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(varn_x)) wn_h, varn_h = w_var(flexn, pronn, 'h') copy(wn_h) saisir("\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(varn_h)) wjn, flexjn, pronjn = w_flex(forme,pron,'jn') copy(wjn) saisir("\n\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(flexjn)) wjn_x, varjn_x = w_var(flexjn, pronjn, 'x') copy(wjn_x) saisir("\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(varjn_x)) wjn_h, varjn_h = w_var(flexjn, pronjn, 'h') copy(wjn_h) print("\t Page de '{}' copiée dans le presse-papier.".format(varjn_h)) else: wj, flexj = w_flex(forme,pron,'j')[:2] copy(wj) saisir("\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(flexj)) wn, flexn = w_flex(forme,pron,'n')[:2] copy(wn) saisir("\t Page de '{}' copiée dans le presse-papier. [Entrée] pour continuer…".format(flexn)) wjn, flexjn = w_flex(forme,pron,'jn')[:2] copy(wjn) print("\t Page de '{}' copiée dans le presse-papier.".format(flexjn))