Создание сервера написания
Класс NSSpellServer дает Вам способ сделать Вашу определенную программу проверки правописания службой, это доступно любому приложению. Служба является приложением, объявляющим его доступность стандартным способом, так, чтобы любые другие приложения, хотящие использовать ее, могли сделать так. Если Вы создадите программу проверки правописания, использующую класс NSSpellServer, и перечислите его как доступную службу, то пользователи любого приложения, использующего NSSpellChecker или включающего меню Services, рассмотрят Вашу программу проверки правописания как один из доступных словарей.
Для использования NSSpellServer Вы пишете маленькую программу, создающую экземпляр NSSpellServer и делегата сервера, реагирующего на сообщения, просящие, чтобы он нашел слово с ошибками и предложил, чтобы предположения исправили слово с ошибками. Отправьте NSSpellServer registerLanguage:byVendor: сообщения, чтобы сказать ему языки Ваш делегат могут обработать.
Программа, выполняющая Вашу программу проверки правописания, не должна быть создана как приложение Набора Приложения, но как простая программа. Предположим, что Вы предоставляете программы проверки правописания под именем поставщика «Высшая точка», и файл, содержащий код для Вашего делегата, вызывают AcmeEnglishSpellChecker. Тогда следующее могло бы быть основной функцией Вашей программы:
void main() |
{ |
NSSpellServer *aServer = [[NSSpellServer alloc] init]; |
if ([aServer registerLanguage:"English" byVendor:"Acme"]) { |
[aServer setDelegate:[[AcmeEnglishSpellChecker alloc] init]]; |
[aServer run]; |
fprintf(stderr, "Unexpected death of Acme SpellChecker!\n"); |
else { |
fprintf(stderr, "Unable to check in Acme SpellChecker.\n"); |
} |
} |
Ваш делегат является экземпляром пользовательского подкласса. (Является самым простым сделать его подклассом NSObject, но это не требование.) Данный NSString, Ваш делегат должен быть в состоянии найти слово с ошибками путем реализации метода spellServer:findMisspelledWordInString:language:wordCount:countOnly:. Обычно, этот метод также сообщает о числе слов, которые это отсканировало, но это не обязательно.
Дополнительно, делегат может также предложить исправления для слов с ошибками. Это делает так путем реализации метода spellServerS:suggestGuessesForWord:inLanguage:.
Уведомление о наличии службы
Когда существует больше чем одна доступная программа проверки правописания, пользователь выбирает желаемый тот. Приложение, запрашивающее проверку правописания, использует объект NSSpellChecker, и оно обеспечивает панель Spelling; в панели существует раскрывающийся список доступных программ проверки правописания. Ваша программа проверки правописания появляется в том списке, если это имеет дескриптор службы.
Дескриптор службы является записью в вызванных службах текстового файла. Обычно это расположено в пакете, также содержащем исполняемый файл Вашей программы проверки правописания. Пакет (или каталог), который содержит файл служб, должен иметь имя, заканчивающееся в “.service” или “.app”. Система ищет пакеты службы в стандартном наборе каталогов.
Уведомление о наличии службы программы проверки правописания имеет стандартный формат, проиллюстрированный в следующем примере для программы проверки правописания Высшей точки:
Spell Checker: Acme |
Language: French |
Language: English |
Executable: franglais.daemon |
Первая строка идентифицирует тип службы; для программы проверки правописания это должно сказать «Программу проверки правописания»: сопровождаемый Вашим именем поставщика. Следующая строка содержит английское имя языка, который Ваша программа проверки правописания подготовлена проверить. (Язык должен быть одной Вашей системой, распознает.), Если Ваша программа может проверить больше чем один язык, используйте дополнительную строку для каждого дополнительного языка. Последняя строка дескриптора дает имя исполняемого файла службы. (Это требует полного пути, если это находится в различном каталоге.)
Если существует дескриптор службы для Вашей программы проверки правописания Высшей точки и также дескриптор службы для английского средства проверки, предоставленного поставщиком под названием Объединенный, пользователь, смотрящий на раскрывающийся список панели Spelling, видел бы:
English (Acme) |
English (Consolidated) |
French (Acme) |
Иллюстративная последовательность сообщений к NSSpellServer
Действие проверения орфографию обычно включает взаимодействие объектов в двух классах: NSSpellChecker пользовательского приложения (который реагирует на взаимодействия с пользователем) и NSSpellServer Вашей программы проверки правописания (который обеспечивает интерфейс приложения для Вашей программы проверки правописания). Вы видите взаимодействие между двумя в следующем списке шагов, вовлеченных в нахождение слова с ошибками.
Пользователь приложения выбирает пункт меню для запроса проверки правописания. Приложение отправляет сообщение в свой объект NSSpellChecker. NSSpellChecker поочередно отправляет соответствующее сообщение соответствующему NSSpellServer.
NSSpellServer получает сообщение, прося, чтобы он проверил написание NSString. Это передает сообщение своему делегату.
Делегат ищет слово с ошибками. Если это находит один, это возвращает NSRange идентификация расположения слова в строке.
NSSpellServer получает сообщение, прося, чтобы он предложил предположения для корректного написания слова с ошибками и передает сообщение его делегату.
Делегат возвращает список возможных исправлений, которые NSSpellServer поочередно возвращает в NSSpellChecker, подавший заявку.
NSSpellServer не знает то, что пользователь делает с ошибками, которые нашел его делегат, или с предположениями сделал предложение его делегат. (Возможно, пользователь исправляет документ, возможно путем выбора исправления из дисплея NSSpellChecker предположений; но это не ответственность NSSpellServer.) Однако, если пользователь нажимает кнопки Learn или Forget (таким образом, то, чтобы заставлять NSSpellChecker пересмотреть список слов пользователя), NSSpellServer получает уведомление о слове, о котором, таким образом изученном или забывают. Вам решать, ли Ваша программа проверки правописания действует на эту информацию. Если пользователь нажимает кнопку Ignore, делегат не уведомляется (но в следующий раз, когда слово происходит в тексте, методе
isWordInUserDictionaries:caseSensitive:сообщитYESвместоNO).Как только делегат NSSpellServer сообщил о слове с ошибками, оно завершило свой поиск. Конечно, вероятно, что приложение пользователя тогда отправит новое сообщение, на сей раз прося, чтобы NSSpellServer проверил строку, содержащую часть текста, до которого это не добиралось ранее.