Sur un fil de commentaires plutôt obscur, quelqu'un a expliqué où vous pourriez trouver la liste de mots qu'Apple utilise pour alimenter l'économiseur d'écran. C'est à /System/Library/Graphics/Quartz\ Composer\ Plug-Ins/WOTD.plugin/Contents/Resources/NOAD_wotd_list.txt
. Le fichier ressemble à ceci:
m_en_us1282510 quinsy
m_en_us1273791 orbicular
m_en_us1220945 alimony
m_en_us1250517 genome
Il s'agit d'une liste d'entrées séparées par des tabulations. À droite, vous avez le mot, et à gauche, ce qui ressemble à une pièce d'identité. Mais à quoi sert un identifiant et comment pourriez-vous le trouver pour un autre mot qui ne figure pas déjà sur la liste?
Comme vous vous en doutez, l'ID fait référence à une entrée du dictionnaire par défaut d'Apple, le "New Oxford American Dictionary". (C'est ce que "NOAD" signifie dans le chemin de la liste de mots ci-dessus.)
Comment trouver les identifiants pour d' autres mots?
Un collègue du nom de Joseph Gentle, dans une série de billets de blog, montre comment accéder aux données sous-jacentes aux dictionnaires d'Apple. Dans son article "Apple dictionaries, part 2" , il pointe du code qui décompresse le fichier binaire pertinent (stocké dans /Library/Dictionaries
) en XML. En utilisant les fichiers dedict.c
et strip.c
trouvés ici , et en suivant l'exemple de Gentle, j'ai utilisé les commandes bash suivantes pour obtenir le XML du NOAD (ces commandes sont exécutées à partir du répertoire où vous avez téléchargé les fichiers dedict.c
et strip.c
):
clang dedict.c -Wall -lz -o dedict
clang strip.c -Wall -lz -o strip
./dedict "New Oxford American Dictionary" | ./strip > dict.xml
Lorsque j'ai head
modifié les premières lignes du dict.xml
fichier, j'ai vu quelque chose de prometteur, avec des entrées qui ressemblaient à ceci:
<d:entry xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng" id="m_en_us1219333" d:title="abode" class="entry">
Notez que id
param ... c'est un identifiant qui ressemble exactement à celui de la liste de mots de l'économiseur d'écran!
J'ai écrit le script Ruby suivant pour analyser le XML, puis, en utilisant ma propre liste de mots, j'ai créé un nouveau fichier d'économiseur d'écran qui mappe mes propres mots à leurs ID dans le dictionnaire:
raw = File.open("./dict.xml").read
my_words = File.open("./word_list.csv").readlines.map { |line| line.split(',')[1] }
word_id_map = {}
raw.scan(/<d:entry .*? id="(.*?)" d:title="(.*?)" class="entry">/).each do |entry|
word_id_map[entry[1]] = entry[0]
end
my_words.each do |word|
if id = word_id_map[word]
puts [id, word].join(' ')
end
end
Lorsque j'ai remplacé le fichier d'économiseur d'écran d'origine par ce nouveau, cela a fonctionné. Vous pouvez maintenant avoir un économiseur d'écran "Mot du jour" qui donne des définitions pour les mots que vous choisissez.