En un hilo de comentarios bastante oscuro, alguien explicó dónde podría encontrar la lista de palabras que Apple usa para impulsar el protector de pantalla. Está en /System/Library/Graphics/Quartz\ Composer\ Plug-Ins/WOTD.plugin/Contents/Resources/NOAD_wotd_list.txt
. El archivo se ve así:
m_en_us1282510 quinsy
m_en_us1273791 orbicular
m_en_us1220945 alimony
m_en_us1250517 genome
Es una lista de entradas separadas por tabuladores. A la derecha tiene la palabra, y a la izquierda, lo que parece una identificación. Pero, ¿para qué es una identificación y cómo podría encontrarla para otra palabra que no esté en la lista?
Como es de esperar, la ID se refiere a una entrada en el diccionario predeterminado de Apple, el "New Oxford American Dictionary". (Eso es lo que significa "NOAD" en la ruta de la lista de palabras de arriba).
¿Cómo encontrar los ID para otras palabras?
Un compañero llamado Joseph Gentle, en una serie de publicaciones del blog, muestra cómo obtener los datos subyacentes a los diccionarios de Apple. En su publicación de "Diccionarios de Apple, parte 2" , señala el código que desempaqueta el archivo binario relevante (almacenado en /Library/Dictionaries
) en XML. Usando los archivos dedict.c
y strip.c
encontrados aquí , y siguiendo el ejemplo de Gentle, usé los siguientes comandos de bash para obtener en el XML de NOAD (estos comandos se ejecutan desde el directorio donde descargó los archivos dedict.c
y strip.c
):
clang dedict.c -Wall -lz -o dedict
clang strip.c -Wall -lz -o strip
./dedict "New Oxford American Dictionary" | ./strip > dict.xml
Cuando head
-ed las primeras líneas del archivo dict.xml
, vi algo prometedor, con entradas que parecían a esto:
<d:entry xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng" id="m_en_us1219333" d:title="abode" class="entry">
Observe que id
param ... ¡es un identificador que se ve exactamente como el de la lista de palabras del protector de pantalla!
Escribí el siguiente script de Ruby para analizar el XML, y luego, usando mi propia lista de palabras, cree un archivo de protector de pantalla nuevo que asigna mis propias palabras a sus ID en el diccionario:
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
Cuando reemplacé el archivo del protector de pantalla original con este nuevo, funcionó. Ahora puedes tener un protector de pantalla de "Palabra del día" que proporciona definiciones de las palabras que elijas.