feat(universite): tür, ızgaraya değil H1'in altındaki kimlik çipine döndü
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 <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ import Link from "next/link";
|
|||||||
import { ChevronDown, ChevronUp } from "lucide-react";
|
import { ChevronDown, ChevronUp } from "lucide-react";
|
||||||
import type { Program } from "@/types/yokatlas";
|
import type { Program } from "@/types/yokatlas";
|
||||||
import { trBaslikDuzeni } from "@/lib/slug";
|
import { trBaslikDuzeni } from "@/lib/slug";
|
||||||
|
import { UNITUR_ETIKET } from "@/lib/unitur";
|
||||||
import { VERI_YIL_SAYISI } from "@/lib/veri-yillari";
|
import { VERI_YIL_SAYISI } from "@/lib/veri-yillari";
|
||||||
import { Sayfalama, SAYFA_BOYU } from "./sayfalama";
|
import { Sayfalama, SAYFA_BOYU } from "./sayfalama";
|
||||||
import {
|
import {
|
||||||
@@ -224,7 +225,8 @@ export function BolumProgramListesi({
|
|||||||
: "bg-violet-50 text-violet-600"
|
: "bg-violet-50 text-violet-600"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{devlet ? "Devlet" : trBaslikDuzeni(p.unitur)}
|
{UNITUR_ETIKET[p.unitur]?.cip ??
|
||||||
|
trBaslikDuzeni(p.unitur)}
|
||||||
</span>
|
</span>
|
||||||
) : null}
|
) : null}
|
||||||
<span className="truncate">
|
<span className="truncate">
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
bolumSlugFromIsim,
|
bolumSlugFromIsim,
|
||||||
} from "../katalog-queries";
|
} from "../katalog-queries";
|
||||||
import { trBaslikDuzeni } from "@/lib/slug";
|
import { trBaslikDuzeni } from "@/lib/slug";
|
||||||
|
import { UNITUR_ETIKET, uniturDevletMi } from "@/lib/unitur";
|
||||||
import {
|
import {
|
||||||
JsonLd,
|
JsonLd,
|
||||||
breadcrumbJsonLd,
|
breadcrumbJsonLd,
|
||||||
@@ -43,29 +44,6 @@ import { BASLIK_YILI, SON_YIL, TERCIH_YILI } from "@/lib/veri-yillari";
|
|||||||
|
|
||||||
const sayi = (n: number) => n.toLocaleString("tr-TR");
|
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<string, { kart: string; cumle: string }> = {
|
|
||||||
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 {
|
export function uniToplamSayfa(programSayisi: number): number {
|
||||||
return Math.max(1, Math.ceil(programSayisi / SAYFA_BOYU));
|
return Math.max(1, Math.ceil(programSayisi / SAYFA_BOYU));
|
||||||
}
|
}
|
||||||
@@ -235,14 +213,13 @@ export function UniversiteIcerik({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ilkSayfa = sayfa === 1;
|
const ilkSayfa = sayfa === 1;
|
||||||
// Devlet/vakıf bilgisi sayfada başka hiçbir yerde geçmiyor (URAP'ta olan
|
// Tür iki yerde geçer ve bu bilinçli: H1'in altındaki çip taranmak,
|
||||||
// üniversitede "Tür" kartının yerini URAP sırası aldı), o yüzden özet
|
// özet paragrafın ilk virgülündeki öbek okunmak içindir. Izgarada "Tür"
|
||||||
// paragrafın ilk virgülünde duruyor. Haritada olmayan ya da NULL bir
|
// kartı yok (şablon 4 hücre, bkz. aşağıdaki ızgara yorumu). Haritada
|
||||||
// `unitur`'da öbek hiç yazılmaz: cümlede kopuk virgül/boşluk kalmaz ve
|
// olmayan ya da NULL bir `unitur`'da öbek hiç yazılmaz: cümlede kopuk
|
||||||
// ham DB değeri cümlenin içine sızmaz.
|
// virgül/boşluk kalmaz ve ham DB değeri cümlenin içine sızmaz.
|
||||||
const turCumlesi = uni.unitur
|
const turEtiketi = uni.unitur ? UNITUR_ETIKET[uni.unitur] : undefined;
|
||||||
? UNITUR_ETIKET[uni.unitur]?.cumle
|
const turCumlesi = turEtiketi?.cumle;
|
||||||
: undefined;
|
|
||||||
const buYol = ilkSayfa
|
const buYol = ilkSayfa
|
||||||
? `/universite/${slug}`
|
? `/universite/${slug}`
|
||||||
: `/universite/${slug}/sayfa/${sayfa}`;
|
: `/universite/${slug}/sayfa/${sayfa}`;
|
||||||
@@ -336,6 +313,31 @@ export function UniversiteIcerik({
|
|||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* 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 ? (
|
||||||
|
<p className="mt-3 flex min-w-0 items-center gap-1.5 text-xs text-slate-500">
|
||||||
|
<span
|
||||||
|
className={`shrink-0 rounded px-1 py-px text-[10px] font-medium leading-4 ${
|
||||||
|
uniturDevletMi(uni.unitur)
|
||||||
|
? "bg-slate-100 text-slate-600"
|
||||||
|
: "bg-violet-50 text-violet-600"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{turEtiketi.cip}
|
||||||
|
</span>
|
||||||
|
{uni.il ? (
|
||||||
|
<span className="truncate">{trBaslikDuzeni(uni.il)}</span>
|
||||||
|
) : null}
|
||||||
|
</p>
|
||||||
|
) : null}
|
||||||
|
|
||||||
{ilkSayfa ? (
|
{ilkSayfa ? (
|
||||||
<>
|
<>
|
||||||
<p className="mt-4 max-w-3xl text-sm leading-7 text-slate-600">
|
<p className="mt-4 max-w-3xl text-sm leading-7 text-slate-600">
|
||||||
@@ -387,10 +389,15 @@ export function UniversiteIcerik({
|
|||||||
{sayi(uni.fakulteSayisi)}
|
{sayi(uni.fakulteSayisi)}
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
{/* URAP'ta olan üniversitede "Tür" kartının yeri URAP'a
|
{/* Şablon tam 4 hücre bırakıyor: masaüstünde harita 3. sütunu
|
||||||
bırakılır (kart sayısı 4'te kalır, ızgara şablonu değişmez);
|
iki satır boyunca kaplıyor (lg:grid-rows-2 + row-span-2), 5.
|
||||||
olmayanda "Tür" yerinde durur — hiçbir sayfada boş kutu yok.
|
kart ızgarayı bozar. Bu yüzden 4. hücre tek: URAP'ta olan
|
||||||
Payda kartın içindedir: "18." tek başına yanıltır. */}
|
ü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. */}
|
||||||
<div className="rounded-xl border border-slate-200 bg-white p-4">
|
<div className="rounded-xl border border-slate-200 bg-white p-4">
|
||||||
{uni.urap ? (
|
{uni.urap ? (
|
||||||
<>
|
<>
|
||||||
@@ -407,13 +414,10 @@ export function UniversiteIcerik({
|
|||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<dt className="text-xs font-medium uppercase tracking-wide text-slate-500">
|
<dt className="text-xs font-medium uppercase tracking-wide text-slate-500">
|
||||||
Tür
|
Toplam kontenjan
|
||||||
</dt>
|
</dt>
|
||||||
<dd className="mt-1 font-heading text-2xl font-bold text-slate-900">
|
<dd className="mt-1 font-heading text-2xl font-bold text-slate-900">
|
||||||
{uni.unitur
|
{sayi(uni.stats.toplamKontenjan)}
|
||||||
? (UNITUR_ETIKET[uni.unitur]?.kart ??
|
|
||||||
trBaslikDuzeni(uni.unitur))
|
|
||||||
: "—"}
|
|
||||||
</dd>
|
</dd>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|||||||
37
src/lib/unitur.ts
Normal file
37
src/lib/unitur.ts
Normal file
@@ -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<string, { cip: string; cumle: string }> = {
|
||||||
|
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";
|
||||||
Reference in New Issue
Block a user