์ ํ์ค ํ์ด๋ผ์ดํธ์ JSX๊ฐ ์ ๋๋ก ์๋ํ์ง ์๋ ๋ฏํด์ jneen/rouge์ ์ด์ํธ๋์ปค๋ฅผ ๋ณด๋ ์ด๋ฐ ์ฝ๋ฉํธ๊ฐ ์์ด์ ๋๋ฌ์ต๋๋ค.
zackify: Any status update on this?
jneen: No
๋ฌผ๋ก ์ง๊ธ์ ๋์ํ๋ ๊ฒ ๊ฐ์๋ฐ ์งํฌ์์ ์ด๋ป๊ฒ ์ฐ๋์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค์. ํฌ๋จ๋ค์ด๋ ๋ํ๋ฉํธ๊ฐ ์ค๋๋์ด๋ณด์ด๊ณ ... ์ญ์ ๊ทธ๋ฅ ์ต์ํ ๋ฐฉ์๋๋ก ํ๋๊ฒ ๋ง๋ ๊ฒ ๊ฐ์์ ์ต์ํ CodeMirror๋ก Rogue๋์ ์ ํ๋ก ํธ์๋์์ ์ ํ์ค ํ์ด๋ผ์ดํธ๋ฅผ ์ฒ๋ฆฌํด ๋ณด์์ต๋๋ค.
๋จผ์  ๋ก๊ทธ๋ฅผ ๊บผ์ผ๊ฒ ์ฃ ...
_config.yml์์ ํฌ๋จ๋ค์ด์ ํ์ด๋ผ์ดํธ ์ต์
์ ์์ ํฉ๋๋ค.
markdown: kramdown
kramdown:
  syntax_highlighter_opts:
    disable: true
์ข ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
forEach์ unescape๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์๋๋ค.<script>์ ์ฐ์ด๋ Javascript๋ Markdown์ Code Fence์ ์ฐ์ด๋ ๊ฐ์ข
 ์ฝ๋๋ฅผ ์ํด ๋ณต์์ ์ ํ์ค๋ชจ๋๋ฅผ ๊ฒน์ณ์ฐ๊ฒ ํด์ค๋๋ค.<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.22.2/codemirror.min.css">
<!-- ์ ๋ Dracula ํ
๋ง๋ฅผ ์ธ ๊ฒ๋๋ค -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.22.2/theme/dracula.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.22.2/codemirror.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.22.2/addon/runmode/runmode.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.22.2/mode/meta.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.22.2/addon/mode/loadmode.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.22.2/addon/mode/overlay.min.js"></script>
<script>
// ์ด๋์ ๋ชจ๋๋ฅผ ๋ถ๋ฌ์ฌ์ง๋ฅผ ์ ์ด์ค๋๋ค.
CodeMirror.modeURL = 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.22.2/mode/%N/%N.js'
var codeBlocks = document.querySelectorAll('pre code')
// ์ ๋ JSX๋ฅผ ์ฃผ๋ก ์ฐ๋ฏ๋ก js๋ javascript ๋ชจ๋ JSX๋ก ์ฒ๋ฆฌํ๊ฒ ํ์ต๋๋ค.
function parseMode (mode) {
  switch (mode) {
    case 'js':
    case 'javascript':
      mode = 'jsx'
  }
  let syntax = CodeMirror.findModeByName(mode)
  if (syntax == null) syntax = CodeMirror.findModeByName('Plain Text')
  return syntax
}
_.forEach(codeBlocks, block => {
  // ํด๋์ค์ ํ๋ฆฌํฝ์ค `language-`๋ฅผ ์ง์ฐ๊ณ  ๋ชจ๋๋ฅผ ํ์คํฉ๋๋ค.
  var syntax = parseMode(block.className.substring(9))
  CodeMirror.requireMode(syntax.mode, () => {
    // ์ด๋ฏธ ์ด์ค์ผ์ดํ๋ `>`๋ฑ ์ํฐํฐ๋ฅผ `>`๋ก ๋๋ ค์ค๋๋ค
    var value = _.unescape(block.innerHTML)
    // ๋ฐ๋ชจ๋ ์ ์ ๋ด์ฉ์ ๋ค ์ ๋ฆฌํด๋ก๋๋ค.
    block.innerHTML = ''
    // ํ
๋ง๋ฅผ ์ ์ฉํฉ๋๋ค
    block.parentNode.className = `cm-s-dracula CodeMirror`
    // ๋ ๋๋ฅผ ์์ํฉ๋๋ค
    CodeMirror.runMode(value, syntax.mime, block, {
      tabSize: 2
    })
  })
})
</script>
์ด์์
๋๋ค. ์ด์  ํ์ด์ง๊ฐ ์ด๋ฆฌ๋ฉด <pre><code>๋ฅผ ์๋์ผ๋ก ๊ฒ์ํด์ ์ฝ๋๋ฏธ๋ฌ๋ก ๋ ๋๋ง ํ๊ฒ ๋ ๊ฒ๋๋ค.