Как реализовать NSTextView, который выполняет оперативную разметку для преобразования RTF - PullRequest
2 голосов
/ 07 декабря 2009

Я пытаюсь создать NSTextView, который может принимать «размеченный» ввод, который автоматически переводится в красивый текст в стиле RTF при вводе пользователем.

Идея состоит в том, чтобы позволить пользователю вводить текст в формате «обычный текст», но «украсить» его на месте, например,

H1 A quick list:
* first item
* second item

будет переведено в первую строку со шрифтом заголовка, за которым следует маркированный список.

Я нашел множество потенциальных способов сделать это, но текстовая система невероятно сложна (по причине), и я не хочу начинать «готовить самостоятельно», если уже есть что-то подходящее встроенное. Кстати, я был бы доволен API только для Snow Leopard.

Первое, о чем я подумал, это " детекторы данных ", но я не могу найти публичный API для этого.

Дойдя до конца пути, я обратился к новому " API источников ввода текста ". Это делает все виды вещей, но раздел «Управляемые данными методы ввода» в презентации WWDC 2006 «Взять на себя ответственность за ввод текста» кажется мне интересным. Однако, помимо этого слайда, ничего не существует нигде, так что это опять тупик.

Наконец, я взглянул на класс NSSpellChecker , который также должен предлагать функции завершения и автоматические исправления ... но я не уверен, как это можно изменить для моих требований.

В настоящий момент у меня возникает соблазн просто пересмотреть весь NSTextStorage вручную и внести изменения самостоятельно, когда пользователь перестает печатать ... но я уверен, что вокруг этого форума есть более умные головы ...

Буду очень признателен за любые советы или указатели в правильном направлении.

1 Ответ

3 голосов
/ 07 декабря 2009

Ни детекторы данных, ни проверка орфографии не подходят для этой задачи. Предполагая, что вы просто ищете способ передать ввод уже имеющемуся синтаксическому анализатору / форматеру, взаимодействие с текстовой системой не так уж сложно. Вы на правильном пути в обработке редактирования в NSTextStorage.

Вдоль этих строк нет необходимости повторно анализировать всю вещь, когда пользователь останавливается. Текстовая система отправляет вам измененный диапазон и дает вам возможность воздействовать на эти изменения (и даже отклонить их из-под контроля). Поскольку все изменения проходят через это (ввод, вставка, удаление ...), это точка, в которую вы хотите вступить.

Поскольку вы имеете дело с заголовками и маркированными списками, я получу включающий абзац измененного диапазона. Это дает вам хорошую круглую единицу работы, которая легко обнаруживается и идеально соответствует тому, что вы пытаетесь выполнить.

Удачи!

...