Pour le projet eBook Reader Dictionaries, j'avais besoin d'inspecter le dictionnaire généré pour les Kindle : un fichier au format .mobi
(Mobipocket E-book) créé à l'aide de l'utilitaire kindlegen.
Pour l'exemple, j'utiliserai le dictionnaire de l'ancien français, avec le fichier dict-fro-fro.mobi
:
$ file dict-fro-fro.mobi
dict-fro-fro.mobi: Mobipocket E-book "Wiktionary FRO-FRO", 5095255 bytes uncompressed, version 7, codepage 65001
Extraction
Nous avons deux solutions pour extraire les données d'un dictionnaire Mobi.
Mobitool
Une première solution avec mobitool
, du projet Libmobi :
$ sudo apt install libmobi-tools
Pour extraire les données dans un dossier, disons output :
$ mkdir output
$ mobitool -s -o output dict-fro-fro.mobi
Si tout se passe bien, la sortie devrait afficher quelque chose comme :
Title: Wiktionary FRO-FRO
Subject: Dictionaries
Description: Wiktionnaire (ɔ) 2025
Language: fro (utf8)
Dictionary: fr-fr => fr-fr
__
Mobi version: 7
Creator software: kindlegen 2.9.0 (linux)
Reconstructing source resources...
Warning: program compiled against libxml 212 using older 209
Dumping resources...
Saving markup to output/dict-fro-fro_markup
part00000.html
resource00000.jpg
resource00002.jpg
resource00003.ncx
resource00004.opf
Dans le dossier output, nous trouverons :
$ tree output
output
└── dict-fro-fro_markup
├── part00000.html
├── resource00000.jpg
├── resource00002.jpg
├── resource00003.ncx
└── resource00004.opf
2 directories, 5 files
Le fichier pertinent est output/dict-fro-fro_markup/part00000.html.
KindleUnpack
Solution alternative avec KindleUnpack :
$ git clone https://github.com/kevinhendricks/KindleUnpack
$ git checkout ca9549e03cd6cede5af1b248ff8438f523cdaf6e
# Patch pour les soucis avec des caractères unicode
$ git apply << 'EOF'
diff --git a/lib/mobi_dict.py b/lib/mobi_dict.py
index 55ebe2f..abd385c 100644
--- a/lib/mobi_dict.py
+++ b/lib/mobi_dict.py
@@ -203,7 +203,7 @@ def getPositionMap(self):
else:
utext += unichr(off)
pos += inc
- text = utext.encode('utf-8')
+ text = utext.encode('utf-8', 'replace')
tagMap = getTagMap(controlByteCount, tagTable, data, startPos+1+textLength, endPos)
if 0x01 in tagMap:
EOF
Pour extraire les données dans un dossier, disons output :
$ python KindleUnpack/lib/kindleunpack.py -r dict-fro-fro.mobi output
Si tout se passe bien, la sortie devrait afficher quelque chose comme :
KindleUnpack v0.83
Based on initial mobipocket version Copyright © 2009 Charles M. Hannum <root@ihack.net>
Extensive Extensions and Improvements Copyright © 2009-2020
by: P. Durrant, K. Hendricks, S. Siebert, fandrieu, DiapDealer, nickredding, tkeo.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3.
Unpacking Book...
Palm DB type: BOOKMOBI, 1280 sections.
Unpacking a Mobipocket 7 book...
Processing Mobipocket 7 section of book...
Mobi Version: 7
Codec: utf-8
Title: Wiktionary FRO-FRO
Palmdoc compression
Unpacking images, resources, fonts, etc
Extracting image: cover01273.jpeg from section 1273
Extracting image: thumb01275.jpeg from section 1275
File contains kindlegen build log, extracting as kindlegenbuild.log
Unpacking raw markup language
Write ncx
Info: Document contains orthographic index, handle as dictionary
Parsing metaInflIndexData
Parsing metaOrthIndex
orthIndexCount is 11
orth entry uses ordt2 lookup table of type 0
Read dictionary index data
Find link anchors
Insert data into html
Insert hrefs into html
Remove empty anchors from html
Insert image references into html
Building an opf for mobi7/azw4.
Completed
Dans le dossier output, nous trouverons :
$ tree output
output
├── HDImages
├── kindlegenbuild.log
└── mobi7
├── book.html
├── content.opf
├── dict-fro-fro.rawml
├── Images
│ ├── cover01273.jpeg
│ └── thumb01275.jpeg
└── toc.ncx
4 directories, 7 files
Le fichier pertinent est output/mobi7/book.html.
Embellir
Quel que soit l'outil utilisé, le fichier pertinent est un fichier HTML contenant tout le dictionnaire en une seule ligne.
Pour faciliter mes recherches, xq
permet de redonner des couleurs et des formes au code HTML :
$ sudo apt install xq
$ xq FICHIER.html > book-pretty.html
Enfin, je peux m'éclater avec le fichier final book-pretty.html !