diff --git a/src/lib/utils/slugParser.ts b/src/lib/utils/slugParser.ts new file mode 100644 index 0000000..5d7632e --- /dev/null +++ b/src/lib/utils/slugParser.ts @@ -0,0 +1,70 @@ +/** + * Функция для разбора slug тегов и авторов + */ + +export interface SlugParseResult { + slug: string; + page: number; +} + +export function slugParse(slug: string | string[]): SlugParseResult { + + // Если ничего нет + if (!slug) return { slug: '', page: 1 }; + + // Если массив + if (Array.isArray(slug)) { + if (slug.length === 0) return { slug: '', page: 1 }; + + // Берем последний элемент + const last = slug[slug.length - 1]; + const num = Number(last); + + // Если последний - положительное целое число + if (Number.isInteger(num) && num > 0) { + // Убираем номер страницы + const slugWithoutPage = slug.slice(0, -1); + return { + slug: slugWithoutPage.join('/'), + page: num + }; + } + + // Весь массив - это slug + return { + slug: slug.join('/'), + page: 1 + }; + } + + // Если строка + if (typeof slug === 'string') { + if (slug === '') return { slug: '', page: 1 }; + + // Делим строку + const parts = slug.split('/').filter(p => p !== ''); + if (parts.length === 0) return { slug: '', page: 1 }; + + // Смотрим на последнюю часть + const last = parts[parts.length - 1]; + const num = Number(last); + + if (Number.isInteger(num) && num > 0) { + // Убираем номер страницы + const slugWithoutPage = parts.slice(0, -1).join('/'); + return { + slug: slugWithoutPage, + page: num + }; + } + + // Вся строка - это slug + return { + slug: slug, + page: 1 + }; + } + + // Если другой тип + return { slug: '', page: 1 }; +} \ No newline at end of file