In einem eher obskuren Kommentarthread erklärte jemand, wo sich möglicherweise die Wortliste befindet, mit der Apple den Bildschirmschoner ansteuert. Es ist bei /System/Library/Graphics/Quartz\ Composer\ Plug-Ins/WOTD.plugin/Contents/Resources/NOAD_wotd_list.txt
. Die Datei sieht folgendermaßen aus:
m_en_us1282510 quinsy
m_en_us1273791 orbicular
m_en_us1220945 alimony
m_en_us1250517 genome
Es ist eine Liste von durch Tabulatoren getrennten Einträgen. Auf der rechten Seite steht das Wort und auf der linken Seite, was wie ein Ausweis aussieht. Aber wofür ist es eine ID und wie können Sie sie für ein anderes Wort finden, das noch nicht auf der Liste steht?
Wie zu erwarten, bezieht sich die ID auf einen Eintrag im Standardwörterbuch von Apple, dem "New Oxford American Dictionary". (Dafür steht "NOAD" im obigen Wortlistenpfad.)
Wie finde ich die IDs für andere Wörter?
Ein Kollege namens Joseph Gentle zeigt in einer Reihe von Blog-Posts, wie man an die Daten kommt, die Apples Wörterbüchern zugrunde liegen. In seinem Beitrag "Apple dictionarys, part 2" verweist er auf Code, der die relevante Binärdatei (gespeichert in /Library/Dictionaries
) in XML entpackt . Unter Verwendung der hier gefundenen dedict.c
und strip.c
-Dateien und gemäß dem Beispiel von Gentle habe ich die folgenden Bash-Befehle verwendet, um auf das XML des NOAD zuzugreifen (diese Befehle werden aus dem Verzeichnis ausgeführt, in das Sie die und -Dateien heruntergeladen haben ):dedict.c
strip.c
clang dedict.c -Wall -lz -o dedict
clang strip.c -Wall -lz -o strip
./dedict "New Oxford American Dictionary" | ./strip > dict.xml
Als ich head
die ersten Zeilen der dict.xml
Datei schrieb, sah ich etwas vielversprechendes mit Einträgen, die so aussahen:
<d:entry xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng" id="m_en_us1219333" d:title="abode" class="entry">
Beachten Sie, dass id
param ... ein Bezeichner ist, der genau so aussieht wie der in der Bildschirmschoner-Wortliste!
Ich habe das folgende Ruby-Skript geschrieben, um das XML zu analysieren, und dann mithilfe meiner eigenen Wortliste eine neue Bildschirmschonerdatei erstellt, die meine eigenen Wörter ihren IDs im Wörterbuch zuordnet:
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
Als ich die ursprüngliche Bildschirmschonerdatei durch diese neue ersetzte, funktionierte es. Sie können jetzt einen Bildschirmschoner "Wort des Tages" erstellen, der Definitionen für die von Ihnen ausgewählten Wörter enthält.