27 lines
823 B
TypeScript
27 lines
823 B
TypeScript
import type { MinimalElement, MinimalNode } from '@nuxt/content'
|
|
|
|
type TypedRecord<T extends readonly string[]> = Record<T[number], string>
|
|
|
|
type PlainText<T extends string[]> = {
|
|
meta: TypedRecord<T>
|
|
text: string
|
|
}
|
|
|
|
const extractText = (element ?: MinimalNode) : string => {
|
|
if (!element) return ''
|
|
if (typeof element === 'string') return element
|
|
const [,, ...nodes] = element
|
|
return nodes?.map((el : MinimalNode) => typeof el === 'string' ? el : extractText(el)).join(' ') ?? ''
|
|
}
|
|
|
|
export const generatePlainText = <T extends string[] = []>(body ?: MinimalNode[]) : PlainText<T>[] => {
|
|
if (!body) return []
|
|
return body.map<PlainText<T>>(part => {
|
|
const [, meta] = part as MinimalElement
|
|
return {
|
|
meta : meta as TypedRecord<T>,
|
|
text: extractText(part).replace(/\n/g, ' ')
|
|
}
|
|
})
|
|
}
|
|
|