본문으로 건너뛰기

MarkdownEngine: TextKit 2 기반의 macOS용 네이티브 마크다운 에디터 엔진

GitHub - nodes-app/swift-markdown-engine: A native AppKit Markdown editor for macOS, built on TextKit 2 and bridged...

github.com

핵심 요약

  1. TextKit 2를 기반으로 macOS 환경에 최적화된 성능과 렌더링을 제공하며 SwiftUI와 연동됩니다.
  2. 라이브 마크다운 스타일링, 위키 링크, LaTeX 렌더링, 구문 강조가 포함된 코드 블록 등 풍부한 편집 기능을 지원합니다.
  3. 확장 가능한 서비스 프로토콜 구조로 이미지 제공자, 구문 강조기, LaTeX 렌더러 등을 사용자 정의할 수 있습니다.

도입

Nodes 앱 개발 팀이 기존 오픈소스 에디터의 한계를 극복하고자 직접 개발한 AppKit 기반 마크다운 에디터 엔진입니다. TextKit 2의 현대적인 레이아웃 시스템을 활용하며, macOS 14 이상을 지원해 네이티브 앱에 즉시 통합할 수 있는 유연한 구조를 갖추고 있습니다. 단순한 텍스트 편집을 넘어 위키 링크, LaTeX, 코드 블록 구문 강조 등 전문적인 집필 환경에 필요한 기능을 네이티브 성능으로 제공합니다.

상세 요약

핵심 기술 및 특징

MarkdownEngine은 macOS의 현대적인 텍스트 레이아웃 엔진인 TextKit 2를 기반으로 설계됐습니다. 기존의 많은 마크다운 에디터가 웹 뷰나 구형 TextKit 1에 의존하는 것과 달리, 이 엔진은 AppKit의 네이티브 성능을 최대한 활용하면서 SwiftUI와의 브릿지로 최신 앱 개발 환경에 쉽게 통합되도록 만들어졌습니다. 특히 macOS 15.1부터 도입된 Apple의 Writing Tools와 호환되어 시스템 수준의 텍스트 교정 및 요약 기능을 바로 사용할 수 있습니다.

주요 편집 기능

이 엔진은 단순한 텍스트 입력을 넘어 다음과 같은 마크다운 편집 기능을 제공합니다.

  • 라이브 스타일링: 굵게, 기울임꼴, 제목, 리스트, 가로 구분선 등을 입력 즉시 시각적으로 반영합니다.
  • 위키 링크 지원: [[이름|표시명]] 형태의 위키 스타일 링크를 지원하며, 상태 바인딩으로 링크 내부 입력 시 컨텍스트 UI를 표시할 수 있습니다.
  • 이미지 및 수식 임베딩: ![[이미지]] 구문으로 이미지 삽입과 $$ ... $$ 또는 $ ... $ 구문을 이용한 LaTeX 렌더링을 지원합니다.
  • 코드 블록 및 구문 강조: 펜스형 코드 블록을 지원하며, 외부 라이브러리와 연동해 언어별 구문 강조와 복사 버튼 오버레이를 추가할 수 있습니다.
  • 사용자 편의 기능: 타이핑 시 커서가 화면 하단에 붙지 않도록 하는 하단 오버스크롤(Overscroll), 긴 문서에서 드래그 선택 시 속도를 높여주는 오토스크롤 부스트 등을 포함합니다.

모듈 구성 및 설치

MarkdownEngine은 의존성 관리를 위해 세 가지 라이브러리 제품으로 나뉘어 제공됩니다.

  1. MarkdownEngine: 외부 의존성이 없는 핵심 에디터 엔진입니다.
  2. MarkdownEngineCodeBlocks: HighlighterSwift를 포함해 코드 블록의 배경색, 폰트, 구문 강조 기능을 즉시 사용할 수 있게 해줍니다.
  3. MarkdownEngineLatex: SwiftMath를 포함해 LaTeX 수식 렌더링 기능을 즉시 제공합니다.

Swift Package Manager로 설치할 수 있으며, 프로젝트의 요구사항에 맞춰 필요한 모듈만 선택적으로 추가하면 됩니다.

서비스 프로토콜을 통한 확장

엔진의 유연성을 위해 네 가지 핵심 서비스 프로토콜을 제공합니다. 개발자는 자신의 앱 로직에 맞게 이를 구현해 엔진에 주입할 수 있습니다.

  • WikiLinkResolver: 위키 링크의 이름을 실제 데이터 모델의 ID로 확인하는 로직을 담당합니다.
  • EmbeddedImageProvider: 지정된 이름에 해당하는 NSImage 데이터를 조회해 반환합니다.
  • SyntaxHighlighter: 코드 블록 내의 텍스트에 구문 강조 스타일을 입힙니다.
  • LatexRenderer: LaTeX 문자열을 이미지로 렌더링해 에디터 내에 표시합니다.

각 프로토콜은 기본적으로 아무 동작도 하지 않는(No-op) 구현체가 설정되어 있어, 필요한 기능만 골라 구현하면 됩니다.

테마 및 세부 설정

MarkdownEditorTheme로 에디터의 모든 색상 요소를 제어할 수 있습니다. 기본값은 NSColor 시스템 동적 색상을 사용하므로 라이트 모드와 다크 모드에 자동으로 대응합니다. 또한 MarkdownEditorConfiguration으로 폰트 크기 비율, 제목별 폰트 배율, 오버스크롤 비율, 리스트 도우미 활성화 여부 등 엔진의 모든 동작 파라미터를 세밀하게 조정할 수 있습니다.

요구사항 및 상태

이 프로젝트는 macOS 14 이상, Swift 5.9 및 Xcode 15 이상의 환경을 요구합니다. 현재 정식 1.0 릴리스 이전인 프리뷰 단계이므로 마이너 버전 업데이트 시 API가 변경될 수 있습니다. 따라서 실제 프로젝트에서 사용할 때는 특정 버전을 고정(Pinning)해 사용하는 것이 권장됩니다.

결론

현재 1.0 미만 버전이지만 실제 서비스인 Nodes 앱에서 검증된 안정성을 갖췄습니다. Apple의 Writing Tools 통합과 같은 최신 macOS 기능을 지원하며, 모듈화된 설계로 필요한 기능만 선택적으로 도입할 수 있어 macOS용 문서 편집 도구 개발자에게 유용한 선택지입니다. Apache 2.0 라이선스로 공개되어 상업적 프로젝트에서도 자유롭게 활용하고 기여할 수 있습니다.