Проблема
MacOSX поставляется со словарями, хранящимися в /Library/Dictionaries
. Я хотел бы проанализировать их, чтобы программно получить результаты словаря (через терминал, AppleScript или Automator). Словари представляют собой пакеты MacOSX, и все они имеют папку Contents
, содержащую файл с именем Body.data
. Я хотел бы проанализировать этот файл для строки UTF-8 (возможно, двойные байты китайского символа) и вернуть строки, в которых найдена строка.
Я пробовал следующее, которое не возвращает никаких результатов:
find . -name 'Body.data' -exec grep -li '我' {} \;
Когда я ищу в словаре с помощью интерфейса приложения, я могу найти соответствующий текст. Моя цель — создать службу рабочего процесса для перевода выбранного китайского текста в эквиваленты пиньинь, которые хранятся в системных/пользовательских словарях.
Обновить
Следующее сработало для меня на основе принятого ответа:
Создал и заархивировал утилиту командной строки под названием rdef
, используя Xcode с этим кодом:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
if(argc < 2)
{
printf("Usage: rdef <word to define>");
return -1;
}
NSString * search =
[NSString stringWithCString: argv[1] encoding: NSUTF8StringEncoding];
CFStringRef def =
DCSCopyTextDefinition(NULL,
(__bridge CFStringRef)search,
CFRangeMake(0, [search length]));
NSString * output =
[NSString stringWithFormat: @"Definition of <%@>: %@", search, (__bridge NSString *)def];
printf("%s", [output UTF8String]);
}
return 0;
}
В рамки моего проекта добавлено следующее:
Выполните сборку, а затем развернули ее вручную, выполнив указанные ниже действия.
Для развертывания:
Щелкните правой кнопкой мыши архивный пакет и выберите «Показать в Finder». Затем отобразите содержимое пакета, разверните папку продукта и скопируйте исполняемый файл в /local/usr/bin
. Теперь из командной строки я могу запустить утилиту следующим образом:
rdef 我|awk -F '\|' '{ gsub(/^ +| +$/, "", $2); print $2 }'
Пожалуйста, смотрите принятый ответ ниже для расширенных ссылок.
Примечание: github для утилиты можно найти по адресу https://github.com/mingsai/rdef.git
Далее я просто создам службу для вызова утилиты из Automator для выделенного текста.
Сервисное решение
Чтобы заплатить тем, кто помог, особенно @mklement0: вот решение для использования командной утилиты и преобразования ее в службу MacOSX, которую можно использовать для перевода китайских иероглифов в пиньинь.
Создайте новый файл службы Automator и убедитесь, что выбранный вывод заменяет выделенный текст.
Подробнее о скрипте Automator
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/:
export PATH
LC_CTYPE=UTF-8
x=$1
for ((i=0;i<${#x};i++)); do rdef "${x:i:1}" | awk -F '\|' 'BEGIN {ORS=" "}{ gsub(/^ | +?/, "", $2); if (length($2) > 0) print $2 ; exit}'; done
Чтобы сделать службу «живой», просто удалите «Запросить текст» и сохраните службу с именем по вашему выбору (например, «Преобразовать в пиньинь»).
Чтобы использовать обновленную службу, выделите все китайские символы и щелкните правой кнопкой мыши контекстное меню, затем в нижней части меню «Службы» выберите «Преобразовать в пиньинь» ... (как указано ниже)
Использование
Производит этот вывод
Надеюсь, что это поможет любому с этой проблемой.
awk
, см. мой обновленный ответ. Если вы готовы к этому, было бы здорово, если бы вы также добавили особенности того, как вы настраиваете проект Xcode (какие фреймворки, включает,...). - person mklement0   schedule 22.03.2014__bridge
в вашем коде, вероятно, должен быть__bridge_transfer
, чтобы ARC взял на себя ответственность и освободил для вас строкуdef
(в качестве альтернативы, в конце, вызовитеCFRelease(def)
). Насчет приблудой трубы: странно; возможноawk -F ' *[|] *' '{ print $2 }'
сработает. - person mklement0   schedule 23.03.2014; exit
послеprint $2
в программеawk
. Каким словарем вы пользуетесь? Ближе всего к моей машине подходит Оксфордский китайский словарь (упрощенный китайско-английский), но он не дает такого же результата. - person mklement0   schedule 24.03.2014rdef
: обратите внимание, что вы создали универсальную утилиту, которая выполняет поиск во всех словарях, которые пользователь выбрал в диалоговом окне «Настройки» Dictionary.app. И наоборот, это означает, что он будет работать с китайским вводом только в том случае, если выбран китайский словарь; Я предлагаю вам обновить описание на github. (Кстати: что означаетr
вrdef
?) - person mklement0   schedule 24.03.2014