Support Unicode capture slugs

This commit is contained in:
Codex
2026-07-13 03:25:11 +00:00
parent 3ed933fb35
commit 2020f8e356
3 changed files with 30 additions and 5 deletions
+2 -1
View File
@@ -7,7 +7,8 @@
"dev": "tsx watch src/server.ts",
"build": "tsc && vite build",
"start": "node dist/server.js",
"typecheck": "tsc --noEmit"
"typecheck": "tsc --noEmit",
"test": "npm run build && node --test tests/*.test.mjs"
},
"dependencies": {
"archiver": "^7.0.1",
+5 -4
View File
@@ -5,12 +5,13 @@ export function slugify(input: string, fallback = "chatgpt-share"): string {
.normalize("NFKD")
.replace(STOP_CHARS, "")
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/[^\p{L}\p{N}]+/gu, "-")
.replace(/^-+|-+$/g, "")
.replace(/-{2,}/g, "-")
.slice(0, 80);
.replace(/-{2,}/g, "-");
return base || fallback;
const truncated = Array.from(base).slice(0, 80).join("").replace(/-+$/g, "");
return truncated || fallback;
}
export function displayTitleFromSlug(slug: string): string {
+23
View File
@@ -0,0 +1,23 @@
import assert from "node:assert/strict";
import test from "node:test";
import { slugify } from "../dist/slug.js";
test("preserves Unicode letters and numbers", () => {
assert.equal(slugify("多喝水减肥效果"), "多喝水减肥效果");
assert.equal(slugify("减肥 Plan 2026"), "减肥-plan-2026");
});
test("normalizes punctuation and Latin accents", () => {
assert.equal(slugify(" Café — healthy choices! "), "cafe-healthy-choices");
});
test("uses the fallback when no letters or numbers remain", () => {
assert.equal(slugify("🎉 !!!"), "chatgpt-share");
assert.equal(slugify("🎉", "capture"), "capture");
});
test("limits slugs to 80 Unicode code points without a trailing separator", () => {
assert.equal(slugify(`${"界".repeat(79)} hello`), "界".repeat(79));
assert.equal(Array.from(slugify("界".repeat(100))).length, 80);
});