import { DateTime } from 'luxon'
export const searchIndex = (collection) => {
const searchIndex = []
let id = 0
const collectionData = collection.getAll()[0]
const { data } = collectionData
const { posts, links, movies, books } = data
const movieData = movies['movies'].filter(movie => (movie['review']?.length && movie['review']?.length > 0 && movie['rating']))
const bookData = books.filter(book => (book['review']?.length && book['review']?.length > 0 && book['rating']))
const addItemToIndex = (items, icon, getUrl, getTitle, getTags) => {
if (items) {
items.forEach((item) => {
searchIndex.push({
id,
url: getUrl(item),
title: `${icon}: ${getTitle(item)}`,
tags: getTags ? getTags(item) : [],
})
id++
})
}
}
addItemToIndex(posts, '📝', item => item['url'], item => item['title'], item => item['tags'])
addItemToIndex(links, '🔗', item => item['link'], item => item['title'], item => item['tags'])
if (movieData) addItemToIndex(movieData, '🎥', item => item['url'], item => `${item['title']} (${item['rating']})`, item => item['tags'])
if (bookData) addItemToIndex(bookData, '📖', item => item['url'], item => `${item['title']} (${item['rating']})`, item => item['tags'])
return searchIndex
}
export const allContent = (collection) => {
const aggregateContent = []
const collectionData = collection.getAll()[0]
const { data } = collectionData
const {
posts,
links,
books,
movies: { movies }
} = data
const parseDate = (date) => {
if (!date) return null
let parsedDate = DateTime.fromISO(date)
if (!parsedDate.isValid) parsedDate = DateTime.fromFormat(date, 'yyyy-MM-dd')
if (!parsedDate.isValid) parsedDate = DateTime.fromFormat(date, 'MM/dd/yyyy')
if (!parsedDate.isValid) parsedDate = DateTime.fromFormat(date, 'dd-MM-yyyy')
return parsedDate.isValid ? parsedDate.toISO() : null
}
const addContent = (items, icon, getTitle, getDate) => {
if (items) {
items.forEach(item => {
const content = {
url: `https://coryd.dev${item['url']}`,
title: `${icon}: ${getTitle(item)}${item?.['authors']?.['name'] ? ' via ' + item['authors']['name'] : ''}`
}
if (item?.['link']) content['url'] = item?.['link']
if (item?.['description']) content['description'] = `${item['description']}
`
const date = getDate ? parseDate(getDate(item)) : null
if (date) content['date'] = date
aggregateContent.push(content)
})
}
}
addContent(posts, '📝', item => item['title'], item => item['date'])
addContent(links, '🔗', item => item['title'], item => item['date'])
addContent(books.filter(book => book['status'] === 'finished'), '📖', item => `${item['title']}${item['rating'] ? ' (' + item['rating'] + ')' : ''}`, item => item['date'])
addContent(movies, '🎥', item => `${item['title']}${item['rating'] ? ' (' + item['rating'] + ')' : ''}`, item => item['lastWatched'])
return aggregateContent.sort((a, b) => {
const dateA = a['date'] ? DateTime.fromISO(a['date']) : DateTime.fromMillis(0)
const dateB = b['date'] ? DateTime.fromISO(b['date']) : DateTime.fromMillis(0)
return dateB - dateA
})
}