- Arapça web tipografisi; harf bağlanması, çift yönlü metin, sayı ve noktalama işleme ile satır hizalamanın birlikte düğümlendiği bir render altyapısı sorunudur ve basit bir CSS hatası olarak ele alınması zordur
- Klasik Arapça dizgide iki yana yaslama, kelimeler arası boşluğu artırmak yerine harflerin içindeki bağlantı çizgisini uzatan kaşida (kashida) ile uygulanıyordu; ancak modern tarayıcılardaki
text-align: justifyçoğunlukla kelimeler arası boşluğu artırır - Arapça harflerde kaydedilen tek bir kod noktası bağlama göre yalıtık, başta, ortada ve sonda biçimlerine dönüşür; OpenType özellikleri ve bir shaping engine olmadan harfler ayrık biçimde render edilir
- Unicode’daki Arabic Presentation Forms, sayı sistemleri, UAX #9 çift yönlü algoritması ve görünmez kontrol karakterleri; arama başarısızlığı, telefon numarasının ters dönmesi ve imleç hareketinde karışıklık gibi gerçek ürün sorunlarına yol açar
- HarfBuzz, Amiri, W3C Arabic Layout Requirements gibi temel altyapılar kurulmuş olsa da, tarayıcılardaki Arapça hizalama ve
jstfkullanımı hâlâ bir uygulama boşluğu olarak duruyor
Başlangıç noktası: “CSS hatası” gibi görünen Arapça dizgi sorunu
- Müşteri panosundaki karışık içerikli Arapça paragraf, tasarım maketindeki gibi iki yana yaslanmak yerine sol kenarı girintili çıkıntılı olacak şekilde render edildi
- Aynı bloğun Latin harfli sürümü “idare eder” görünüyordu; ancak Arapçada satırlar sağdan başladığı için düzensiz kenar solda ortaya çıktı
text-align: justifyuygulansa da, tasarım ekibinin onayladığı biçimde kelime içi çizgileri uzatarak satırı dolduramadı- Aynı üründe daha önce de PDF’lerde isim harflerinin ayrılması, arama indeksleme hataları ve eski Unicode kod noktaları gibi Arapça işleme sorunları tekrar etmişti
- Sorunun özü belirli bir stil dosyasındaki kusur değil, web’in Arapça tipografi durumuydu
İstinsah geleneğinin çözdüğü problem
- Klasik Arapça istinsah geleneği, kelimeler arası boşluğu büyütmeden harf formlarının içindeki bağlantı çizgisini uzatarak satırı iki yana yaslıyordu
- Bu yöntem taṭwīl ya da modern teknik terimle kashida olarak adlandırılır ve belirli harf çiftleri arasındaki bağlantı çizgisinin uzatılmasına dayanır
-
- yüzyıl Naskh’ının iyi düzenlenmiş bir sayfasında iki kenar hizalıdır ve kelime aralığı artmadığı için yoğun, düzenli bir doku oluşur
- Ibn Muqla’nın sistemleştirdiği al-khaṭṭ al-mansūb, kamış kalemin elmas noktasını, alif yüksekliğini ve yay oranlarını kullanarak harf biçimlerini düzenler
- Bu gelenekte satır hizalama, boşluk dağıtımı sorunu değil; harf biçimlerini ve alternatif glifleri seçmeye dayanan bir shaping sorunuydu
Tek harf, dört biçim
- Arapça her zaman el yazısı gibi bitişik akan bir yazıdır; matbaa harfi ile el yazısını ayıran blok harf ayrımı yoktur
- Her harf komşularına göre yalıtık, başta, ortada veya sonda biçim alır; altı harf ise kendisinden sonrakine bağlanamadığı için kelime içi akışı keser
- Unicode soyut harfi saklar, font konuma göre glifleri sağlar ve shaping engine
isol,init,medi,fina,rlig,mark,mkmkgibi OpenType özelliklerini uygular محمدgibi bir kelime depolamada dört kod noktasından ibarettir; ancak render sırasında çeşitli glif seçimleri ve OpenType aramaları üzerinden tek bir bitişik çizgi gibi görünür- HarfBuzz gibi bir shaping engine yoksa ya da PDF üreticisi bu aşamadan geçmiyorsa, aynı kod noktaları birbirinden kopuk yalıtık harfler olarak render edilir
Unicode’un fosili: Arabic Presentation Forms
- DOS ve ilk Windows dönemindeki 8 bitlik kod sayfaları, soyut harfleri değil başta ya da ortada gibi biçimlerin kendisini ayrı karakterler olarak kodluyordu
- Unicode bunu çift yönlü uyumluluk için kabul etti ve U+FB50 ile U+FEFF arasındaki Arabic Presentation Forms blokları olarak bıraktı
- Yeni belgelere bu kod noktaları girmemeli, ancak PDF metin çıkarıcıları bugün bile bunları üretebiliyor
- Aynı isim modern Unicode ile de Presentation Forms ile de saklanabilir; ekranda aynı görünse de dizge karşılaştırması ve aramada farklı işlenirler
- NFKC normalizasyonu uygulanırsa Presentation Forms soyut harflere indirgenebilir ve arama kaçakları azaltılabilir
Shaping ve çift yönlü işlemeyi atlayan yazılımlar
- Shaping engine’i ve çift yönlü algoritmayı atlayan yazılımlar, harfleri tek tek yalıtık biçimde çizer ve satırları soldan sağa dizer
- Bu tür çıktı; dükkân tabelalarında, biniş kartlarında, filigranlarda ve eski film afişlerindeki Arapça yazımlarda Arapça okurların gerçekten karşılaştığı bir şeydir
- Eski Photoshop sürümleri, varsayılan ayarlı matplotlib, npm’deki çeşitli PDF üreticileri ve fiş yazıcıları bu tür sorunlar çıkarabilir
- Python’daki yaygın kaçamak çözüm
arabic_reshapervepython-bidi, önceden şekillendirilmiş biçimi dizgeye gömmek için Presentation Forms bloğunu kullanır - Bu çözüm, render katmanının yapması gereken işi önden dizgeye yazmak anlamına gelir ve özünde metin yığınının kusurunu açığa çıkarır
Üç tür rakam ve noktalama sorunu
- Dünyanın “Arabic numerals” dediği 0–9, Arapça okurların çoğunun günlük hayatta kullandığı rakam şekli değildir
- Mısır, Sudan, Levant, Irak ve Körfez bölgesi Unicode’un ARABIC-INDIC DIGITS
٠١٢٣٤٥٦٧٨٩biçimini kullanır - Mağrip bölgesi Latin rakam gliflerini kullanırken, İran, Afganistan ve Pakistan EXTENDED ARABIC-INDIC DIGITS
۰۱۲۳۴۵۶۷۸۹kullanır - Rakamlar UAX #9’da güçlü karakterler değil zayıf karakterlerdir; bu yüzden önceki güçlü karakterin yönüne göre Avrupa rakamı ya da Arap rakamı olarak yeniden sınıflandırılırlar
- Arapça bir kelimenin ardından gelen
010-1234-5678gibi telefon numaraları, tire nötr sayıldığı için ekranda5678-1234-010şeklinde ters sırada görünebilir - Platformların sunduğu çözüm, numarayı
ya da<bdi>ile sarmalayarak yönlülüğü yalıtmaktır - Arapça konuşulan bölgelerde ondalık ve binlik ayırıcılar U+066B
٫ve U+066C٬karakterleridir; ASCII.ve,neredeyse aynı görünse de kod noktaları ve çift yönlü özellikleri farklıdır
Baskıdan web’e uzanan kaçamaklar ve sadeleştirmeler
- 1514’te Fano’da basılan Kitāb Ṣalāt al-Sawāʿī, hareketli harflerle basılmış ilk Arapça kitaptı ve harf bağlantılarının kopması ile nokta yerleşimi hatalarını gösteren bir örnektir
- 1537’de Venedik’te basılan Paganini Qurʾān, dizgi ve metin hatalarının birleşmesiyle ticari başarısızlığa uğradı; tek bir nüsha 1987’de Venedik’teki bir manastır kütüphanesinde bulundu
- Osmanlı’daki matbaa yasağı anlatısında Bayezid II ve Selim I’e ait fermanların asılları elde değildir; anlatı büyük ölçüde Avrupalı seyyah kayıtlarına dayanır
- Kahire’deki Bulaq Press, 1820’de Muhammad Ali tarafından kuruldu ve yüzlerce harf parçası ile büyük sabır sayesinde Arapça metal dizginin kalitesini yükseltti
- 1924 Kahire Kur’an’ı, Amiria Press’te metal harflerle üretildi ve 20. yüzyılda metin ile tipografinin standartlaşmasına katkı sağladı
- 1950’lerin sonunda Kamel Mrowa ve Linotype, 90 kanallı dergi sistemine uyması için baştaki biçimleri ortadakilerle, sondakileri yalıtık biçimlerle birleştirip ligatürleri azaltarak Simplified Arabic geliştirdi
- Simplified Arabic, ucuz ve hızlı gazete üretimini mümkün kıldı ve bir nesil içinde Arapça haber merkezlerine hâkim oldu
Web’in hâlâ çizemediği kaşida
- CSS Text Module Level 3’ün ilk taslaklarında
text-justifyiçin kashida diye bir değer vardı ve Internet Explorer 5.5 bunu 2000 yılında uyguladı - IE 5.5 ayrıca
text-kashida-spaceözelliğini de sunuyordu; ancak diğer tarayıcılar bunu uygulamayınca ilgili değer spesifikasyondan çıkarıldı - Güncel Chrome, Firefox ve Safari’de
text-align: justify, Arapçada kelimeler arası boşluğu artırarak çalışır - CSS Working Group’un Arapça hizalama konusu en az 2015’ten beri açık ve W3C Arabic Layout Requirements çalışması da aynı yıl başladı
- Kaşida ile hizalama zordur; çünkü uzatılan glif genişliği değiştirir, genişlik değişimi satır kırılımını ve gereken uzatma miktarını yeniden değiştirir; dolayısıyla shaping ile layout’un satır bazında tekrar tekrar uzlaşması gerekir
- OpenType’ta 1990’lardan beri fontun hizalama önceliklerini bildirmesine yarayan
jstftablosu vardı; ancak shaping engine’ler bunu neredeyse hiç okumaz ve font geliştiricileri de neredeyse hiç sağlamaz - Microsoft Word ve InDesign Middle East Edition kaşida hizalaması sunar; ancak insanların en çok okuduğu tarayıcı render motorları harfleri uzatamaz
Tatweel hileleri ve ligatür ile hareke sorunları
- Web’de yaygın bir kaçamak, doğrudan metne U+0640 TATWEEL karakteri ekleyerek uzatılmış bağlantı çizgisi görüntüsü vermektir
- Tatweel içeriği değiştirdiği için arama eşleşmesi, kopyala-yapıştır, ekran okuyucular ve sütun yeniden akıtımı gibi alanlarda sorun çıkarır
- Tatweel’in çizdiği çubuk, font ve harf kurallarına göre yerleşen bir kaşida değil; yazarın tahmin ederek eklediği daktilo tarzı bir çizgidir
- OpenType ligatürleri
rlig,liga,dligolarak ayrılır;lām-alifgibi zorunlu ligatürler bozulduğunda mesele sadece çirkin görünmekten çıkıp yanlış yazıma dönüşür - U+200C ZERO WIDTH NON-JOINER harflerin arasına konursa kaydedilen harfler korunur ama render her harfi yalıtık olmaya zorlar
- Safari
"rlig" 0,"liga" 0ayarlarını yok saydığı için zorunlu ligatürü kapatma demoları etkisiz kalır - Amiri, Khaled Hosny’nin 2011’de SIL Open Font License ile yayımladığı bir Naskh fontudur; 2022’deki 1.0 yeniden yazımından sonra kıvrımlı kaşida ve gelişmiş hareke istifleme sunar
line-height: 1ileoverflow: hiddenbir kart bileşeninde birleştiğinde, tam harekeli Arapça metindeki üst harekeler kesilebilir
Çift yönlü algoritma ve yalan söyleyen imleç
- Arapça bir paragraf içindeki sürüm numaraları, İngilizce tanımlayıcılar, URL’ler ve Fransızca kelimeler Unicode Çift Yönlü Algoritması UAX #9’u devreye sokar
- Arapça harfler güçlü sağdan sola karakterler, Latin harfleri güçlü soldan sağa karakterler, rakamlar bağlama uyan zayıf karakterler, boşluk ve noktalama ise nötr karakterlerdir
- Algoritma her karaktere bir yön sınıfı atar, zayıf ve nötr karakterleri aşamalı olarak yorumlar, ardından gömme seviyeleri verip aynı seviyedeki dizileri ters çevirir
- Ekrandaki görsel sıra ile bellekteki mantıksal sıra farklı olduğu için imleç hareketi, fare tıklaması ve seçim davranışı bu iki sıra arasında sürekli çeviri yapmak zorundadır
- Çalışma dizisi sınırlarında mantıksal konum ve görsel konum diye iki meşru imleç yeri vardır; Chrome, Firefox, Qt ve Outlook bunları birbirinden farklı ele alabilir
- Arapça-İngilizce karışık metin yazmak, 2026’da bile büyük editörlerde, e-posta istemcilerinde ve sohbet uygulamalarında varsayılan olarak bilişsel yükü yüksek bir deneyim olmaya devam ediyor
الصفحات 10-20gibi bir aralık, W2 kuralı ve nötr tire işleme nedeniyle “20’den 10’a” gibi görünebilir; bunu düzeltmek için başına U+200E LEFT-TO-RIGHT MARK eklenebilir
Çalışan temel ve kalan boşluk
- Khaled Hosny, Amiri’yi yaptı; HarfBuzz komut satırı aracı
hb-shape’i yazdı ve ayrıca HarfBuzz’ın ortak bakımcılarından biri oldu - Behdad Esfahbod, Hosny’den önce HarfBuzz’ın büyük bir kısmını yazdı ve bugün tarayıcılarda Arapça harfleri doğru çizen shaping engine’e katkıda bulundu
- Brill, Semitics kataloğunda gereken tüm çevriyazı karakterlerini kapsamak için John Hudson’a Brill yazı tipini sipariş etti ve bunu 2011’de ticari olmayan kullanım için ücretsiz yayımladı
- Sakhr AX-170, yaklaşık 1984’te ROM’dan Arapça görüntüleyen Suudi-Kuveyt ortak yapımı bir MSX bilgisayardı ve sağdan sola yazılan Arabic BASIC tanımlayıcılarını destekliyordu
- HarfBuzz, Amiri, Scheherazade, GNU Unifont’un Presentation Forms desteği, Noto Arabic ve W3C Arabic Layout belgeleri; az sayıda kişi, kurum ve gönüllünün çabasına büyük ölçüde bağımlı kaldı
- Tarayıcı üreticileri HarfBuzz ücretsiz ve tamamlanmış hâle geldikten sonra bunu benimsedi; ancak istinsah geleneğindeki hizalama yöntemini ekranda uygulayacak layout döngüsüne neredeyse hiç katkı sunmadı
- Kalan fark, birkaç layout engine’de uygulanması gereken iyi anlaşılmış algoritmalardan ibaret; müşteri panosundaki pürüzlü sol kenar da bu yatırım eksikliğinin kullanıcıya görünen yüzüdür
1 yorum
Lobste.rs yorumları
Gerçekten muhteşem bir yazı
Ayrıca şu karakterin
﷽tek bir kod noktası olması da hoşuma gidiyor. Kopyalayıp deneyince insanı şaşırtıyorAnlamı da “Rahman ve Rahim olan Allah'ın adıyla” imiş
﷽hakkında yazıdaki şu cümle şiirsel:“Render motorlarına kimsenin güvenmediği için render işleminin encoding'in içine gömüldüğü bir dönemin anıtı. Tıpkı kehribarın içinde sonsuza dek korunmuş bir resitasyon sineği gibi”
Orada referans verilen Wikipedia bağlantısının kaynaklarını takip etmek de eğlenceliydi: https://lobste.rs/c/dq2ucz
Kısacası, bu karakterin Unicode'a girmesinin nedeni Pakistan kod sayfasında zaten bulunmasıydı; oraya girmesinin nedeni de hukuki belgelerde bu ifadenin yer almasını zorunlu kılan yasal bir gereklilik olmasıydı. Urdu, Hint-Avrupa dil ailesine ait bir dil olduğu için, o dönemin teknolojisiyle Basmala yazmak amacıyla Arapça kod sayfasına bir tür “dış çağrı” yapar gibi geçiş yapmak zor olmuş olmalı
Ne yazık ki tüm yorumlar o topluluğun güçlü yanlarını göstermiyor
Meta: Böyle yazılar için
typographyetiketi gerektiğine dair bir harika örnek dahalobste.rs'de etiketler esas olarak filtreleme için kullanılıyor
IE'nin
text-justifyözelliği ha, o dönemde ilginç şeyler çoktu.text-justify: newspaperda vardı; onlarca yıl sonra bazıları bunu Knuth-Plass ya da benzeri bir şeyle açıkladı ama gerçekten öyle olduğuna inanmıyorumhttps://mediumwell.com/wp-content/uploads/… bağlantısı, o zamanlar
text-justify: newspaperdenilen davranışın bugünkü spesifikasyondakitext-justify: inter-characterile örtüştüğünü gösteriyorIE, gerçekten oldukça erken bir dönemde birçok havalı özellikle gelmişti ve diğer tarayıcılar bunları “fazla zor” sepetine bırakmıştı. Sonunda ya hiç geri dönmediler ya da ancak 15 ya da 30 yıl sonra geri geldiler. Firefox
text-justify: inter-characterdesteğini 2017'de aldı, Chromium bu kısmı ancak birkaç ay önce uyguladı, Safari'de ise hâlâ yokİnanılmaz derecede iyi ve öğretici bir yazı. Tüm anlatıya geniş bir bağlam kazandıran tarihsel arka planı özellikle sevdim
Hem tarih alanında derecesi hem de BT kariyeri olan biri olarak, iki ilgi alanıma da kusursuz biçimde dokunan bir yazıydı
Yazının bazı kısımları bende LLM dedektörünü tetikliyor, bu üzücü. Çünkü derinliği var ve modern teknoloji yığınında daha az belgelenmiş alanları ele alıyor
LLM işi gibi duran örneklerden biri şu; aslında yazının genelinde böyle bir hava var:
“Bunu hiçbir tarayıcının sunmamasının nedeni yapısal ve engel olarak bu yapı oldukça zarif. Latin hizalama, şekillendirilmiş metni sabit kabul eder, kelimeleri ölçer, artan boşluğu aralıklara döker ve işi bitirir. Şekillendirme ile yerleşim kendi kutularında kalır ve bugün çalışan her metin yığını bu ayrımın etrafında tasarlanmıştır. Kashida hizalaması ise o kutuyu açıp dağıtır.”
@lr0'a sormak isterim: Bu yazının gövdesi LLM ile üretildi, düzenlendi ya da çevrildi mi? Eğer öyleyse, son çıktı üzerindeki LLM kontrol seviyesini ayarlamak iyi olabilir. Önceki blog yazıları, örneğin https://lr0.org/blog/p/gpt/ ve https://lr0.org/blog/p/linux_new_users/ çok daha insan eli değmiş gibi hissettiriyordu