diff --git a/src/app/(public)/p/[slug]/page.tsx b/src/app/(public)/p/[slug]/page.tsx index 2591262..10121d7 100644 --- a/src/app/(public)/p/[slug]/page.tsx +++ b/src/app/(public)/p/[slug]/page.tsx @@ -1,7 +1,7 @@ import { notFound } from "next/navigation" import Link from "next/link" import type { Metadata } from "next" -import { getPostBySlug, getAllPosts } from "@/lib/db" +import { getPostBySlug, getAllPosts, getAuthorSlugByName } from "@/lib/db" import { PostCard } from "@/components/post-card" import { TagBadge } from "@/components/tag-badge" import { ArrowLeft, BookOpen, ExternalLink } from "lucide-react" @@ -78,6 +78,9 @@ export default async function PostDetailPage({ post.summary.length > 50 ) + // Enlaces cruzados: autor -> página de autor, parodia -> franquicia. + const authorSlug = post.artist ? getAuthorSlugByName(post.artist) : null + return (
- {post.artist && ( - + {post.artist && authorSlug && ( + + artista: + {post.artist} + )} - {post.parody && ( - + {post.parody && !["original", "sin parodia"].includes(post.parody) && ( + + franquicia: + {post.parody} + )} {post.source && ( diff --git a/src/lib/db.ts b/src/lib/db.ts index 7e01178..d3498c4 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -420,6 +420,23 @@ export function getAuthorBySlug(slug: string): Author | null { return row ? rowToAuthor(row) : null } +// Devuelve el slug de un autor por su nombre (para enlazar desde los posts). +// Si el autor no está registrado, lo registra sobre la marcha. +export function getAuthorSlugByName(name: string): string | null { + const d = getDb() + const clean = (name || "").trim() + if (!clean || clean === "sin artista" || clean === "dummy") return null + + d.prepare("INSERT OR IGNORE INTO authors(name, slug) VALUES (?, ?)").run( + clean, + slugify(clean), + ) + const row = d.prepare("SELECT slug FROM authors WHERE name = ?").get(clean) as + | { slug: string } + | undefined + return row ? row.slug : null +} + export function getSeriesBySlug(slug: string): Series | null { const d = getDb() const row = d