Kısa özet: JavaScript'in varsayılan
toLowerCase()davranışı Türkçede
İSTANBULkelimesinii̇stanbul,IĞDIRkelimesiniiğdiryapar.
turkce-slug, Türkçe harfleri açık kurallarla işleyen, sıfır runtime
bağımlılıklı bir TypeScript paketi. 616.760 kelimede 0 hata.
Sorun
Türkçede dört I harfi vardır ve JavaScript'in locale'den bağımsız
toLowerCase() / toUpperCase() davranışı bunları doğru yönetmez:
"İSTANBUL".toLowerCase(); // "i̇stanbul" (i + combining dot)
"IĞDIR".toLowerCase(); // "iğdir" (Türkçede "ığdır" olmalı)
"istanbul".toUpperCase(); // "ISTANBUL" (Türkçede "İSTANBUL" olmalı)
Bu yüzden birçok slug kütüphanesi Türkçe başlıkları bozar:
-
İSTANBUL→istanbulyerinei̇stanbul(i + birleşik nokta) -
İstanbul'da Iğdır→istanbulda-igdiryerinei̇stanbul'da-iğdirveyai-stanbul-da-igdir -
ŞÜKRÜ ÇAĞLAR→sukru-caglaryerineşükrü-çağlar - Case dönüşümünde
IĞDIR→ığdıryerineiğdir
Türkçe kuralları açıktır:
| Girdi | Doğru çıktı |
|---|---|
İ |
i |
I |
ı |
i |
İ |
ı |
I |
Slug üretiminde ise bu harflerin ASCII karşılıkları gerekir.
Çözüm: açık harf eşlemesi
turkce-slug, I/ı/İ/i için locale'e güvenmek yerine harfleri açıkça
eşler. Bu hem tarayıcıda hem Node.js'te aynı sonucu verir.
import { slugify } from "turkce-slug";
slugify("İSTANBUL"); // "istanbul"
slugify("IĞDIR"); // "igdir"
slugify("İstanbul'da Iğdır"); // "istanbulda-igdir"
slugify("Çok Güzel Bir Başlık!"); // "cok-guzel-bir-baslik"
slugify("ŞÜKRÜ ÇAĞLAR"); // "sukru-caglar"
slugify("Fiyat: 100 TL / Ay"); // "fiyat-100-tl-ay"
Kurulum:
npm install turkce-slug
Paket ESM ve CommonJS çıktılarını, ayrıca TypeScript tiplerini birlikte
sunar. Runtime bağımlılığı yoktur.
Türkçe büyük/küçük harf dönüşümleri
Slug dışında Türkçe case dönüşümleri de doğru çalışır:
import {
toLowercaseTr,
toUppercaseTr,
capitalizeTr,
titleCaseTr,
removePunctuation,
} from "turkce-slug";
toLowercaseTr("İSTANBUL"); // "istanbul"
toLowercaseTr("IĞDIR"); // "ığdır"
toLowercaseTr("ISIK"); // "ısık"
toUppercaseTr("istanbul"); // "İSTANBUL"
toUppercaseTr("ışık"); // "IŞIK"
capitalizeTr("iĞDIR"); // "İğdır"
titleCaseTr("ışık ırmak"); // "Işık Irmak"
removePunctuation("Merhaba, dünya!"); // "Merhaba dünya"
Slug seçenekleri
slugify("Çok Güzel", { separator: "_" }); // "cok_guzel"
slugify("Çok Güzel", { lowercase: false }); // "Cok-Guzel"
slugify("Çok güzel bir başlık örneği", {
maxLength: 10,
}); // "cok-guzel"
slugify("Fiyat: 100 TL", { preserveNumbers: false }); // "fiyat-tl"
-
separatorvarsayılan"-". -
lowercasevarsayılantrue; kapatıncaÇ → C,İ → Igibi kaynak büyüklüğü korunur. -
trimbaş/son separator temizliğini kontrol eder. -
maxLengthmümkünse kelime sınırından keser ve sonucu separator ile bitirmez. -
preserveNumbersvarsayılantrue;falseiken rakamlar kaldırılır.
616.760 kelimelik doğrulama
Kütüphanenin gerçekten kapsamlı çalıştığını göstermek için iki MIT lisanslı
kaynaktan oluşturulan 616.760 kelimelik bir doğrulama korpusu
kullanıyorum:
Her kelime için üç kontrol yapılıyor:
- Slug yalnızca ASCII karakterler içeriyor mu?
- Slug idempotent mi? (
slugify(slug) === slug) - Türkçe büyük/küçük harf round-trip tutarlı mı?
Sonuç: 616.760 / 616.760 geçti, 0 hata. Tüm Türkçe özel harfler
(ç ğ ı ö ş ü â î û) korpusta yer alıyor. Rapor ve korpus GitHub'da:
Canlı demo
Tarayıcıda canlı slugify, Türkçe case dönüşümleri ve kelime doğrulaması:
https://officalbluehair.github.io/turkce-slug/
Demo, 4.205 kelimelik hızlı test setini çalıştırır. Tam 616.760 kelimelik
korpus ve rapor GitHub deposunda bulunur.
Kaynaklar
- npm: https://www.npmjs.com/package/turkce-slug/v/0.1.0
- GitHub: https://github.com/OfficalBlueHair/turkce-slug
- Lisans: MIT
Türkçe slug veya case dönüşümüyle ilgili bir hata görürsen issue açabilirsin.
Geri bildirim ve katkılar memnuniyetle karşılanır.
Top comments (0)