Attempt at Markdown page rendering
Syntax highlighting doesn't work yet.
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
import { defineContentConfig, defineCollection } from '@nuxt/content'
|
||||||
|
|
||||||
|
// Lookup resolved from path: rootDir/content
|
||||||
|
// see: https://github.com/nuxt/content/issues/3161
|
||||||
|
|
||||||
|
export default defineContentConfig({
|
||||||
|
collections: {
|
||||||
|
content: defineCollection({
|
||||||
|
type: "page",
|
||||||
|
source: "**/*.md"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
title: "My First Blog Post"
|
||||||
|
description: "This is a test article."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Hello World
|
||||||
|
|
||||||
|
This is a test article.
|
||||||
|
|
||||||
|
## Component Rendering
|
||||||
|
|
||||||
|
::ExampleComponent
|
||||||
|
#namedslot
|
||||||
|
This is a Named Slot
|
||||||
|
#default
|
||||||
|
This is the Default Slot
|
||||||
|
::
|
||||||
|
|
||||||
|
### Testing Some Markdown Features
|
||||||
|
|
||||||
|
A link: [website-vue](https://github.com/riyyi/website-vue)
|
||||||
|
|
||||||
|
A codeblock:
|
||||||
|
```js [file.js]{2} meta-info=val
|
||||||
|
export default () => {
|
||||||
|
console.log('Code block')
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
int i = 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
```php
|
||||||
|
protected static $router;
|
||||||
|
$path = parse_url($_SERVER['REQUEST_URI'])['path'];
|
||||||
|
```
|
||||||
|
|
||||||
|
Inline `hightlight`.
|
||||||
|
|
||||||
|
`const code: string = 'highlighted code inline'`{lang="ts"}
|
||||||
|
|
||||||
|
- An
|
||||||
|
- Unordered
|
||||||
|
- List
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: "My Second Blog Post"
|
||||||
|
description: "This is another article."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Test!
|
||||||
|
|
||||||
|
This is another article.
|
||||||
@@ -3,6 +3,19 @@ import Aura from "@primevue/themes/aura";
|
|||||||
// https://nuxt.com/docs/api/configuration/nuxt-config
|
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
compatibilityDate: "2024-11-01",
|
compatibilityDate: "2024-11-01",
|
||||||
|
content: {
|
||||||
|
build: {
|
||||||
|
markdown: {
|
||||||
|
highlight: {
|
||||||
|
theme: "github-light",
|
||||||
|
langs: [
|
||||||
|
// https://github.com/shikijs/shiki/blob/main/packages/langs/package.json
|
||||||
|
"c", "cpp", "css", "html", "js", "json", "lua", "md", "mdc", "php", "shell", "ts", "vue", "yaml"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
css: [
|
css: [
|
||||||
"primeicons/primeicons.css",
|
"primeicons/primeicons.css",
|
||||||
"~/assets/css/style.css"
|
"~/assets/css/style.css"
|
||||||
@@ -12,6 +25,7 @@ export default defineNuxtConfig({
|
|||||||
public: "../public"
|
public: "../public"
|
||||||
},
|
},
|
||||||
modules: [
|
modules: [
|
||||||
|
"@nuxt/content",
|
||||||
"@nuxt/eslint",
|
"@nuxt/eslint",
|
||||||
"@pinia/nuxt",
|
"@pinia/nuxt",
|
||||||
"@primevue/nuxt-module",
|
"@primevue/nuxt-module",
|
||||||
|
|||||||
@@ -23,11 +23,13 @@
|
|||||||
"zod": "^3.23.8"
|
"zod": "^3.23.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@nuxt/content": "^3.2.2",
|
||||||
"@nuxt/eslint": "^0.7.1",
|
"@nuxt/eslint": "^0.7.1",
|
||||||
"@primevue/nuxt-module": "^4.2.3",
|
"@primevue/nuxt-module": "^4.2.3",
|
||||||
"@types/bun": "latest",
|
"@types/bun": "latest",
|
||||||
"@vue/language-server": "^2.1.10",
|
"@vue/language-server": "^2.1.10",
|
||||||
"@vue/typescript-plugin": "^2.1.10",
|
"@vue/typescript-plugin": "^2.1.10",
|
||||||
|
"shiki": "2.5.0",
|
||||||
"typescript": "^5.7.2"
|
"typescript": "^5.7.2"
|
||||||
},
|
},
|
||||||
"trustedDependencies": [
|
"trustedDependencies": [
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h2 v-if="$slots.namedslot">
|
||||||
|
<slot name="namedslot" mdc-unwrap="p" />
|
||||||
|
</h2>
|
||||||
|
<h2 v-else>Broken Slot</h2>
|
||||||
|
|
||||||
|
<slot mdc-unwrap="p" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
defineProps({
|
||||||
|
namedslot: String,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -40,9 +40,9 @@ const items = ref([
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "About",
|
label: "Articles",
|
||||||
icon: "pi pi-link",
|
icon: "pi pi-link",
|
||||||
route: "#"
|
route: "/articles"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Service",
|
label: "Service",
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<template v-if="article">
|
||||||
|
<h1>{{ article.title }}</h1>
|
||||||
|
<p>{{ article.description }}</p>
|
||||||
|
<ContentRenderer :value="article" />
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<h1>Page Not Found</h1>
|
||||||
|
<p>Oops! The content you're looking for doesn't exist.</p>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
const { params } = useRoute();
|
||||||
|
|
||||||
|
console.log(params);
|
||||||
|
|
||||||
|
const { data: article } = await useAsyncData(
|
||||||
|
`article-${params.slug}`,
|
||||||
|
() => queryCollection("content").path("/articles/" + params.slug).first()
|
||||||
|
);
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title: article.value?.title,
|
||||||
|
description: article.value?.description
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(article);
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h1>Articles</h1>
|
||||||
|
<ul>
|
||||||
|
<li v-for="article in articles" :key="article._path">
|
||||||
|
<NuxtLink :to="article.path">{{ article.title }}</NuxtLink>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div v-for="article in articles" :key="article._path">
|
||||||
|
<pre>{{ article }}</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
const { data: articles } = await useAsyncData("articles", () => queryCollection("content").all())
|
||||||
|
</script>
|
||||||
Reference in New Issue
Block a user