Использование тезауруса Dictionary.app программно в OSX (желательно через Ruby) - PullRequest
10 голосов
/ 24 апреля 2009

Мне нужно написать метод Ruby, который берет слово, запускает его через тезаурусную функцию Dictionary.app в OS 10.5 и возвращает альтернативные слова.

Если метод Ruby завершает вызов командной строки, это нормально; Мне просто нужно быть в состоянии сделать это программно из Ruby.

Просматривая Ruby OSA, я понимаю, что словарь доступен через некоторую службу словарей [http://discussions.apple.com/thread.jspa?threadID=1561332],, но я на самом деле не понимаю.

Кто-нибудь видит простое решение?

Я также собирался создать рабочий процесс Automator и вызывать его из командной строки, но по какой-то причине я не смог правильно передать функции «Получить определение» слово из оболочки (оно продолжало говорить, что не могу найти слово, но при поиске вручную это сработало).

Ответы [ 2 ]

17 голосов
/ 24 апреля 2009

К сожалению, единственный программный интерфейс для этого (службы словаря) не поддерживает настройку словаря.

Тем не менее, он обращается к настройкам словаря, чтобы использовать первый указанный словарь, так что вы можете, очень уродливо, сбросить настройки, чтобы тезаурус был единственным доступным словарем.

Это действительно отвратительно и может сломаться, если подышать, но это должно сработать:

/* compile with:

   gcc -o thesaurus -framework CoreServices -framework Foundation thesaurus.m
*/

#import <Foundation/Foundation.h>
#include <CoreServices/CoreServices.h>

int main(int argc, char *argv[]) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  NSMutableDictionary *dictionaryPrefs =
    [[userDefaults persistentDomainForName:@"com.apple.DictionaryServices"] mutableCopy];

  NSArray *activeDictionaries = [dictionaryPrefs objectForKey:@"DCSActiveDictionaries"];

  [dictionaryPrefs setObject:
    [NSArray arrayWithObject:@"/Library/Dictionaries/Oxford American Writer's Thesaurus.dictionary"]
                      forKey:@"DCSActiveDictionaries"];
  [userDefaults setPersistentDomain:dictionaryPrefs forName:@"com.apple.DictionaryServices"];

  NSString *word = [NSString stringWithUTF8String:argv[1]];
  puts([(NSString *)DCSCopyTextDefinition(NULL, (CFStringRef)word,
                                          CFRangeMake(0, [word length])) UTF8String]);

  [dictionaryPrefs setObject:activeDictionaries forKey: @"DCSActiveDictionaries"];
  [userDefaults setPersistentDomain:dictionaryPrefs forName:@"com.apple.DictionaryServices"];
}

И используйте его как:

% ./thesaurus string
noun 
1 twine, cord, yarn, thread, strand.
2 chain, group, firm, company.
3 series, succession, chain, sequence, run, streak.
4 line, train, procession, queue, file, column, convoy, cavalcade.
[...]
7 голосов
/ 27 мая 2013

Я обновил код для работы с 10.7 и 10.8. Вся заслуга Николаса Райли; Я бы не смог написать это без него!

Я немного изменил его, чтобы вы могли выбрать словарь для поиска, используйте его следующим образом: $dictionary $PATH_TO_DICT $word

#import <Foundation/Foundation.h>
#include <CoreServices/CoreServices.h>

NSUserDefaults* GetUserDefaults() {
  return [NSUserDefaults standardUserDefaults];
}

NSMutableDictionary* GetGlobalDomain() {
  NSUserDefaults *userDefaults = GetUserDefaults();
  NSMutableDictionary *dictionaryPrefs =
    [[userDefaults persistentDomainForName:@"Apple Global Domain"] mutableCopy];
  return dictionaryPrefs;
}

NSMutableDictionary* GetDictionaryPreferences() {
   return [[GetGlobalDomain() objectForKey:@"com.apple.DictionaryServices"] mutableCopy];
}

NSArray* GetCurrentDictionaryList() {
  return [GetDictionaryPreferences() objectForKey:@"DCSActiveDictionaries"];
}

void SetUserDictPreferences(NSArray* array) {
  NSMutableDictionary *currentPref = GetDictionaryPreferences();
  [currentPref setObject:array forKey:@"DCSActiveDictionaries"];
  NSDictionary *immutPref = [NSDictionary dictionaryWithDictionary:currentPref];
  NSMutableDictionary *g = GetGlobalDomain();
  [g setObject:immutPref forKey:@"com.apple.DictionaryServices"];
  NSUserDefaults *defaults = GetUserDefaults();
  [defaults setPersistentDomain:g forName:@"Apple Global Domain"];
}


int main(int argc, char *argv[]) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSArray *currentPrefs = GetCurrentDictionaryList();

  NSString *dict = [NSString stringWithUTF8String:argv[1]];
  NSString *word = [NSString stringWithUTF8String:argv[2]];
  SetUserDictPreferences([NSArray arrayWithObject:dict]);
  puts([(NSString *)DCSCopyTextDefinition(NULL, (CFStringRef)word,
                                          CFRangeMake(0, [word length])) UTF8String]);

  SetUserDictPreferences(currentPrefs);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...