En un hilo de comentarios bastante oscuro, alguien explicó dónde puede encontrar la lista de palabras que Apple usa para activar el protector de pantalla. Es 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 tabulaciones. A la derecha tienes la palabra, y a la izquierda, lo que parece una identificación. Pero, ¿para qué sirve una identificación y cómo podría encontrarla para otra palabra que aún no está en la lista?
Como es de esperar, la ID se refiere a una entrada en el diccionario predeterminado de Apple, el "Nuevo Diccionario Americano de Oxford". (Eso es lo que significa "NOAD" en la ruta de la lista de palabras anterior).
¿Cómo encontrar las ID para otras palabras?
Un compañero llamado Joseph Gentle, en una serie de publicaciones de blog, muestra cómo obtener los datos subyacentes a los diccionarios de Apple. En su publicación "Diccionarios de Apple, parte 2" , señala un código que desempaqueta el archivo binario relevante (almacenado /Library/Dictionaries
) en XML. Usando los archivos dedict.c
y strip.c
que se encuentran aquí , y siguiendo el ejemplo de Gentle, utilicé los siguientes comandos bash para obtener 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
escribí las primeras líneas del dict.xml
archivo, vi algo prometedor, con entradas que se veían así:
<d:entry xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng" id="m_en_us1219333" d:title="abode" class="entry">
Tenga en cuenta 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, creé un nuevo archivo de protector de pantalla 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 original del protector de pantalla con este nuevo, funcionó. Ahora puede tener un protector de pantalla "Palabra del día" que le da definiciones para las palabras que elija.