Slug-ul care mănâncă literele cu diacritice
TypeScript · URL-urile articolelor pe o platformă de blog multilingvă · Cazuri-limită · dificultate 2/3 · ~7 min
Un coleg i-a cerut asistentului AI: „Scrie un slugify(title) pentru URL-urile articolelor. Litere mici, doar litere și cifre ASCII, cratime între cuvinte, nimic la margini. Literele cu diacritice trebuie să-și păstreze litera de bază, pentru că mulți dintre autorii noștri scriu în franceză, portugheză și germană. Adaugă și uniqueSlug(title, existing), care adaugă -2, -3 și așa mai departe când un slug e deja ocupat.”
Codul a venit cu teste, iar articolele în engleză de pe staging au toate URL-uri curate. Contractul promis de docstring:
- Rezultatul conține doar
a-z,0-9și separatori-simpli, fără-la început sau la final. - Secvențele de spații și semne de punctuație se reduc la un singur
-. - Literele cu diacritice sunt reduse la litera lor de bază:
"Crème brûlée"devine"creme-brulee". uniqueSlugreturnează slug-ul simplu când e liber, altfel prima variantă-nliberă.
Fă-i review înainte să intre live pentru autorii care nu scriu în engleză.
Repară codul până trec testele ascunse.
code.ts
Teste vizibile (trec pe codul primit)
import { describe, it, expect } from "@debunk/harness";
import { slugify, uniqueSlug } from "./code";
describe("slugify", () => {
it("lowercases and joins words with hyphens", () => {
expect(slugify("Hello World")).toBe("hello-world");
});
it("drops punctuation and collapses runs of separators", () => {
expect(slugify(" Rust & C++: a comparison! ")).toBe("rust-c-a-comparison");
});
it("uniqueSlug appends a counter when the slug is taken", () => {
const existing = new Set(["hello-world", "hello-world-2"]);
expect(uniqueSlug("Hello World", existing)).toBe("hello-world-3");
});
});