tl;dr: See http://pygments.org/docs/lexers/

블로그에 글을 쓰다가 문득 의문이 들었습니다.

"과연 내 블로그는 어떤 언어들의 문법 강조가 가능할까?"

Jekyll 공식 홈페이지엔 이렇다할 해답이 없었는데, 의외로 GitHub Pages에 그 답이 있었습니다. GitHub Pages는 기본 Jekyll highlighter로 pygments를 사용한다고 적혀있습니다. 그럼 Pygments는 무엇일까요? Pygments는 Python으로 개발된 문법 강조기입니다. 현재 최신 버전은 _2.0.2_입니다. 근데 Jekyll은 Ruby인데 Python 라이브러리인 Pygments를 어떻게 사용할까요? Jekyll 설치시 pygments.rb라는 것이 같이 설치가 됩니다. 이것을 통해 문법 강조를 하는 것으로 보입니다. (좀 더 자세한 설명은 아래에)

지원하는 문법의 종류도 상당히 많습니다. Python에 관련한것만 찾아보면 다음과 같습니다.

  • Cython(cython, pyx, pyrex)
  • Dg(dg)
  • NumPy(numpy)
  • Python 3(python3, py3)
  • Python 3 Traceback(py3tb)
  • Python Console(pycon)
  • Python(python, py, sage)
  • Python Traceback(pytb)

이 외에 프레임워크에서 지원하는 문법도 지원합니다.1

  • CSS Django(css+django, css+jinja)
  • Django(django, jinja)
  • HTML Django(html+django, html+jinja, djangohtml)
  • JavaScript Django(js+django, javascript+django, js+jinja, javascript+jinja)
  • XML Django(xml+django, xml+jinja)
  • YAML Jinja(yaml+jinja, salt, sls)
  • Mako CSS(css+mako)
  • Mako HTML(html+mako)
  • Mako JavaScript(js+mako, javascript+mako)
  • Mako (mako)
  • Mako XML (xml+mako)

자, 이렇게 여러가지 기능을 지원하는 pygments는 만능일까요? 제 생각엔 아닙니다. pygments.rb는 내부적으로 Python을 popen해서(그러니까 subprocess를 만들어서 실행해서) 사용하는 구조입니다. Pygments를 별도로 설치하지 않아도 되도록 아예 배포본 소스에 내장하고 있는데 그 버전은 _2.0pre_입니다. 그리고 이 내장 Pygments의 버전은 1년째 갱신되지 않고 있습니다.

이것은 무엇을 의미할까요? 일단 당장 개발했을때는 Pygments가 업데이트가 크지 않았으므로 별 상관 없다고 생각했을 수도 있습니다. 하지만 당장에 올해 안에 문법이 바뀔 메이저 언어가 내가 아는 것만 해도 2개나 있습니다.2 그 외에도 아직 Pygments 본진조차 지원하지 못하고 있는 언어가 많습니다.3 만약 이런 언어들의 지원이 Pygments 본진에 추가되도 pygments.rb가 갱신이 되지 않으면 사용할 수 없습니다. 물론 pygments.rb가 업데이트 되어도 GitHub쪽에서 반영을 안하면 역시 말짱 도루묵이지만 말이죠.

그리고 이 사실은 저에게 이것을 시사합니다.

Python 3.5, GraphQL 관련 코드를 올릴때 매우 곤란하게 생겼다.

이 문제를 해결하려면 일단 Pygments 본진부터가 Python 3.5를 지원하게 만드는게 순서겠지만, GitHub Pages의 pygments.rb의 버전이 그렇게 호락호락하게 올라가줄까 싶습니다. 왠지 먹구름이 낀 느낌입니다.


  1. Django와 Jinja가 뒤섞여있는게 매우 신경쓰입니다.

  2. PHP 7과 Python 3.5

  3. JSX, GraphQL, Less 등등