@@ -90,7 +90,7 @@ export const ARACLAR: AracTanimi[] = [
universite : { type : "string" , description : "Üniversite adı parçası " } ,
universite : { type : "string" , description : "Üniversite adı parçası " } ,
il : { type : "string" , description : "İl adı , ör. 'İzmir'" } ,
il : { type : "string" , description : "İl adı , ör. 'İzmir'" } ,
tur : { type : "string" , enum : [ "devlet" , "vakif" ] , description : "Yalnı z devlet ya da yalnı z vakı f üniversiteleri" } ,
tur : { type : "string" , enum : [ "devlet" , "vakif" ] , description : "Yalnı z devlet ya da yalnı z vakı f üniversiteleri" } ,
dil : { type : "string" , enum : [ "Türkçe" , "İngilizce" ] , description : "Öğretim dili" } ,
dil : { type : "string" , enum : [ "Türkçe" , "İngilizce" , "Almanca" , "Fransı zca" , "Arapça" , "Rusça" ], description : "Öğretim dili" } ,
ogretim_turu : {
ogretim_turu : {
type : "string" ,
type : "string" ,
enum : [ "Örgün Öğretim" , "Uzaktan Öğretim" , "Açı k Öğretim" ] ,
enum : [ "Örgün Öğretim" , "Uzaktan Öğretim" , "Açı k Öğretim" ] ,
@@ -318,23 +318,38 @@ function programOzeti(p: Program, sira: number, o?: ProgramOzellik) {
} ;
} ;
}
}
/** SQLite LIKE Türkçe büyük/küçük harfi bilmez: hem yazı ldı ğı gibi hem başlı k düzeni denen ir. */
/** Arama metninin katlanmı ş hâli en az bu kadar harf olmalı ; daha kı sası her kayı tla eşleş ir. */
function likeVaryantlari ( q : string ) : string [ ] {
const ARAMA_ALT_HARF = 3 ;
const t = q . trim ( ) ;
const baslik = t
/** Yaygı n üniversite kı saltmaları → adı n katlanmı ş (slug) parçası . */
. toLocaleLowerCase ( "tr-TR" )
const UNI_KISALTMA : Record < string , string > = {
. split ( " " )
odtu : "orta-dogu-teknik ",
. map ( ( w ) = > ( w ? w [ 0 ] . toLocaleUpperCase ( "tr-TR" ) + w . slice ( 1 ) : w ) )
itu : "istanbul-teknik" ,
. join ( " " ) ;
ytu : "yildiz-teknik" ,
return Array . from ( new Set ( [ t , baslik , t . toLocaleUpperCase ( "tr-TR" ) ] ) ) ;
ktu : "karadeniz-teknik" ,
deu : "dokuz-eylul" ,
} ;
const ayrikDegerler = new Map < string , { ham : string ; katli : string } [ ] > ( ) ;
/**
* Kolonun, katlanmı ş hâli `katliSorgu`yu içeren değerleri. SQLite LIKE Türkçe
* harf katlamayı bilmez ("isletme" İşletme'yi, "bogazici" Boğaziçi'ni bulmaz);
* ayrı k değerler (birkaç bin) bir kez okunur, eşleşme JS'te yapı lı r.
*/
function katliEslesenler ( kolon : "isim" | "universite" , katliSorgu : string ) : string [ ] {
let liste = ayrikDegerler . get ( kolon ) ;
if ( ! liste ) {
liste = ( getDb ( ) . prepare ( ` SELECT DISTINCT ${ kolon } AS v FROM programs ` ) . all ( ) as { v : string | null } [ ] )
. filter ( ( x ) : x is { v : string } = > x . v != null )
. map ( ( x ) = > ( { ham : x.v , katli : turkishSlugify ( x . v ) } ) ) ;
ayrikDegerler . set ( kolon , liste ) ;
}
return liste . filter ( ( x ) = > x . katli . includes ( katliSorgu ) ) . map ( ( x ) = > x . ham ) ;
}
}
function like Kosulu( kolon : string , q : string ) : { sql : string ; args : string [ ] } {
function in Kosulu( kolon : string , degerler : string [ ] ) : string {
const v = likeVaryantlari ( q ) ;
return degerler . length ? ` ${ kolon } IN ( ${ degerler . map ( ( ) = > "?" ) . join ( "," ) } ) ` : "0 = 1" ;
return {
sql : ` ( ${ v . map ( ( ) = > ` ${ kolon } LIKE ? ` ) . join ( " OR " ) } ) ` ,
args : v.map ( ( x ) = > ` % ${ x } % ` ) ,
} ;
}
}
// ── Araç gövdeleri ───────────────────────────────────────────────────────
// ── Araç gövdeleri ───────────────────────────────────────────────────────
@@ -363,24 +378,28 @@ function programAra(b: AracBaglami, a: ProgramAraArg, profilUygula = true): Prog
const args : ( string | number ) [ ] = [ PUAN_TURLERI [ b . tur ] , b . tur === "tyt" ? 1 : 0 ] ;
const args : ( string | number ) [ ] = [ PUAN_TURLERI [ b . tur ] , b . tur === "tyt" ? 1 : 0 ] ;
const uygulanan : string [ ] = [ ] ;
const uygulanan : string [ ] = [ ] ;
const bos = ( not : string ) : ProgramAraSonuc = > ( { toplamEslesen : 0 , gosterilen : 0 , uygulananFiltreler : [ ] , sonuclar : [ ] , not } ) ;
if ( a . arama ) {
if ( a . arama ) {
const k = likeKosulu ( "isim" , a . arama ) ;
const katli = turkishSlugify ( a . arama ) ;
kosullar . push ( k . sql ) ;
if ( katli . length < ARAMA_ALT_HARF ) return bos ( ` Bölüm araması için en az ${ ARAMA_ALT_HARF } harf yaz: ${ a . arama } ` ) ;
args . push ( . . . k . args ) ;
const adlar = katliEslesenler ( "isim" , katli ) ;
kosullar . push ( inKosulu ( "isim" , adlar ) ) ;
args . push ( . . . adlar ) ;
uygulanan . push ( ` bölüm ~ " ${ a . arama } " ` ) ;
uygulanan . push ( ` bölüm ~ " ${ a . arama } " ` ) ;
}
}
if ( a . universite ) {
if ( a . universite ) {
const k = likeKosulu ( "universite" , a . universite ) ;
const slug = turkishSlugify ( a . universite ) ;
kosullar . push ( k . sql ) ;
const katli = UNI_KISALTMA [ slug ] ? ? slug ;
args . push ( . . . k . args ) ;
if ( katli . length < ARAMA_ALT_HARF ) return bos ( ` Üniversite araması için en az ${ ARAMA_ALT_HARF } harf yaz: ${ a . universite } ` ) ;
const adlar = katliEslesenler ( "universite" , katli ) ;
kosullar . push ( inKosulu ( "universite" , adlar ) ) ;
args . push ( . . . adlar ) ;
uygulanan . push ( ` üniversite ~ " ${ a . universite } " ` ) ;
uygulanan . push ( ` üniversite ~ " ${ a . universite } " ` ) ;
}
}
// İl: parametre > profildeki km sı nı rı
// İl: parametre > profildeki km sı nı rı
if ( a . il ) {
if ( a . il ) {
const il = ilAdiNormalize ( a . il ) ;
const il = ilAdiNormalize ( a . il ) ;
if ( ! il ) {
if ( ! il ) return bos ( ` İl tanı nmadı : ${ a . il } ` ) ;
return { toplamEslesen : 0 , gosterilen : 0 , uygulananFiltreler : [ ] , sonuclar : [ ] , not : ` İl tanı nmadı : ${ a . il } ` } ;
}
kosullar . push ( "il = ?" ) ;
kosullar . push ( "il = ?" ) ;
args . push ( il ) ;
args . push ( il ) ;
uygulanan . push ( ` il = ${ il } ` ) ;
uygulanan . push ( ` il = ${ il } ` ) ;
@@ -594,6 +613,7 @@ function bolumIstihdam(b: AracBaglami, a: { bolumler?: unknown }) {
ulkeOrtalamasi : ISTIHDAM_ORTALAMA [ duzey ] ,
ulkeOrtalamasi : ISTIHDAM_ORTALAMA [ duzey ] ,
bolumler : adlar.map ( ( ad ) = > {
bolumler : adlar.map ( ( ad ) = > {
const slug = bolumSayfaSlug ( ad ) ;
const slug = bolumSayfaSlug ( ad ) ;
if ( slug . length < ARAMA_ALT_HARF ) return { aranan : ad , hata : ` Bölüm adı çok kı sa; en az ${ ARAMA_ALT_HARF } harf yaz. ` } ;
// Birebir > başı tutan > içinde geçen ("bilgisayar müh" → bilgisayar-muhendisligi)
// Birebir > başı tutan > içinde geçen ("bilgisayar müh" → bilgisayar-muhendisligi)
const anahtar =
const anahtar =
( slug in tablo ? slug : undefined ) ? ?
( slug in tablo ? slug : undefined ) ? ?
@@ -619,6 +639,8 @@ function bolumOzeti(_b: AracBaglami, a: { bolum?: string }) {
const q = String ( a . bolum ? ? "" ) . trim ( ) ;
const q = String ( a . bolum ? ? "" ) . trim ( ) ;
if ( ! q ) return { hata : "Bölüm adı gerekli." } ;
if ( ! q ) return { hata : "Bölüm adı gerekli." } ;
const slug = bolumSayfaSlug ( q ) ;
const slug = bolumSayfaSlug ( q ) ;
// Boş/tek harfli slug her bölümle "başlı yor" sayı lı r ve ilk kayı t (Abaza Dili) dönerdi
if ( slug . length < ARAMA_ALT_HARF ) return { hata : ` Bölüm adı çok kı sa; en az ${ ARAMA_ALT_HARF } harf yaz: ${ q } ` } ;
const hepsi = getAllBolumler ( ) ;
const hepsi = getAllBolumler ( ) ;
const aday =
const aday =
hepsi . find ( ( x ) = > x . slug === slug ) ? ?
hepsi . find ( ( x ) = > x . slug === slug ) ? ?
@@ -645,7 +667,8 @@ const IL_UNI_UST = 30;
function ilOzeti ( _b : AracBaglami , a : { il? : string } ) {
function ilOzeti ( _b : AracBaglami , a : { il? : string } ) {
const q = String ( a . il ? ? "" ) . trim ( ) ;
const q = String ( a . il ? ? "" ) . trim ( ) ;
if ( ! q ) return { hata : "İl adı gerekli." } ;
if ( ! q ) return { hata : "İl adı gerekli." } ;
const il = getIlBySlug ( turkishSlugify ( q ) ) ;
// "Afyon" → AFYONKARAHİSAR: program_ara ile aynı il eşleşmesi
const il = getIlBySlug ( turkishSlugify ( ilAdiNormalize ( q ) ? ? q ) ) ;
if ( ! il ) return { hata : ` İl bulunamadı : ${ q } ` } ;
if ( ! il ) return { hata : ` İl bulunamadı : ${ q } ` } ;
return {
return {
il : il.ad ,
il : il.ad ,
@@ -724,14 +747,8 @@ function universiteProfili(_b: AracBaglami, a: { universite?: string }) {
if ( ! q ) return { hata : "Üniversite adı gerekli." } ;
if ( ! q ) return { hata : "Üniversite adı gerekli." } ;
const slugQ = turkishSlugify ( q ) ;
const slugQ = turkishSlugify ( q ) ;
const hepsi = getAllUniversiteler ( ) ;
const hepsi = getAllUniversiteler ( ) ;
const kisaltma : Record < string , string > = {
const arananSlug = UNI_KISALTMA [ slugQ ] ? ? slugQ ;
odtu : "orta-dogu-teknik" ,
if ( arananSlug . length < ARAMA_ALT_HARF ) return { hata : ` Üniversite adı çok kı sa; en az ${ ARAMA_ALT_HARF } harf yaz: ${ q } ` } ;
itu : "istanbul-teknik" ,
ytu : "yildiz-teknik" ,
ktu : "karadeniz-teknik" ,
dtu : "deu" ,
} ;
const arananSlug = kisaltma [ slugQ ] ? ? slugQ ;
const aday =
const aday =
hepsi . find ( ( u ) = > u . slug === arananSlug || u . slug === ` ${ arananSlug } -universitesi ` ) ? ?
hepsi . find ( ( u ) = > u . slug === arananSlug || u . slug === ` ${ arananSlug } -universitesi ` ) ? ?
hepsi . find ( ( u ) = > u . slug . startsWith ( arananSlug ) ) ? ?
hepsi . find ( ( u ) = > u . slug . startsWith ( arananSlug ) ) ? ?