İçeriğe geç
academia.sh

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, head ve body etiketleri 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.
  • title belgeyi bağlamı dışında adlandırır, h1 belgenin 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat