Gitlab Markdown Parser 바꾸기

Git 기반 프로세스 도구인 Gitlab 은 오픈소스이기 때문에 Community Edition 을 쓰건, Enterprise Edition 을 쓰건 상관없이 맘대로 수정해서 사용이 가능하다. 물론 적절한 감(?)으로 수정할 곳을 찾아야 하는 번거로움은 있다. 여기서는 Gitlab에서 문서 작성에 필요한 Markdown 의 Parser 부분을 수정하기 위한 방법을 정리해 둔다. Ruby 개발자가 아니라서 전체 빌드 순서가 정공법처럼 보이진 않겠지만.

Gitlab의 Markdown Parser는 Redcarpet 을 사용한다. 아마 Jekyll 도 기본적으로 Redcarpet 을 사용하는 것으로 알고 있다. 만약 Ruby의 Redcarpet 을 Markdown Parser 로 쓰는 경우라면 똑같이 적용이 가능하다.

디렉토리 경로는 Gitlab 10.x 기준으로 설명한다.

Parser C 파일 수정하기

/opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/redcarpet-3.4.0/ 으로 들어가면 Redcarpet의 소스코드가 존재한다. 여기서 ext/redcarpet 디렉토리가 Parser C 파일들이 위치한 곳이다.

내가 수정하고 싶은 것은 ‘엔터 키를 두번 쳐야 (혹은 줄 끝에 스페이스를 2개 이상 줘야) 줄바꿈이 되는 불편함‘ 을 해소하고 싶었다. markdown.c 파일을 보니 char_linebreak()  라는 함수가 존재한다. 여기서 해당 부분을 주석처리했다.

/* char_linebreak • '\n' preceded by two spaces (assuming linebreak != 0) */
static size_t
char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)
{
        //if (offset < 2 || data[-1] != ' ' || data[-2] != ' ')
        //      return 0;

        /* removing the last space from ob and rendering */
        while (ob->size && ob->data[ob->size - 1] == ' ')
                ob->size--;

        return rndr->cb.linebreak(ob, rndr->opaque) ? 1 : 0;
}

라이브러리 생성/복사

수정이 끝나면 반드시 ext/redcarpet 디렉토리에서 make 를 수행해 주도록 하자. 그러면 Shared Library 파일인 redcarpet.so 이 생성된다.

이 파일을, 다음 경로에 모두 복사해주도록 하자.

  • /opt/gitlab/embedded/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0/redcarpet-3.4.0/
  • /opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/redcarpet-3.4.0/lib/

Gitlab 재부팅

대망의 재부팅이 남았다.
gitlab-ctl reconfigure && gitlab-ctl restart 를 실행시키면 반영이 된다!