Struktur internal teknis editor teks Apple
- Membahas detail cara kerja Paper sebagai editor teks berbasis
TextView.
- Paper saat ini dibangun di atas framework TextKit 1, dan pada TextKit 2 konsep, abstraksi, serta prinsipnya tetap dipertahankan atau diubah menjadi API yang lebih baik.
Tampilan teks
- Kelas
TextView adalah inti dari pekerjaan pengeditan teks di editor teks Apple.
NSTextView dan UITextView memang berbeda, tetapi API-nya serupa sehingga diperlakukan sebagai satu kelas TextView.
TextView adalah komponen besar yang kompleksitasnya meningkat pada setiap rilis OS.
- Apple memecah
TextView ke dalam beberapa lapisan untuk menghadirkan pengalaman pengeditan teks.
NSTextStorage
- Menyimpan string teks mentah.
- Menyimpan atribut (pasangan string-nilai) yang ditetapkan pada rentang teks.
- Memicu peristiwa untuk perubahan pada teks dan atribut.
NSTextContainer
- Menentukan bentuk dan ukuran area yang menampung simbol teks (glyph).
NSLayoutManager
- Menghitung ukuran dan jarak antarglyph dengan melihat rentang atribut yang diterapkan pada string teks di
NSTextStorage.
- Menata glyph, menghitung posisi awal dan akhir setiap baris teks, serta tinggi total seluruh teks.
TextView
- Menggambar tata letak glyph yang dihasilkan oleh
NSLayoutManager.
- Menyinkronkan tinggi view dengan tinggi terkini dari teks yang telah ditata.
- Mengelola pemilihan teks, caret, dan atribut pengetikan yang diterapkan pada teks yang baru disisipkan.
ScrollView
- Menampilkan bagian
TextView yang terlihat.
- Mengelola scrolling, scrollbar, dan zoom.
Atribut
NSAttributedString adalah dasar pengeditan rich text di framework Apple.
- Terdiri dari string teks biasa dan atribut (pasangan string-nilai) yang dilekatkan pada rentang teks.
- Atribut terutama digunakan untuk tujuan styling, tetapi tidak ada batasan untuk menetapkan pasangan string-nilai kustom.
Styling
- Styling berarti menerapkan atribut khusus yang didefinisikan framework pada rentang teks.
- Paper menggunakan meta-atribut untuk mengidentifikasi struktur teks lalu menerapkan styling.
- Atribut disinkronkan dengan teks Markdown di
NSTextStorage yang berubah akibat input pengguna, dan dengan pengaturan yang memengaruhi teks yang disesuaikan pengguna melalui item menu, slider, dan gesture.
Performa
- Pemisahan atribut meta, layout, dan dekorasi membantu menjaga perubahan editor tertentu tetap cepat.
- Kecepatan mengetik adalah faktor performa paling penting dalam editor teks.
- Karena cara kerja Markdown, perubahan teks dapat memengaruhi styling seluruh paragraf.
Meta-atribut
- Selain logika highlighting, meta-atribut juga memainkan peran penting dalam berbagai fitur yang perlu mengetahui struktur teks.
Pintasan pemformatan
- Memberikan informasi detail yang diperlukan untuk menyalakan atau mematikan style pada teks Markdown yang dipilih.
Navigasi antar bab
- Membantu menemukan heading relatif terhadap posisi caret.
Outline
- Bergantung pada kemampuan untuk menelusuri semua heading.
Penyusunan ulang bab
- Menyediakan kemampuan untuk menyusun ulang bab di outline.
Konversi format
- Perlu mengetahui struktur untuk mengonversi konten Markdown ke RTF, HTML, dan DOCX.
Matematika text container
- Aturan terpenting dari text container adalah mempertahankan panjang baris yang diinginkan.
- Ada kasus di mana perlu menciptakan ilusi simetri, misalnya saat tag heading ditempatkan di luar aliran teks normal.
Penjangkaran seleksi
- Pemilihan teks selalu memiliki titik jangkar.
- Di Mac, teks dipilih dengan klik dan seret, sedangkan di iOS salah satu ujung seleksi dapat diseret.
Afinitas seleksi
- Dalam pengeditan teks ada konsep menarik yang disebut afinitas seleksi.
- Saat memindahkan caret dengan tombol panah, baris hanya berpindah sederhana, tetapi saat berpindah ke akhir baris dengan pintasan, caret tetap berada di baris yang sama dan menempel ke kanan.
Uniform Type Identifiers (UTIs)
- Membahas UTI sebagai sistem dasar pertukaran data antar aplikasi.
- Ini adalah sistem hierarkis di mana tipe data conform to (mewarisi) tipe data induk.
Clipboard (Pasteboard)
- Clipboard adalah kamus tempat UTI dipetakan ke data yang telah diserialisasi.
- Satu operasi copy menulis beberapa representasi dari data yang sama sekaligus.
- Menangani UTI publik dan privat relatif sederhana, tetapi menangani format yang diterima luas namun tidak didefinisikan oleh Apple lebih kompleks.
Penutup
- Dengan melihat artikel pertama, Anda bisa memperoleh lebih banyak informasi tentang aplikasi dan proses pengembangannya.
Opini GN⁺
- Artikel ini menjelaskan secara rinci cara kerja internal yang kompleks dari editor teks berbasis
TextView di platform Apple, sehingga memberikan informasi yang menarik bagi pengembang perangkat lunak maupun pengguna yang tertarik.
- Algoritme dan metode pengelolaan atribut untuk optimasi performa editor teks menjadi contoh yang baik bagi pengembang saat merancang aplikasinya sendiri.
- Pendekatan teknis yang digunakan untuk meningkatkan performa editor teks memberikan panduan yang berguna bagi pengembang lain saat menyelesaikan masalah serupa.
- Saat mengembangkan aplikasi yang menangani format teks seperti Markdown, pemahaman tentang UTI penting untuk pertukaran data dan kompatibilitas.
- Artikel ini membantu meningkatkan pemahaman tentang struktur internal editor teks, tetapi dalam praktiknya mengelola kompleksitas tersebut bisa menjadi tantangan besar bagi pengembang.
1 komentar
Komentar Hacker News
Tulisan ini benar-benar bagus. Sepertinya ini akan menggantikan https://www.objc.io sebagai materi pengantar dasar saya untuk TextKit.
Saya agak bingung tentang atribut dekoratif yang diterapkan di luar transaksi pengeditan. Disebutkan, "Dan itu tidak menyadari transaksi, karena itu ada di NSLayoutManager sendiri, bukan di NSTextStorage." Padahal atribut dekoratif seperti warna biasanya ada di NSTextStorage! Apakah penulis menyiratkan bahwa warna yang diterapkan pada karakter markdown dilakukan melalui dukungan atribut sementara milik NSLayoutManager (yang biasanya digunakan untuk mewarnai kata yang salah eja)? Kalau begitu, apa tujuannya?
Artikel yang sangat hebat (dan secara pribadi juga sangat tepat waktu. Saat ini saya sedang menangani NSTextViews). Dari mana Anda mendapatkan informasi ini? Kode orang lain? Pengalaman yang menyakitkan? developer.apple.com?
Di era dokumen DOM (misalnya notion, gitbook), saya sering menggunakan attributed string untuk melakukan hal-hal yang terasa seperti sihir dalam parsing dan manipulasi teks. Ini adalah struktur yang sangat elegan, dan saya tidak mengerti kenapa ini tidak lebih dikenal. Sebagai tambahan, artikelnya luar biasa.
Saya pernah mencoba menulis text editor saya sendiri dari nol di masa lalu, dan sumber daya seperti ini akan sangat luar biasa kalau tersedia saat itu.
Karena saya sudah lama menjadi pengembang aplikasi Android, menarik melihat bagaimana Apple mendekati hal-hal dengan cara yang agak berbeda dan lebih hati-hati. Di Android, kelas Layout (beserta subclass-nya) menangani semua hal yang terkait layout dan rendering, dan TextView mengimplementasikan sebagian logika pengeditan/pemilihan. Satu-satunya perbedaan antara EditText dan TextView adalah bahwa EditText "mengaktifkan" kemampuan pengeditan yang sebenarnya sudah ada di TextView. Masalah dari pendekatan yang agak monolitik ini (dan API yang buruk) adalah bahwa jika aplikasi membutuhkan kontrol yang lebih besar atas cara teks dirender, Anda tidak beruntung. Misalnya, ingin mengakses glyph individual setelah layout selesai? Tidak, maaf.
Aplikasi TextEdit hampir seluruhnya terdiri dari satu TextView. Saya rasa padanannya di Windows adalah WordPad. Itu berbasis pada kontrol RichEdit. Fakta menarik lainnya adalah bahwa RTF pada dasarnya adalah bentuk serialisasi dari NSAttributedString. Hal yang sama juga berlaku untuk kontrol RichEdit di Windows. Bahkan, tampaknya implementasi Windows muncul lebih dulu: https://en.wikipedia.org/wiki/Rich_Text_Format
Saya sangat menyukai aplikasi ini. Ini menggantikan semua aplikasi markdown lain saya, termasuk obsidian dan ia Writer!
Syukurlah setidaknya masih ada seseorang yang menggunakan Cocoa pada 2024.
Saya berharap ada lebih banyak dokumentasi seperti ini tentang komponen iOS!