Description

기본적으둜 .md λ˜λŠ” html νŒŒμΌμ„ μ›ν•˜λŠ” ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ” μž‘μ—…μ„ 함.

  • quartz.config.tsνŒŒμΌμ— Listν˜•νƒœλ‘œ 등둝할 수 있으며, λ“€μ–΄κ°„ μˆœμ„œμ— 따라 λ™μž‘.
  • .md νŒŒμΌμ„ html둜 λ³€ν™˜.
  • .md νŒŒμΌμ— λŒ€ν•œ 해석은 기본적으둜 remark 라이브러리λ₯Ό μ‚¬μš©.
    • 좔가적인 Transformersλ₯Ό μΆ”κ°€ν•˜μ—¬ customκ°€λŠ₯

Types

AST : 좔상 ꡬ문 트리(Abstract Syntax Tree)의 μ•½μžλ‘œ μ†ŒμŠ€μ½”λ“œμ˜ ꡬ쑰λ₯Ό 트리 ν˜•νƒœλ‘œ ν‘œν˜„ν•œ 것.

typedescription
MdProcessorλ§ˆν¬λ‹€μš΄ νŒŒμΌμ„ νŒŒμ‹±ν•˜μ—¬ λ§ˆν¬λ‹€μš΄ AST둜 λ³€ν™˜
.md β†’ MD AST
HtmlProcessorλ§ˆν¬λ‹€μš΄ ASTλ₯Ό HTML AST둜 λ³€ν™˜
MD AST β†’ HTML AST

Example

cardLink.ts
import { QuartzTransformerPlugin } from "../../types"  
import { visit } from "unist-util-visit"  
  
type CardData = {  
  url: string,  
  title: string,  
  description: string,  
  image: string  
}  
  
export const CardLink: QuartzTransformerPlugin = () => {  
  return {  
    name: "CardLink",  
    markdownPlugins() {  
      return [  
        () => {  
          return (tree) => {  
            visit(tree, "code", (node) => {  
              if (node.lang === "cardlink") {  
                const cardData = parseCardData(node.value)  
                if (cardData) {  
                  node.type = "html"  
                  node.value = `  
                    <div class="card-link">  
                      <a href="${cardData.url}" target="_blank" rel="noopener noreferrer">  
                      ${createContent(cardData)}  
                      </a>  
                    </div>  
                  `  
                }  
              }  
            })  
          }  
        },  
      ]  
    },  
  }  
}  
  
function createContent(cardData:CardData) {  
  if (cardData.image)  
    return `  
    <div class="card-link-content">  
          <div class="card-image-container">  
            <img src="${cardData.image}" alt="${cardData.title}" class="card-image" />  
          </div>  
          <div class="card-text">  
            <h3 class="card-title">${cardData.title}</h3>  
            <p class="card-description">${cardData.description}</p>  
          </div>  
        </div>  
    `  
  return `  
  <div class="card-link-content-no-img">  
          <div class="card-text">  
            <h3 class="card-title">${cardData.title}</h3>  
            <p class="card-description">${cardData.description}</p>  
          </div>  
        </div>  
  `  
}  
  
function parseCardData(cardlink: string): CardData {  
  const cardData: { [key: string]: string } = {}  
  
  const lines = cardlink.split("\n")  
  for (const line of lines) {  
    const [key, ...valueParts] = line.split(":")  
    if (key && valueParts.length > 0) {  
      const value = valueParts.join(":").trim() // λ‚˜λ¨Έμ§€ 값은 λ‹€μ‹œ ν•©μ³μ„œ 처리  
      cardData[key.trim()] = value ? value.replaceAll("\"", "") : ""  
    }  
  }  
  
  return {  
    url: cardData.url || "",  
    title: cardData.title || "",  
    description: cardData.description || "",  
    image: cardData.image || "",  
  }  
}

Trees

1🌳

more