fix: slugify supports better acronyms and preserve non-latin char (#606)

* fix: slugify supports better acronyms and preserve non-latin char

Update slugify function to handle better acronyms and preserve non-latin characters.
- uses slugify (simov) for Latin-only strings to fix acronym issue (eg: e2e-testing)
- uses lodash.kebabcase for strings with non-latin characters to preserve them

* fix: remove dots in slugified titles for view transitions

Fixes #584
This commit is contained in:
Sat Naing
2026-01-14 05:20:25 +07:00
committed by GitHub
parent c20d747f38
commit fb63d96011
5 changed files with 33 additions and 3 deletions
+3 -1
View File
@@ -22,7 +22,9 @@ const { title, description, ...props } = data;
"focus-visible:no-underline focus-visible:underline-offset-0",
]}
>
<Heading style={{ viewTransitionName: slugifyStr(title) }}>
<Heading
style={{ viewTransitionName: slugifyStr(title.replaceAll(".", "-")) }}
>
{title}
</Heading>
</a>
+1 -1
View File
@@ -91,7 +91,7 @@ const nextPost =
data-pagefind-body
>
<h1
transition:name={slugifyStr(title)}
transition:name={slugifyStr(title.replaceAll(".", "-"))}
class="inline-block text-2xl font-bold text-accent sm:text-3xl"
>
{title}
+19 -1
View File
@@ -1,5 +1,23 @@
import kebabcase from "lodash.kebabcase";
import slugify from "slugify";
export const slugifyStr = (str: string) => kebabcase(str);
/**
* Check if string contains non-Latin characters
*/
const hasNonLatin = (str: string): boolean => /[^\x00-\x7F]/.test(str);
/**
* Slugify a string using a hybrid approach:
* - For Latin-only strings: use slugify (eg: "E2E Testing" -> "e2e-testing", "TypeScript 5.0" -> "typescript-5.0")
* - For strings with non-Latin characters: use lodash.kebabcase (preserves non-Latin chars)
*/
export const slugifyStr = (str: string): string => {
if (hasNonLatin(str)) {
// Preserve non-Latin characters (e.g., Burmese, Chinese, etc.)
return kebabcase(str);
}
// Handle Latin strings with better number/acronym handling
return slugify(str, { lower: true });
};
export const slugifyAll = (arr: string[]) => arr.map(str => slugifyStr(str));