Skip to content

Instantly share code, notes, and snippets.

@fbecart
Last active May 1, 2024 19:57
Show Gist options
  • Save fbecart/7abfde329e3f536160c0af1016e02b8b to your computer and use it in GitHub Desktop.
Save fbecart/7abfde329e3f536160c0af1016e02b8b to your computer and use it in GitHub Desktop.
Bookmarklet to export Leo Trainer words to an Anki deck.
/**
* This bookmarklet makes it possible to transfer words from Leo Trainer to Anki.
* It is configured for fr-de (French to German) translations, but can easily be
* adapted to other languages.
*
* Prerequisites:
* - a Leo account (http://www.leo.org/) with a few words saved in the trainer
* - an Anki account (https://ankiweb.net/account/register)
*
* 1. Crunch the following code and add it to your bookmarks
* (see http://ted.mielczarek.org/code/mozilla/bookmarklet.html)
* 2. Run the bookmarklet
* (you might have to run it twice, as the first run will lead you to the correct Leo page)
* 3. Import the downloaded file in Anki using \t as field separator and allowing HTML in fields
**/
// This is where you can adapt the script for other languages.
// `fromLang` is the language you know already, whereas `toLang` is the language you're learning.
const fromLang = 'fr';
const toLang = 'de';
function extractVocabulary() {
const output = [];
const matches = document.body.querySelectorAll('.tb-bg-alt-lightgray > tbody > tr');
for (let index = 0; index < matches.length; index++) {
const item = matches[index];
output.push([
item.querySelector(`td[lang=${fromLang}]`).innerHTML,
item.querySelector(`td[lang=${toLang}]`).innerHTML,
]);
}
return output;
}
function downloadTsvFile(filename, content) {
const tsv = content.reduce((acc, cur) => acc + cur.join('\t') + '\n', '');
const a = document.createElement('a');
a.setAttribute('href', 'data:text/tab-separated-values;charset=utf-8,' + encodeURIComponent(tsv));
a.setAttribute('download', filename);
document.body.appendChild(a);
a.click();
}
const manageFolderUrl = 'https://dict.leo.org/trainer/manageFolder.php' +
`?lp=${fromLang}${toLang}&lang=${toLang}`;
if (location != manageFolderUrl) {
location = manageFolderUrl;
} else {
downloadTsvFile('vokabeln.csv', extractVocabulary());
}
@fbecart
Copy link
Author

fbecart commented Feb 4, 2021

Hi @eriwst, I updated the code to make it easier to customize the languages. Is that working for you?

@paulwiniecki
Copy link

Hi @fbecart,

I'm hoping to use this process to download my Leo dictionary and add it to Anki (English to German). However, nothing seems to happen when using the follow script as a bookmarklet. Does anything need to be updated? All your help is much appreciated!

`/**

function extractVocabulary() {
var output = []
var matches = document.body.querySelectorAll('.tb-bg-alt-lightgray > tbody > tr')

for (var index = 0; index < matches.length; index++) {
let item = matches[index]
output.push([item.querySelector('td[lang=en]').innerHTML, item.querySelector('td[lang=de]').innerHTML])
}

return output
}

function downloadTsvFile(filename, content) {
var tsv = content.reduce(function (acc, cur) {
return acc + cur.join('\t') + '\n'
}, '')

var a = document.createElement('a')
a.setAttribute('href', 'data:text/tab-separated-values;charset=utf-8,' + encodeURIComponent(tsv))
a.setAttribute('download', filename)
document.body.appendChild(a)
a.click()
}

var manageFolderUrl = 'https://dict.leo.org/trainer/manageFolder.php?lp=ende&lang=de'
if (location != manageFolderUrl) location = manageFolderUrl
else downloadTsvFile('vokabeln.csv', extractVocabulary())`

@fbecart
Copy link
Author

fbecart commented Oct 12, 2023

@paulwiniecki I just tested the bookmarklet, and it seems to be still working.

The code snippet you posted is hard to read because of incorrect markdown formatting. I can see however that you have made more modifications than needed, and this is likely the cause of your troubles.

I suggest you restart from the code I shared at the very top. You only need to change line 19, so that it looks like:

const fromLang = 'en';

@paulwiniecki
Copy link

@fbecart thank you so much for your prompt response. I was able to get it to work following your instructions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment