๐Ÿšจ ReactMarkdown + <img /> ๊ฒฝ๊ณ  ์›์ธ๊ณผ ํ•ด๊ฒฐ

๋ฐ•์ƒ์€ยท2022๋…„ 5์›” 11์ผ
0

โœ๏ธ blelog โœ๏ธ

๋ชฉ๋ก ๋ณด๊ธฐ
13/13

๐Ÿค” ์›์ธ

react-markdown์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ด๋ฏธ์ง€๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒฝ์šฐ์— ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด <p> ๋‚ด๋ถ€์— <img />๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ง์ ‘ ์‹คํ—˜ํ•ด ๋ณธ ๊ฒฐ๊ณผ๋กœ๋Š” <p>ํƒœ๊ทธ ๋‚ด๋ถ€์—๋Š” <a>์™€ <span>๊ฐ™์€ ํƒœ๊ทธ ์™ธ์— ๋‹ค๋ฅธ ํƒœ๊ทธ๋“ค์ด ๋“ค์–ด๊ฐ€๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋„์›Œ์ค๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ <img> react markdown cannot appear as a descendant of <p>. ๊ฐ™์€ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์œ„์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์ง€๋งŒ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์€ ์ •๋ณด๋ผ์„œ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ( ์ฐธ๊ณ  )
    ๊ธฐ๋ณธ display๊ฐ€ inline์ธ ๊ฒฝ์šฐ์—๋Š” ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    ๊ธฐ๋ณธ display๊ฐ€ block์ธ ์š”์†Œ๋งŒ ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ฎ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ฐธ๊ณ  ๋งํฌ

import ReactMarkdown from "react-markdown";
import remarkGfm from "remark-gfm";

// jsx
<ReactMarkdown
  className="py-4 px-8 prose dark:prose-invert whitespace-normal max-w-full"
  remarkPlugins={[remarkGfm]}
  components={{
    p: ({ node, ...props }) => {
      // <img />๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒฝ์šฐ์— <p>๋‚ด๋ถ€์—์„œ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ
      if (typeof props.children[0] === "object") {
        const element: any = props.children[0];
        return element.type.name === "img" ? (
          { ...element }
        ) : (
          <p {...props} />
        );
      }
      return <p {...props} className="whitespace-pre-line" />;
    },
	// ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„ ์ƒ๋žต...
  }}
>
  {markdown}
</ReactMarkdown>

0๊ฐœ์˜ ๋Œ“๊ธ€