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 등등