GitHub Flavored Markdown Commonmarker를 활용한 Ruby/Rails 애플리케이션 마크다운 렌더링

GitHub Flavored Markdown in Rails with Commonmarker - Avo

작성자
Short Ruby
발행일
2025년 06월 11일

핵심 요약

  • 1 Commonmarker는 Ruby/Rails 애플리케이션에서 GitHub Flavored Markdown을 구현하는 데 적합한 Gem입니다.
  • 2 이 Gem은 CommonMark 사양을 준수하며, 구문 강조, 알림, 사용자 정의 임베드 등 다양한 확장 기능을 제공합니다.
  • 3 Commonmarker는 AST 및 Nokogiri를 활용한 고급 사용자 정의 기능을 통해 유연하고 강력한 마크다운 렌더링 경험을 제공합니다.

도입

사용자에게 WYSIWYG 편집기 대신 마크다운 작성을 허용하는 것은 기술적 숙련도를 가진 사용자들에게 더 높은 만족도와 효율성을 제공할 수 있습니다. 루비에는 마크다운 파싱을 위한 여러 Gem이 존재하며, 각기 다른 접근 방식과 마크다운 사양을 구현합니다. 본 문서에서는 CommonMark 사양을 구현하고 GitHub Flavored Markdown(GFM)을 지원하는 Commonmarker Gem에 대해 심층적으로 다룹니다. 이 글에서는 Commonmarker를 활용하여 간단한 블로그 애플리케이션을 구축하고, Marksmith Markdown Editor를 사용하여 편집 경험을 개선하며, 구문 강조 및 사용자 정의 임베드(숏코드)와 같은 일반적인 기능을 추가하는 방법을 시연합니다.

애플리케이션 구축은 Tailwind CSS와 ESBuild를 사용하는 Rails 애플리케이션 생성부터 시작하며, Post 모델을 스캐폴딩하고 Commonmarker Gem을 설치합니다. Marksmith Markdown Editor를 통합하기 위해 Gem 및 JavaScript 패키지를 설치하고, Stimulus 컨트롤러에 등록하여 실시간 미리보기 기능을 활성화합니다. Commonmarker는 기본적으로 Marksmith의 렌더러로 사용될 수 있지만, 본 문서에서는 Marksmith::Renderer 클래스를 오버라이딩하여 Commonmarker의 강력한 기능을 직접적으로 시연합니다. 여기에는 GitHub Flavored Markdown의 다양한 기능(예: 취소선, 자동 링크, 이모지, 구문 강조, 테이블, 작업 목록, HTML 태그 필터링)이 포함됩니다.

Commonmarker의 구성은 to_html 또는 parse 메서드를 통해 이루어지며, 파싱, 렌더링, 확장 옵션 및 플러그인을 세밀하게 제어할 수 있습니다. parse 옵션은 스마트 구두점 변환, 태스크리스트 매칭 완화 등을 포함하며, render 옵션은 소프트 브레이크를 하드 브레이크로 변환하거나 안전하지 않은 HTML 렌더링 허용 여부 등을 설정합니다. Commonmarker는 기본적으로 20가지 확장을 제공하며, strikethrough, table, autolink, tasklist, shortcodes 등이 포함됩니다. 구문 강조 기능은 기본으로 제공되며, syntax_highlighter 플러그인을 통해 다양한 내장 테마를 선택하거나 TextMate의 .tmtheme 형식을 사용하여 사용자 정의 테마를 적용할 수 있습니다. 이는 외부 의존성 없이 코드 블록 스타일을 완벽하게 제어할 수 있게 합니다.

또한, GitHub Flavored Markdown의 알림(Callouts) 기능을 활성화하고 스타일링하는 방법을 상세히 설명합니다. alerts 확장을 통해 [!NOTE], [!WARNING] 등과 같은 구문을 특별한 시각적 요소로 렌더링할 수 있으며, Tailwind CSS와 SVG 아이콘을 활용하여 시각적으로 풍부한 알림을 구현하는 예시를 제공합니다. Commonmarker는 문서의 AST(Abstract Syntax Tree)를 탐색하여 렌더링된 마크다운의 출력을 사용자 정의할 수 있는 강력한 기능을 제공합니다. walkeach 메서드를 사용하여 노드를 조작함으로써, 링크의 프로토콜을 HTTPS로 강제하거나 외부 링크를 일반 텍스트로 렌더링하는 등의 고급 기능을 구현할 수 있습니다. AST 탐색만으로는 부족한 경우, Nokogiri Gem을 활용하여 생성된 HTML을 파싱하고 수정하는 방법을 제시합니다. 이를 통해 외부 링크에 rel="nofollow" 속성을 추가하거나 코드 블록에 ‘클립보드로 복사’ 버튼을 동적으로 삽입하는 기능을 구현할 수 있습니다.

마지막으로, 사용자 정의 임베드(Shortcode) 지원에 대해 다룹니다. {{shortcode/}}와 같은 자체 닫힘 숏코드 및 파라미터를 처리하기 위한 ShortcodeParser 클래스를 정의하고, 정규식을 사용하여 숏코드 문자열을 파싱하고 해당 partial을 렌더링하는 과정을 설명합니다. 또한, 숏코드가 없는 버전의 본문을 생성하는 render_without_shortcodes 메서드를 제공하여 마크다운의 이식성을 유지하는 방안을 제시합니다.

결론

Commonmarker Gem은 Ruby 또는 Rails 애플리케이션에 GitHub Flavored Markdown을 통합하기 위한 탁월한 선택입니다. Rust 기반의 comrak 라이브러리를 래핑하여 CommonMark 사양을 구현하며, 빠르고 유연한 마크다운 렌더링 솔루션을 제공합니다. 이 Gem은 표준 마크다운 구문을 넘어 다양한 확장 기능을 제공하여 GitHub와 유사한 사용자 경험을 기본적으로 제공합니다. 구문 강조와 같은 플러그인을 통해 코드 블록의 스타일을 사용자 정의하고 외부 의존성 없이 고유한 테마를 정의할 수 있는 유연성을 갖추고 있습니다. 또한, AST를 탐색하거나 Nokogiri를 활용하여 생성된 HTML을 세밀하게 제어함으로써 링크 처리, 코드 블록 기능 추가 등 복잡한 사용자 정의 요구사항을 충족시킬 수 있습니다. 사용자 정의 임베드 기능과 숏코드 제거 기능은 마크다운의 활용 범위를 넓히면서도 핵심적인 이식성을 유지할 수 있도록 돕습니다. 전반적으로 Commonmarker Gem은 사용자 정의가 용이하고, 빠르며, 최소한의 노력으로 뛰어난 사용자 경험을 제공하는 강력한 도구로서 Ruby/Rails 개발에 매우 유용합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!