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