I figured I'd post an update in case someone else finds this useful. Obviously, it's possible I'm doing something stupid, but ... it seems to be working. :-)
The script I'm using is here: https://github.com/alefore/edge/blob/master/src/clozes.py. It reads my entire set of Markdown files and outputs a cards.xml file with cloze deletion facts+cards. I wrote a bit about it in: https://github.com/alefore/weblog/blob/master/zettelkasten.md#spaced-repetition-and-notes At first, I tried to use the libmnemosyne API but figuring out how to update previously created cards (e.g., if the index property of a cloze deletion card changes) seemed tricky. So I opted for using the *.cards approach. I'm generating the IDs of the facts/cards in a ~stable manner (fact IDs are a function of the path where they were found, cloze deletion card IDs are a function of the path + hash of the answer). Thank you once again, Peter, for your help! The suggestion to just generate *.cards files was super useful! <3 On Fri, Apr 24, 2020 at 6:27 PM Alejandro Forero Cuervo <[email protected]> wrote: > Awesome, thank you very much for your help, Peter! > > Looks easy enough. I guess I'll probably use the Python API, that example > you sent me looks pretty straightforward. Once I've figured out the details > (e.g., how to generate IDs and such), I'll probably update this thread with > the results, in case others find it useful. > > Thanks again! > > On Fri, Apr 24, 2020 at 1:31 PM <[email protected]> wrote: > >> Hi, >> >> >> >> Glad you like Mnemosyne! >> >> >> >> There’s two options to achieve what you want: >> >> >> >> One is to use the Python API to create, retrieve and edit cards (see >> https://github.com/mnemosyne-proj/mnemosyne/tree/master/mnemosyne/example_scripts >> for examples). I would not recommend directly approaching the sqlite >> database, as that will result in the sync algorithm not picking up any >> changes (that’s what all the logging statements are for). >> >> >> >> Alternatively, you can try to manually create a *.card files instead of a >> text file, as these contain ids so that later on you can import them again >> to result in an update. >> >> >> >> >> https://github.com/mnemosyne-proj/mnemosyne/blob/master/mnemosyne/libmnemosyne/file_formats/mnemosyne2_cards.py >> >> >> >> A *.cards file is basically a zipfile. Just look into one to get a >> feeling for how it is put together. >> >> >> >> Good luck! >> >> >> >> Peter >> >> >> >> *From:* [email protected] < >> [email protected]> *On Behalf Of *Alejandro Forero >> Cuervo >> *Sent:* 23 April 2020 21:52 >> *To:* [email protected] >> *Subject:* [mnemosyne-proj-users] Updating previously imported cards? >> >> >> >> Hello, >> >> I'm super happy with Mnemosyne, which I've been using since 2014. I >> currently have 8.1k cards. I find it very useful! I'm a huge fan. :-) >> >> I'm beginning to generate cards from my set of notes (my Zettelkasten, as >> described in >> https://github.com/alefore/weblog/blob/master/zettelkasten.md#spaced-repetition-and-notes) >> that I import into Mnemosyne. I consider my notes my canonical source of >> information and I just want to be able to import them into Mnemosyne. I >> have been quite successfully generating and importing tab separated files. >> It works great! >> >> I was wondering if there's a way to update previously imported cards >> (without losing their state)? When I update my notes with additional >> information, I would love for their associated cards to be updated. >> >> For example, I have a note like this (simplifying somewhat): >> >> Paul Klee timeline: >> * 1879: Born in Münchenbuchsee, Switzerland. >> * 1940: Died. >> >> >> >> zkcloze("1940", "year"); >> >> zkclose("Switzerland", "Country"); >> zkcloze("1879", "year"); >> >> >> The last 3 lines basically specify that 3 flashcards should be generated, >> using cloze deletion, replacing specific tokens (e.g., "1879") with a hint >> ("___year___"), such as: >> >> Paul Klee timeline: <ul><li><b>___year___</b>: Born in Münchenbuchsee, >> Switzerland</li><li>1940: Died.</li></ul>\t Paul Klee timeline: >> <ul><li><b>1879</b>: Born in Münchenbuchsee, Switzerland</li><li>1940: >> Died.</li></ul> >> >> >> So far so good. This works great! >> >> >> >> However, if I edit the note in the future (perhaps I register the fact >> that he got married in 1906; or maybe I discover that I had the city >> wrong), I would like to just update the three notes to include this >> additional data *without losing all the state*. >> >> >> >> Does anybody have any suggestions for how to do this? I think part of the >> challenge is cross-linking the "zkclose" lines in my note with some IDs in >> Mnemosyne so that when I generate the new tab-separated file with updated >> cards, each new card can be associated with the corresponding card >> previously imported to Mnemosyne's db. Perhaps there's some way I can >> generate some ~random IDs (in a very large namespace so that the >> probabilities of collisions are negligible) and just insert the notes with >> such IDs? Is something like this possible? Failing that, is there some way >> to reimport notes and have Mnemosyne just update previously imported notes? >> >> >> >> Perhaps I should generate SQL sentences and import them directly into >> Mnemosyne's sqlite database? That sounds a bit brittle, so I'm looking for >> some alternative. :-) But, failing that, I guess I'll look more closely at >> SQLite.py to try to make sure I understand the semantics of the fields in >> the "insert into cards" statement in SQLite.add_card. But, yeah, I'd rather >> use a more "supported" route. :-) Maybe there's some other format (than the >> tab-separated text files) that supports importing cards containing some ID? >> >> >> >> Thanks in advance for all your help! And, apart from this, thanks a ton >> for maintaining such a useful piece of software! It has had a very positive >> impact in my life. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "mnemosyne-proj-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/mnemosyne-proj-users/CAJphAxVy%2BGn-LxTEDupMTRR0f0NSMKRFteAptku6xv4eOpe%3DUQ%40mail.gmail.com >> <https://groups.google.com/d/msgid/mnemosyne-proj-users/CAJphAxVy%2BGn-LxTEDupMTRR0f0NSMKRFteAptku6xv4eOpe%3DUQ%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> >> -- >> You received this message because you are subscribed to the Google Groups >> "mnemosyne-proj-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/mnemosyne-proj-users/004001d61a2b%24f5c829a0%24e1587ce0%24%40gmail.com >> <https://groups.google.com/d/msgid/mnemosyne-proj-users/004001d61a2b%24f5c829a0%24e1587ce0%24%40gmail.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "mnemosyne-proj-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/mnemosyne-proj-users/CAJphAxW--3RVOZD7%3DVhhQ1t_agVpc7gU3CZ7t_a0bt%2BpknXkHw%40mail.gmail.com.
