b5fe5deed5
- Register `content:file:afterParse` hook to inject `wordCount` + `minutes` on every parsed markdown content object (D-19: 200 wpm, floor 1 min). - Import pure util `countWordsInMinimalBody` from app/utils/countWords. - Guard against non-`.md` files (defensive — hook fires on all sources). - Values persist in @nuxt/content SQLite DB and are queryable via queryCollection thanks to matching Zod fields (content.config.ts).
24 lines
941 B
TypeScript
24 lines
941 B
TypeScript
import { countWordsInMinimalBody } from '~/utils/countWords'
|
|
|
|
/**
|
|
* Nitro plugin: compute reading time for every markdown content file at parse time.
|
|
*
|
|
* Injects `wordCount` (number) and `minutes` (number, min 1) on the content object.
|
|
* Values are persisted in the @nuxt/content SQLite DB and queryable via queryCollection
|
|
* thanks to the matching Zod schema fields in content.config.ts (per D-18 + D-19).
|
|
*
|
|
* Hook reference: https://content.nuxt.com/docs/advanced/hooks
|
|
*/
|
|
export default defineNitroPlugin((nitroApp) => {
|
|
nitroApp.hooks.hook('content:file:afterParse', (ctx) => {
|
|
const { file, content } = ctx
|
|
|
|
// Only process markdown files (defensive — hook fires on all sources)
|
|
if (!file.id?.endsWith('.md')) return
|
|
|
|
const wordCount = countWordsInMinimalBody(content.body)
|
|
content.wordCount = wordCount
|
|
content.minutes = Math.max(1, Math.ceil(wordCount / 200)) // D-19: 200 wpm, floor 1 min
|
|
})
|
|
})
|