Ders 05 / 25
Belge Türü ve Kök Yapı
Belge türü bildiriminin işlevi, kök ögenin dil bildirimi, baş ve gövde bölümlerinin ayrımı ve yazılmayan ögelerin ayrıştırıcı tarafından kurulması.
İçindekiler
Önceki konu belgenin nasıl işlendiğini kurdu. Bu konu belgenin nasıl yazıldığını kurar ve en dıştaki yapıdan başlar: her HTML belgesinin ilk satırlarında bulunan ve çoğu zaman üzerinde düşünülmeden kopyalanan bildirimlerden.
Bu bildirimlerin her biri belirli bir soruna karşılık gelir. Hangi soruna karşılık geldiklerini bilmek, hangilerinin zorunlu, hangilerinin koşullu olduğunu da belirler.
Belge Türü Bildirimi
Bir belgenin ilk satırı <!doctype html> yazımıdır. Bu bir öge değildir; ayrıştırıcıya
verilen bir bildirimdir ve tek bir işi vardır: ayrıştırma kipini seçmek.
Kipin varlığının nedeni geriye dönük uyumluluktur. Web’in erken belgelerinin bir bölümü, sonradan standartlaşan kurallara aykırı yazılmıştı; o belgeleri standart kurallarla işlemek, görünümlerini bozardı. Çözüm iki kip tanımlamak oldu: standart kurallara uyan belgeler için standart kip, eski belgeler için uyumluluk kipi (quirks mode). Belge türü bildirimi, belgenin hangi kiple işleneceğini seçen anahtardır.
Bildirimin yokluğu bir kusur değil, farklı bir istektir: ayrıştırıcı belgeyi uyumluluk kipinde işler ve o kipteki kurallar bugün beklenen kurallar değildir. Aradaki farklar çoğunlukla sunum katmanındadır — kutu genişliğinin nasıl hesaplandığı gibi — ve bu kurs kapsamında ele alınmaz. Kural nettir: bildirim yazılır.
Bildirimin kendisinde başka bilgi taşınmaz. Sürüm numarası, şema adresi ve dil kimliği içermez; yalnızca kipi seçer.
Kök Öge ve Dil Bildirimi
Belge türü bildiriminden sonra tek bir kök öge gelir: html. Ağacın belge düğümünden
sonraki tek çocuğudur ve tüm belge onun içindedir.
Kök ögede yazılması gereken bir öznitelik vardır: lang. Belgenin doğal dilini bildirir
ve etkisi görsel değildir.
<!doctype html> <html lang="tr">
Dil bildirimi en az dört kararı etkiler. Ekran okuyucular metni hangi dilin ses kurallarıyla seslendireceğini buradan öğrenir; yanlış bildirilmiş bir dil, metni okunamaz kılar. Yazım denetimi ve hecelemeyle satır bölme kuralları dile bağlıdır. Arama dizinleyicileri belgeyi dile göre sınıflandırır. Bazı tipografik kurallar —tırnak işaretlerinin biçimi gibi— dile göre değişir.
Belgenin bir bölümü başka dildeyse, o bölümü taşıyan ögede yeniden bildirilir; öznitelik kalıtılır ve en yakın bildirim geçerlidir.
<p>İstasyon adının İngilizce karşılığı <span lang="en">North Slope Station</span> biçimindedir.</p>
Baş ve Gövde
Kök ögenin iki çocuğu vardır ve sırası değişmez: head, sonra body.
Baş bölümü (head), belgeye ilişkin bilgiyi taşır: başlığı, karakter kodlaması
bildirimi, dış kaynak bağlantıları, üstveri. Bu içerik çizilmez. Tek görünür etkisi,
title ögesinin tarayıcı sekmesinde ve yer imlerinde kullanılmasıdır.
Gövde bölümü (body), belgenin okunacak içeriğini taşır. Çizilen her şey buradadır.
Ayrım keskin görünse de sınırda duran bir öge vardır: script. Betik ögesi her iki bölümde
de bulunabilir ve nerede bulunduğu, önceki derste görülen yükleme davranışını belirler.
Yazılmayan Ögeler Kurulur
html, head ve body ögelerinin etiketleri yazılmasa da ayrıştırıcı bunları kurar.
Baş bölümüne hangi ögenin gireceği, gövdeye hangisinin gireceği tanımlı bir kurala göre
belirlenir: baş bölümüne ait ögelerden başkası görüldüğü anda baş bölümü kapanır ve gövde
başlar.
// kok.mjs — yazilmayan html/head/body ogelerinin yerlestirilmesi const BAS_ICERIGI = new Set(["title", "base", "link", "meta", "style", "script", "noscript"]); function yerlestir(metin) { const birimler = [...metin.matchAll(/<\/?([a-z0-9!]+)[^>]*>/g)] .map((e) => ({ ad: e[1], kapanis: e[0][1] === "/" })); const bas = []; const govde = []; let belgeTuru = null; let kip = "bas"; for (const birim of birimler) { if (birim.ad === "!doctype") { belgeTuru = "html"; continue; } if (birim.kapanis) continue; if (["html", "head", "body"].includes(birim.ad)) continue; if (kip === "bas" && BAS_ICERIGI.has(birim.ad)) bas.push(birim.ad); else { kip = "govde"; govde.push(birim.ad); } } return { belgeTuru, bas, govde }; } const belgeler = { "tam yazilmis": `<!doctype html><html lang="tr"><head><meta charset="utf-8"> <title>Kuzey Yamaç</title></head><body><h1>Kuzey Yamaç</h1><p>1840 m</p></body></html>`, "kok ogeleri yazilmamis": `<!doctype html><meta charset="utf-8"> <title>Kuzey Yamaç</title><h1>Kuzey Yamaç</h1><p>1840 m</p>`, "belge turu yok": `<title>Kuzey Yamaç</title><h1>Kuzey Yamaç</h1>`, }; for (const [ad, belge] of Object.entries(belgeler)) { const { belgeTuru, bas, govde } = yerlestir(belge); console.log("[" + ad + "]"); console.log(" belge turu :", belgeTuru ?? "yok -> uyumluluk kipi"); console.log(" head :", bas.join(", ")); console.log(" body :", govde.join(", ")); }
[tam yazilmis] belge turu : html head : meta, title body : h1, p [kok ogeleri yazilmamis] belge turu : html head : meta, title body : h1, p [belge turu yok] belge turu : yok -> uyumluluk kipi head : title body : h1
İlk iki belge farklı yazılmış, aynı yapıyı üretmiştir. Üçüncüsü aynı kuralla bölünmüştür ama farklı bir kiple işlenecektir.
Bu kuralın bir sonucu, baş bölümüne ait olmayan bir ögenin yanlışlıkla baş bölümüne
yazılamamasıdır: yazılsa bile gövdeye taşınır. Tersi de doğrudur — gövdenin ortasına
yazılmış bir title ögesi baş bölümüne geri gitmez, gövdede kalır ve beklenen işi
görmez. Ayrıştırıcının hoşgörüsü, yazım hatalarını sessizce düzeltmek değil, tanımlı bir
sonuç üretmektir.
Etiketlerin yazılmasının yine de bir gerekçesi vardır: okunabilirlik ve öznitelik yeri.
lang özniteliği html ögesine, sınıf veya kimlik body ögesine yazılabilmelidir; bunun
için etiketin kaynak metinde bulunması gerekir.
Tekillik ve Sıra Kısıtları
Kök yapıda dört öge tektir: bir belgede yalnızca bir html, bir head, bir body ve bir
title bulunur. İkincisinin yazılması yeni bir öge kurmaz; ayrıştırıcı ikinci body
etiketini gördüğünde yeni bir gövde açmaz, var olanın öznitelikleriyle birleştirir.
Belgenin iki gövdesi olamaz, çünkü ağacın tek bir kökü ve o kökün tek bir görünür dalı
vardır.
Baş bölümünün içeriğinde sıra genellikle serbesttir; iki durum bunun dışındadır. Karakter
kümesi bildirimi olabildiğince erken yazılır — gerekçesi sonraki dersin konusudur. Göreli
adreslerin tabanını değiştiren base ögesi de, kendisinden sonra gelen adresleri
etkilediği için erken yazılır ve belgede yalnızca bir kez bulunur.
title ögesi baş bölümünün zorunlu içeriğidir. Yazılmadığında belge işlenmeyi sürdürür
ancak bağlamı dışında adlandırılamaz: sekmede adres görünür, yer imi adsız kaydedilir,
arama sonucunda belgeyi tanıtan metin başka kaynaklardan üretilir. Zorunluluk, bir
ayrıştırma koşulu değil, belgenin dış dünyada tanınabilir olmasının koşuludur.
İstasyon Belgesinin İskeleti
Kurs boyunca geliştirilecek belgenin ilk hâli şudur:
<!doctype html> <html lang="tr"> <head> <meta charset="utf-8"> <title>Kuzey Yamaç Ölçüm İstasyonu</title> </head> <body> <h1>Kuzey Yamaç Ölçüm İstasyonu</h1> <p>Deniz seviyesinden 1840 metre yükseklikte kurulu otomatik ölçüm istasyonu.</p> </body> </html>
Beş satır bildirim, iki satır içerik. Bu oran belgede içerik arttıkça düşecektir; bildirim bölümü belgenin büyüklüğünden bağımsız olarak sabit kalır.
title ögesi baş bölümünde, h1 ögesi gövdededir ve ikisinin metni burada aynıdır. İkisi
farklı işler görür: title belgeyi bağlamı dışında adlandırır — sekmede, yer iminde, arama
sonucunda —; h1 belgenin içindeki en üst başlıktır. Bağlam dışında anlaşılır olması
gereken title ögesi çoğu belgede daha uzun yazılır ve site adını da taşır.
Özet
- Belge türü bildirimi bir öge değildir; ayrıştırma kipini seçer ve başka bilgi taşımaz. Yazılmadığında belge uyumluluk kipinde işlenir.
- Kök öge
html, belgenin tek kök çocuğudur;langözniteliği seslendirme, heceleme, dizinleme ve tipografi kararlarını etkiler ve bir bölüm başka dildeyse orada yeniden bildirilir. - Baş bölümü belgeye ilişkin bilgiyi, gövde okunacak içeriği taşır; baş bölümü içeriği çizilmez.
html,headvebodyetiketleri yazılmasa da ayrıştırıcı bu ögeleri kurar; bölünme, baş bölümüne ait olmayan ilk ögede yapılır.titlebelgeyi bağlamı dışında adlandırır,h1belgenin içindeki en üst başlıktır; metinleri aynı olabilir ama işlevleri ayrıdır.
Sonraki Adım
Bu ders belgenin en dış kabuğunu kurdu ve etiketleri sözdizimsel ayrıntısına girmeden
kullandı. Sonraki ders o ayrıntıyı ele alır: bir etiketin nasıl yazıldığı, özniteliklerin
hangi yazım biçimlerini kabul ettiği, metinde geçen < ve & karakterlerinin nasıl
yazılacağı ve kurallara aykırı bir yazımda ayrıştırıcının hangi kurtarma kurallarını
uyguladığı.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.