์ ํ์ค ํ์ด๋ผ์ดํธ์ 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>
๋ฅผ ์๋์ผ๋ก ๊ฒ์ํด์ ์ฝ๋๋ฏธ๋ฌ๋ก ๋ ๋๋ง ํ๊ฒ ๋ ๊ฒ๋๋ค.