Skip to content

Commit b19d453

Browse files
committed
feat: enhance markdown rendering with GFM plugins and image handling
1 parent 7741c94 commit b19d453

File tree

5 files changed

+40
-81
lines changed

5 files changed

+40
-81
lines changed

apps/website/app/[locale]/blog/[slug]/components/ZoomableImage.tsx

+2-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
"use client";
22

3-
import Image from "next/image";
3+
import { cn } from "@/lib/utils";
44
import { PhotoProvider, PhotoView } from "react-photo-view";
55
import "react-photo-view/dist/react-photo-view.css";
6-
76
interface ZoomableImageProps {
87
src: string;
98
alt: string;
@@ -14,12 +13,7 @@ export function ZoomableImage({ src, alt, className }: ZoomableImageProps) {
1413
return (
1514
<PhotoProvider>
1615
<PhotoView src={src}>
17-
<Image
18-
src={src}
19-
alt={alt}
20-
fill
21-
className={`object-cover cursor-zoom-in ${className || ""}`}
22-
/>
16+
<img src={src} alt={alt} className={cn("object-cover", className)} />
2317
</PhotoView>
2418
</PhotoProvider>
2519
);

apps/website/app/[locale]/blog/[slug]/page.tsx

+14-35
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import remarkGfm from "remark-gfm";
1414
import { codeToHtml } from "shiki";
1515
import type { BundledLanguage } from "shiki/bundle/web";
1616
import TurndownService from "turndown";
17+
// @ts-ignore
18+
import * as turndownPluginGfm from "turndown-plugin-gfm";
1719
import { ZoomableImage } from "./components/ZoomableImage";
20+
1821
type Props = {
1922
params: { locale: string; slug: string };
2023
};
@@ -128,39 +131,13 @@ export default async function BlogPostPage({ params }: Props) {
128131
headingStyle: "atx",
129132
codeBlockStyle: "fenced",
130133
});
131-
132-
// Configurar el manejo de tablas
133-
turndownService.addRule("table", {
134-
filter: ["table"],
135-
replacement: (content, node) => {
136-
const rows = node.rows;
137-
let markdown = "\n";
138-
139-
// Headers
140-
if (rows.length > 0) {
141-
const headers = Array.from(rows[0].cells).map((cell) =>
142-
cell.textContent.trim(),
143-
);
144-
markdown += `| ${headers.join(" | ")} |\n`;
145-
markdown += `| ${headers.map(() => "---").join(" | ")} |\n`;
146-
}
147-
148-
// Body
149-
for (let i = 1; i < rows.length; i++) {
150-
const cells = Array.from(rows[i].cells).map((cell) =>
151-
cell.textContent.trim(),
152-
);
153-
markdown += `| ${cells.join(" | ")} |\n`;
154-
}
155-
156-
return `${markdown}\n`;
157-
},
158-
});
134+
const gfm = turndownPluginGfm.gfm;
135+
const tables = turndownPluginGfm.tables;
136+
const strikethrough = turndownPluginGfm.strikethrough;
137+
turndownService.use([tables, strikethrough, gfm]);
159138

160139
const markdown = turndownService.turndown(post.html);
161140

162-
console.log(markdown);
163-
164141
const formattedDate = new Date(post.published_at).toLocaleDateString(locale, {
165142
year: "numeric",
166143
month: "long",
@@ -232,9 +209,11 @@ export default async function BlogPostPage({ params }: Props) {
232209
<td className="p-4 text-muted-foreground" {...props} />
233210
),
234211
img: ({ node, src, alt }) => (
235-
<span className="relative w-64 h-64 my-6 rounded-lg ">
236-
{src && <ZoomableImage src={src} alt={alt || ""} />}
237-
</span>
212+
<ZoomableImage
213+
src={src || ""}
214+
alt={alt || ""}
215+
className="object-cover max-w-lg mx-auto rounded-lg border border-border"
216+
/>
238217
),
239218
code: ({ inline, className, children, ...props }: CodeProps) => {
240219
const match = /language-(\w+)/.exec(className || "");
@@ -319,11 +298,11 @@ export default async function BlogPostPage({ params }: Props) {
319298
</div>
320299
</div>
321300
{post.feature_image && (
322-
<div className="relative w-full h-[400px] mb-8">
301+
<div className="relative w-full h-[400px] mb-8">
323302
<ZoomableImage
324303
src={post.feature_image}
325304
alt={post.title}
326-
className="rounded-lg"
305+
className="rounded-lg h-full w-full object-cover"
327306
/>
328307
</div>
329308
)}

apps/website/package.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@
4343
"tailwindcss": "^3.4.1",
4444
"tailwindcss-animate": "^1.0.7",
4545
"turndown": "^7.2.0",
46-
"typescript": "5.1.6"
46+
"turndown-plugin-gfm": "^1.0.2",
47+
"typescript": "5.1.6",
48+
"react-markdown": "^10.0.0",
49+
"rehype-raw": "^7.0.0",
50+
"remark-gfm": "^4.0.1"
4751
},
4852
"devDependencies": {
4953
"@babel/core": "^7.26.9",

package.json

-6
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,5 @@
4141
"resolutions": {
4242
"@types/react": "18.3.5",
4343
"@types/react-dom": "18.3.0"
44-
},
45-
"dependencies": {
46-
"prism-react-renderer": "^2.4.1",
47-
"react-markdown": "^10.0.0",
48-
"rehype-raw": "^7.0.0",
49-
"remark-gfm": "^4.0.1"
5044
}
5145
}

pnpm-lock.yaml

+19-31
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)