#!/usr/bin/ruby # -*- coding: utf-8 -*- # Génération individuelle des sujets avec pdflatex # Lancement : # ruby genere_sujets.rb # Exécutables nécessaires à installer : # * unoconv : version 'ligne de commande' de libreoffice. # Problèmes connus : # * Classe ou gem ruby manquant : installer le gem correspondant # --> exemple pour installer le gem 'highline' : sudo gem install highline # * Erreur de unoconv : "Error: Unable to connect or start own listener. Aborting." # --> Survient parfois si un fichier .ods est déjà ouvert. Simplement relancer le script. # Classes et gems ruby nécessaires ##################################### # pour installer un gem manquant, par exemple le gem 'machin' : # sudo gem install machin require 'fileutils' # Configuration ##################################### $file = "assignation.ods" # format ods (ou xls) $source = "Exam2020.tex" $sujetdir = "Sujets" # destination des sujets $correcdir = "Corrigés" # destination des corrigés $builddir = "build" # destination des fichiers auxiliaires #$a_generer = [:sujet] #$a_generer = [:corrige] $a_generer = [:sujet, :corrige] # Conversion automatique du fichier ODS (ou XLS) en un fichier (caché) CSV ###################################### # nécesite d'avoir installé unoconv # Options du filtre: voir # https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options ods2csv_command = "unoconv -f csv -e FilterOptions=58,34,76,3,,2060,true,true" ext = File.extname($file) if ext != ".ods" and ext != ".xls" puts "ERROR. Wrong file format. Only .ods or .xls accepted" exit(1) end csvfile = ".#{File.basename($file, ext)}.csv" if not system(ods2csv_command+" -o #{csvfile} #{$file}") warn "Unoconv conversion error (arrive souvent, relancer simplement le script)" exit(1) end # Génération des sujets ###################################### puts "Génération des sujets avec PDFLATEX" IO.readlines(csvfile).each do |l| data = l.chomp.split(":"); # chomp vire le \n final # 5 premières colonnes (toujours les mêmes) grnum = Integer(data.shift()) rescue nil next unless grnum && grnum >= 0 # Continue uniquement pour les "vraies" lignes, caractérisées par un "vrai" numéro de groupe en 1ère colonne (entier poitif). nom = data.shift().tr('"', '') prenom = data.shift().tr('"', '') adresse = data.shift().tr('"', '') pdfname = data.shift().tr('"', '') # Colonnes restantes -> assignedparameters assignedparameters=data.map{|d| d.tr('"', '')}.join(",") $a_generer.each do |sujcorr| case sujcorr when :sujet pdfdir = $sujetdir iscorrec = 0 when :corrige pdfdir = $correcdir iscorrec = 1 end FileUtils.mkdir "#{pdfdir}" if not Dir.exists? "#{pdfdir}" FileUtils.mkdir "#{$builddir}" if not Dir.exists? "#{$builddir}" pdflatex_command = "pdflatex -jobname=\"#{pdfname}\" -output-directory #{$builddir} \"\\def\\iscorrec{#{iscorrec}} \\def\\assignedparameters{#{assignedparameters}} \\input{#{$source}}\"" if not system(pdflatex_command) warn "pdflatex error" exit(1) end FileUtils.mv("#{$builddir}/#{pdfname}.pdf",pdfdir) FileUtils.rm_r Dir.glob("#{$builddir}/*") end end