Utilisateur:Cynddl/Autogen leçons par niveau

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche

Le code suivant permet de générer automatiquement une version statique des pages du type Leçons par niveau des départements de la Faculté de Mathématiques.

Code Python[modifier | modifier le wikicode]

Ce code n’est pas parfait, loin de là... je ne fais que débuter dans la programmation python (mon deuxième prog !). Pour le lancer, vous avez besoin de pyyaml et pywikibot-rewrite.

#! /usr/bin/env python
# -*- coding: utf-8 -*-
 
import re
import yaml
 
from optparse import OptionParser
 
import pywikibot
from pywikibot import catlib # DEBUG
from pywikibot import Category
from pywikibot import pagegenerators
 
site = pywikibot.getSite()

def join(a,b):
	return list(set(a)|set(b))
 
def articles_in_cat(cat_name, recurse=True):
	cat = catlib.Category(site, cat_name)
	return list(cat.articles(recurse=recurse))
 
def articles_from_level(k, recurse=False):
	cat = catlib.Category(site, u'Catégorie:Leçon de niveau '+str(k))
	return list(cat.articles(recurse=recurse))
  
class GeneratorBot:
	def __init__(self, page_name, category_name, patterns, code):
		self.page_name = page_name
		
		self.category_name = category_name
		self.category = Category(site, self.category_name)
		
		self.category_lecons = reduce(join,[list(cat.articles()) for cat in self.category.subcategories()])
		
		self.patterns = patterns
		self.code = code
		self.articles_names_from_level = [[x.title() for x in articles_from_level(k) if x in self.category_lecons] for k in range(0,19)]
		self.avcm_cats_names = frozenset([u"Catégorie:Leçon d'avancement 0", u"Catégorie:Leçon d'avancement 1", u"Catégorie:Leçon d'avancement 2", u"Catégorie:Leçon d'avancement 3", u"Catégorie:Leçon d'avancement 4"])
		
		# Pour l'instant un seul type d'action !
		self.actions = dict(GENERATE_LEVEL = lambda args : self.generate_level(range(args['from'], args['to']+1)))
		
	def	get_avancement(self, lecon_name):
		'''Renvoie l'avancement d'une leçon à partir de son nom'''
		cat = set(pywikibot.Page(site, u"Discussion:" + lecon_name).categories())
		cat_names = set([x.title() for x in cat])
		if cat_names.isdisjoint(self.avcm_cats_names):
			return u"0"
		else:
			return cat_names.intersection(self.avcm_cats_names).pop()[-1]
	
	def generate_level(self, seq):
		'''Génère une "liste" (formatée sous forme de code wiki) des articles de self.category, de niveau dans seq.'''
		return "\n".join(["* {{L|[[%s]]|%s|%i}}" % (x, self.get_avancement(x), k) for k in seq for x in self.articles_names_from_level[k]])
	
	def parse(self):
		p = re.compile(r'\$(.*?)\$')
		for	i in p.findall(self.code):
			t = self.patterns[i]
			self.code = self.code.replace("$"+i+"$", self.actions[t['type']](t['args']))
		print "All code has been parsed !"
 
	def run(self):
		p = pywikibot.Page(site, self.page_name)
		self.parse()
		p.put(self.code, "Mise à jour automatique de la page.")
 
def main():
	parser = OptionParser()
	parser.add_option('-f', '--file', type="string")
	options, args = parser.parse_args()
 
	stream = open(options.file, 'r')
	inc = yaml.load(stream)
	stream.close()
 
	bot = GeneratorBot(inc['page'], inc['category'], inc['patterns'], inc['code'])
	bot.run()
 
 
if __name__ == '__main__':
    try: 
        main() 
    finally: 
        pywikibot.stopme()

Utilisation[modifier | modifier le wikicode]

Il suffit d'exécuter le script avec en argument --file=fichier_template, où fichier_template est un fichier YAML du type :

page: "Utilisateur:Cynddl/Test_leçons"

category: "Catégorie:Algèbre"

patterns:
    NIV_1_3: {type: "GENERATE_LEVEL", args: {from: 1, to: 3}}
    NIV_4_6: {type: "GENERATE_LEVEL", args: {from: 4, to: 6}}
    NIV_7_9: {type: "GENERATE_LEVEL", args: {from: 7, to: 9}}
    NIV_10_12: {type: "GENERATE_LEVEL", args: {from: 10, to: 12}}
    NIV_13_15: {type: "GENERATE_LEVEL", args: {from: 13, to: 15}}
    NIV_16_18: {type: "GENERATE_LEVEL", args: {from: 16, to: 18}}

code: |
    {| width=100% border=0 style="background-color: #{{Idfaculté/pastel/mathématiques}};"
    | width=33% valign="top" | '''Novice''' <span style="font-size: 80%; border: ">[[Aide:Niveau de difficulté|Niveau]] 0 à 2</span>
    $NIV_1_3$
    | width=33% valign="top" | '''Débutant''' <span style="font-size: 80%; border:">[[Aide:Niveau de difficulté|Niveau]] 2 à 5</span>
    $NIV_4_6$
    | width=33% valign="top" | '''Intermédiaire''' <span style="font-size: 80%; border: ">[[Aide:Niveau de difficulté|Niveau]] 6 à 9</span>
    $NIV_7_9$
    |-
    |valign="top" | '''Avancé''' <span style="font-size: 80%; border: ">[[Aide:Niveau de difficulté|Niveau]] 10 à 12</span>
    $NIV_10_12$
    |valign="top" | '''Expert''' <span style="font-size: 80%; border: ">[[Aide:Niveau de difficulté|Niveau]] 13 à 15</span>
    $NIV_13_15$
    |valign="top" | '''Perfectionnement''' <span style="font-size: 80%; border: ">[[Aide:Niveau de difficulté|Niveau]] 16 à 18</span>
    $NIV_16_18$
    |}
    [[Catégorie:Algèbre]]