Browse Source

feat(posts): add public post markdown export action

Made-with: Cursor
main
npmrun 2 weeks ago
parent
commit
1a142c1cec
  1. 36
      app/pages/@[publicSlug]/posts/[postSlug].vue

36
app/pages/@[publicSlug]/posts/[postSlug].vue

@ -1,6 +1,11 @@
<script setup lang="ts">
import { unwrapApiBody, type ApiResponse } from '../../../utils/http/factory'
import { extractFrontMatterDesc } from '../../../utils/markdown-front-matter'
import {
buildMarkdownExportFileName,
downloadMarkdownFile,
normalizeMarkdownImageUrls,
} from '../../../utils/markdown-export'
import { renderSafeMarkdown } from '../../../utils/render-markdown'
import { formatOccurredOnDisplay, occurredOnToIsoAttr } from '../../../utils/timeline-datetime'
import { useAuthSession } from '../../../composables/useAuthSession'
@ -13,6 +18,7 @@ const route = useRoute()
const publicSlug = computed(() => route.params.publicSlug as string)
const postSlug = computed(() => route.params.postSlug as string)
const { user, loggedIn } = useAuthSession()
const toast = useToast()
type Post = {
id: number
@ -75,6 +81,26 @@ const canEditPost = computed(() => {
const editPostHref = computed(() =>
data.value && canEditPost.value ? `/me/posts/${data.value.id}` : '',
)
function exportMarkdown(): void {
if (!data.value) {
return
}
try {
const origin = window.location.origin
const bodyMarkdown = data.value.bodyMarkdown || ''
const normalizedMarkdown = normalizeMarkdownImageUrls(bodyMarkdown, origin)
const filename = buildMarkdownExportFileName({
slug: data.value.slug,
id: data.value.id,
})
downloadMarkdownFile(filename, normalizedMarkdown)
toast.add({ title: '已导出 Markdown', color: 'success' })
} catch {
toast.add({ title: '导出失败,请稍后重试', color: 'error' })
}
}
</script>
<template>
@ -97,6 +123,16 @@ const editPostHref = computed(() =>
>
编辑
</UButton>
<UButton
v-if="data"
color="neutral"
variant="soft"
size="sm"
:disabled="pending"
@click="exportMarkdown"
>
导出 .md
</UButton>
</div>
<div v-if="data.coverUrl" class="flex justify-center">
<img

Loading…
Cancel
Save