๐Ÿงญ ์ œ๋ชฉ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ œ์ž‘ ( feat. ์ •๊ทœํ‘œํ˜„์‹ )

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

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

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

๊ณต์‹ ๋ฌธ์„œ๋“ค์ด๋‚˜ velog ๊ฐ™์€ ๊ฒฝ์šฐ์— ์šฐ์ธก ์ƒ๋‹จ์— ์ œ๋ชฉ์„ ๊ธฐ์ค€์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค.
ํ•ด๋‹น ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ์ œ์ž‘ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‡ ๊ตฌํ˜„ ๋ฐฉ์‹

  1. <h1> ~ <h6>๋ฅผ ์ƒ์„ฑํ•  ๋•Œ id๋กœ ์ œ๋ชฉ์„ ๋„ฃ์–ด์ค€๋‹ค.
  2. ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ด์šฉํ•ด์„œ ๊ฒŒ์‹œ๊ธ€์˜ ๋‚ด์šฉ์— #, ##, ... ###### ์ดํ›„์— ๋‚˜์˜ค๋Š” ๋ฌธ์ž์—ด(์ œ๋ชฉ)์„ ์ฐพ์•„๋‚ธ๋‹ค.
  3. ์ œ๋ชฉ์˜ ํ…์ŠคํŠธ์™€ ํฌ๊ธฐ๋ฅผ ์ถ”์ถœํ•ด๋‚ธ๋‹ค.
  4. ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์šฐ์ธก ์ƒ๋‹จ์— ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

โœ๏ธ ๊ตฌํ˜„ ์ฝ”๋“œ

1. <h1> ~ <h6>์— id ๋„ฃ๋Š” ์ฝ”๋“œ

<ReactMarkdown
  className="py-4 px-8 prose dark:prose-invert whitespace-normal max-w-full"
  remarkPlugins={[remarkGfm]}
  components={{
    h1: ({ node, ...props }) => (
      <h1 id={props.children[0]?.toString()} {...props} />
    ),
    h2: ({ node, ...props }) => (
      <h2 id={props.children[0]?.toString()} {...props} />
    ),
    h3: ({ node, ...props }) => (
      <h3 id={props.children[0]?.toString()} {...props} />
    ),
    h4: ({ node, ...props }) => (
      <h4 id={props.children[0]?.toString()} {...props} />
    ),
    h5: ({ node, ...props }) => (
      <h5 id={props.children[0]?.toString()} {...props} />
    ),
    h6: ({ node, ...props }) => (
      <h6 id={props.children[0]?.toString()} {...props} />
    ),
    // ... ๋‚˜๋จธ์ง€ ์†์„ฑ๋“ค์€ ์ƒ๋žต
  }}
>
  {markdown}
</ReactMarkdown>

2. ์ ์šฉํ•œ ์ •๊ทœ ํ‘œํ˜„์‹

ํ›„๋ฐฉ ํƒ์ƒ‰์„ ์ด์šฉํ•ด์„œ #{1,6} ์ดํ›„์— ์˜ค๋Š” ํ…์ŠคํŠธ๋งŒ ์ถ”์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.
# ์ „๋ฐฉ์— ์˜ค๋Š” ํ™”์ดํŠธ ์ŠคํŽ˜์ด์Šค๋Š” ๋ฌด์‹œํ•˜๊ณ , ํ…์ŠคํŠธ๊ฐ€ ์˜ค๋Š” ๊ฒฝ์šฐ ์ œ๋ชฉ์œผ๋กœ ์ธ์‹ํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  # ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ๊ฐ์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ฃน ์—ฐ์‚ฐ์ž(())๋กœ 1 ~ 6๊นŒ์ง€ ๋ถ„๋ฆฌํ•ด์„œ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

// 2022/05/04 - ๋ฌธ์žฅ์—์„œ ์ œ๋ชฉ์ธ ๋‹จ์–ด๋งŒ ๊ณจ๋ผ์„œ ๋‹จ์–ด์™€ ํฌ๊ธฐ( h1 ~ h6 ) ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ - by 1-blue
export const getTitleList = (sentence: string) => {
  const titleListArray = [
    ...sentence.matchAll(
      /((?<=^[\s]*#{1}\s).+)|((?<=^[\s]*#{2}\s).+)|((?<=^[\s]*#{3}\s).+)|((?<=^[\s]*#{4}\s).+)|((?<=^[\s]*#{5}\s).+)|((?<=^[\s]*#{6}\s).+)/gm
    ),
  ];

  const titleList: { text: string; size: number }[] = [];

  titleListArray.map((title) => {
    // #, ##, ... ###### ์ค‘ ์–ด๋Š๊ฒƒ์ธ์ง€ ํŒ๋‹จํ•ด์„œ ๊ทธ ํฌ๊ธฐ๋ฅผ 0(h1) ~ 5(h6)๋กœ ๋ฐ˜ํ™˜ํ•จ
    const size = title.slice(1).findIndex((v) => v?.length > 0);

    titleList.push({ text: title[0], size });
  });

  return titleList;
};

// ๋ฐ˜ํ™˜ ํ˜•ํƒœ
[
  {
    title: "์ฒซ ๋ฒˆ์งธ ์ œ๋ชฉ",
    size: 0
  },
  {
    title: "๋‘ ๋ฒˆ์งธ ์ œ๋ชฉ",
    size: 1
  },
  // ...
]

๋™์ž‘ ์˜์ƒ

๐Ÿ‘ ์ฐธ๊ณ  ๋งํฌ

๐Ÿ™ƒ ๋งˆ๋ฌด๋ฆฌ

์›๋ž˜ ์ •๊ทœ ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๊ฐ„๋‹จํ•œ ๊ฒƒ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๊ณ , ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ตฌ๊ธ€์— ๊ฒ€์ƒ‰ํ•ด์„œ ์™„์„ฑ๋œ ์ •๊ทœ ํ‘œํ˜„์‹์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ( email, password ๋“ฑ )

์ด๋ฒˆ์— ์‚ฌ์šฉํ•˜๋ฉด์„œ ์–ด๋–ค ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ด์„œ ์ฐพ์•„์•ผ ํ• ์ง€๋ถ€ํ„ฐ ํž˜๋“ค์—ˆ๊ณ , ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ…Œ์ŠคํŠธํ•ด ๋ณด๋ฉด์„œ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๋งŽ์ด ๊ฒช์—ˆ๋Š”๋ฐ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ œ๋Œ€๋กœ ๋ชจ๋ฅด๋ฉด์„œ ๊ตฌํ˜„๋ถ€ํ„ฐ ํ•˜๋ ค๋‹ค ๋ณด๋‹ˆ ์–ด๋ ค์› ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ฐธ์— ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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