Kkmarkdown

결국 오래 갈망하던 나만의 마크다운 엔진이 완성되었다.
github.com/kkeundotnet/kkmarkdown

이름은 Kkmarkdown. "끄마크다운"이라 부르면 될까? "markkdown", "sdown" 등등의 후보가 있었지만 왠지 모두 오타 같아 보여서 kk시리즈(Kkblog, Kkoment, etc.)의 이름을 그대로 쓰기로 했다. 이름 짓기 참 편하다.

특징

서버와 클라이언트에서 모두 동작

예전 블로그*에서 이야기 한 것처럼 끈닷넷은 서버의 마크다운 엔진과 클라이언트의 마크다운 엔진을 각각 다른 것을 쓰고 있었다. 이로 인해 생기는 문제는 "미리보기한 결과"와 실제 서버에 저장된 후 "나중에 보여지는 결과"가 다르다는 것에 있다.
* blog.kkeun.net/computer/2019-08-26-markdown-engine

Q: 클라이언트가 변환된 html을 서버로 보내면 되지 않나요?
A: Kkoment의 경우 사용자가 악성 html을 서버로 보냈을 때 따로 검사하는 게 만만치 않습니다.

Q: 클라이언트(자바스크립트 코드)를 서버에서 노드로 돌리면 되지 않나요?
A: 그건 그렇습니다. 😓

구현은 OCaml로 했고 얘는 원래 리눅스 서버에선 잘 돈다. 자바스크립트로 변환은 jsofocaml*을 사용했다. 어떻게 쓰는 건지 몰라 약간 애를 먹기는 했는데 한 번 돌고 나니 잘 된다.
* ocsigen.org/js_of_ocaml

안전한 변환 결과

마크다운 문법의 글을 입력으로 받는 Kkoment는 XSS에 노출되어 있었다. 왜 위험한지는 Michel Fortin (PHPMarkdownExtra 만든 이)의 글을 참고하자.
michelf.ca/blog/2010/markdown-and-xss/

문제는 마크다운 문법이 애초에 inline html 문법이라던지, image, link 등등 공격받을 수 있는 문법들을 지원하고 있었다는 점이다. Kkmarkdown은 그런 위험을 피하고자 아주 대단한 기술을 쓴다. "위험하거나 애매하면 지원하지 않는다."

작은 문법 지원

앞서 말한 대로 Kkmarkdown은 마크다운의 일부 위험한 기능을 제공하지 않는다.

지원되는 전체 문법은 아래에서 볼 수 있다.
github.com/kkeundotnet/kkmarkdown/blob/master/syntax.md

적용

이미 Kkoment를 비롯하여 많은 곳에 적용했다. 사실 현재 보고 있는 이 포스트도 Kkmarkdown으로 변환된 것이다.


자, 물건 소개는 끝이 났으니 이제 종교 이야기를 해 보자. 아니 너무 길어지면 곤란하니까 짧게 하겠다.

TypeScript vs OCaml: 거의 동일한 구현을 두 언어에서 했다. 하나는 너무 더러워서 공개는 커녕 나조차도 쓰기 싫은 물건이 나왔고, 다른 하나는 아직 완성도 안 됐는데 공개부터 하고 싶은 물건이 나왔다.

Unison 만세!
www.cis.upenn.edu/~bcpierce/unison/

2020-03-15 씀.