Das technische Innenleben des Apple-Texteditors
- Behandelt Details dazu, wie Paper als auf
TextView basierender Texteditor funktioniert.
- Paper basiert derzeit auf dem Framework TextKit 1; in TextKit 2 bleiben Konzepte, Abstraktionen und Prinzipien erhalten oder werden in bessere APIs überführt.
Text View
- Die Klasse
TextView ist das Herzstück der Textbearbeitung im Apple-Texteditor.
NSTextView und UITextView unterscheiden sich zwar, werden wegen ihrer ähnlichen API aber als eine einzige Klasse TextView behandelt.
TextView ist eine große Komponente, deren Komplexität mit jedem OS-Release zunimmt.
- Apple unterteilt
TextView in mehrere Schichten, um das Textbearbeitungserlebnis bereitzustellen.
NSTextStorage
- Speichert die rohe Textzeichenfolge.
- Speichert Attribute (String-Wert-Paare), die Textbereichen zugewiesen sind.
- Löst Ereignisse für Änderungen am Text und an den Attributen aus.
NSTextContainer
- Definiert Form und Größe des Bereichs, der Textsymbole (Glyphen) aufnimmt.
NSLayoutManager
- Berechnet Größe und Abstände der Glyphen anhand der auf die Textzeichenfolge in
NSTextStorage angewendeten Attributbereiche.
- Führt das Layout der Glyphen durch und berechnet, wo jede Textzeile beginnt und endet sowie die Gesamthöhe des Textes.
TextView
- Zeichnet das von
NSLayoutManager erzeugte Glyphenlayout.
- Synchronisiert die Höhe der View mit der aktuellen Höhe des gelayouteten Textes.
- Verwaltet Textauswahl, Caret und die auf neu eingefügten Text angewendeten Tippattribute.
ScrollView
- Zeigt den sichtbaren Bereich von
TextView an.
- Verwaltet Scrollen, Scrollbars und Zoom.
Attribute
NSAttributedString ist die Grundlage der Rich-Text-Bearbeitung in Apple-Frameworks.
- Besteht aus einer normalen Textzeichenfolge und Attributen (String-Wert-Paaren), die an Textbereiche angehängt sind.
- Attribute werden meist für Styling verwendet, es gibt aber keine Einschränkung dabei, benutzerdefinierte String-Wert-Paare zuzuweisen.
Styling
- Styling bedeutet, spezielle vom Framework definierte Attribute auf Textbereiche anzuwenden.
- Paper verwendet Meta-Attribute, um die Textstruktur zu identifizieren und anschließend Styling anzuwenden.
- Attribute werden mit dem Markdown-Text in
NSTextStorage, der sich durch Benutzereingaben ändert, und mit texteinflussenden Einstellungen synchronisiert, die Nutzer über Menüpunkte, Slider und Gesten anpassen.
Performance
- Die Trennung von Meta-, Layout- und Dekorationsattributen hilft dabei, bestimmte Editoränderungen schnell konsistent zu halten.
- Die Tippgeschwindigkeit ist der wichtigste Performance-Faktor in einem Texteditor.
- Aufgrund der Funktionsweise von Markdown können Textänderungen das Styling ganzer Absätze beeinflussen.
Meta-Attribute
- Neben der Highlighting-Logik spielen Meta-Attribute eine wichtige Rolle in verschiedenen Funktionen, die die Textstruktur kennen müssen.
Formatierungs-Shortcuts
- Liefern die detaillierten Informationen, die nötig sind, um den Stil ausgewählten Markdown-Textes umzuschalten.
Navigation zwischen Kapiteln
- Helfen dabei, Überschriften relativ zur Caret-Position zu finden.
Outline
- Hängt von der Fähigkeit ab, alle Überschriften zu durchlaufen.
Neuordnung von Kapiteln
- Bietet die Möglichkeit, Kapitel in der Outline neu anzuordnen.
Formatkonvertierung
- Für die Konvertierung von Markdown-Inhalten in RTF, HTML und DOCX muss die Struktur bekannt sein.
Mathematik des Textcontainers
- Beim Textcontainer ist die wichtigste Regel, die bevorzugte Zeilenlänge beizubehalten.
- Es gibt Fälle, in denen Symmetrie vorgetäuscht werden muss, etwa wenn Überschriften-Tags außerhalb des normalen Textflusses platziert werden.
Verankerung der Auswahl
- Eine Textauswahl hat immer einen Ankerpunkt.
- Auf dem Mac wählt man Text per Klicken und Ziehen aus, unter iOS kann ein Ende der Auswahl gezogen werden.
Auswahlaffinität
- In der Textbearbeitung gibt es das interessante Konzept der Auswahlaffinität.
- Wenn der Caret mit den Pfeiltasten bewegt wird, wechselt er einfach die Zeile; springt man jedoch per Shortcut ans Zeilenende, bleibt er in derselben Zeile und haftet rechts.
Uniform Type Identifiers (UTIs)
- Es wird über UTIs gesprochen, das Basissystem für den Datenaustausch zwischen Apps.
- Es handelt sich um ein hierarchisches System, in dem Datentypen zu übergeordneten Datentypen conform to (erben).
Pasteboard
- Das Pasteboard ist ein Wörterbuch, in dem UTIs serialisierten Daten zugeordnet sind.
- Ein einzelner Kopieren-Vorgang schreibt mehrere Repräsentationen derselben Daten gleichzeitig.
- Der Umgang mit öffentlichen und privaten UTIs ist relativ einfach, aber das Handling weit akzeptierter Formate, die nicht von Apple definiert wurden, ist komplexer.
Abschluss
- Wer den ersten Artikel liest, findet dort mehr Informationen über die App und den Entwicklungsprozess.
Meinung von GN⁺
- Dieser Artikel erklärt die komplexen internen Abläufe eines auf
TextView basierenden Texteditors auf Apple-Plattformen sehr detailliert und bietet Softwareentwicklern oder interessierten Nutzern spannende Einblicke.
- Die Algorithmen zur Performance-Optimierung und die Methoden zur Attributverwaltung im Texteditor sind gute Beispiele, an denen sich Entwickler beim Entwurf eigener Anwendungen orientieren können.
- Der technische Ansatz zur Steigerung der Performance eines Texteditors bietet anderen Entwicklern nützliche Leitlinien für die Lösung ähnlicher Probleme.
- Beim Entwickeln von Anwendungen, die Textformate wie Markdown verarbeiten, ist das Verständnis von UTIs für Datenaustausch und Kompatibilität wichtig.
- Der Artikel hilft, das Innenleben eines Texteditors besser zu verstehen, zugleich kann das Management dieser Komplexität für Entwickler eine erhebliche Herausforderung sein.
1 Kommentare
Hacker-News-Kommentare
Dieser Artikel ist wirklich gut. Er wird wohl https://www.objc.io als meine Standard-Einführung in TextKit ersetzen.
Ich bin etwas verwirrt über dekorative Attribute, die außerhalb der Editier-Transaktion durchgeführt werden. Es hieß: „Und das ist sich der Transaktion nicht bewusst, weil es in NSLayoutManager selbst existiert und nicht in NSTextStorage.“ Aber dekorative Attribute wie Farben befinden sich normalerweise in NSTextStorage! Deutet der Autor an, dass die auf Markdown-Zeichen angewendete Farbe über die Unterstützung temporärer Attribute von NSLayoutManager erfolgt, die normalerweise verwendet wird, um falsch geschriebene Wörter farblich zu markieren? Falls ja, was ist dann der Zweck davon?
Wirklich ein großartiger Artikel (und für mich persönlich auch sehr passend zum richtigen Zeitpunkt, da ich gerade mit NSTextViews arbeite). Wie bist du an diese Informationen gekommen? Durch den Code anderer Leute? Schmerzvolle Erfahrung? developer.apple.com?
Im Zeitalter von DOM-Dokumenten (z. B. notion, gitbook) verwende ich oft Attributed Strings, um beim Parsen und Manipulieren von Text magische Dinge zu tun. Das ist eine sehr elegante Struktur, und ich kann nicht verstehen, warum sie so unbekannt ist. Übrigens ist der Artikel erstaunlich.
Ich habe in der Vergangenheit einmal versucht, meinen eigenen Texteditor von Grund auf zu schreiben, und so eine Ressource wäre damals wirklich großartig gewesen.
Da ich lange Zeit Android-App-Entwickler war, fand ich es interessant zu sehen, dass Apple an Dinge etwas anders und sorgfältiger herangeht. Unter Android kümmert sich die Layout-Klasse (und ihre Unterklassen) um alles, was mit Layout und Rendering zu tun hat, und TextView implementiert einen Teil der Bearbeitungs-/Auswahllogik. Der einzige Unterschied zwischen EditText und TextView besteht darin, dass EditText die in TextView bereits vorhandenen Bearbeitungsfunktionen „aktiviert“. Das Problem dieses eher monolithischen Ansatzes (und der schlechten API) ist, dass man Pech hat, wenn die App mehr Kontrolle darüber braucht, wie sie Text rendert. Zum Beispiel, wenn man nach dem Layout auf einzelne Glyphen zugreifen möchte? Nein, tut mir leid.
Die TextEdit-App besteht fast vollständig aus einer einzelnen TextView. Ich denke, WordPad ist das Windows-Gegenstück dazu. Es basiert auf dem RichEdit-Control. Noch ein interessanter Fakt: RTF ist im Grunde eine serialisierte Form von NSAttributedString. Dasselbe gilt für das RichEdit-Control unter Windows. Tatsächlich scheint die Windows-Implementierung zuerst da gewesen zu sein: https://en.wikipedia.org/wiki/Rich_Text_Format
Ich liebe diese App wirklich. Sie hat alle meine anderen Markdown-Apps ersetzt, einschließlich obsidian und ia Writer!
Zum Glück benutzt wenigstens irgendjemand auch 2024 noch Cocoa.
Ich wünschte, es gäbe mehr solcher Dokumentation zu iOS-Komponenten!