Em um tópico de comentário bastante obscuro, alguém explicou onde você pode encontrar a lista de palavras que a Apple usa para ativar o protetor de tela. É às /System/Library/Graphics/Quartz\ Composer\ Plug-Ins/WOTD.plugin/Contents/Resources/NOAD_wotd_list.txt
. O arquivo fica assim:
m_en_us1282510 quinsy
m_en_us1273791 orbicular
m_en_us1220945 alimony
m_en_us1250517 genome
É uma lista de entradas separadas por tabulação. À direita, você tem a palavra e, à esquerda, o que parece um ID. Mas para que serve um ID e como você poderia encontrá-lo para outra palavra que ainda não está na lista?
Como você pode esperar, o ID refere-se a uma entrada no dicionário padrão da Apple, o "New Oxford American Dictionary". (É isso que "NOAD" significa no caminho da lista de palavras acima.)
Como encontrar os IDs para outras palavras?
Um colega chamado Joseph Gentle, em uma série de postagens no blog, mostra como obter os dados subjacentes aos dicionários da Apple. Em sua postagem "Apple dicionários, parte 2" , ele aponta para o código que descompacta o arquivo binário relevante (armazenado em /Library/Dictionaries
) no XML. Usando os arquivos dedict.c
e strip.c
encontrados aqui , e seguindo o exemplo de Gentle, usei os seguintes comandos bash para obter o XML do NOAD (esses comandos são executados no diretório em que você baixou os arquivos dedict.c
e strip.c
):
clang dedict.c -Wall -lz -o dedict
clang strip.c -Wall -lz -o strip
./dedict "New Oxford American Dictionary" | ./strip > dict.xml
Quando head
editei as primeiras linhas do dict.xml
arquivo, vi algo promissor, com entradas parecidas com esta:
<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 ... é um identificador que se parece exatamente com o da lista de palavras do protetor de tela!
Escrevi o seguinte script Ruby para analisar o XML e, usando minha própria lista de palavras, crie um novo arquivo de proteção de tela que mapeie minhas próprias palavras para seus IDs no dicionário:
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
Quando substituí o arquivo original do protetor de tela por um novo, ele funcionou. Agora você pode ter um protetor de tela "Palavra do dia" que fornece definições para as palavras que você escolhe.