Ders 21 / 26
Metin Biçimlendirme
Boşluk işleme kuralları, hizalama ve girinti, büyük–küçük harf dönüşümünün dile bağlılığı ve alt çizgi süslemesinin denetimi.
İçindekiler
Yazı tipi geldi ve boyut ölçeği kuruldu. Metnin kendisi üzerinde verilecek kararlar kaldı: kaynak metindeki boşluklara ne olur, satırlar nasıl hizalanır, harfler nasıl dönüştürülür, bağlantıların altı nasıl çizilir.
Bu kararların ilki en çok şaşırtan olanıdır. Web’in Temelleri ve HTML kursunda yazılan belgede metin girintili yazılmıştı ve girintiler ekranda görünmedi. Bu ders bunun sebebini kuralla ve hesapla gösterir.
Boşluk İşleme
Varsayılan davranışta, kaynak metindeki ardışık boşluk karakterleri tek bir boşluğa indirgenir ve satır sonları da birer boşluk karakteri sayılır. Bu, HTML belgesinin biçimlendirilebilir olmasını sağlar: girintileme, satır bölme ve hizalama kaynak metinde serbestçe yapılır, çıktıyı etkilemez.
Kural white-space özelliğiyle değiştirilir. Aşağıdaki program beş değeri aynı kaynak metin
üzerinde uygular.
// bosluk.mjs — white-space degerlerinin bosluk isleme kurallarini uygular const KAYNAK = "Kuzey Yamac\n Istasyonu\tolcum verisi"; const DAVRANIS = { "normal": { bosluklariBirlestir: true, satirSonlariniKoru: false, sarma: true }, "nowrap": { bosluklariBirlestir: true, satirSonlariniKoru: false, sarma: false }, "pre": { bosluklariBirlestir: false, satirSonlariniKoru: true, sarma: false }, "pre-wrap": { bosluklariBirlestir: false, satirSonlariniKoru: true, sarma: true }, "pre-line": { bosluklariBirlestir: true, satirSonlariniKoru: true, sarma: true }, }; function isle(metin, kural) { let s = metin; if (kural.satirSonlariniKoru) { if (kural.bosluklariBirlestir) s = s.split("\n").map((p) => p.replace(/[ \t]+/g, " ").trim()).join("\n"); } else { s = s.replace(/\s+/g, " ").trim(); } return s; } console.log("kaynak (kacis dizileriyle):"); console.log(JSON.stringify(KAYNAK)); console.log(""); for (const [ad, k] of Object.entries(DAVRANIS)) { const sonuc = isle(KAYNAK, k); console.log(`${ad.padEnd(9)} sarma=${String(k.sarma).padEnd(5)} -> ${JSON.stringify(sonuc)}`); } console.log("\n--- text-transform: Turkce ozel durumu ---"); const ornek = "istasyon ILIK ışık"; console.log(`kaynak : ${ornek}`); console.log(`uppercase (en) : ${ornek.toLocaleUpperCase("en-US")}`); console.log(`uppercase (tr) : ${ornek.toLocaleUpperCase("tr-TR")}`); console.log(`lowercase (en) : ${ornek.toLocaleLowerCase("en-US")}`); console.log(`lowercase (tr) : ${ornek.toLocaleLowerCase("tr-TR")}`); console.log("\n--- text-indent ve hizalama etkisi (60 karakterlik kutu) ---"); const KUTU = 60; const satir = "Istasyon deniz seviyesinden 1840 metre yukseklikte"; for (const [ad, hizala] of [["start", (s) => s.padEnd(KUTU)], ["end", (s) => s.padStart(KUTU)], ["center", (s) => s.padStart((KUTU + s.length) / 2).padEnd(KUTU)]]) { console.log(`${ad.padEnd(7)}|${hizala(satir)}|`); }
kaynak (kacis dizileriyle): "Kuzey Yamac\n Istasyonu\tolcum verisi" normal sarma=true -> "Kuzey Yamac Istasyonu olcum verisi" nowrap sarma=false -> "Kuzey Yamac Istasyonu olcum verisi" pre sarma=false -> "Kuzey Yamac\n Istasyonu\tolcum verisi" pre-wrap sarma=true -> "Kuzey Yamac\n Istasyonu\tolcum verisi" pre-line sarma=true -> "Kuzey Yamac\nIstasyonu olcum verisi" --- text-transform: Turkce ozel durumu --- kaynak : istasyon ILIK ışık uppercase (en) : ISTASYON ILIK IŞIK uppercase (tr) : İSTASYON ILIK IŞIK lowercase (en) : istasyon ilik ışık lowercase (tr) : istasyon ılık ışık --- text-indent ve hizalama etkisi (60 karakterlik kutu) --- start |Istasyon deniz seviyesinden 1840 metre yukseklikte | end | Istasyon deniz seviyesinden 1840 metre yukseklikte| center | Istasyon deniz seviyesinden 1840 metre yukseklikte |
Çıktı iki ekseni ayırıyor: boşlukların birleştirilip birleştirilmediği ve satır bölünmesine izin verilip verilmediği.
normal — ardışık boşluklar tek boşluğa iner, satır sonları boşluk sayılır, satır kutuya
göre bölünür. Kaynak metindeki üç boşluk ve sekme karakteri tek bir boşluğa dönüştü.
nowrap — aynı boşluk işlemesini yapar ama satır bölünmesine izin vermez. Metin kutudan
taşar; taşma yönetimi dersinde gördüğümüz durum ortaya çıkar.
pre — hiçbir şey değiştirmez: boşluklar ve satır sonları olduğu gibi korunur, otomatik
satır bölünmesi yapılmaz. pre ögesinin tarayıcı varsayılan biçemi budur.
pre-wrap — boşlukları ve satır sonlarını korur ama kutuya sığmayan satırları böler. Uzun
satırlar taşırmadan gösterilmek istendiğinde pre yerine bu değer yazılır.
pre-line — boşlukları birleştirir ama satır sonlarını korur. Bir metin alanından
gelen kullanıcı metnini paragraf yapısıyla göstermek için kullanılır.
Harf Dönüşümü Dile Bağlıdır
Çıktının ikinci bloğu, text-transform özelliğinin neden yalnızca görsel bir dönüşüm
sayılamayacağını gösteriyor.
istasyon sözcüğü İngilizce kurallarla büyütüldüğünde ISTASYON, Türkçe kurallarla
büyütüldüğünde İSTASYON oluyor. ILIK sözcüğü İngilizce kurallarla küçültüldüğünde
ilik, Türkçe kurallarla ılık oluyor — iki farklı sözcük.
Sebep, Türkçe alfabesinde i ve ı harflerinin ayrı harfler olması ve büyük
karşılıklarının İ ve I olmasıdır. Bilgisayarlar Nasıl Çalışır kursundaki kod noktası
ayrımı burada anlam farkına dönüşür.
Bu, text-transform yazmanın belgedeki lang bildirimine bağlı olduğunu gösterir. Kök
ögede lang="tr" bildirilmemiş bir belgede büyük harfe çevirme yanlış sonuç verebilir.
İkinci bir uyarı: dönüşüm yalnızca çizimde yapılır. Belgedeki metin değişmez; kopyalanan metin kaynaktaki hâliyle gelir ve ekran okuyucu kaynaktaki hâlini okur. Bir başlığın büyük harfle yazılması gerekiyorsa bu bir görsel karardır ve biçemde verilir; metnin kendisi kaynakta olağan yazımıyla durmalıdır.
Hizalama
text-align beş temel değer alır: start, end, center, justify ve fiziksel
karşılıkları left ile right. Mantıksal değerler yazma yönüne uyar ve bu kursta
kullanılan biçim odur.
Çıktının üçüncü bloğu üç hizalamayı sabit genişlikli bir kutuda gösteriyor. Karar üç ölçütle verilir.
Ortalama kısa metinlerde işler; uzun paragraflarda her satırın başlangıç noktası değiştiği için gözün satır başını bulması zorlaşır. Başlık ve kısa açıklama için uygun, gövde metni için değil.
İki yana yaslama (justify) sözcük aralıklarını genişleterek her satırı aynı
uzunlukta yapar. Dar sütunlarda aralıklar aşırı genişler ve metnin içinde dikey beyaz
şeritler oluşur. hyphens: auto ile birlikte kullanıldığında sonuç daha dengelidir, ama
dar sütunlarda yine de sola yaslama tercih edilir.
Girinti (text-indent) paragraf başlarını içeri alır. Paragraflar arasında dikey
boşluk varsa girinti gereksizdir; ikisi birlikte kullanıldığında paragraf ayrımı iki kez
işaretlenmiş olur. Basılı metin geleneğinde girinti, boşluğun yerine geçer.
Metin Süslemesi
text-decoration bir kısayoldur ve dört açılımı ayarlar: -line (çizginin yeri), -color,
-style, -thickness.
Bağlantıların altının çizili olması tarayıcı varsayılanından gelir ve bir görsel süs değildir: metin içindeki bir bağlantıyı yalnızca renkle işaretlemek, renk ayrımını algılamayan bir okuyucu için bağlantıyı görünmez kılar. Alt çizginin kaldırılması, yerine başka bir görsel ayırt edici konmadıkça yapılmamalıdır.
Alt çizginin okunabilirliği text-underline-offset ve text-decoration-skip-ink ile
ayarlanır; ikincisi çizginin harflerin alta inen kısımlarını kesmemesini sağlar.
/* istasyon.css — 20. adım: metin biçimlendirme */ .olcum-cizelgesi th { text-transform: uppercase; letter-spacing: 0.04em; font-size: var(--yazi-kucuk); } .olcum-ham-veri { white-space: pre-wrap; font-family: ui-monospace, monospace; tab-size: 2; } .gozlem-notu { white-space: pre-line; } main a { text-decoration-line: underline; text-underline-offset: 0.15em; text-decoration-thickness: 1px; text-decoration-skip-ink: auto; } main a:hover { text-decoration-thickness: 2px; }
.olcum-ham-veri sınıfı, istasyondan gelen ham ölçüm kaydını gösterir: satır sonları ve
hizalama boşlukları anlam taşır, bu yüzden korunur; pre yerine pre-wrap yazılması uzun
satırların taşmasını değil bölünmesini sağlar.
Başlık hücrelerine verilen harf aralığı, büyük harfe çevrilmiş metinlerde yerleşik bir düzeltmedir: büyük harfler küçük harflere göre daha sıkışık görünür ve aralık açılmadığında okunması zorlaşır.
Özet
- Varsayılan boşluk işlemesinde ardışık boşluklar tek boşluğa indirgenir ve satır sonları boşluk sayılır; kaynak metnin girintilenebilir olması buna dayanır.
white-spaceiki ekseni birden ayarlar: boşlukların birleştirilip birleştirilmediği ve satır bölünmesine izin verilip verilmediği.pre-wrapboşlukları korur ve satırı böler,pre-lineboşlukları birleştirir ve satır sonlarını korur.text-transformdile bağlıdır; Türkçedeiveıharflerinin ayrı büyük karşılıkları olduğu içinlangbildirimi olmadan yanlış dönüşüm üretilebilir.- Dönüşüm yalnızca çizimde yapılır; belgedeki metin değişmez ve kopyalandığında kaynaktaki hâliyle gelir.
- Bağlantıların alt çizgisi bir süs değil, renkten bağımsız bir ayırt edicidir; kaldırılacaksa yerine başka bir görsel işaret konur.
Sonraki Adım
Metin kararları tamamlandı. Kutuların arkasına henüz bakılmadı: bir kutunun arka planı yalnızca bir renk değil, konumlandırılabilir ve yinelenebilir bir görsel de olabilir. Sonraki ders arka plan katmanlarını, konumlandırma ve yineleme kurallarını ve arka planın hangi bölgeye kadar uzandığını ele alır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.