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 !