From aeceab3d4d90270137b2288cc24057b51278c821 Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Fri, 9 Jan 2026 02:10:04 +0100 Subject: [PATCH] Using local slugify. --- common | 2 +- src/utils/slugify.js | 137 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 137 insertions(+), 2 deletions(-) diff --git a/common b/common index ee23dc03..ec4b15ce 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit ee23dc0358677a66b27a20b8d56c4b69782cec9b +Subproject commit ec4b15ce33a3a6306ee5024935ed2966502d3019 diff --git a/src/utils/slugify.js b/src/utils/slugify.js index f9bfe27c..115efcae 100755 --- a/src/utils/slugify.js +++ b/src/utils/slugify.js @@ -1,5 +1,140 @@ 'use strict'; -const slugify = require('../../common/slugify.cjs'); +const accentMap = { + à: 'a', + á: 'a', + ä: 'a', + å: 'a', + ã: 'a', + â: 'a', + æ: 'ae', + ç: 'c', + è: 'e', + é: 'e', + ë: 'e', + ẽ: 'e', + ê: 'e', + ì: 'i', + í: 'i', + ï: 'i', + ĩ: 'i', + î: 'i', + ǹ: 'n', + ń: 'n', + ñ: 'n', + ò: 'o', + ó: 'o', + ö: 'o', + õ: 'o', + ô: 'o', + ø: 'o', + œ: 'oe', + ß: 'ss', + ù: 'u', + ú: 'u', + ü: 'u', + ũ: 'u', + û: 'u', + ỳ: 'y', + ý: 'y', + ÿ: 'y', + ỹ: 'y', +}; + +const plainCharRegex = /[a-zA-Z0-9]/; +const defaultPunctuationRegex = /[.,?!:;&'‘’"“”…()[]{}<>\/*—-]/; +const defaultSymbolRegex = /[@$€£#%^+=\\~]/; + +function slugify(strings, delimiter = '-', { + limit = 1000, + lower = true, + encode = false, + accents: keepAccents = false, + punctuation: keepPunctuation = false, + punctuationRegex = defaultPunctuationRegex, + symbols: keepSymbols = false, + symbolRegex = defaultSymbolRegex, +} = {}) { + if (!strings || (typeof strings !== 'string' && !Array.isArray(strings))) { + return strings; + } + + const string = [].concat(strings).join(' '); + + const casedString = lower + ? string.toLowerCase() + : string; + + const normalized = casedString + .split('') + .map((char) => { + if (char === ' ') { + return char; + } + + const lowChar = char.toLowerCase(); + + if (accentMap[lowChar]) { + if (keepAccents) { + return char; + } + + // match original case after mapping + if (char === lowChar) { + return accentMap[lowChar]; + } + + return accentMap[lowChar].toUpperCase(); + } + + if (plainCharRegex.test(char)) { + return char; + } + + if (punctuationRegex.test(char)) { + if (keepPunctuation === 'split') { + return ' '; + } + + if (keepPunctuation) { + return char; + } + } + + if (symbolRegex.test(char)) { + if (keepSymbols === 'split') { + return ' '; + } + + if (keepSymbols) { + return char; + } + } + + return ''; + }).join(''); + + const components = normalized.trim().split(/\s+/).filter(Boolean); + + if (components.length === 0) { + return ''; + } + + const slug = components.reduce((acc, component, index) => { + const accSlug = `${acc}${index > 0 ? delimiter : ''}${component}`; + + if (accSlug.length < limit) { + return accSlug; + } + + return acc; + }).slice(0, limit); // in case first word exceeds limit + + if (encode) { + return encodeURI(slug); + } + + return slug; +} module.exports = slugify;