읽기 λͺ¨λ“œμ—μ„œ λ§ˆν¬λ‹€μš΄ λ¬Έμ„œκ°€ λ Œλ”λ§λ˜λŠ” 방식을 λ³€κ²½ν•˜λ €λ©΄ μžμ‹ λ§Œμ˜ _λ§ˆν¬λ‹€μš΄ ν›„μ²˜λ¦¬κΈ°(Markdown post processor)_λ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄, ν›„μ²˜λ¦¬κΈ°λŠ” λ§ˆν¬λ‹€μš΄μ΄ HTML둜 처리된 후에 μ‹€ν–‰λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ Œλ”λ§λœ λ¬Έμ„œμ— HTML μš”μ†Œλ₯Ό μΆ”κ°€, 제거 λ˜λŠ” ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ˜ˆμ œλŠ” 두 개의 콜둠 : 사이에 ν…μŠ€νŠΈκ°€ μžˆλŠ” μ½”λ“œ 블둝을 μ°Ύμ•„ μ μ ˆν•œ 이λͺ¨μ§€λ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€:

import { Plugin } from 'obsidian';
 
const ALL_EMOJIS: Record<string, string> = {
  ':+1:': 'πŸ‘',
  ':sunglasses:': '😎',
  ':smile:': 'πŸ˜„',
};
 
export default class ExamplePlugin extends Plugin {
  async onload() {
    this.registerMarkdownPostProcessor((element, context) => {
      const codeblocks = element.findAll('code');
 
      for (let codeblock of codeblocks) {
        const text = codeblock.innerText.trim();
        if (text[0] === ':' && text[text.length - 1] === ':') {
          const emojiEl = codeblock.createSpan({
            text: ALL_EMOJIS[text] ?? text,
          });
          codeblock.replaceWith(emojiEl);
        }
      }
    });
  }
}

λ§ˆν¬λ‹€μš΄ μ½”λ“œ 블둝 ν›„μ²˜λ¦¬

Mermaid λ‹€μ΄μ–΄κ·Έλž¨μ„ λ‹€μŒκ³Ό 같은 ν…μŠ€νŠΈ μ •μ˜κ°€ μžˆλŠ” mermaid μ½”λ“œ λΈ”λ‘μœΌλ‘œ 생성할 수 μžˆλ‹€λŠ” 것을 μ•Œκ³  κ³„μ…¨λ‚˜μš”?:

```mermaid
flowchart LR
    Start --> Stop
```

미리보기 λͺ¨λ“œλ‘œ μ „ν™˜ν•˜λ©΄ μ½”λ“œ λΈ”λ‘μ˜ ν…μŠ€νŠΈκ°€ λ‹€μŒκ³Ό 같은 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€:

flowchart LR
    Start --> Stop

Mermaid와 같은 μ‚¬μš©μž μ •μ˜ μ½”λ“œ 블둝을 μΆ”κ°€ν•˜λ €λ©΄ registerMarkdownCodeBlockProcessor()λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ μ˜ˆμ œλŠ” CSV 데이터가 ν¬ν•¨λœ μ½”λ“œ 블둝을 ν…Œμ΄λΈ”λ‘œ λ Œλ”λ§ν•©λ‹ˆλ‹€:

import { Plugin } from 'obsidian';
 
export default class ExamplePlugin extends Plugin {
  async onload() {
    this.registerMarkdownCodeBlockProcessor('csv', (source, el, ctx) => {
      const rows = source.split('\n').filter((row) => row.length > 0);
 
      const table = el.createEl('table');
      const body = table.createEl('tbody');
 
      for (let i = 0; i < rows.length; i++) {
        const cols = rows[i].split(',');
 
        const row = body.createEl('tr');
 
        for (let j = 0; j < cols.length; j++) {
          row.createEl('td', { text: cols[j] });
        }
      }
    });
  }
}