From e8434dc0540dadb9c77f5d2ae7329d647d2e08b9 Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Wed, 23 Sep 2026 11:14:54 +0300 Subject: [PATCH] =?UTF-8?q?feat(universite):=20t=C3=BCr,=20=C4=B1zgaraya?= =?UTF-8?q?=20de=C4=9Fil=20H1'in=20alt=C4=B1ndaki=20kimlik=20=C3=A7ipine?= =?UTF-8?q?=20d=C3=B6nd=C3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Izgara 5 karta çıkamıyor: lg:grid-cols-[1fr_1fr_1.35fr] + lg:grid-rows-2 şablonunda harita 3. sütunu iki satır kaplıyor, kartlara tam 4 hücre kalıyor. Tür zaten bir metrik değil kategori; sitenin geri kalanında (program tablosu, rapor listesi, tadımlık, bölüm listesi) başlığın altında çip olarak yaşıyor, detay sayfası bunu taşımayan tek yüzeydi. - Tür çipi H1'in altına girdi; sınıf seti program-tablosu.tsx:329-333'ten birebir kopya (yeni varyant yok). Sayfalama sayfalarında da yazar. - URAP'ı olmayan 31 sayfada ızgaranın 4. hücresi "Tür" yerine "Toplam kontenjan" oldu; toplam kontenjanı 0 olan üniversite yok, o hücrede "—" çıkmıyor. - UNITUR_ETIKET bileşenin içinden src/lib/unitur.ts'e çıktı (DILIM_ETIKET'in lib/risk.ts'te durması gibi tek kaynak) ve bölüm listesi rozetleri de buna bağlandı: "Kktc" → "KKTC", "Vakıf Myo" → "Vakıf MYO". - Özet cümledeki "…, devlet üniversitesi, …" telafisi kalıyor: tür bir kez taranabilir çip, bir kez okunabilir cümle olarak geçiyor. Co-Authored-By: Claude Opus 5 --- .../components/bolum-program-listesi.tsx | 4 +- .../katalog/components/universite-icerik.tsx | 84 ++++++++++--------- src/lib/unitur.ts | 37 ++++++++ 3 files changed, 84 insertions(+), 41 deletions(-) create mode 100644 src/lib/unitur.ts diff --git a/src/features/katalog/components/bolum-program-listesi.tsx b/src/features/katalog/components/bolum-program-listesi.tsx index f95057a..76a0d0c 100644 --- a/src/features/katalog/components/bolum-program-listesi.tsx +++ b/src/features/katalog/components/bolum-program-listesi.tsx @@ -5,6 +5,7 @@ import Link from "next/link"; import { ChevronDown, ChevronUp } from "lucide-react"; import type { Program } from "@/types/yokatlas"; import { trBaslikDuzeni } from "@/lib/slug"; +import { UNITUR_ETIKET } from "@/lib/unitur"; import { VERI_YIL_SAYISI } from "@/lib/veri-yillari"; import { Sayfalama, SAYFA_BOYU } from "./sayfalama"; import { @@ -224,7 +225,8 @@ export function BolumProgramListesi({ : "bg-violet-50 text-violet-600" }`} > - {devlet ? "Devlet" : trBaslikDuzeni(p.unitur)} + {UNITUR_ETIKET[p.unitur]?.cip ?? + trBaslikDuzeni(p.unitur)} ) : null} diff --git a/src/features/katalog/components/universite-icerik.tsx b/src/features/katalog/components/universite-icerik.tsx index e3d5633..ef5f258 100644 --- a/src/features/katalog/components/universite-icerik.tsx +++ b/src/features/katalog/components/universite-icerik.tsx @@ -9,6 +9,7 @@ import { bolumSlugFromIsim, } from "../katalog-queries"; import { trBaslikDuzeni } from "@/lib/slug"; +import { UNITUR_ETIKET, uniturDevletMi } from "@/lib/unitur"; import { JsonLd, breadcrumbJsonLd, @@ -43,29 +44,6 @@ import { BASLIK_YILI, SON_YIL, TERCIH_YILI } from "@/lib/veri-yillari"; const sayi = (n: number) => n.toLocaleString("tr-TR"); -// Ham `unitur` değerlerinin ekranda görünen karşılığı. `trBaslikDuzeni` -// tr-TR küçültmesi yaptığı için ("I" → "ı") ham değerlere uygulanamaz: -// "YURTDISI KAMU" → "Yurtdısı Kamu" gibi Türkçede olmayan kelimeler çıkıyor. -// İki biçim tek kaynakta durur, çünkü aynı bilgi iki yerde geçiyor: -// `kart` = "Tür" kartındaki kısa etiket (yalnız URAP'ta olmayan üniversitede), -// `cumle` = özet paragrafın ilk virgülündeki öbek (her üniversitede). -// `cumle` cümle ortasında okunacak biçimde küçük harfle başlar; KKTC gibi -// kısaltmalar büyük kalır. -const UNITUR_ETIKET: Record = { - DEVLET: { kart: "Devlet", cumle: "devlet üniversitesi" }, - VAKIF: { kart: "Vakıf", cumle: "vakıf üniversitesi" }, - "VAKIF MYO": { kart: "Vakıf MYO", cumle: "vakıf meslek yüksekokulu" }, - KKTC: { kart: "KKTC", cumle: "KKTC üniversitesi" }, - "YURTDISI KAMU": { - kart: "Yurt dışı (kamu)", - cumle: "yurt dışında bir kamu üniversitesi", - }, - "YURTDISI VAKIF": { - kart: "Yurt dışı (vakıf)", - cumle: "yurt dışında bir vakıf üniversitesi", - }, -}; - export function uniToplamSayfa(programSayisi: number): number { return Math.max(1, Math.ceil(programSayisi / SAYFA_BOYU)); } @@ -235,14 +213,13 @@ export function UniversiteIcerik({ } const ilkSayfa = sayfa === 1; - // Devlet/vakıf bilgisi sayfada başka hiçbir yerde geçmiyor (URAP'ta olan - // üniversitede "Tür" kartının yerini URAP sırası aldı), o yüzden özet - // paragrafın ilk virgülünde duruyor. Haritada olmayan ya da NULL bir - // `unitur`'da öbek hiç yazılmaz: cümlede kopuk virgül/boşluk kalmaz ve - // ham DB değeri cümlenin içine sızmaz. - const turCumlesi = uni.unitur - ? UNITUR_ETIKET[uni.unitur]?.cumle - : undefined; + // Tür iki yerde geçer ve bu bilinçli: H1'in altındaki çip taranmak, + // özet paragrafın ilk virgülündeki öbek okunmak içindir. Izgarada "Tür" + // kartı yok (şablon 4 hücre, bkz. aşağıdaki ızgara yorumu). Haritada + // olmayan ya da NULL bir `unitur`'da öbek hiç yazılmaz: cümlede kopuk + // virgül/boşluk kalmaz ve ham DB değeri cümlenin içine sızmaz. + const turEtiketi = uni.unitur ? UNITUR_ETIKET[uni.unitur] : undefined; + const turCumlesi = turEtiketi?.cumle; const buYol = ilkSayfa ? `/universite/${slug}` : `/universite/${slug}/sayfa/${sayfa}`; @@ -336,6 +313,31 @@ export function UniversiteIcerik({ + {/* Kurumun kimliği (tür + il): ızgaradaki kartlar sayısal ve + karşılaştırılabilir metriklerdir, tür ise kategoridir — sitenin + geri kalanında da başlığın altında çip olarak duruyor. Çipin sınıf + seti program-tablosu.tsx:329-333'ten birebir kopyadır (AGENTS.md + "ortak elemanlar tek kaynaktan"); yeni varyant üretilmez. + Sayfalama sayfalarında da yazar: ziyaretçi Google'dan doğrudan + /sayfa/N'ye inebiliyor, kimlik orada da aynı. `unitur` NULL ise + satırın tamamı düşer, kopuk boşluk kalmaz. */} + {turEtiketi ? ( +

+ + {turEtiketi.cip} + + {uni.il ? ( + {trBaslikDuzeni(uni.il)} + ) : null} +

+ ) : null} + {ilkSayfa ? ( <>

@@ -387,10 +389,15 @@ export function UniversiteIcerik({ {sayi(uni.fakulteSayisi)} - {/* URAP'ta olan üniversitede "Tür" kartının yeri URAP'a - bırakılır (kart sayısı 4'te kalır, ızgara şablonu değişmez); - olmayanda "Tür" yerinde durur — hiçbir sayfada boş kutu yok. - Payda kartın içindedir: "18." tek başına yanıltır. */} + {/* Şablon tam 4 hücre bırakıyor: masaüstünde harita 3. sütunu + iki satır boyunca kaplıyor (lg:grid-rows-2 + row-span-2), 5. + kart ızgarayı bozar. Bu yüzden 4. hücre tek: URAP'ta olan + üniversitede URAP sırası, olmayan 31 sayfada toplam + kontenjan. Toplam kontenjanı 0 olan üniversite yok + (yokatlas.db: GROUP BY universite HAVING + SUM(COALESCE(kontenjan2026,0))=0 → 0 satır), yani hiçbir + sayfada "—" çıkmaz. URAP'ta payda kartın içindedir: "18." + tek başına yanıltır. */}

{uni.urap ? ( <> @@ -407,13 +414,10 @@ export function UniversiteIcerik({ ) : ( <>
- Tür + Toplam kontenjan
- {uni.unitur - ? (UNITUR_ETIKET[uni.unitur]?.kart ?? - trBaslikDuzeni(uni.unitur)) - : "—"} + {sayi(uni.stats.toplamKontenjan)}
)} diff --git a/src/lib/unitur.ts b/src/lib/unitur.ts new file mode 100644 index 0000000..137775a --- /dev/null +++ b/src/lib/unitur.ts @@ -0,0 +1,37 @@ +/** + * Ham `unitur` değerlerinin (DB: DEVLET, VAKIF, VAKIF MYO, KKTC, + * YURTDISI KAMU, YURTDISI VAKIF) ekranda görünen karşılığı — **tek kaynak**. + * `DILIM_ETIKET`'in `lib/risk.ts`'te durması gibi: ham anahtarı kullanıcıya + * basma, buradan oku (AGENTS.md "ortak elemanlar tek kaynaktan"). + * + * `trBaslikDuzeni` bu değerlere uygulanamaz: tr-TR küçültmesi "I" → "ı" + * yaptığı için "KKTC" → "Kktc", "VAKIF MYO" → "Vakıf Myo", + * "YURTDISI KAMU" → "Yurtdısı Kamu" gibi Türkçede olmayan kelimeler çıkıyor. + * + * İki biçim var, çünkü aynı bilgi iki bağlamda geçiyor: + * `cip` = başlık altındaki kimlik çipinde okunan kısa etiket, + * `cumle` = özet paragrafın ilk virgülündeki öbek; cümle ortasında + * okunacağı için küçük harfle başlar, KKTC gibi kısaltmalar + * büyük kalır. + */ +export const UNITUR_ETIKET: Record = { + DEVLET: { cip: "Devlet", cumle: "devlet üniversitesi" }, + VAKIF: { cip: "Vakıf", cumle: "vakıf üniversitesi" }, + "VAKIF MYO": { cip: "Vakıf MYO", cumle: "vakıf meslek yüksekokulu" }, + KKTC: { cip: "KKTC", cumle: "KKTC üniversitesi" }, + "YURTDISI KAMU": { + cip: "Yurt dışı (kamu)", + cumle: "yurt dışında bir kamu üniversitesi", + }, + "YURTDISI VAKIF": { + cip: "Yurt dışı (vakıf)", + cumle: "yurt dışında bir vakıf üniversitesi", + }, +}; + +/** + * Çipin renk dili: devlet → slate, diğer her şey (vakıf, KKTC, yurt dışı) + * → violet. Sitedeki dört çip kopyasının hepsinde aynı kural. + */ +export const uniturDevletMi = (unitur: string | null | undefined) => + unitur === "DEVLET";