Sari la conținut
← Toate exercițiile

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".
  • uniqueSlug returnează slug-ul simplu când e liber, altfel prima variantă -n liberă.

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");
  });
});