Rails I18n 마크다운 변환 구현 상세
본 기능 구현은 크게 두 가지 핵심 패치와 마크다운 변환 로직으로 구성됩니다.
1. I18n translate 메서드 패치
config/initializers/markdown.rb 파일에 Markdown::I18nBackendExt 모듈을 정의하여 I18n.backend.class에 prepend 방식으로 삽입합니다. 이는 기존 translate 메서드를 오버라이드하여 마크다운 변환 로직을 추가하기 위함입니다.
-
기능: 번역 키가
_md로 끝나고 반환된 결과가 문자열인 경우, 해당 문자열을 마크다운으로 간주하고 HTML로 변환합니다. - 로직:
result.include?(" ")을 통해 여러 줄 마크다운인지 인라인 마크다운인지 판단합니다.- 여러 줄인 경우
Markdown.convert를, 인라인인 경우Markdown.inline을 호출하여 적절히 변환합니다.
- 참고: Rails의 누락된 번역 감지 로직(특정 매직 넘버 반환)을 고려하여
result.is_a?(String)조건을 통해 실제 번역 문자열에 대해서만 변환을 시도합니다.
2. HTML 안전성 동작 패치
Markdown::HtmlSafeTranslationExt 모듈을 정의하고 ActiveSupport::HtmlSafeTranslation에 prepend하여 html_safe_translation_key? 메서드를 확장합니다. 이 패치는 _md 접미사로 끝나는 번역 키도 HTML 안전한 것으로 간주하도록 Rails에 지시합니다.
-
목적: 마크다운에서 변환된 HTML이 뷰에서 이스케이프되지 않고 안전하게 렌더링되도록 보장합니다.
-
주의: HTML 안전성 관련 패치는 XSS(크로스 사이트 스크립팅) 공격 가능성을 항상 염두에 두고 면밀히 검토해야 합니다.
3. Kramdown을 이용한 마크다운 변환
Markdown 모듈 내에 self.convert와 self.inline 클래스 메서드를 구현하여 실제 마크다운-HTML 변환을 담당합니다. Kramdown 라이브러리를 활용합니다.
Markdown.convert:- 일반적인 마크다운 텍스트를 HTML로 변환합니다.
auto_ids: false옵션으로 자동 ID 생성을 비활성화하고,smart_quotes옵션을 통해 스마트 쿼트 기능을 비활성화합니다.Kramdown::Document.new(text, options).to_html을 호출하여 변환을 수행합니다.
Markdown.inline:- 인라인 마크다운 텍스트를 처리하기 위한 메서드입니다.
input: "Inline"옵션을 사용하여 Kramdown의 커스텀 입력 파서인Kramdown::Parser::Inline을 지정합니다.- 이 커스텀 파서는
Kramdown::Parser::Kramdown을 상속받지만,@block_parsers를 비워 블록 레벨 요소(예:<p>)가 생성되지 않도록 하여 순수한 인라인 HTML을 반환합니다.
이러한 단계를 통해 Rails 애플리케이션에서 _md 접미사를 가진 I18n 키를 마크다운으로 작성하고, 자동으로 HTML로 변환하여 안전하게 사용할 수 있게 됩니다.