During a live-stream on 25th November 2020 I was tackling a feature on my project where I have Markdown within front-matter data I would like to render to the page correctly.
Here I'm quickly sharing some findings after sleeping on the problem and finding an elegant solution to the problem.
tl;dr
Utilise the
content:file:beforeInsert
hook innuxt.config.js
.
Setup
Assuming you've got a nuxt.js project with @nuxt/content
module installed
It is expected you'll have a content file like the following, containing Markdown within a property.
# content/home.md
---
title: Hello World
specialNotice: |
This is **Special Notice** to
everyone using
[Markdown](https://en.wikipedia.org/wiki/Markdown).
---
Configuration
With the above content, we can see the specialNotice
which is formatted using Markdown. So we're going to pre-parse this field and make it accessible for the <nuxt-content />
helper to render the HTML output.
Within nuxt.config.js
we're going to add into the hook
section a content:file:beforeInsert
to convert the Markdown content to JSON ATS which is like a node tree that can be rendered to the page.
// nuxt.config.js
export default {
// ...
hooks: {
// Doc: https://content.nuxtjs.org/advanced#contentfilebeforeinsert
'content:file:beforeInsert': async (document, database) => {
// search for markdown containing
// only `specialNotice` property.
if (document.extension === '.md' &&
document.specialNotice) {
// Replace Markdown string in database
// with the JSON ATS version
document.specialNotice = await database
.markdown
.toJSON(document.specialNotice)
}
}
},
// ...
}
Displaying
<!-- pages/index.vue -->
<template>
<div>
<h1>{{ document.title }}</h1>
<nuxt-content :document="document.specialNotice" />
</div>
</template>
<script>
export default {
async asyncData ({ $content }) {
const document = await $content('home').fetch()
return {
document
}
}
}
</script>
There we have it; Your page should contain the special notice rendered in HTML.
Follow me on Twitch, YouTube and Twitter for regular live-streams and chat.
Top comments (0)