logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 25-10-2018 20:02:22

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

convertir des qcm en .docx en .aiken puis en .gift

Hello,
j'ai pas ma le de qcm au format docx que je voudrai arrivé à importer dans moodle qui supporte l'import de fichiers aux format aiken https://docs.moodle.org/35/en/Aiken_format pour les qcm simple et gift https://docs.moodle.org/23/en/GIFT_form … t_examples pour des qcm nettement plus complex.

il y a qq exemples bien documentés sur l'utilisation du format gift ici: https://moodle-admin.parisdescartes.fr/ … hp?id=6748

J'ai déjà eu beaucoup d'aide sur l'irc de df (merci les gars!!) ce qui m'a permis de passer de passer d'un docx à quasiment un aiken (il  y a encore qq trucs à faire manuellement mais très peu).

J'ai fait un répertoire avec qq fichiers sur lesquels je dois travailler et donc intégrer dans le moodle... c'est un échantillon il y en a en réalité bien plus...

Les doc se trouvent là: http://163.172.214.170/owncloud/index.p … 5Up8JhxmCS

Pour que vous puissiez vous repérer dans le bazzard voila l’arborescence du répertoire:

.
.
├── DOSSIER_QCM_en_docx
│   ├── 00-QCM1-Menuiserie_en_general-C-.docx
│   ├── 0-QCM2-Menuiserie_en_general-C-.docx
│   ├── 10-QCM-TOV_SCM_T130-C-.docx
│   ├── 11-QCM-PER_C-C-.docx
│   ├── 12-QCM-PER_M-C-.docx
│   ├── 13-QCM-Plaq-C-.docx
│   ├── 14-QCM-Le_debit_et_le_sciage-C-fait-.docx
│   ├── 15-QCM-Les_proprietes_Mecanique_et_Physique-C-fait-.docx
│   ├── 16-QCM-Le_sechage_naturel_et_artificiel_du_bois-C-.docx
│   ├── 17-QCM-Les_panneaux_derives_du_bois-C-.docx
│   ├── 18-QCM-Classification_botanique_et_essence-C-.docx
│   ├── 19-QCM-Les_colles-C-.docx
│   ├── 1-QCM-DEG-C-.docx
│   ├── 20-QCM-Le_comportement_du_bois_en_fonction_des_conditions_de_mise_en_oeuvre-C-.docx
│   ├── 2-QCM-RAB-C-.docx
│   ├── 3-QCM-MOM-C-.docx
│   ├── 4-QCM-MOB-C-.docx
│   └── 5-QCM-SCP_V-C-.docx
├── Notes_commandes_sed_pour_txt_2_aiken.txt
├── premiers_essais_avec_sed
│   ├── 00-QCM1-Menuiserie_en_general-E-.docx
│   ├── 00-QCM1-Menuiserie_en_general-E-.txt
│   ├── 01_qcm_menui_generalites.txt
│   ├── QCM1_enregistrer_sous_txt_av_libreoffice.txt
│   ├── testsed_suppr_sauts_de_lignes_ajoute_._et_un_espace.txt
│   ├── testsed_suppr_sauts_de_lignes.txt
│   ├── test_suppr_points.txt
│   ├── test_supr_lignes_comm_par.txt
│   ├── test_supr_mots_question_num.txt
│   └── tets_sed_majuscules.txt
└── Syntaxe-du-format-GIFT.pdf

2 directories, 30 files



Les echantillons sont dans DOSSIER_QCM_en_docx
Les résultats des premiers essais sont dans premiers_essais_avec_sed
Les commandes sed pour obtenir le resultat se trouve dans le fichier Notes_commandes_sed_pour_txt_2_aiken.txt

Voici les commandes sed qui me permette de quasiment avoir un fichier aiken:

#export en *.txt
cd /ds/le/bon/rep
libreoffice --headless --convert-to "txt:Text (encoded):UTF8" *.docx
#nettoyage
rm *.docx
#transformation des a b c en A B C
sed -e 's/\(^.$\)/\U\1/' *.txt
#Supprime les sauts de ligne pour mettre les lettres majuscule devant chaque ligne
sed -e '/^.$/ N;s/\n//'
#supprime les sauts de ligne et ajoute un .et un espace après le point
sed -e '/^.$/ N;s/\n/\.\ /'
#supprime tous les points à la fin de chaque ligne
sed 's/\.$//'
#supprime les lignes qui commences par (
sed '/^(/d'
#Supprime tous les "Questions N°2: " "Questions N°3: " "Questions N°4: " etc...
sed -E 's/Question n.[0-9].*: *//'






La première étape serait d'arriver à faire un script qui fasse la conversion *.docx >> *.txt et la somme de toutes les commandes sed en un coup et en recursif vu que le taf doit être fait sur plusieurs fichiers.
De la je tenterai de trouver une solution pour me macher le travail pour le passage au format gift...


Un grand merci à vous car je me sers jamais de sed...et seul ce serai une mission suicide *_*

Dernière modification par cemoi (25-10-2018 20:37:07)


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#2 25-10-2018 23:30:52

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

Bonjour cemoi.
J'ai téléchargé 0-QCM2-Menuiserie_en_general-C-.docx et j'ai quelques doutes:
A ) Tu veux inclure les "(Une seule réponse possible) (2 points)" dans les questions?
PS: Pardon. les lignes

#supprime les lignes qui commences par (
sed '/^(/d'

me donnent la réponse.

B) Il faut virer tout le reste, non? Par exemple:

Nom :                      Prénom :                                     Classe :
QCM 2–  Menuiserie en général : CORRIGE
Entourer la lettre pour valider la ou les  bonnes réponses.



ou

Date de l’évaluation : ___/____/20____


CAP MI – M. PARIS



C) La commande
#Supprime les sauts de ligne pour mettre les lettres majuscule devant chaque ligne

sed -e '/^.$/ N;s/\n//'


n'est pas nécessaire si on exécute la suivante
#supprime les sauts de ligne et ajoute un .et un espace après le point

sed -e '/^.$/ N;s/\n/\.\ /'


n'est ce pas?

Dernière modification par empanada (25-10-2018 23:35:31)


"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#3 26-10-2018 07:17:27

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

hello,
A: tu as eu ta réponse
B: oui il faut virer tout le reste
C: oui effectivement il y a un doublon dans mes commandes.

smile

Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#4 26-10-2018 11:44:13

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

Tu presque l'avait. Il manquait garder les réponses correctes (il faut le faire avant la conversion docx-->txt), mais ce n'est pas compliqué.
Plus des questions:
Gift parait pas trôp compliqué.
A) Veux-tu ajouter de coefficient négatif aux réponses incorrectes? ("il est conseillé d'inclure des coefficients négatifs pour les réponses fausses")
B) Quand au réponses correctes, je pensais en leur assigner un pourcentage = ((Points de la question) / nombre de réponses correctes de cette question ) / (Points totales du QCM)

PS: Je ne connaissais pas moodle, il parait un projet sympa... mais le "Syntaxe-du-format-GIFT.pdf" me rendre un peu triste, puisqu'au début de fichier, il explique seulement "création du fichier" pour Windows et Mac sad

Dernière modification par empanada (26-10-2018 11:44:54)


"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#5 26-10-2018 12:49:30

Toto_lancien
Membre
Distrib. : Strech
Noyau : Linux 4.9.0-6-amd64
(G)UI : OpenBox
Inscription : 21-07-2009

Re : convertir des qcm en .docx en .aiken puis en .gift

Tout est quasiment fait... Il ne te manque qu'a enchaîner les sed :
(J'ai viré les commentaires ils me génaient pour enchaîner les sed. Il existe d'autres façons de faire, mais je trouve celle là lisible).

#! /usr/bin/env bash

FICHIER="${1}"
#A tester
#cd $(dirname "${FICHIER}")

libreoffice --headless --convert-to "txt:Text (encoded):UTF8" "${FICHIER}"

#On gère toutes les modifs d'un coup en parallèle
#echo ${FICHIER%.docx}.txt
cat ${FICHIER%.docx}.txt |\
sed -e 's/\(^.$\)/\U\1/' |\
sed -e '/^.$/ N;s/\n/\.\ /' |\
sed 's/\.$//' |\
sed '/^(/d' |\
sed -E 's/Question n.[0-9].*: *//' >${FICHIER%.docx}.aiken

#nettoyage
rm *.docx *.txt

exit 0



Pour les explications de la syntaxe

${FICHIER%.docx}.txt

qui sert a changer l'extension du fichier original, voir https://abs.traduc.org/abs-5.1-fr/ch09s02.html (Ce site est une mine d'or).

Le même site (ici https://abs.traduc.org/abs-fr/ch16s02.html ) te parle du couple find -exec et find xargs. L'idée est de passer en argument au script les fichiers à traiter, eux mêmes recherchés par find.
Ca tombe bien,

FICHIER="${1}"

récupère le premier paramètre que tu vas donner a ton script, et estime que c'est le nom du fichier à traiter.

Donc tu lances le script comme ceci pour faire un fichier:

./mon_bo_script.sh mon_fichier_a_traiter.docx



Après si tu veux le coté récursif, tu mets le script dans le PATH :

find . -name '*.docx' -exec mon_bo_script.sh {} \;



Une condition cependant, évites les espaces et autres caractères spéciaux dans le chemin, sinon lire la doc signalée plus haut.

Après si tu as tous tes fichiers docx dans le même répertoire, pour peu que le script soit dans le même répertoire :

for fich in $(ls *.docx); do ./mon_bo_script "${fich}"; done


Idem, éviter les espaces dans les noms de fichiers...

Pour enlever tes entêtes de fichiers :

tail -n +5 fichier


Va te supprimer les 5 premières lignes du fichier, tu peux le rajouter a travers un "|" a tes traitements sed.

Hors ligne

#6 26-10-2018 18:06:57

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

empanada a écrit :

Tu presque l'avait. Il manquait garder les réponses correctes (il faut le faire avant la conversion docx-->txt), mais ce n'est pas compliqué.
Plus des questions:
Gift parait pas trôp compliqué.
A) Veux-tu ajouter de coefficient négatif aux réponses incorrectes? ("il est conseillé d'inclure des coefficients négatifs pour les réponses fausses")
B) Quand au réponses correctes, je pensais en leur assigner un pourcentage = ((Points de la question) / nombre de réponses correctes de cette question ) / (Points totales du QCM)

PS: Je ne connaissais pas moodle, il parait un projet sympa... mais le "Syntaxe-du-format-GIFT.pdf" me rendre un peu triste, puisqu'au début de fichier, il explique seulement "création du fichier" pour Windows et Mac sad



A: oui si non si les étudiants coches toute les cases sur toutes les questions ils ont la moyenne ou quasi...
B: oui, par default je donne un point par réponse

J'ai mis en ligne sur la racine un export de moodle au "format" gift (fichier quiz-generalites_menuiserie-20181026-1810.txt) on peu mettre plus de choses mais pour le moment je veux  faire simple.

On peu avoir un compte gratos sur un serveur maintenu par l'asso de moodle il me semble je reviendrai mettre le lien ça peux permettre de faire des exports/tests et voir à quoi ça peu ressembler. De mon coté je n'ai pour le moment que une instance locale beacause l'internet n'existe pas là ou je taf  (lycée public)...

Détail troublant le aiken et le gift ne paraissent pas être des formats de fichiers... o_<O en fait c'est une certaine mise en forme dans le *.txt Il n'y a pas de dépendance à l'os (win/mac/unix/linux) ça peut etre fait à partir de n'importe quel logiciel qui gére ça (nano vim emac ...ou autres trucs windozien).


@Toto_lancien

Un grand merci pour ce taf même si ça parait simple pour toi... je vais tester tout ça! J'ai pas beaucoup avancé aujourd'hui car j'ai cramé mon pc portable...ça m'a occupé.


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#7 26-10-2018 18:10:59

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

cemoi a écrit :

j'ai cramé mon pc portable...ça m'a occupé.


Ben et les merguez alors qu'en as-tu fait ? ... ms2.gif


saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#8 27-10-2018 07:41:07

Toto_lancien
Membre
Distrib. : Strech
Noyau : Linux 4.9.0-6-amd64
(G)UI : OpenBox
Inscription : 21-07-2009

Re : convertir des qcm en .docx en .aiken puis en .gift

A la réflexion :
Le nettoyage est un poil barbare, au premier passage du script il va te virer tous les docx roll conclusion mon truc n'en traitera qu'un.
Donc, ou on nettoie plus finement, on remplace :

rm *.docx *.txt


par

rm ${FICHIER} ${FICHIIER%.docx}.txt


Ou on l'enlève carrément, et on règle le problème à la fin du traitement:

for fich in $(ls *.docx); do ./mon_bo_script "${fich}"; done; rm *.{docx,txt}



Si comme le souligne @empanada tu veux enlever les en-têtes et fin de fichiers, tail et head sont là... Je suppose que tu veux virer les 3 premières et les 4 dernières.

#! /usr/bin/env bash

FICHIER="${1}"
#A tester
#cd $(dirname "${FICHIER}")

libreoffice --headless --convert-to "txt:Text (encoded):UTF8" "${FICHIER}"

#On gère toutes les modifs d'un coup en parallèle
#echo ${FICHIER%.docx}.txt
cat "${FICHIER%.docx}.txt" |\
sed -e 's/\(^.$\)/\U\1/' |\
sed -e '/^.$/ N;s/\n/\.\ /' |\
sed 's/\.$//' |\
sed '/^(/d' |\
sed -E 's/Question n.[0-9].*: *//' |\
tail -n +3 |\
head -n -4 >${FICHIER%.docx}.aiken

#A voir
#rm ${FICHIER} ${FICHIIER%.docx}.txt

exit 0
 



EDIT: Après discussion sur IRC, correction des erreurs et différences entre ma version d'essai, et celle publiée sur le forum

Dernière modification par Toto_lancien (27-10-2018 16:12:11)

Hors ligne

#9 27-10-2018 14:42:47

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

je saisi pas pourquoi mais ça supprime presque tout... j'ai testé avec le répertoire DOSSIER_QCM_docx en mettant le script dans le repertoir et en faisant un:

for fich in $(ls *.docx); do ./script_conv_docx2_aiken.sh "${fich}"; done
 



Il reste presque rien voir rien dans les *.txt apres... je capte pas sur ce coup là.


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#10 27-10-2018 14:56:07

Toto_lancien
Membre
Distrib. : Strech
Noyau : Linux 4.9.0-6-amd64
(G)UI : OpenBox
Inscription : 21-07-2009

Re : convertir des qcm en .docx en .aiken puis en .gift

Hum, head ne marche pas comme tail. remplacer 

head -n +5

par

head -n -5

Dernière modification par Toto_lancien (27-10-2018 14:59:19)

Hors ligne

#11 28-10-2018 17:45:34

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

Hello,
je viens mettre la dernière version du script ecrit par toto_lancien qui sort un fichier txt avec la syntaxe aiken dedans.
Ca sort qqchose de bien propre directement importable dans moodle.

La syntaxe aiken ne permet que des qcm simple avec une seule réponse possible. Pour pouvoir gérer d'autres choses plus complexes il faut passer la syntaxe gift.
Avoir des fichiers txt avec al syntaxe aiken permet de partir sur une base relativement universelle donc interopérable entre les plateformes de LMS ( https://fr.wikipedia.org/wiki/Learning_ … ent_system ).

Pour le moment je vais travailler avec ça, en gros j'importe dans le moodle puis je modifie question par question suivant le besoin. Apres ça le moodle me fait une syntaxe gift suivant ce que j'ai mis (genre plusieurs réponses possible et combien de points attribué par question) il m'exporte les questions en gift.

#! /usr/bin/env bash

FICHIER="${1}"

libreoffice --headless --convert-to "txt:Text (encoded):UTF8" "${FICHIER}"

#On gère toutes les modifs d'un coup en parallèle
#echo ${FICHIER%.docx}.txt
cat "${FICHIER%.docx}.txt" |\
sed '/^$/d' |\
sed -e 's/\(^.$\)/\U\1/' |\
sed -e '/^.$/ N;s/\n/\.\ /' |\
sed 's/\.$//' |\
sed '/^(/d' |\
sed '/^Question/ iANSWER:\n' |\
sed -E 's/Question n.[0-9].*: *//' |\
tail -n +6 |\
head -n -2 >"${FICHIER%.docx}.aiken"
echo "ANSWER:" >>"${FICHIER%.docx}.aiken"
#
#nettoyage
#rm *.docx *.txt

exit 0



Il y a certainement des améliorations peut etre... suivant ce que je vais en faire surtout!
Le top serai de le faire tourner sur un serveur et qu'il traite un répertoire en particulié toutes les 10min par exemple. Ce permettrai de pouvoir convertir les qcm en docx automatiquement. Le répertoire peut être un répertoire partagé d'un owncloud et du coup on peu mutualiser les qcm et leur conversion pour apres gérer les imports.

Ce script reste basic mais il va traiter des milliers de questions...voir plus. wink


Il y a pl0p6 qui m'a également fait un script avec déplacement des fichiers dans un autre répertoire pour que ce soit plus organisé, je n'ai pas eu le temps de le tester mais je vais le faire et je viendrai faire un retour ici.

#!/bin/bash

[[ ! "${1}" == "-x" ]] && {
  echo -e "Usage:\n ${0} -x [file to use] [directory to save work]\n${0} -x [directory to use] [directory to save work]"
  exit 1
}

FICHIER="${2}"
FICHIER_WITH_PATH=$(readlink -f "${FICHIER}" )
DIRTO="${3}"
tmpfile=$(mktemp )

traitement(){
while read line;do
        [[ ${#line} -eq 1 ]] &&  {
                l=$(echo "${line^^}.")
                bool=1
                continue
        }
        [[ ${bool} -eq 1 ]] && {
                echo "${l} $( echo ${line} )" >> ${tmpfile}
                bool=0
                continue
        }
        [[ "${line}" == "Question"* ]] && {
                echo "ANSWER: "  >> ${tmpfile}
                echo -e "\n${line##*: }"   >> ${tmpfile}
                continue
        }
        echo ${line}  >> ${tmpfile}

done < <( cat "${FICHIER_WITH_PATH}"  | awk '! /^\(/ && ! /^$/ && NF && NR > 3 {print}' | head -n-3 )
echo "ANSWER: "  >> ${tmpfile}
}

[[ -f "${FICHIER}" ]] &&  {
  traitement
}


[[ -d "${FICHIER}" ]] &&  {
  for file in "$( readlink -f "${FICHIER}")/*"; do
    FICHIER_WITH_PATH=$(readlink -f "${file}")
    traitement
  done
}

  #libreoffice --headless --convert-to "txt:Text (encoded):UTF8" "${FICHIER_WITH_PATH}"


mv ${tmpfile} ${DIRTO}/${FICHIER}.aiken

exit 0



Je vais regarder si je peux importer le aiken dans d'autres logiciels et tenter de faire un choix de format suivant une problématique de pérennité du travail...

Merci à tous de votre aide!


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#12 28-10-2018 19:10:52

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

Bonsoir cemoi.
Je viens de terminer ce script. Ça a été un beau exercice de bash smile :

Il fait un fichier *.aiken et un *.gift pour chaque *.docx

Tu peux l'exécuter avec

./docx-qcm_to_aiken-gift.sh nom+chemin_repertoire1 nom+chemin_repertoire2 ... nom+chemin_repertoireN



Les noms des répertoires peuvent être avec leur chemin absolu ou relatif  à l'emplacement du script. Donc le plus simple pour faire des essais peut être de placer le script dans le répertoire qui contient les répertoires avec les docx, et l'appeler seulement avec les noms des répertoires.
Si les noms des répertoires contiennent des espaces en blanc, il faut les mètre entre guillemets.

Dans les deux cas j'ai inclus l'information entre parenthèses du nombre de réponses possibles , mais c'est facile à changer.
Par contre j'ai omis les nº points de chaque question.
Les pourcentages de chaque question sont calculés en fonction de l'information entre parenthèses des nombre de points (1 point, 2 points...) . Si le *.docx n'as pas cette info, les questions ont toutes la même valeur.
Comme on avait parlé,dans les *gift les réponses incorrectes restent.

Le succès du script est basé sur la syntaxe des fichiers originales. Et surtout dans la couleur des réponses correctes ("rouge 3" = #ff0000).

Le fonctionnement est expliqué avec des commentaires

#!/bin/bash

# $N = REPERTOIRES

create_aiken_gift(){
    FILE="$1"
libreoffice --headless --convert-to odt  "$FILE"
QCM_ODT="${FILE%.docx}.odt"
###############   Garder les réponses correctes ########################################################################################
#Uncompress *.odt
unzip "${QCM_ODT}" -d "${QCM_ODT%.odt}"

#Inserer des sauts de ligne pour que sed puisse travailler mieux avec, en créant un fichier auxilier "${QCM_ODT%.odt}"/content.txt
sed 's/\([^\]>\)/\1\n/g' "${QCM_ODT%.odt}"/content.xml >"${QCM_ODT%.odt}"/content.txt

#Identifier les style:name qui ont couleur police "rouge 3", et les stocker dans l'array NAME
NAME=($(sed -n 'N;s/<style:style style:family=\"text\" style:name=\"\([A-Z][0-9]\+\)\">.\+fo:color=\"#ff0000\".*/\1/pg;s/<style:style style:name=\"\([A-Z][0-9]\+\)\" style:family=\"text\">.\+fo:color=\"#ff0000\".*/\1/pg;D' ${QCM_ODT%.odt}/content.txt))

#Chercher les réponses en "rouge 3" ,et leur ajouter un "=" devant pour les identifier comme correctes
TOTAL_REGEXP="<text:span text:style-name=\"${NAME[0]}\">"
N=1
while [[ "${NAME[${N}]}" ]];do
  TOTAL_REGEXP="${TOTAL_REGEXP}\|<text:span text:style-name=\"${NAME[${N}]}\">"
  ((N+=1))
done
sed -i "/${TOTAL_REGEXP}/,+1 s/^\([a-zA-Z]\)<\/text:span>/=\1<\/text:span>/g" "${QCM_ODT%.odt}"/content.txt

#Supprimer les sauts de ligne inserés pour travailler avec sed, et storer sur "${QCM_ODT%.odt}"/content.xml de nouveau
tr -d '\n' <"${QCM_ODT%.odt}"/content.txt >"${QCM_ODT%.odt}"/content.xml

#On peur supprimer le fichier auxilier "${QCM_ODT%.odt}"/content.txt
rm "${QCM_ODT%.odt}"/content.txt

#Compreser de nouveau (premier supprimer "${QCM_ODT}")
rm "${QCM_ODT}"
cd "${QCM_ODT%.odt}"
zip -0 -X "${QCM_ODT}" mimetype
zip -r "${QCM_ODT}" * -x mimetype
mv "${QCM_ODT}" ..
cd ..

# Maintenant on l'info des réponses correctes dans "${QCM_ODT}"

#Convertir vers *.txt
libreoffice --headless --convert-to "txt:Text (encoded):UTF8" "${QCM_ODT}"
rm -R "${QCM_ODT%.odt}"
rm "${QCM_ODT}"
#Créer les variables qui gardent les noms des fichiers
QCM_TXT="${QCM_ODT%.odt}.txt"
QCM_AIKEN="${QCM_ODT%.odt}.aiken"
QCM_GIFT="${QCM_ODT%.odt}.gift"
#Trouver la ligne ou commencent les questions
LIGNE=$(( $(sed -n '/Question n°/ =' "$QCM_TXT"| head -1)-2 ))
#Supprimer les lignes d'entête qui ne servent à rien
sed -i "1,+${LIGNE} d" "$QCM_TXT"
#Supprimer les lignes à la fin qui ne servent à rien
sed -i '/Date de l’évaluation/,$ d' "$QCM_TXT"
#Mieux supprimer les "0" à gauche
sed -i 's/Question n°0\([0-9]\)/Question n°\1/g' "$QCM_TXT"
#Jusqu'ici les modificatons comunes. Maintenant on fait deux copies et on peu virer les ofichier auxilier "$QCM_TXT"
cp "$QCM_TXT" "$QCM_AIKEN"
cp "$QCM_TXT" "$QCM_GIFT"
rm "$QCM_TXT"
###############  Exporter vers *.aiken   ########################################################################################
                #transformation des a b c en A B C
sed -i 's/\(^.$\|^=.$\)/\U\1/' "$QCM_AIKEN"
#Garder les réponses correctes à la fin de chaque de chaque bloc question-réponses dans une ligne ANSWER:
#Il faut garder les numeros tel qu'il apparaitrent dans le fichier. Quelques fois avec un "0" à gauche
NUM_QUEST=$(cat "$QCM_AIKEN"|sed -n 's/Question n°\([0-9]*\).*/\1/p'|tail -1)
N=1
while [[ "$N" -le "$NUM_QUEST" ]];do
  ANSWER[$N]=$(sed -n "/Question n°${N}[^0-9]/,/^$/ s/^=\([A-Z]\)$/\1,/p" "$QCM_AIKEN" | tr -d '\n'|sed 's/,$//g')
  ROW=$(sed -n "/Question n°${N}[^0-9]/,/^$/=" "$QCM_AIKEN"|tail -1)
  sed -i "${ROW} i ANSWER: ${ANSWER[${N}]}" "$QCM_AIKEN"
  (( N+=1 ))
done
#Maintenant qu'on a gardé les réponses correctes, on peut supprimer les caractères "="
sed -i '/^=[A-Z]$/ s/=//' "$QCM_AIKEN"
#Quand on a une seule letre mayuscule,on supprime les sauts de ligne et ajoute un .et un espace après le point
sed -i '/^[A-Z]$/ N;s/\n/\.\ /' "$QCM_AIKEN"
#supprime tous les points à la fin de chaque ligne
sed -i 's/\.\+[ \t]*$//' "$QCM_AIKEN"
#supprime les lignes qui commencent par (
#sed -i '/^(/d' "$QCM_AIKEN"
#Si on  veut specifier le nombre de réponses correctes, on comente la ligne anterieure et on dé-comente la suivante:
sed -i '/^Question/N;s/\n/ /;s/).*/)/' "$QCM_AIKEN"
#Supprime tous les "Questions N°2: " "Questions N°3: " "Questions N°4: " etc...
sed -i 's/Question n.[0-9].*: *//' "$QCM_AIKEN"
#Supprime les lines vides répétées
cat -s "$QCM_AIKEN" > "$QCM_AIKEN".tmp && cat "$QCM_AIKEN".tmp > "$QCM_AIKEN" && rm "$QCM_AIKEN".tmp

###############  Exporter vers *.gift   ########################################################################################
#On vérifie si les points de chaque question sont indiqués, sinon, on leur assigne un valeur égal à chaque une:
if [[ -z $(sed -n "/Question n°[0-9]\+/,+1 s/.*(\([0-9]\+\) point.*/\1/p" "$QCM_GIFT") ]];then
  POIDS_QCM=${NUM_QUEST}
                        #Le poids de toutes les questios sera le même
  N=1
                        while [[ "$N" -le "$NUM_QUEST" ]];do
                                POIDS_QUESTION[$N]=$(echo "1/${POIDS_QCM}"|bc -l| sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
#                                echo "POIDS_QUESTION[$N]=${POIDS_QUESTION[$N]}"
                                (( N+=1 ))
                        done

else
  POIDS_QCM=0
  #Si les points sont indiqués dans chaque question, on utilise l'info
  N=1
                  while [[ "$N" -le "$NUM_QUEST" ]];do
    POIDS_QUESTION[$N]=$(sed -n "/Question n°${N}[^0-9]/,+1 s/.*(\([0-9]\+\) point.*/\1/p" "$QCM_GIFT")
    M=${POIDS_QUESTION[$N]}
    POIDS_QCM=$(( M + POIDS_QCM ))
#       echo "POIDS_QUESTION[$N]=${POIDS_QUESTION[$N]}"
                          (( N+=1 ))
                  done
fi
#   echo "POIDS_QCM=${POIDS_QCM}"
#Quand on a un "=" et une seule letre au debut de ligne,on supprime la letre et le saut de ligne
sed -i '/^=[a-zA-Z]$/ N;s/\(^=\)[a-zA-Z]\n\(.*\)/\1\2/' "$QCM_GIFT"
#Quand on a une seule letre au debut de ligne,on substitue la letre par un "~" et le saut de ligne
                sed -i '/^[a-zA-Z]$/ N;s/^[a-zA-Z]\n\(.*\)/~\1/' "$QCM_GIFT"
N=1
                while [[ "$N" -le "$NUM_QUEST" ]];do
  REPONSES_INCORRECTES=$(sed -n "/Question n°${N}[^0-9]/,/^$/p" "$QCM_GIFT"|grep "~" -c)
  REPONSES_CORRECTES=$(sed -n "/Question n°${N}[^0-9]/,/^$/p" "$QCM_GIFT"|grep "=" -c)
  PQ=${POIDS_QUESTION[$N]}
#     echo "REPONSES_INCORRECTES[$N]=$REPONSES_INCORRECTES"
#     echo "REPONSES_CORRECTES[$N]=$REPONSES_CORRECTES"
#     echo "POIDS_QUESTION[$N]=$POIDS_QUESTION"
  POURCENTAGE_INCORRECTE[$N]=$( echo "100*${PQ}/(${POIDS_QCM}*${REPONSES_INCORRECTES})"|bc -l|sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
  POURCENTAGE_CORRECTE[$N]=$( echo "100*${PQ}/(${POIDS_QCM}*${REPONSES_CORRECTES})"|bc -l|sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^~\(.*\)/~%-${POURCENTAGE_INCORRECTE[$N]}%\1/" "$QCM_GIFT"
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^=\(.*\)/=%${POURCENTAGE_CORRECTE[$N]}%\1/" "$QCM_GIFT"
                        (( N+=1 ))
                done
#Si on  veut specifier le nombre de réponses correctes, on comente la ligne anterieure et on dé-comente la suivante:
                sed -i '/^Question/N;s/\n/ /;s/).*/)/' "$QCM_GIFT"
#Substituer les "Questions n°1: " etc... par "::"
sed -i 's/Question n.[0-9].*: */::/' "$QCM_GIFT"
                #Supprime les lines vides répétées
                cat -s "$QCM_GIFT" > "$QCM_GIFT".tmp && cat "$QCM_GIFT".tmp > "$QCM_GIFT" && rm "$QCM_GIFT".tmp
}

####################### START OF THE SCRIPT   ################################################################################


if [[ -n $(ps x|grep soffice|grep libreoffice) ]];then
  if [ -x /usr/bin/zenity ];then
    zenity --no-wrap  --info --text "Libreoffice must be closed to convert office documents.\nClose any Libreoffice instance and try again."
    exit 1
  else
    #If there isn't zenity, we will use command line interface
    echo "Error: To convert office documents is necessary there isn't any Libreoffice instance running"
    echo "Close any Libreoffice instance and try again"
    exit 1
  fi
fi

while [[ "$1" ]];do
  cd "$1"
  for QCM_DOCX in $(ls .|grep '\.docx') ;do
    create_aiken_gift "$QCM_DOCX" || echo "##############_ÉCHEC_DANS_LE_FICHIER_${QCM_DOCX}_################"
  done
shift
done
 

 

Les fichiers 18 et 19 ont des erreurs: tous les deux ont la question 9 mal numéroté comme 8 (donc ils ont deux question 8), et le 19 manque des reponses dans les deux dernières questions.

J'attends tes comentaires.

Salut

Dernière modification par empanada (28-10-2018 22:13:26)


"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#13 29-10-2018 11:00:59

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

hello,
bon et bien wow!! Quel travail!

Le gift permet pas mal de choses:

Choix multiple et réponse unique
Choix multiple et réponses multiples
Mot manquant (Cloze)
Réponse courte
Vrai / Faux
Appariement
Réponse numérique
Composition
Description



Pour voir des exemples de chaque possibilité il y a des exemples ici; https://moodle-admin.parisdescartes.fr/ … hp?id=6748


Les qcm que nous faisons peuvent être complexe mais je préfaire commencer par le plus simple et ce qui se fait de plus courant:
Choix multiple et réponse unique
Choix multiple et réponses multiples

En y regardant de prêt on peu faire du Choix multiple et réponses multiples (dans la syntaxe du fichier) mais qu'il n'y ai que 100% des points sur une seule question ce qui revient à faire du Choix multiple et réponse unique. Dans les qcm existant les qcm comportent des questions à choix multiple et choix unique mélangées...


Un exemple d' un Choix multiple et réponses multiples:



// =========================================================================================
// Choix multiple et réponses multiples
// =========================================================================================
// Aucune des réponses ne remporte le total des points. Plusieurs réponses doivent être données.  
// Les réponses comportent toutes un ~ : chacune d'elle est en effet soit incorrecte, soient partiellement correcte.
// La somme des coefficients positifs des réponses partiellement correctes doit être égal à 100%.
// Il est conseillé d'inclure des coefficients négatifs pour les réponses fausses pour éviter que
// les étudiants obtiennent 100% en sélectionnant systématiquement toutes les réponses.

::Q7 QCM et réponses multiples (QCM avec coefficient et feed-back,  réponses multiples)::
Q7 Question QCM et réponses multiples{
~%-50%réponse 1 incorrecte#Feddback pour la réponse 1 incorrecte
~%-50%réponse 2 incorrecte#Feddback pour la réponse 2 incorrecte
~%50%réponse 3 partiellement correcte#Feddback pour la réponse 3 partiellement correcte
~%50%réponse 4 partiellement correcte#Feddback pour la réponse 4 partiellement correcte}
 



Le résultat de conversion avec ton script est:


::Sur une lame de parquet traditionnel, citez les deux assemblage existant ? (Plusieurs réponses possibles)
~%-5.00000%Tenon.
=%5.00000%Rainure.
~%-5.00000%Mortaise.
=%5.00000%Languette.
 



J'ai fait un export d'un choix multiple avec réponses multiple:


// question: 21  name: Quels types de charnières standard est utilisés sur les meubles de cuisine ?
::Quels types de charnières standard est utilisés sur les meubles de cuisine ?::[html]Quels types de charnières standard est utilisés sur les meubles de cuisine ?{
  ~%50%Charnières universelles#
  ~%50%Charnières invisibles#
  ~%-50%Charnières à entailler#
  ~%-50%Charnières à piano#
}



Les // permettent de faire un commentaire
le

[html]Quels types de charnières standard est utilisés sur les meubles de cuisine ?

permet de mettre le titre de la question mais il me semble que à l'import il le crait automatiquement.
j'ai mis des feedback mais vide c'est pour ça qu'il y a des # mais sans rien devant

Les notes se mettent en pourcentage: on attribut un points en point(s) à la question et on les distribue par réponse en pourcentage sachant que 100%= la totalité des points attribués à la question.


Je me suis apperçu que l'utilisation de libreoffice n'est pas une bonne idée:
si jamais on veux utiliser le script avec un cron pour traiter un répertoire on évite d'installer libreoffice hmm J'ai trouvé une alternative avec unoconv:

unoconv -f txt -e FilterOptions=UTF8,LF fichier.docx

Ca sort la même chose qu'avec libreoffice.


Seconde remarque: je n'ai que debian sur ma machine de tous les jours donc pour ma part je n'utilise pas microsoftoffice sauf sur d'autres pc (qui ne m'appartiennent pas). J'ai donc fait le meme fichier mais en odt que j' utiliserais comme model.

J'ai mis les models dans le répertoire "models_qcm_en_odt" ici: http://163.172.214.170/owncloud/index.p … 5Up8JhxmCS je ne sais pas si la référence de la couleur sera la même...j'ai mis en rouge 3 dans le model sur les mots "bonnes réponses"




Un grand merci à toi pour ce travail!!

Dernière modification par cemoi (29-10-2018 11:05:23)


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#14 30-10-2018 19:21:42

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

Dans un message précédent t'avais dit:

cemoi a écrit :

La syntaxe aiken ne permet que des qcm simple avec une seule réponse possible


Selon ce que j'ai vu dans un des liens, c'est possible. Il faut les séparer par des ",". Regarde les *.aiken qui créent le script. As-tu essayé de les monter vers le serveur de moodle et voire le resultat?

cemoi a écrit :


En y regardant de prêt on peu faire du Choix multiple et réponses multiples (dans la syntaxe du fichier) mais qu'il n'y ai que 100% des points sur une seule question ce qui revient à faire du Choix multiple et réponse unique. Dans les qcm existant les qcm comportent des questions à choix multiple et choix unique mélangées...

Un exemple d' un Choix multiple et réponses multiples:



// =========================================================================================
// Choix multiple et réponses multiples
// =========================================================================================
// Aucune des réponses ne remporte le total des points. Plusieurs réponses doivent être données.  
// Les réponses comportent toutes un ~ : chacune d'elle est en effet soit incorrecte, soient partiellement correcte.
// La somme des coefficients positifs des réponses partiellement correctes doit être égal à 100%.
// Il est conseillé d'inclure des coefficients négatifs pour les réponses fausses pour éviter que
// les étudiants obtiennent 100% en sélectionnant systématiquement toutes les réponses.

::Q7 QCM et réponses multiples (QCM avec coefficient et feed-back,  réponses multiples)::
Q7 Question QCM et réponses multiples{
~%-50%réponse 1 incorrecte#Feddback pour la réponse 1 incorrecte
~%-50%réponse 2 incorrecte#Feddback pour la réponse 2 incorrecte
~%50%réponse 3 partiellement correcte#Feddback pour la réponse 3 partiellement correcte
~%50%réponse 4 partiellement correcte#Feddback pour la réponse 4 partiellement correcte}
 


Dans le paragraphe en gras tu dit que "...il n'y ai que 100% des points sur une seule question ce qui revient à faire du Choix multiple et réponse unique". Je n'ai pas compris cette phrase..Veux-tu dire qu'a la fin les réponses multiples ne sont pas possibles? Parce que dessous tu mets un exemple avec réponses multiples qui est correct. Je ne comprend pas. scratchhead.gif

cemoi a écrit :


Le résultat de conversion avec ton script est:


::Sur une lame de parquet traditionnel, citez les deux assemblage existant ? (Plusieurs réponses possibles)
~%-5.00000%Tenon.
=%5.00000%Rainure.
~%-5.00000%Mortaise.
=%5.00000%Languette.
 



J'ai fait un export d'un choix multiple avec réponses multiple:


// question: 21  name: Quels types de charnières standard est utilisés sur les meubles de cuisine ?
::Quels types de charnières standard est utilisés sur les meubles de cuisine ?::[html]Quels types de charnières standard est utilisés sur les meubles de cuisine ?{
  ~%50%Charnières universelles#
  ~%50%Charnières invisibles#
  ~%-50%Charnières à entailler#
  ~%-50%Charnières à piano#
}



j'ai mis des feedback mais vide c'est pour ça qu'il y a des # mais sans rien devant

Les notes se mettent en pourcentage: on attribut un points en point(s) à la question et on les distribue par réponse en pourcentage sachant que 100%= la totalité des points attribués à la question.


Le premier à dire c'est que je n'avais pas bien lu la syntaxe. Le début de la question c'est avec le titre encadré entre "::", et après la question. Les réponses entre {} : c'est corrigé dans la nouvelle version.

Quand au points, comme expliqué dans le message original, j'avais tenu en compte l'information original contenu dans les *.docx, de façon, que un élève qui répond correctement à toutes les questions, fait un total de 100%. Pas 100% pour chaque question. Assigner un 100% à chaque question c'était plus facile...mais on perd l'information du poids relatif de chaque question dans l'ensemble de l'épreuve. Je pense que c'est dommage.
Quand même, je ne sais pas comment moodle gère les points/pourcentages. Je ne sais pas s'il est capable d'additionner toutes les pourcentages de chaque question (c'est comme ça que j'ai fait par l'instant), pour en sortir une qualification en pourcentage, ou par contre il additionne chaque question comme un point est il montre une qualification qui simplement c'est l'addition de ces points.
Je ne sais pas si je me suis bien exprimé scratchhead.gif. Dans cette nouvelle version toutes les questions on le même poids du 100%.

Quand au feedback, tu peux ajouter une colonne dans la quelle tu mets comme premier caractère "#". Après, c'est simple de gérer (mas ce n'est pas encore inclus ce code dans le script).

cemoi a écrit :

[html]Quels types de charnières standard est utilisés sur les meubles de cuisine ?
permet de mettre le titre de la question


Où t'as vu ça? Je crois que ça se fait avec l'entête entre "::". T'as essayé? En fait, je crois que ce "titre"tu pourrais l'utiliser pour spécifier le nombre de réponses possibles (entre ( ) dans le fichiers originales)

cemoi a écrit :

Je me suis apperçu que l'utilisation de libreoffice n'est pas une bonne idée:
si jamais on veux utiliser le script avec un cron pour traiter un répertoire on évite d'installer libreoffice hmm J'ai trouvé une alternative avec unoconv:

unoconv -f txt -e FilterOptions=UTF8,LF fichier.docx

Ca sort la même chose qu'avec libreoffice.


Oui, c'est vrai. En fait, dans mes scripts c'est unoconv que j'utilise. J'avais pensé à dire, mais j'avais préféré laisser pour plus tard, étant donné que ce n'était pas important. C'est quand même inclus sur cette nouvelle version.

cemoi a écrit :

Un grand merci à toi pour ce travail!!


Merci à toi. Je suis content de voir que les gens utilisent les logiciels libres.

Version 0.2 :

#!/bin/bash

#Version 0.2:
#-corrigés erreurs syntaxe *.gift
#-changer les pourcentages des questions: toutes les questions 100%)
#-Utiliser unoconv au lieu de libreoffice

# $N = REPERTOIRES

create_aiken_gift(){
    FILE="$1"
echo "2 $FILE"
#libreoffice --headless --convert-to odt  "$FILE"
unoconv -f odt "$FILE"
ls *.odt
QCM_ODT="${FILE%.docx}.odt"
echo "${QCM_ODT}"
###############   Garder les réponses correctes ########################################################################################
#Uncompress *.odt
unzip -q "${QCM_ODT}" -d "${QCM_ODT%.odt}"

#Inserer des sauts de ligne pour que sed puisse travailler mieux avec, en créant un fichier auxilier "${QCM_ODT%.odt}"/content.txt
sed 's/\([^\]>\)/\1\n/g' "${QCM_ODT%.odt}/content.xml" >"${QCM_ODT%.odt}/content.txt"

#Identifier les style:name qui ont couleur police "rouge 3", et les stocker dans l'array NAME
NAME=($(sed -n 'N;s/<style:style style:family=\"text\" style:name=\"\([A-Z][0-9]\+\)\">.\+fo:color=\"#ff0000\".*/\1/pg;s/<style:style style:name=\"\([A-Z][0-9]\+\)\" style:family=\"text\">.\+fo:color=\"#ff0000\".*/\1/pg;D' "${QCM_ODT%.odt}/content.txt"))

#Chercher les réponses en "rouge 3" ,et leur ajouter un "=" devant pour les identifier comme correctes
TOTAL_REGEXP="<text:span text:style-name=\"${NAME[0]}\">"
N=1
while [[ "${NAME[${N}]}" ]];do
  TOTAL_REGEXP="${TOTAL_REGEXP}\|<text:span text:style-name=\"${NAME[${N}]}\">"
  ((N+=1))
done
sed -i "/${TOTAL_REGEXP}/,+1 s/^\([a-zA-Z]\)<\/text:span>/=\1<\/text:span>/g" "${QCM_ODT%.odt}/content.txt"

#Supprimer les sauts de ligne inserés pour travailler avec sed, et storer sur "${QCM_ODT%.odt}"/content.xml de nouveau
tr -d '\n' <"${QCM_ODT%.odt}"/content.txt >"${QCM_ODT%.odt}/content.xml"

#On peur supprimer le fichier auxilier "${QCM_ODT%.odt}"/content.txt
rm "${QCM_ODT%.odt}"/content.txt

#Compreser de nouveau (premier supprimer "${QCM_ODT}")
rm "${QCM_ODT}"
cd "${QCM_ODT%.odt}"
zip -q -0 -X "${QCM_ODT}" mimetype
zip -q -r "${QCM_ODT}" * -x mimetype
mv "${QCM_ODT}" ..
cd ..

# Maintenant on l'info des réponses correctes dans "${QCM_ODT}"

#Convertir vers *.txt
#libreoffice --headless --convert-to "txt:Text (encoded):UTF8" "${QCM_ODT}"
unoconv -f txt -e FilterOptions=UTF8,LF "${QCM_ODT}"
rm -R "${QCM_ODT%.odt}"
rm "${QCM_ODT}"
#Créer les variables qui gardent les noms des fichiers
QCM_TXT="${QCM_ODT%.odt}.txt"
QCM_AIKEN="${QCM_ODT%.odt}.aiken"
QCM_GIFT="${QCM_ODT%.odt}.gift"
#Trouver la ligne ou commencent les questions
LIGNE=$(( $(sed -n '/Question n°/ =' "$QCM_TXT"| head -1)-2 ))
#Supprimer les lignes d'entête qui ne servent à rien
sed -i "1,+${LIGNE} d" "$QCM_TXT"
#Supprimer les lignes à la fin qui ne servent à rien
sed -i '/Date de l’évaluation/,$ d' "$QCM_TXT"
#Mieux supprimer les "0" à gauche
sed -i 's/Question n°0\([0-9]\)/Question n°\1/g' "$QCM_TXT"
#Jusqu'ici les modificatons comunes. Maintenant on fait deux copies et on peu virer les ofichier auxilier "$QCM_TXT"
cp "$QCM_TXT" "$QCM_AIKEN"
cp "$QCM_TXT" "$QCM_GIFT"
rm "$QCM_TXT"
###############  Exporter vers *.aiken   ########################################################################################
                #transformation des a b c en A B C
sed -i 's/\(^.$\|^=.$\)/\U\1/' "$QCM_AIKEN"
#Garder les réponses correctes à la fin de chaque de chaque bloc question-réponses dans une ligne ANSWER:
#Il faut garder les numeros tel qu'il apparaitrent dans le fichier. Quelques fois avec un "0" à gauche
NUM_QUEST=$(cat "$QCM_AIKEN"|sed -n 's/Question n°\([0-9]*\).*/\1/p'|tail -1)
N=1
while [[ "$N" -le "$NUM_QUEST" ]];do
  ANSWER[$N]=$(sed -n "/Question n°${N}[^0-9]/,/^$/ s/^=\([A-Z]\)$/\1,/p" "$QCM_AIKEN" | tr -d '\n'|sed 's/,$//g')
  ROW=$(sed -n "/Question n°${N}[^0-9]/,/^$/=" "$QCM_AIKEN"|tail -1)
  sed -i "${ROW} i ANSWER: ${ANSWER[${N}]}" "$QCM_AIKEN"
  (( N+=1 ))
done
#Maintenant qu'on a gardé les réponses correctes, on peut supprimer les caractères "="
sed -i '/^=[A-Z]$/ s/=//' "$QCM_AIKEN"
#Quand on a une seule letre mayuscule,on supprime les sauts de ligne et ajoute un .et un espace après le point
sed -i '/^[A-Z]$/ N;s/\n/\.\ /' "$QCM_AIKEN"
#supprime tous les points à la fin de chaque ligne
sed -i 's/\.\+[ \t]*$//' "$QCM_AIKEN"
#supprime les lignes qui commencent par (
#sed -i '/^(/d' "$QCM_AIKEN"
#Si on  veut specifier le nombre de réponses correctes, on comente la ligne anterieure et on dé-comente la suivante:
sed -i '/^Question/N;s/\n/ /;s/).*/)/' "$QCM_AIKEN"
#Supprime tous les "Questions N°2: " "Questions N°3: " "Questions N°4: " etc...
sed -i 's/Question n.[0-9].*: *//' "$QCM_AIKEN"
#Supprime les lines vides répétées
cat -s "$QCM_AIKEN" > "$QCM_AIKEN".tmp && cat "$QCM_AIKEN".tmp > "$QCM_AIKEN" && rm "$QCM_AIKEN".tmp

###############  Exporter vers *.gift   ########################################################################################
sed -i '/^=[a-zA-Z]$/ N;s/\(^=\)[a-zA-Z]\n\(.*\)/\1\2/' "$QCM_GIFT"
#Quand on a une seule letre au debut de ligne,on substitue la letre par un "~" et le saut de ligne
                sed -i '/^[a-zA-Z]$/ N;s/^[a-zA-Z]\n\(.*\)/~\1/' "$QCM_GIFT"
N=1
while [[ "$N" -le "$NUM_QUEST" ]];do
  REPONSES_INCORRECTES=$(sed -n "/Question n°${N}[^0-9]/,/^$/p" "$QCM_GIFT"|grep "~" -c)
  REPONSES_CORRECTES=$(sed -n "/Question n°${N}[^0-9]/,/^$/p" "$QCM_GIFT"|grep "=" -c)
  POURCENTAGE_INCORRECTE[$N]=$( echo "100/${REPONSES_INCORRECTES}"|bc -l|sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
  POURCENTAGE_CORRECTE[$N]=$( echo "100/${REPONSES_CORRECTES}"|bc -l|sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^~\(.*\)/~%-${POURCENTAGE_INCORRECTE[$N]}%\1/" "$QCM_GIFT"
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^=\(.*\)/=%${POURCENTAGE_CORRECTE[$N]}%\1/" "$QCM_GIFT"
  ROW=$(sed -n "/Question n°${N}[^0-9]/,/^$/=" "$QCM_GIFT"|tail -1)
  sed -i "$ROW i }" "$QCM_GIFT"
  (( N+=1 ))
done
#Si on  veut specifier le nombre de réponses correctes, on comente la ligne anterieure et on dé-comente la suivante:
                sed -i '/^Question/N;s/\n/ /;s/).*/)/' "$QCM_GIFT"
#Substituer les "Questions n°1: " etc... par "::"
sed -i 's/Question n.[0-9].*: *\(.*\)$/::\1::\1{/' "$QCM_GIFT"
                #Supprime les lines vides répétées
                cat -s "$QCM_GIFT" > "$QCM_GIFT".tmp && cat "$QCM_GIFT".tmp > "$QCM_GIFT" && rm "$QCM_GIFT".tmp
}

####################### START OF THE SCRIPT   ################################################################################


if [[ -n $(ps x|grep soffice|grep libreoffice) ]];then
  if [ -x /usr/bin/zenity ];then
    zenity --no-wrap  --info --text "Libreoffice must be closed to convert office documents.\nClose any Libreoffice instance and try again."
    exit 1
  else
    #If there isn't zenity, we will use command line interface
    echo "Error: To convert office documents is necessary there isn't any Libreoffice instance running"
    echo "Close any Libreoffice instance and try again"
    exit 1
  fi
fi

while [[ "$1" ]];do
  cd "$1"
  while read "QCM_DOCX" ;do
  echo "1 $QCM_DOCX"
    create_aiken_gift "$QCM_DOCX"
  done < <(ls .|grep '\.docx')
shift
done

 

Dernière modification par empanada (31-10-2018 12:03:41)


"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#15 01-11-2018 23:47:45

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

Hello,
j'ai testé l'import et ça donne qqchose de curieux:

Sur une lame de parquet traditionnel, citez les deux assemblage existant ? (Plusieurs réponses possibles)
Veuillez choisir une réponse :
a. %50.00000%Languette.
b. Mortaise.
c. Tenon.
d. %50.00000%Rainure.



ce qui a été fait par le script pour cette question:

::Quels types de charnières standard est utilisés sur les meubles de cuisine ? (Une seule réponse possible)::Quels types de charnières standard est utilisés sur les meubles de cuisine ? (Une seule réponse possible){
~%-33.33333%Charnières universelles.
=%100.00000%Charnières invisibles.
~%-33.33333%Charnières à entailler.
~%-33.33333%Charnières à piano.
}




Sachant que ça devrait etre:

// question: 21  name: Quels types de charnières standard est utilisés sur les meubles de cuisine ?
::Quels types de charnières standard est utilisés sur les meubles de cuisine ?::[html]Quels types de charnières standard est utilisés sur les meubles de cuisine ?{
  ~%50%Charnières universelles#
  ~%50%Charnières invisibles#
  ~%-50%Charnières à entailler#
  ~%-50%Charnières à piano#
}



Je pense que il ne faut pas autant de décimales apres le . de 33 mais franchement je ne suis pas sur de ce que je dis...je vois pas pourquoi ça fait ça...0 decimale apres le . vont bien à mon avis

Ce serai top de mettre des # à la fin de chaque réponse pour que je puisse y mettre des commentaires de retour (feedback) par reponse. Pour le moment il y a des .

Pour pouvoir tester des imports si tu as besoin tu peux aussi le faire à partir de ce site: https://moodle.org/demo/ dans moodle sandbox, sachant que j'ai la même version de moodle en place mais en locale.

Je ferai qq tests de comparaison mais je suis presque certain que le problème vient des decimales derrière le .

Sur mon dossier partagé (cf lein sur le 1er post) tu trouveras un fichiers exporté des questions faites dans moodle (quiz-generalites_menuiserie-20181026-1810.txt) il a la bonne syntaxe. Mais oui à priori ton script va bien à part qq petits problémes de formatage. smile

Merci!


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#16 02-11-2018 19:44:11

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

cemoi a écrit :

Hello,
j'ai testé l'import et ça donne qq chose de curieux:

Sur une lame de parquet traditionnel, citez les deux assemblage existant ? (Plusieurs réponses possibles)
Veuillez choisir une réponse :
a. %50.00000%Languette.
b. Mortaise.
c. Tenon.
d. %50.00000%Rainure.


a) J'aurais besoin de faire des essais, me je ne sais pas du tout utiliser le lien que t'as donné (  https://moodle.org/demo/  ). J'arrive a monter un fichier, mai je ne sais pas comment l'essayer comme "élève" .


cemoi a écrit :


ce qui a été fait par le script pour cette question:

::Quels types de charnières standard est utilisés sur les meubles de cuisine ? (Une seule réponse possible)::Quels types de charnières standard est utilisés sur les meubles de cuisine ? (Une seule réponse possible){
~%-33.33333%Charnières universelles.
=%100.00000%Charnières invisibles.
~%-33.33333%Charnières à entailler.
~%-33.33333%Charnières à piano.
}



Sachant que ça devrait etre:

// question: 21  name: Quels types de charnières standard est utilisés sur les meubles de cuisine ?
::Quels types de charnières standard est utilisés sur les meubles de cuisine ?::[html]Quels types de charnières standard est utilisés sur les meubles de cuisine ?{
  ~%50%Charnières universelles#
  ~%50%Charnières invisibles#
  ~%-50%Charnières à entailler#
  ~%-50%Charnières à piano#
}



b) Je vois que dans le deuxième gift les réponses correctes sont deux au lieu d'une. T'es sûr que sur le *.docx original sont les deux marqués en "rouge 3"? Ce quel *.docx?

c)

cemoi a écrit :

Je pense que il ne faut pas autant de décimales apres le . de 33 mais franchement je ne suis pas sur de ce que je dis...je vois pas pourquoi ça fait ça...0 decimale apres le . vont bien à mon avis

Le cinq décimales sont pour faire une addition la plus précise possible. Selon les spécifications gift jusqu'au 5 décimales sont admis. Peut être que le serveur n'aime pas les décimales tous zéro, ça c'est facile à résoudre mais ça serait dans le cas "a)", mais ça n'a rien à avoir avec le change de une réponse correcte à deux.

d) Je t'avais demandé déjà, et je ne sais pas encore la réponse: ce tag "[html]" où t'as vu? T'as essayé? Ça sert à quoi. À nouveau il s'impose le besoin de pouvoir essayer les *.gifts sur moodle.

e)

cemoi a écrit :

Ce serai top de mettre des # à la fin de chaque réponse pour que je puisse y mettre des commentaires de retour (feedback) par reponse. Pour le moment il y a des .

Pas problème, c'est simple.

Pour pouvoir tester des imports si tu as besoin tu peux aussi le faire à partir de ce site: https://moodle.org/demo/ dans moodle sandbox, sachant que j'ai la même version de moodle en place mais en locale.

cemoi a écrit :

Je ferai qq tests de comparaison mais je suis presque certain que le problème vient des decimales derrière le .

  Le problème "a)", surement oui. L reste n'ont rien à avoir je crois.

cemoi a écrit :

Sur mon dossier partagé (cf lein sur le 1er post) tu trouveras un fichiers exporté des questions faites dans moodle (quiz-generalites_menuiserie-20181026-1810.txt) il a la bonne syntaxe. Mais oui à priori ton script va bien à part qq petits problémes de formatage. smile


Ok, je vais vérifier.


"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#17 02-11-2018 23:21:15

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

Hello,
je vais tenter de répondre à toutes les questions mais je si j'oublis ou je ne répond que partiellement hésite pas à le dire.

a:
J'ai fait 3 screencast pour te montrer:
1- comment importer les gift dans la banque de question de moodle
2-comment utiliser ces questions dans un test et comment les tester
3-comment créer un test et une question dedans

tu peux à partir de la banque de question également exporter une/des question(s) en gift ou autres.

b:

T'es sûr que sur le *.docx original sont les deux marqués en "rouge 3"?


effectivement les deux docx étaient différent... oups hmm

e:
tu verras dans un des deux screencast j'importe un fichier *.txt qui a la syntaxe du gift.

Si tu as besoin d'explications pour pouvoir utiliser le moodle de test n'hésite pas car moodle est une uzine...et je te parle pas du panel d'administration qui est 100 fois pire o_O

Merci !

Dernière modification par cemoi (02-11-2018 23:51:45)


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#18 03-11-2018 19:42:02

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

Je crois avoir tout compris yikes (les options de moodle, ufff, c'est vaste...)

Essaie cette nouvelle version:

#!/bin/bash

#Version 0.3:
#Insérer des //Question NUM : Name : .... et [html]
#Corriger la syntaxe des QCM à réponse unique (enlever le "=")
#Ajouter un "#" à la fin de chaque réponse

#Version 0.2:
#-corrigés erreurs syntaxe *.gift
#-changer les pourcentages des questions: toutes les questions 100%)
#-Utiliser unoconv au lieu de libreoffice

# $N = REPERTOIRES

create_aiken_gift(){
    FILE="$1"
echo "2 $FILE"
#libreoffice --headless --convert-to odt  "$FILE"
unoconv -f odt "$FILE"
ls *.odt
QCM_ODT="${FILE%.docx}.odt"
echo "${QCM_ODT}"
###############   Garder les réponses correctes ########################################################################################
#Uncompress *.odt
unzip -q "${QCM_ODT}" -d "${QCM_ODT%.odt}"

#Inserer des sauts de ligne pour que sed puisse travailler mieux avec, en créant un fichier auxilier "${QCM_ODT%.odt}"/content.txt
sed 's/\([^\]>\)/\1\n/g' "${QCM_ODT%.odt}/content.xml" >"${QCM_ODT%.odt}/content.txt"

#Identifier les style:name qui ont couleur police "rouge 3", et les stocker dans l'array NAME
NAME=($(sed -n 'N;s/<style:style style:family=\"text\" style:name=\"\([A-Z][0-9]\+\)\">.\+fo:color=\"#ff0000\".*/\1/pg;s/<style:style style:name=\"\([A-Z][0-9]\+\)\" style:family=\"text\">.\+fo:color=\"#ff0000\".*/\1/pg;D' "${QCM_ODT%.odt}/content.txt"))

#Chercher les réponses en "rouge 3" ,et leur ajouter un "=" devant pour les identifier comme correctes
TOTAL_REGEXP="<text:span text:style-name=\"${NAME[0]}\">"
N=1
while [[ "${NAME[${N}]}" ]];do
  TOTAL_REGEXP="${TOTAL_REGEXP}\|<text:span text:style-name=\"${NAME[${N}]}\">"
  ((N+=1))
done
sed -i "/${TOTAL_REGEXP}/,+1 s/^\([a-zA-Z]\)<\/text:span>/=\1<\/text:span>/g" "${QCM_ODT%.odt}/content.txt"

#Supprimer les sauts de ligne inserés pour travailler avec sed, et storer sur "${QCM_ODT%.odt}"/content.xml de nouveau
tr -d '\n' <"${QCM_ODT%.odt}"/content.txt >"${QCM_ODT%.odt}/content.xml"

#On peur supprimer le fichier auxilier "${QCM_ODT%.odt}"/content.txt
rm "${QCM_ODT%.odt}"/content.txt

#Compreser de nouveau (premier supprimer "${QCM_ODT}")
rm "${QCM_ODT}"
cd "${QCM_ODT%.odt}"
zip -q -0 -X "${QCM_ODT}" mimetype
zip -q -r "${QCM_ODT}" * -x mimetype
mv "${QCM_ODT}" ..
cd ..

# Maintenant on l'info des réponses correctes dans "${QCM_ODT}"

#Convertir vers *.txt
#libreoffice --headless --convert-to "txt:Text (encoded):UTF8" "${QCM_ODT}"
unoconv -f txt -e FilterOptions=UTF8,LF "${QCM_ODT}"
rm -R "${QCM_ODT%.odt}"
rm "${QCM_ODT}"
#Créer les variables qui gardent les noms des fichiers
QCM_TXT="${QCM_ODT%.odt}.txt"
QCM_AIKEN="${QCM_ODT%.odt}.aiken"
QCM_GIFT="${QCM_ODT%.odt}.gift"
#Trouver la ligne ou commencent les questions
LIGNE=$(( $(sed -n '/Question n°/ =' "$QCM_TXT"| head -1)-2 ))
#Supprimer les lignes d'entête qui ne servent à rien
sed -i "1,+${LIGNE} d" "$QCM_TXT"
#Supprimer les lignes à la fin qui ne servent à rien
sed -i '/Date de l’évaluation/,$ d' "$QCM_TXT"
#Mieux supprimer les "0" à gauche
sed -i 's/Question n°0\([0-9]\)/Question n°\1/g' "$QCM_TXT"
#Jusqu'ici les modificatons comunes. Maintenant on fait deux copies et on peu virer les ofichier auxilier "$QCM_TXT"
cp "$QCM_TXT" "$QCM_AIKEN"
cp "$QCM_TXT" "$QCM_GIFT"
rm "$QCM_TXT"
###############  Exporter vers *.aiken   ########################################################################################
                #transformation des a b c en A B C
sed -i 's/\(^.$\|^=.$\)/\U\1/' "$QCM_AIKEN"
#Garder les réponses correctes à la fin de chaque de chaque bloc question-réponses dans une ligne ANSWER:
#Il faut garder les numeros tel qu'il apparaitrent dans le fichier. Quelques fois avec un "0" à gauche
NUM_QUEST=$(cat "$QCM_AIKEN"|sed -n 's/Question n°\([0-9]*\).*/\1/p'|tail -1)
N=1
while [[ "$N" -le "$NUM_QUEST" ]];do
  ANSWER[$N]=$(sed -n "/Question n°${N}[^0-9]/,/^$/ s/^=\([A-Z]\)$/\1,/p" "$QCM_AIKEN" | tr -d '\n'|sed 's/,$//g')
  ROW=$(sed -n "/Question n°${N}[^0-9]/,/^$/=" "$QCM_AIKEN"|tail -1)
  sed -i "${ROW} i ANSWER: ${ANSWER[${N}]}" "$QCM_AIKEN"
  (( N+=1 ))
done
#Maintenant qu'on a gardé les réponses correctes, on peut supprimer les caractères "="
sed -i '/^=[A-Z]$/ s/=//' "$QCM_AIKEN"
#Quand on a une seule letre mayuscule,on supprime les sauts de ligne et ajoute un .et un espace après le point
sed -i '/^[A-Z]$/ N;s/\n/\.\ /' "$QCM_AIKEN"
#supprime tous les points à la fin de chaque ligne
sed -i 's/\.\+[ \t]*$//' "$QCM_AIKEN"
#supprime les lignes qui commencent par (
sed -i '/^(/d' "$QCM_AIKEN"
#Si on  veut specifier le nombre de réponses correctes, on comente la ligne anterieure et on dé-comente la suivante:
#sed -i '/^Question/N;s/\n/ /;s/).*/)/' "$QCM_AIKEN"
#Supprime tous les "Questions N°2: " "Questions N°3: " "Questions N°4: " etc...
sed -i 's/Question n.[0-9].*: *//' "$QCM_AIKEN"
#Supprime les lines vides répétées
cat -s "$QCM_AIKEN" > "$QCM_AIKEN".tmp && cat "$QCM_AIKEN".tmp > "$QCM_AIKEN" && rm "$QCM_AIKEN".tmp

###############  Exporter vers *.gift   ########################################################################################
sed -i '/^=[a-zA-Z]$/ N;s/\(^=\)[a-zA-Z]\n\(.*\)/\1\2/' "$QCM_GIFT"
#Quand on a une seule letre au debut de ligne,on substitue la letre par un "~" et le saut de ligne
                sed -i '/^[a-zA-Z]$/ N;s/^[a-zA-Z]\n\(.*\)/~\1/' "$QCM_GIFT"
N=1
while [[ "$N" -le "$NUM_QUEST" ]];do
  REPONSES_INCORRECTES=$(sed -n "/Question n°${N}[^0-9]/,/^$/p" "$QCM_GIFT"|grep "~" -c)
  REPONSES_CORRECTES=$(sed -n "/Question n°${N}[^0-9]/,/^$/p" "$QCM_GIFT"|grep "=" -c)
  POURCENTAGE_INCORRECTE[$N]=$( echo "100/${REPONSES_INCORRECTES}"|bc -l|sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
  POURCENTAGE_CORRECTE[$N]=$( echo "100/${REPONSES_CORRECTES}"|bc -l|sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^~\(.*\)/~%-${POURCENTAGE_INCORRECTE[$N]}%\1/" "$QCM_GIFT"
if [[ "$REPONSES_CORRECTES" == "1" ]];then
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^=\(.*\)/=\1/" "$QCM_GIFT"
else
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^=\(.*\)/~%${POURCENTAGE_CORRECTE[$N]}%\1/" "$QCM_GIFT"
fi
ROW=$(sed -n "/Question n°${N}[^0-9]/,/^$/=" "$QCM_GIFT"|tail -1)
  sed -i "$ROW i }" "$QCM_GIFT"
  (( N+=1 ))
done

#supprime les lignes qui commencent par (
sed -i '/^(/d' "$QCM_GIFT"
#Si on  veut specifier le nombre de réponses correctes, on comente la ligne anterieure et on dé-comente la suivante:
#                sed -i '/^Question/N;s/\n/ /;s/).*/)/' "$QCM_GIFT"
#Substituer les "Questions n°1: " etc... par "::"
sed -i 's/Question n.\([0-9]\+\).*: *\(.*\)$/\/\/Question: \1 Name: \2\n::\2::[html]\2{/' "$QCM_GIFT"
#Dans les réponses, supprimer les . finales (s'ils éxistent) et ajouter un # à le final de la ligne
sed -i '/^~.*/ s/\.\? *$/#/' "$QCM_GIFT"
sed -i '/^=.*/ s/\.\? *$/#/' "$QCM_GIFT"
#Supprime les lines vides répétées
cat -s "$QCM_GIFT" > "$QCM_GIFT".tmp && cat "$QCM_GIFT".tmp > "$QCM_GIFT" && rm "$QCM_GIFT".tmp
}

####################### START OF THE SCRIPT   ################################################################################


if [[ -n $(ps x|grep soffice|grep libreoffice) ]];then
  if [ -x /usr/bin/zenity ];then
    zenity --no-wrap  --info --text "Libreoffice must be closed to convert office documents.\nClose any Libreoffice instance and try again."
    exit 1
  else
    #If there isn't zenity, we will use command line interface
    echo "Error: To convert office documents is necessary there isn't any Libreoffice instance running"
    echo "Close any Libreoffice instance and try again"
    exit 1
  fi
fi

while [[ "$1" ]];do
  cd "$1"
  while read "QCM_DOCX" ;do
  echo "1 $QCM_DOCX"
    create_aiken_gift "$QCM_DOCX"
  done < <(ls .|grep '\.docx')
shift
done
 


"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#19 06-11-2018 21:39:44

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

hello,
ça fonctionne!!! :]

mais il y a une chose à laquelle je n'avait pas pensée... mes collégues utilisent tous le docx mais moi sur debian je suis sur le même model mais en odt... vu que j'utilise que du libreoffice... je ne vais pas pouvoir utiliser le script pour les futur qcm qui seront en odt pour les miens et en docx pour mes autres....
J'ai égalemetn des qcm avec des images (schéma) tu penses que ce serai gérable via le script sachant que la mise ne forme est la même mais avec une image en plus à coté de la question.

En tous les cas je vais pouvoir transformer pas mal de qcm existant c'est déja énorme!!!

Un grand merci à toi!

Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#20 06-11-2018 22:28:50

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

cemoi a écrit :

hello,
ça fonctionne!!! :]


wink

cemoi a écrit :

mais il y a une chose à laquelle je n'avait pas pensée... mes collégues utilisent tous le docx mais moi sur debian je suis sur le même model mais en odt... vu que j'utilise que du libreoffice... je ne vais pas pouvoir utiliser le script pour les futur qcm qui seront en odt pour les miens et en docx pour mes autres....


C'est très facile à adapter (une ou deux lignes), si c'es un odt il ne faut pas la conversion. C'est tout.

cemoi a écrit :

J'ai égalemetn des qcm avec des images (schéma) tu penses que ce serai gérable via le script sachant que la mise ne forme est la même mais avec une image en plus à coté de la question.

C'est très probable que oui, ou oui avec des petites modifications/ajouts  mais il faut essayer. Monte quelque documents pour travailler avec eux.

Le plus important ce que le nombre des "modèles" de documents soient le plus petit posible, et que vous vous serrez à eux complètement (pas ajouter des files ou colonnes, pas changer le "rouge 3", pas ajouter des caractères non nécessaires , etc)

cemoi a écrit :

En tous les cas je vais pouvoir transformer pas mal de qcm existant c'est déja énorme!!!

Un grand merci à toi!


Je serais content si tu essayes à étendre les logiciels libres.
Salut!


"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#21 08-11-2018 21:34:58

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

Hello,
je propose toujours  l'usage des logiciels libre wink

J'ai un probléme avec 2 qcm que je viens de faire mais je saisi pas ou se trouve le problème...

Surtout que j'ai utilisé le même model pour 3 qcm et ce sont les 2 et 3 ou ça coince. j'ai fait un répertoire qcm_videos_scf  ou se trouve ces 3 qcm.
Ca se trouve toujours à la racine de:

http://163.172.214.170/owncloud/index.p … 5Up8JhxmCS

J'ai commencé à bidouillé le qcm N°2 mais je saisi pas ou se trouve le pb hmm

./docx-qcm_to_aiken-gift.sh qcm_videos_scf/
1 QCM_SCF_video_01.docx
2 QCM_SCF_video_01.docx
QCM_SCF_video_01.odt
QCM_SCF_video_01.odt
1 QCM_SCF_video_02.docx
2 QCM_SCF_video_02.docx
QCM_SCF_video_02.odt
QCM_SCF_video_02.odt
Runtime error (func=(main), adr=7): Divide by zero
Runtime error (func=(main), adr=7): Divide by zero
Runtime error (func=(main), adr=7): Divide by zero
1 QCM_SCF_video_03.docx
2 QCM_SCF_video_03.docx
QCM_SCF_video_03.odt
QCM_SCF_video_03.odt
Runtime error (func=(main), adr=7): Divide by zero
Runtime error (func=(main), adr=7): Divide by zero



Une idée du problème dans le modèle?

Pour les qcm avec images ils suivent le même model mais avec une image en plus sur le coté. l'idée c'est de pouvoir exploiter un peu plus ce qui est déjà en place mais je veux pas allé trop vite ce que tu as déja fait est énorme...
Je mettrai les models avec images ce week-end.


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#22 08-11-2018 23:01:45

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

Les problèmes sont:
QCM_SCF_video_02.docx a deux questions nº2 et deux questions nº8
QCM_SCF_video_03.docx a deux questions nº2 et deux questions nº6

Demain/samedi je vais poster une nouvelle version pour travailler avec des *.docx ou *.odt et autres petites améliorations.

Salut!

"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#23 09-11-2018 20:57:04

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

haaaaa je suis une buse!!...

J'ai corrigé et effcetivement d'un coup ça va bien, j'ai remarqué un petit problème:
quand la question est sur 2 lignes la seconde lignes n'est pas prise en compte.

Ca fait un sacré taf!

Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

#24 10-11-2018 14:12:37

empanada
Membre
Distrib. : Debian 11 (Bullseye)
Noyau : 5.10.0-13-amd64
(G)UI : LXDE
Inscription : 19-09-2018

Re : convertir des qcm en .docx en .aiken puis en .gift

cemoi a écrit :

quand la question est sur 2 lignes la seconde lignes n'est pas prise en compte.


C'est ajouté dans la version 4... mais mieux se serrer au maximum au modèle
Il manque l'option pour travailler avec *.odt, mais j'attends des fichiers avec des images pour essayer et faire tout d'une fois.

#!/bin/bash

#version 0.4
#Detecter les questions dans deux lignes

#Version 0.3:
#Insérer des //Question NUM : Name : .... et [html]
#Corriger la syntaxe des QCM à réponse multiple (enlever le "=")
#Ajouter un "#" à la fin de chaque réponse

#Version 0.2:
#-corrigés erreurs syntaxe *.gift
#-changer les pourcentages des questions: toutes les questions 100%)
#-Utiliser unoconv au lieu de libreoffice

# $N = REPERTOIRES

create_aiken_gift(){
    FILE="$1"
echo "2 $FILE"
#libreoffice --headless --convert-to odt  "$FILE"
unoconv -f odt "$FILE"
ls *.odt
QCM_ODT="${FILE%.docx}.odt"
echo "${QCM_ODT}"
###############   Garder les réponses correctes ########################################################################################
#Uncompress *.odt
unzip -q "${QCM_ODT}" -d "${QCM_ODT%.odt}"

#Inserer des sauts de ligne pour que sed puisse travailler mieux avec, en créant un fichier auxilier "${QCM_ODT%.odt}"/content.txt
sed 's/\([^\]>\)/\1\n/g' "${QCM_ODT%.odt}/content.xml" >"${QCM_ODT%.odt}/content.txt"

#Identifier les style:name qui ont couleur police "rouge 3", et les stocker dans l'array NAME
NAME=($(sed -n 'N;s/<style:style style:family=\"text\" style:name=\"\([A-Z][0-9]\+\)\">.\+fo:color=\"#ff0000\".*/\1/pg;s/<style:style style:name=\"\([A-Z][0-9]\+\)\" style:family=\"text\">.\+fo:color=\"#ff0000\".*/\1/pg;D' "${QCM_ODT%.odt}/content.txt"))

#Chercher les réponses en "rouge 3" ,et leur ajouter un "=" devant pour les identifier comme correctes
TOTAL_REGEXP="<text:span text:style-name=\"${NAME[0]}\">"
N=1
while [[ "${NAME[${N}]}" ]];do
  TOTAL_REGEXP="${TOTAL_REGEXP}\|<text:span text:style-name=\"${NAME[${N}]}\">"
  ((N+=1))
done
sed -i "/${TOTAL_REGEXP}/,+1 s/^\([a-zA-Z]\)<\/text:span>/=\1<\/text:span>/g" "${QCM_ODT%.odt}/content.txt"

#Supprimer les sauts de ligne inserés pour travailler avec sed, et storer sur "${QCM_ODT%.odt}"/content.xml de nouveau
tr -d '\n' <"${QCM_ODT%.odt}"/content.txt >"${QCM_ODT%.odt}/content.xml"

#On peur supprimer le fichier auxilier "${QCM_ODT%.odt}"/content.txt
rm "${QCM_ODT%.odt}"/content.txt

#Compreser de nouveau (premier supprimer "${QCM_ODT}")
rm "${QCM_ODT}"
cd "${QCM_ODT%.odt}"
zip -q -0 -X "${QCM_ODT}" mimetype
zip -q -r "${QCM_ODT}" * -x mimetype
mv "${QCM_ODT}" ..
cd ..

# Maintenant on l'info des réponses correctes dans "${QCM_ODT}"

#Convertir vers *.txt
#libreoffice --headless --convert-to "txt:Text (encoded):UTF8" "${QCM_ODT}"
unoconv -f txt -e FilterOptions=UTF8,LF "${QCM_ODT}"
rm -R "${QCM_ODT%.odt}"
rm "${QCM_ODT}"
#Créer les variables qui gardent les noms des fichiers
QCM_TXT="${QCM_ODT%.odt}.txt"
QCM_AIKEN="${QCM_ODT%.odt}.aiken"
QCM_GIFT="${QCM_ODT%.odt}.gift"
#Trouver la ligne ou commencent les questions
LIGNE=$(( $(sed -n '/Question n°/ =' "$QCM_TXT"| head -1)-2 ))
#Supprimer les lignes d'entête qui ne servent à rien
sed -i "1,+${LIGNE} d" "$QCM_TXT"
#Supprimer les lignes à la fin qui ne servent à rien
sed -i '/Date de l’évaluation/,$ d' "$QCM_TXT"
#Mieux supprimer les "0" à gauche
sed -i 's/Question n°0\([0-9]\)/Question n°\1/g' "$QCM_TXT"
#Jusqu'ici les modificatons comunes. Maintenant on fait deux copies et on peu virer les ofichier auxilier "$QCM_TXT"
cp "$QCM_TXT" "$QCM_AIKEN"
cp "$QCM_TXT" "$QCM_GIFT"
#rm "$QCM_TXT"
###############  Exporter vers *.aiken   ########################################################################################
#transformation des a b c en A B C
sed -i 's/\(^.$\|^=.$\)/\U\1/' "$QCM_AIKEN"
#Garder les réponses correctes à la fin de chaque de chaque bloc question-réponses dans une ligne ANSWER:
#Il faut garder les numeros tel qu'il apparaitrent dans le fichier. Quelques fois avec un "0" à gauche
NUM_QUEST=$(cat "$QCM_AIKEN"|sed -n 's/Question n°\([0-9]*\).*/\1/p'|tail -1)
N=1
while [[ "$N" -le "$NUM_QUEST" ]];do
  ANSWER[$N]=$(sed -n "/Question n°${N}[^0-9]/,/^$/ s/^=\([A-Z]\)$/\1,/p" "$QCM_AIKEN" | tr -d '\n'|sed 's/,$//g')
  ROW=$(sed -n "/Question n°${N}[^0-9]/,/^$/=" "$QCM_AIKEN"|tail -1)
  sed -i "${ROW} i ANSWER: ${ANSWER[${N}]}" "$QCM_AIKEN"
  (( N+=1 ))
done
#Maintenant qu'on a gardé les réponses correctes, on peut supprimer les caractères "="
sed -i '/^=[A-Z]$/ s/=//' "$QCM_AIKEN"
#Quand on a une seule letre mayuscule,on supprime les sauts de ligne et ajoute un .et un espace après le point
sed -i '/^[A-Z]$/ N;s/\n/\.\ /' "$QCM_AIKEN"
#supprime tous les points à la fin de chaque ligne
sed -i 's/\.\+[ \t]*$//' "$QCM_AIKEN"
#supprime les lignes qui commencent par (
sed -i '/^(/d' "$QCM_AIKEN"
#Si on  veut specifier le nombre de réponses correctes, on comente la ligne anterieure et on dé-comente la suivante:
#sed -i '/^Question/N;s/\n/ /;s/).*/)/' "$QCM_AIKEN"
#Supprime tous les "Questions N°2: " "Questions N°3: " "Questions N°4: " etc...
sed -i 's/Question n.[0-9].*: *//' "$QCM_AIKEN"
#Supprime les lines vides répétées
cat -s "$QCM_AIKEN" > "$QCM_AIKEN".tmp && cat "$QCM_AIKEN".tmp > "$QCM_AIKEN" && rm "$QCM_AIKEN".tmp

###############  Exporter vers *.gift   ########################################################################################
#Detecter Questions en deux lignes
sed -i '/^Question/N; /\n^=\?[a-zA-Z]\{1\}$\|\n(.*réponse.*).*$/! s/\n/ /' "$QCM_GIFT"
#Quand on a [= + une seule letre] au debut de ligne, on supprime la letre et le saut de ligne
sed -i '/^=[a-zA-Z]$/ N;s/\(^=\)[a-zA-Z]\n\(.*\)/\1\2/' "$QCM_GIFT"
#Quand on a une seule letre au debut de ligne,on substitue la letre par un "~" et on supprime le saut de ligne
sed -i '/^[a-zA-Z]$/ N;s/^[a-zA-Z]\n\(.*\)/~\1/' "$QCM_GIFT"
N=1
while [[ "$N" -le "$NUM_QUEST" ]];do
  REPONSES_INCORRECTES=$(sed -n "/Question n°${N}[^0-9]/,/^$/p" "$QCM_GIFT"|grep "~" -c)
  REPONSES_CORRECTES=$(sed -n "/Question n°${N}[^0-9]/,/^$/p" "$QCM_GIFT"|grep "=" -c)
  POURCENTAGE_INCORRECTE[$N]=$( echo "100/${REPONSES_INCORRECTES}"|bc -l|sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
  POURCENTAGE_CORRECTE[$N]=$( echo "100/${REPONSES_CORRECTES}"|bc -l|sed 's/^\./0./;s/\([0-9]\+\.[0-9]\{5\}\)[0-9]*/\1/')
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^~\(.*\)/~%-${POURCENTAGE_INCORRECTE[$N]}%\1/" "$QCM_GIFT"
if [[ "$REPONSES_CORRECTES" == "1" ]];then
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^=\(.*\)/=\1/" "$QCM_GIFT"
else
  sed -i "/Question n°${N}[^0-9]/,/^$/ s/^=\(.*\)/~%${POURCENTAGE_CORRECTE[$N]}%\1/" "$QCM_GIFT"
fi
ROW=$(sed -n "/Question n°${N}[^0-9]/,/^$/=" "$QCM_GIFT"|tail -1)
  sed -i "$ROW i }" "$QCM_GIFT"
  (( N+=1 ))
done

#supprime les lignes qui commencent par (
sed -i '/^(/d' "$QCM_GIFT"
#Si on  veut specifier le nombre de réponses correctes, on comente la ligne anterieure et on dé-comente la suivante:
#                sed -i '/^Question/N;s/\n/ /;s/).*/)/' "$QCM_GIFT"
#Substituer les "Questions n°1: " etc... par "::"
sed -i 's/Question n.\([0-9]\+\).*: *\(.*\)$/\/\/Question: \1 Name: \2\n::\2::[html]\2{/' "$QCM_GIFT"
#Dans les réponses, supprimer les . finales (s'ils éxistent) et ajouter un # à le final de la ligne
sed -i '/^~.*/ s/\.\? *$/#/' "$QCM_GIFT"
sed -i '/^=.*/ s/\.\? *$/#/' "$QCM_GIFT"
#Supprime les lines vides répétées
cat -s "$QCM_GIFT" > "$QCM_GIFT".tmp && cat "$QCM_GIFT".tmp > "$QCM_GIFT" && rm "$QCM_GIFT".tmp
}

####################### START OF THE SCRIPT   ################################################################################


if [[ -n $(ps x|grep soffice|grep libreoffice) ]];then
  if [ -x /usr/bin/zenity ];then
    zenity --no-wrap  --info --text "Libreoffice must be closed to convert office documents.\nClose any Libreoffice instance and try again."
    exit 1
  else
    #If there isn't zenity, we will use command line interface
    echo "Error: To convert office documents is necessary there isn't any Libreoffice instance running"
    echo "Close any Libreoffice instance and try again"
    exit 1
  fi
fi

while [[ "$1" ]];do
  cd "$1"
  while read "QCM_DOCX" ;do
  echo "1 $QCM_DOCX"
    create_aiken_gift "$QCM_DOCX"
  done < <(ls .|grep '\.docx')
shift
done
 


"blues are the roots and the other musics are the fruits" . Willie Dixon

Hors ligne

#25 12-11-2018 22:51:42

cemoi
Membre
Distrib. : Debian 10 Buster et une SID
Noyau : Linux 4.19.0-9-amd64
(G)UI : XFCE
Inscription : 21-10-2008

Re : convertir des qcm en .docx en .aiken puis en .gift

hello,
super!!

Pour la suite j'ai déja les models mais il me semble trés important de savoir ou on va d'abord:

il faudrai tester un fichier gift avec juste une question texte à trous car pour le moment je ne suis pas certain de la forme/syntaxe que celle si doit avoir dans le gift. Il y a bien la doc qui donne les indications mais est ce qu'elles sont vraiment bonnes?
J'ai créé une question texte à trous dans moodle et quand je l'exporte ça donne quelque chose de vide...

En export ça donne:

// question: 0  name: Switch category to $course$/top
$CATEGORY: $course$/top


// question: 0  name: Switch category to $course$/top/Défaut pour P01
$CATEGORY: $course$/top/Défaut pour P01


// question: 1  name: [porte n°1] Compléter la definition..."porte"....


// question: 2  name: Compléter la définition..."terminologie:baie"...



Alors que la question est bien plus complexe j'ai fait un screencast de la question dans moodle, j'ai mis l'export et la vidéo sur mon dépôt de fichier dans le répertoire "datas_pour_qcm_avec_texte_a_trous_et_images"

Je vais tester d'importer un exemple de la documentation voir si ça fonctionne correctement...

Pour l'intégration d'une image alors là je ne sais pas comment ça peu marcher... je pense qu'on a tout intérêt à faire ça étape par étape sauf si tu sais ou tu vas ou que t'as déjà une idée claire de comment procéder. smile

J'ai aussi mis un qcm avec questions par textes à trous et questions d’après une image.

Un grand merci pour tout ce travail smile

Edit:
je viens de me rendre compte que ma question n'est pas un texte à trous... mais un glisser-déposer sur texte!... pourtant le moodle me propose de l'exporter en gift mais on dirait que ça déconne totalement.

Ils appellent le texte à trous: question cloze: https://docs.moodle.org/3x/fr/Question_ … gr%C3%A9es

Dernière modification par cemoi (12-11-2018 23:12:38)


Linux debDesk Linux 4.19.0-9-amd64

Hors ligne

Pied de page des forums