Введение 3
Постановка задачи 5
1. Обзор предметной области 6
1.1. Текстовый редактор 6
1.2. Аналоги 7
1.3. Jetpack Compose и Compose Desktop 12
1.4. Kotlin Multiplatform 14
1.5. Grazie 15
2. Разработка редактора 16
2.1. Архитектура 16
2.2. Пользовательский интерфейс 18
2.3. Взаимодействие со встроенными сервисами 22
3. Компонент CoreTextField в Jetpack Compose 25
3.1. Состояние компонента и отрисовка текста 25
3.2. Оптимизация отрисовки текста 26
3.3. Изменения в API CoreTextField и BasicTextField 28
4. Работа с текстом 30
4.1. Документная модель 30
4.1.1 Определение 30
4.1.2 Внешний вид элементов документной модели в редакторе 31
4.1.3 Экспорт в форматы Markdown и LaTeX 32
4.2. Класс TextState 34
4.3. Отрисовка результатов анализа 36
Заключение 39
Список литературы
С момента появления персональных компьютеров пользователи работают с текстовыми файлами: создают, сохраняют и редактируют их. Для работы с текстовыми файлами были созданы текстовые редакторы — программы, предоставляющие возможность работы с текстом в интерактивном режиме.
С развитием технологий и появлением языков разметки функциональность текстовых редакторов расширялась для упрощения работы с новыми форматами файлов.
Существуют редакторы не только для работы с естественными языками, но и с языками программирования. Для языков программирования разрабатываются так называемые редакторы программ. Редакторы программ обычно входят в состав интегрированных сред разработки — программных средств, используемых программистами для разработки программного обеспечения. Редакторы программ являются более продвинутыми в сравнении с редакторами для текстов на естественном языке. Языки программирования обладают формальным набором синтаксических, лексических и семантических правил, по коду можно построить дерево абстрактного синтаксиса, и поэтому становится возможным выполнение следующих задач:
• проверка наличия ошибок до компиляции программ
• разбиение на синтаксические конструкции для создания удобной подсветки кода
• автодополнение названия функции или другой конструкции языка на основе первых введенных символов
Открытия в области обработки естественных языков сегодня позволяют создавать модели машинного обучения, способные выполнять различные действия над естественными текстами [1]: разбивать на предложения, выделять термины или морфемы, проверять орфографию и пунктуацию, производить перевод на другой язык, генерировать новый текст и так далее. Стало возможным работать с естественными текстами схожим с языками программирования образом. Однако существующие текстовые редакторы не предоставляют возможность простого внедрения таких моделей, потому что они проектировались без учета возможности сложной обработки текста.
Создание редактора, способного внедрять сервисы, обрабатывающие естественный текст, позволит людям без опыта в программировании получить редактор с нужной им проверкой текста. Копирайтеры, журналисты, редакторы, писатели и другие люди, профессия которых связана с написанием текстов, получат возможность ускорить и автоматизировать свою работу, так как у них будет доступ к результатам анализа текста в самом редакторе.
Стоит также отметить, что многие современные редакторы являются кроссплатформенными и позволяют пользователям редактировать файлы с разных устройств: телефонов, планшетов, браузеров и т.д. Поэтому возможность работы редактора на разных платформах станет отдельным преимуществом.
Постановка задачи
Целью данной работы является разработка кроссплатформенного текстового редактора, который позволяет встраивать сервисы для анализа текста и поддерживает декорирование текста.
Таким образом, были поставлены следующие задачи:
1. Провести обзор и анализ существующих аналогов.
2. Разработать архитектуру собственного мультиплатформенного редактора и пользовательский интерфейс.
3. Реализовать редактор с использованием выбранных технологий.
4. Создать интерфейс и руководство для встраивания стороннего сервиса, анализирующего текст.
В рамках работы был проведен обзор аналогов как среди редакторов текста, так и среди редакторов программ. Было выявлено, что они либо не решают поставленную задачу, либо предоставляемые ими возможности являются неудобными для конечного пользователя. Для реализации мульти-платформенного редактора была выбрана технология Kotlin Multiplatform. Реализованный редактор доступен на следующих платформах: MacOs, Linux, Windows, Android. Интерфейс для первых трёх платформ был реализован с использованием фреймворка Compose for Desktop, а интерфейс для Android и общая для всех платформ функциональность и компоненты интерфейса были реализованы с помощью фреймворка Jetpack Compose. Архитектура редактора, таким образом, состоит из общего модуля и модулей для Android и десктопа, её диаграмма представлена в 2.1.
Основная функциональность редактора — возможность встроить собственный сервис для проверки грамматики и автодополнения. Реализация интерфейса TextAnalyzer дает пользователям возможность встроить собственные сервисы. Руководство для встраивания сервиса также приведено в репозитории [36].
Дополнительно редактор позволяет экспортировать текст в такие известные форматы как Markdown и LaTeX, а так же есть возможность открывать ссылки, написанные в редакторе, в браузере.
В будущем планируется расширить множество элементов, поддерживаемых документной моделью. Вдобавок хочется предоставить пользователям возможность дополнительно декорировать текст (менять размер шрифта и его тип, и тому подобное), а также позволить редактировать языки разметки и анализировать их в самом редакторе.
Реализация редактора представлена в репозитории [36].
[1] Joseph S. R. et al. Natural language processing: A review //International Journal of Research in Engineering and Applied Sciences. - 2016. - Т. 6. -№. 3.-С. 207-210.
[2] Воройский Ф.С. Информатика. Новый систематизированный толковый словарь-справочник. (Введение в современные информационные и телекоммуникационные технологии в терминах и фактах). 3-е изд, 2003, стр. 368
[3] Windows Notepad. URL: https://www.microsoft.eom/ru-ru/p/
windows-notepad/9msmlrh6lzf3 (дата обр. 25.04.2022).
[4] CKEditor. URL:https://ckeditor.com/ckeditor-5 (дата обр. 25.04.2022).
[5] IntelliJ IDEA. URL:https://www. jetbrains.com/ru-ru/idea (дата обр. 25.04.2022).
[6] Текстовый редактор Google Docs. URL:https://www.google.ru/intl/ru/docs/about (дата обр. 25.04.2022).
[7] Текстовый редактор Notepad++. URL:https://notepad-plus-plus.org(дата обр. 25.04.2022).
[8] ИСР Visual Studio Code. URL:https://code.visualstudio.com (дата обр. 25.04.2022).
[9] Плагин DSpellCheck для Notepad++. URL:https://github.com/Predelnik/DSpellCheck (дата обр. 05.05.2022)
[10] Форум для Notepad++. URL:https://community.notepad-plus- plus.org/(дата обр. 05.05.2022)
[11] Code Spell Checker (plugin for VS Code).
URL: https://marketplace.visualstudio.com/items?itemName=
streetsidesoftware.code-spell-checker (дата обр. 25.04.2022).
[12] VS Code API. URL:https://code.visualstudio.com/api/references/vscode-api (дата обр. 25.04.2022).
[13] Spell and Grammar Checker. URL:https://github.com/microsoft/vscode-spell-check (дата обр. 25.04.2022).
[14] Платформа Android. URL:https://www.android.com/intl/ru_ru/ (дата обр. 05.05.2022)
[15] Smyth N. Jetpack Compose Essentials: Developing Android Apps with Jetpack Compose, Android Studio, and Kotlin. (n.p.): Payload Media, Incorporated, 2022.
[16] Compose for Desktop. URL:https://www.jetbrains.com/ru-ru/lp/compose-mpp дата обр. 25.04.2022).
[17] BadgeBox компонент библиотеки Jetpack Compose. URL: https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt;l=58 (дата обр. 25.04.2022).
[18] Material компоненты от компании Google. URL:https://material.io/components (дата обр. 05.05.2022)
[19] Vasic M. Mastering Android Development with Kotlin: Deep dive into the world of Android to create robust applications with Kotlin. - Packt Publishing Ltd, 2017.
[20] Fjodorovs I., Kodors S. JETPACK COMPOSE AND XML LAYOUT RENDERING PERFORMANCE COMPARISON //HUMAN. ENVIRONMENT. TECHNOLOGIES. Proceedings of the Students International Scientific and Practical Conference. - 2021. - №. 25. - С. 49-54.
[21] Jemerov D., Isakova S. Kotlin in action. - Simon and Schuster, 2017.
[22] Moore K.D.,Taheri S.,Mota C. Kotlin Multiplatform by Tutorials (First Edition): Build Native Apps Faster by Sharing Code Across Platforms. (n.p.): Razeware LLC, 2022.
[23] ПлагинGrazieдляIntellij IDEA.URL:https://plugins.jetbrains.com/plugin/12175-grazie (дата обр. 05.05.2022)
[24] Krochmalski J. IntelliJ IDEA Essentials. - Packt Publishing Ltd, 2014.
[25] Tabs, Material Design Component. URL:https://material.io/components/tabs (дата обр. 25.04.2022).
[26] Circular Progress Indicator, Material Design Component. URL: https://material.io/components/progress-indicators#circular-progress-indicators (дата обр. 25.04.2022).
[27] Snackbar, Material Design Component. URL:https://material.io/components/snackbars#usage (дата обр. 25.04.2022).
[28] Popup, Compose UI. URL:https://developer.android.com/reference/kotlin/androidx/compose/ui/window/package-summary#Popup(androidx. compose. ui. Alignment, androidx. compose. ui. unit. Ii(дата обр. 25.04.2022).
[29] Запрос на исправление ошибки, связанной с редактированием большого текста, в фреймворке Jetpack Compose . URL:https://issuetracker.google.com/issues/181332856 (дата обр. 05.05.2022)
[30] Bassett L. Introduction to JavaScript object notation: a to-the-point guide to JSON. - "O’Reilly Media, Inc. 2015.
[31] Репозитории kotlinx.serialization. URL:https://github.com/Kotlin/kotlinx.serialization (дата обр. 05.05.2022)
[32] Gruber J. Markdown: Syntax. URL:http://daringfireball.net/projects/markdown/syntax. Retrieved on June. - 2012. - Т. 24. - С. 640.
[33] Helmut Kopka and Patrick W. Daly. Guide to LATEX. Fourth edition, Addison-Wesley, Boston, MA, USA, 2004. xii+597 pp. ISBN 0-321-17385¬6, p. 3
[34] Mi Ikowski, Marcin Lipski, Jaroslaw. (2011). Using SRX Standard for Sentence Segmentation.
[35] Фридл Дж. Регулярные выражения. Библиотека программиста. — СПб.: Питер, 2001. 352 с.
[36] Репозиторий с кодом работы. URL:https://github.com/jeinygroove/highlight-editor-multiplatform (дата обр. 23.05.2022)