2 poin oleh GN⁺ 2024-03-06 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-03-06
Komentar Hacker News
  • Tulisan ini benar-benar bagus. Sepertinya ini akan menggantikan https://www.objc.io sebagai materi pengantar dasar saya untuk TextKit.

    • Komentar ini menilai tulisan tersebut sangat berguna sebagai pengantar dasar tentang 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?

    • Penulis komentar merasa bingung dengan detail teknis terkait pengeditan teks, dan mempertanyakan penjelasan penulis tentang bagaimana atribut dekoratif ditangani antara NSLayoutManager dan NSTextStorage.
  • 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?

    • Penulis komentar menilai artikel ini sangat berguna dan penasaran bagaimana penulis memperoleh pengetahuan tersebut.
  • 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.

    • Penulis komentar menganggap penggunaan attributed string sebagai cara yang elegan, dan menyebut bahwa ia tidak mengerti mengapa teknik ini tidak lebih dikenal luas. Ia juga memuji artikelnya.
  • 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.

    • Penulis komentar menyebut pengalamannya mencoba membuat text editor dari nol, dan mengatakan artikel ini akan sangat membantu pada masa 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.

    • Penulis komentar menjelaskan perbedaan pendekatan Android dan Apple terhadap rendering serta pengeditan teks, dan menunjukkan bahwa Android menjadi terbatas ketika dibutuhkan kontrol yang lebih rinci.
  • 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

    • Penulis komentar menyebut bahwa aplikasi TextEdit berbasis TextView, dan bahwa RTF (Rich Text Format) adalah bentuk serialisasi dari NSAttributedString. Ia juga menambahkan bahwa kontrol RichEdit di Windows dengan fungsi serupa mungkin muncul lebih dulu.
  • Saya sangat menyukai aplikasi ini. Ini menggantikan semua aplikasi markdown lain saya, termasuk obsidian dan ia Writer!

    • Penulis komentar sangat puas karena aplikasi tersebut telah menggantikan semua aplikasi markdown yang sebelumnya ia gunakan.
  • Syukurlah setidaknya masih ada seseorang yang menggunakan Cocoa pada 2024.

    • Penulis komentar mengungkapkan kelegaan karena masih ada pengembang yang menggunakan framework Cocoa.
  • Saya berharap ada lebih banyak dokumentasi seperti ini tentang komponen iOS!

    • Penulis komentar menyampaikan harapannya agar ada lebih banyak dokumentasi semacam ini untuk komponen iOS.