diff --git a/components/MarkdownRenderer.vue b/components/MarkdownRenderer.vue index 0a0cf14..a249d17 100644 --- a/components/MarkdownRenderer.vue +++ b/components/MarkdownRenderer.vue @@ -5,6 +5,7 @@ import { Text, Comment } from 'vue'; import ProseP from '~/components/prose/ProseP.vue'; import ProseA from '~/components/prose/ProseA.vue'; import ProseBlockquote from '~/components/prose/ProseBlockquote.vue'; +import ProseCallout from './prose/ProseCallout.vue'; import ProseCode from '~/components/prose/ProseCode.vue'; import ProsePre from '~/components/prose/ProsePre.vue'; import ProseEm from '~/components/prose/ProseEm.vue'; @@ -33,6 +34,7 @@ const proseList = { "p": ProseP, "a": ProseA, "blockquote": ProseBlockquote, + "callout": ProseCallout, "code": ProseCode, "pre": ProsePre, "em": ProseEm, diff --git a/components/prose/ProseBlockquote.vue b/components/prose/ProseBlockquote.vue index 7087710..8c4bd0d 100644 --- a/components/prose/ProseBlockquote.vue +++ b/components/prose/ProseBlockquote.vue @@ -1,179 +1,5 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/components/prose/ProseCallout.vue b/components/prose/ProseCallout.vue new file mode 100644 index 0000000..dc34a8d --- /dev/null +++ b/components/prose/ProseCallout.vue @@ -0,0 +1,132 @@ + + + + + + + \ No newline at end of file diff --git a/components/prose/ProseHr.vue b/components/prose/ProseHr.vue index 0925e19..3eda3e0 100644 --- a/components/prose/ProseHr.vue +++ b/components/prose/ProseHr.vue @@ -1,3 +1,3 @@ diff --git a/composables/useMarkdown.ts b/composables/useMarkdown.ts index 69b5178..6b8fed6 100644 --- a/composables/useMarkdown.ts +++ b/composables/useMarkdown.ts @@ -4,10 +4,8 @@ import RemarkParse from "remark-parse"; import RemarkRehype from 'remark-rehype'; import RemarkOfm from 'remark-ofm'; -import RemarkBreaks from 'remark-breaks' import RemarkGfm from 'remark-gfm'; import RemarkFrontmatter from 'remark-frontmatter'; -import RehypeRaw from 'rehype-raw'; export default function useMarkdown(): (md: string) => Root { @@ -16,9 +14,8 @@ export default function useMarkdown(): (md: string) => Root const parse = (markdown: string) => { if (!processor) { - processor = unified().use([RemarkParse, RemarkGfm , RemarkOfm , RemarkBreaks, RemarkFrontmatter]); - processor.use(RemarkRehype, { allowDangerousHtml: true }); - processor.use(RehypeRaw); + processor = unified().use([RemarkParse, RemarkGfm, RemarkOfm, RemarkFrontmatter]); + processor.use(RemarkRehype); } const processed = processor.runSync(processor.parse(markdown)) as Root; diff --git a/package.json b/package.json index 39d2097..b84cbd6 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "scripts": { - "predev": "bun i && bunx nuxi cleanup", + "predev": "bun i", "dev": "bunx --bun nuxi dev" }, "dependencies": { diff --git a/pages/admin/index.vue b/pages/admin/index.vue index fca8639..49729e3 100644 --- a/pages/admin/index.vue +++ b/pages/admin/index.vue @@ -263,7 +263,7 @@ async function logout(user: User) {{ textualFileSize(page.size) }} {{ page.visit }} -
+
diff --git a/pages/editor.vue b/pages/editor.vue deleted file mode 100644 index 78a64ed..0000000 --- a/pages/editor.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - \ No newline at end of file diff --git a/schemas/project.ts b/schemas/project.ts index 7e7416f..c02a7fd 100644 --- a/schemas/project.ts +++ b/schemas/project.ts @@ -10,6 +10,7 @@ const baseItem = z.object({ navigable: z.boolean(), private: z.boolean(), order: z.number().finite(), + content: z.string().optional(), }); export const item: z.ZodType = baseItem.extend({ children: z.lazy(() => item.array().optional()), diff --git a/server/api/__sitemap__/urls.ts b/server/api/__sitemap__/urls.ts index 6f21900..549b952 100644 --- a/server/api/__sitemap__/urls.ts +++ b/server/api/__sitemap__/urls.ts @@ -1,13 +1,12 @@ import type { SitemapUrlInput } from '#sitemap/types' -import { and, eq } from 'drizzle-orm'; import { explorerContentTable } from '~/db/schema'; import useDatabase from '~/composables/useDatabase'; export default defineSitemapEventHandler(() => { const db = useDatabase(); - const pages = db.select({ path: explorerContentTable.path, lastMod: explorerContentTable.timestamp }).from(explorerContentTable).where(and(eq(explorerContentTable.private, false), eq(explorerContentTable.navigable, true))).all(); + const pages = db.select({ path: explorerContentTable.path, lastMod: explorerContentTable.timestamp, navigable: explorerContentTable.navigable, private: explorerContentTable.private }).from(explorerContentTable).all(); - return pages.map(e => ({ + return pages.filter(e => e.navigable && !e.private && e.path.split('/').map((_, i, a) => a.slice(0, i).join('/')).every(p => !pages.find(_p => _p.path === p)?.private)).map(e => ({ loc: `/explore/${e.path}`, lastmod: e.lastMod, })) satisfies SitemapUrlInput[]; diff --git a/server/api/project.post.ts b/server/api/project.post.ts index 3f9ef73..4490cfb 100644 --- a/server/api/project.post.ts +++ b/server/api/project.post.ts @@ -20,7 +20,7 @@ export default defineEventHandler(async (e) => { throw body.error; } - const items = buildOrder(body.data.items) as Array; + const items = buildOrder(body.data.items) as Array; const db = useDatabase(); const { ...cols } = getTableColumns(explorerContentTable);