Bonjour à tous, j’ai conscience que mon problème est très spécifique et je ne m’attends pas à trouver une aide providentielle. Toutefois, le script Python utilisé me semble relativement simple et j’ai bon espoir qu’un connaisseur puisse m’accompagner. Étant étudiant à l’ENS j’ai aussi demandé l’aide d’étudiants en Math/info, si je trouve un volontaire je vous ferai part de ses remarques, peut-être profiteront-elles à la communauté ? Au plaisir d’échanger avec vous (et désolé pour le Pavé César) !

J’utilise principalement deux logiciels pour la préparation de mes concours. Le premier sert à réaliser des cartes mentales et s’appelle Margin Note 3. Le second est destiné à la mémorisation et se nomme Anki. Ce dernier fonctionne sur un principe de «*Flashcards*», c’est à dire des fiches contenant d’un côté la question et de l’autre la réponse. Une fois répondu, on indique la difficulté de la question et l’algorithme se charge de planifier la prochaine révision. Il est possible depuis Margin Note 3 d’exporter ces Flashcards vers Anki sous le format .APKG

Malheureusement cet export contient une erreur dans sa formulation du «*cloze deletion*» (texte à trou). En effet, Anki reconnait les textes à trou avec la formule suivante : {{c1::hello}} my {{c2::world}} et crée ainsi deux Flashcards, l’une masquant {{c1::hello}} et une autre masquant my {{c2::world}}.

En exportant depuis Margin Note 3, on obtient non pas {{c1::hello}} my {{c2::world}} mais {{c1::hello}} my {{c1::world}} ce qui a pour effet, une fois importé dans Anki, de ne créer qu’une seule Flashcard, compliquant grandement les révisions (une seule fiche peut contenir des dizaines de textes à trou…). Cela, alors même que le logiciel comprend la possibilité d’exporter en c1/c2 mais dont le format (ou le code, mes compétences s’arrêtent ici) n’est plus reconnu par Anki depuis sa version 2.0 C’est justement le but du script Python3 «*mn3_anki_fix*» qui fait passer l’export Margin Note 3 : de {{c1::hello}} my {{c1::world}} à {{c1::hello}} my {{c2::world}}

Voici sa page GitHub : https://github.com/lins05/mn3_anki_fix

Toutefois, cela ne fonctionne pas comme attendu, j’arrive à faire fonctionner le script correctement en ne masquant pas les mots des textes à trous :

Nom : 2.png
Affichages : 89
Taille : 1,05 Mo

Donne alors

Nom : 138279322-f275573a-066a-4b96-978c-c113948a43fb.png
Affichages : 83
Taille : 334,0 Ko

Mais lorsque ceux-ci sont masqués

Nom : 138279758-f33ef052-7b28-4c7d-9e53-ed767708a776.png
Affichages : 84
Taille : 793,3 Ko

J'obtiens :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
dhcp-181-29:mn3_anki_fix-master josephdupont$ ./fix_mn_anki_exports.py fix "/Users/josephdupont/Desktop/With.apkg"
[10/21/2021 14:44:17][fix_mn_anki_exports]: files: ['collection.anki2', 'media']
[10/21/2021 14:44:17][fix_mn_anki_exports]: Extracted collection.anki2 to /tmp/mn-anki-exports-fix/tmplljjj4v_
[10/21/2021 14:44:17][fix_mn_anki_exports]: Loaded the model
[10/21/2021 14:44:17][fix_mn_anki_exports]: Loaded 48 notes
[10/21/2021 14:44:17][fix_mn_anki_exports]: Fixed all 48 notes
[10/21/2021 14:44:17][fix_mn_anki_exports]: Loaded deck info: deck name = 20184556082557, id = Droit public - Chapitre 5 : les autorités indépendantes
[10/21/2021 14:44:17][fix_mn_anki_exports]: Generating output file /tmp/output.apkg
Traceback (most recent call last):
  File "/Users/josephdupont/Desktop/mn3_anki_fix-master/./fix_mn_anki_exports.py", line 346, in <module>
    main(obj={})
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 1128, in __call__
    return self.main(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/click/core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "/Users/josephdupont/Desktop/mn3_anki_fix-master/./fix_mn_anki_exports.py", line 304, in fix
    _fix_path(path)
  File "/Users/josephdupont/Desktop/mn3_anki_fix-master/./fix_mn_anki_exports.py", line 317, in _fix_path
    _fix_dbfile(dbfile)
  File "/Users/josephdupont/Desktop/mn3_anki_fix-master/./fix_mn_anki_exports.py", line 56, in _fix_dbfile
    return _fix_db(db)
  File "/Users/josephdupont/Desktop/mn3_anki_fix-master/./fix_mn_anki_exports.py", line 284, in _fix_db
    genanki.Package(deck).write_to_file(OUTPUT_FILE)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/genanki/package.py", line 29, in write_to_file
    self.write_to_db(cursor, now_ts)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/genanki/package.py", line 49, in write_to_db
    deck.write_to_db(cursor, now_ts)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/genanki/deck.py", line 67, in write_to_db
    note.write_to_db(cursor, now_ts, self.deck_id)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/genanki/note.py", line 69, in write_to_db
    card.write_to_db(cursor, now_ts, deck_id, note_id)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/genanki/card.py", line 9, in write_to_db
    cursor.execute('INSERT INTO cards VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);', (
sqlite3.IntegrityError: UNIQUE constraint failed: cards.id
dhcp-181-29:mn3_anki_fix-master josephdupont$
Ce bloc de code vous renseigne-t-il sur une éventuelle erreur de ma part ? Sur une partie à corriger ?