使用Dictionary.app’;在OSX上以编程方式使用s同义词库函数(最好通过Ruby)
我需要编写一个Ruby方法,它接受一个单词,通过OS10.5的Dictionary.app的同义词库函数运行它,然后返回其他单词 如果Ruby方法最终调用命令行,那就好了;我只需要能够从Ruby编程实现它 在浏览了Ruby OSA之后,我意识到可以通过一些字典服务来访问字典[,但我并不真正了解它 有人看到一个简单的解决方案吗使用Dictionary.app’;在OSX上以编程方式使用s同义词库函数(最好通过Ruby),ruby,macos,scripting,dictionary,Ruby,Macos,Scripting,Dictionary,我需要编写一个Ruby方法,它接受一个单词,通过OS10.5的Dictionary.app的同义词库函数运行它,然后返回其他单词 如果Ruby方法最终调用命令行,那就好了;我只需要能够从Ruby编程实现它 在浏览了Ruby OSA之后,我意识到可以通过一些字典服务来访问字典[,但我并不真正了解它 有人看到一个简单的解决方案吗 我还准备制作一个Automator工作流并从命令行调用它,但由于某种原因,我无法从shell中正确地为“Get Definition”函数提供一个单词(它一直说找不到该单词
我还准备制作一个Automator工作流并从命令行调用它,但由于某种原因,我无法从shell中正确地为“Get Definition”函数提供一个单词(它一直说找不到该单词,但在手动查找时它工作正常)。不幸的是,这是唯一的编程接口(字典服务)不支持设置字典 但是,它确实会参考字典首选项来使用指定的第一个字典,因此您可能会以非常难看的方式重置首选项,以便同义词库是唯一可用的字典 这确实令人恶心,如果被吸入,很可能会破裂,但它应该有效:
/* 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"];
}
我已经将代码更新为适用于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);
}
#导入
#包括
NSUserDefaults*GetUserDefaults(){
返回[NSUserDefaults standardUserDefaults];
}
NSMutableDictionary*GetGlobalDomain(){
NSUserDefaults*userDefaults=GetUserDefaults();
NSMutableDictionary*dictionaryPrefs=
[[userDefaults persistentDomainForName:@“Apple Global Domain”]mutableCopy];
返回字典引用;
}
NSMutableDictionary*GetDictionaryPreferences(){
返回[[GetGlobalDomain()objectForKey:@“com.apple.DictionaryServices”]mutableCopy];
}
NSArray*GetCurrentDictionaryList(){
返回[GetDictionaryPreferences()objectForKey:@“DCSActiveDictionaries”];
}
void SetUserDictPreferences(NSArray*数组){
NSMutableDictionary*currentPref=GetDictionaryPreferences();
[currentPref setObject:array forKey:@“DCSActiveDictionaries”];
NSDictionary*immutPref=[NSDictionary Dictionary WithDictionary:currentPref];
NSMutableDictionary*g=GetGlobalDomain();
[g setObject:ImmutRef-forKey:@“com.apple.DictionaryServices”];
NSUserDefaults*defaults=GetUserDefaults();
[默认设置PersistentDomain:g forName:@“苹果全局域”];
}
int main(int argc,char*argv[]){
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSArray*currentPrefs=GetCurrentDictionaryList();
NSString*dict=[NSString stringWithUTF8String:argv[1]];
NSString*word=[NSString stringWithUTF8String:argv[2]];
SetUserDictPreferences([NSArray arrayWithObject:dict]);
将([(NSString*)DCSCopyTextDefinition(NULL,(CFStringRef)字,
CFRangeMake(0,[字长])UTF8String];
SetUserDictPreferences(currentPrefs);
}
Hey感谢您发布这篇文章——我刚刚编译并尝试在Mountain Lion上使用它,它返回的是字典而不是同义词表条目。您知道如何将其应用于Mountain Lion吗?或者现在可能有一个更干净的解决方案?很遗憾,dictionary Services API自10.5以来并没有改变(请提交一个bug!)但是DCSActiveDictionaries
移动到了10.7中com.apple.DictionaryServices
键下的NSGlobalDomain
。我编译了,但生成的二进制文件总是只打印(null)
。我有xcodebuild-版本Xcode 4.4.1 Build版本4F1003和gcc版本4.2.1请阅读我的评论-你不能像10.7或10.8中那样使用我的代码,你需要像我描述的那样修改它。(不,我不会为你编写代码。)Mattt Thompson写了一篇NSHipster文章,详细介绍了这个主题:
#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);
}