diff --git a/packages/explorer/src/core/content/compute.mts b/packages/explorer/src/core/content/compute.mts index 880389bd..cc7edc82 100644 --- a/packages/explorer/src/core/content/compute.mts +++ b/packages/explorer/src/core/content/compute.mts @@ -1,5 +1,4 @@ import type { GalactiksConfig } from '@galactiks/config'; -import slugify from 'slugify'; import { alternatesHeaderBuilder, @@ -30,6 +29,7 @@ import type { ContentlayerWebsite, Person, } from './types/index.mjs'; +import { createIdentifierFromString } from './utils.mjs'; export type ComputeDTO = { config: GalactiksConfig; @@ -42,7 +42,7 @@ function createPage( identifier: string, document: Partial ) { - const id = slugify(identifier, { lower: true, trim: true }); + const id = createIdentifierFromString(identifier); return { _id: id, diff --git a/packages/explorer/src/core/content/repository.mts b/packages/explorer/src/core/content/repository.mts index 1431f83f..e4b857dc 100644 --- a/packages/explorer/src/core/content/repository.mts +++ b/packages/explorer/src/core/content/repository.mts @@ -13,6 +13,7 @@ import { documentByIdentifierSelector, documentsByLanguagesSelector, } from './selectors.mjs'; +import { createIdentifierFromString } from './utils.mjs'; let _generated: ContentlayerDataExports; let _documents: Content[]; @@ -96,6 +97,16 @@ export const getPagesPartOf = async ( filters?: RepositoryFilters ): Promise => (await getPages(filters)).filter((doc) => doc.isPartOf === slug); +export const getPagesWithKeywordIdentifier = async ( + keywordIdentifier: string, + filters?: RepositoryFilters +): Promise => + (await getPages(filters)).filter( + (doc) => + doc.keywords?.some( + (keyword) => createIdentifierFromString(keyword) === keywordIdentifier + ) + ); export const getPageByIdentifier = async ( identifier: string, filters?: RepositoryFilters diff --git a/packages/explorer/src/core/content/urls.mts b/packages/explorer/src/core/content/urls.mts index d95e5ebf..6e310a30 100644 --- a/packages/explorer/src/core/content/urls.mts +++ b/packages/explorer/src/core/content/urls.mts @@ -12,6 +12,7 @@ import { pageDepthSelector, } from './selectors.mjs'; import type { ContentlayerWebPageDocumentWithRender } from './render.mjs'; +import { homeIdentifier } from './consts.mjs'; type WithRequired = T & { [P in K]-?: T[P] }; type ContentlayerDocumentWithPath = WithRequired< @@ -111,7 +112,8 @@ export const computeDocumentsUrl = const existingStringProperties: [string, string][] = Object.entries({ ...document, - identifier: document.identifier !== 'index' ? document.identifier : '', + identifier: + document.identifier !== homeIdentifier ? document.identifier : '', isPartOf: isPartOfPath, }).filter(([, value]) => typeof value === 'string'); return join( diff --git a/packages/explorer/src/core/content/utils.mts b/packages/explorer/src/core/content/utils.mts new file mode 100644 index 00000000..fd2c519b --- /dev/null +++ b/packages/explorer/src/core/content/utils.mts @@ -0,0 +1,4 @@ +import slugify from 'slugify'; + +export const createIdentifierFromString = (s: string) => + slugify(s, { lower: true, trim: true });