Swift

Swift - Markdown

GREEN.1229 2021. 10. 20. 21:52

안녕하세요. 그린입니다🟢

이번 포스팅에서는 Swift의 Markdown에 대해 학습해보겠습니다💁🏻

 

Markdown은 다들 아실겁니다.
간단히 말하자면 서식 있는 텍스트를 작성하기 위한 공통 언어입니다.
깃헙 리드미에서도 많이 보셨을거에요🧐
그런데 Swift - Markdown은 도대체 무엇인지 알아봐야겠어요..!
SwiftUI 3.0으로 업데이트 되면서 즉 iOS15부터 애플에서 Foundation 프레임워크와 SwiftUI에서
이 마크다운을 제공해줍니다!!
얘네들이 마크다운 라이브러리를 만들어버렸어요😁
정말 그럼 딥하게 파고들며 설명하기전에 어떤건지 맛볼까요?

 

간단한 Markdown의 사용 예시 맛보기

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("**Hello**, Green's [Blog](https://green1229.tistory.com)!")
            .padding()
    }
}

요렇게 우리가 알고있는 마크다운 문법을 적용해준다면?

짜란 하고 기가막히게 나옵니다..!

아주 이제 문자열을 다루기가 쉬워졌네요👍

더군다나 링크를 클릭하면 바로 이동도하고 크... 애플 대단해!

 

자 그럼 간단히 맛보았으니 애플이 만든 마크다운 라이브러리를 파해쳐보겠습니다!!!!

 

Swift-markdown 소개

공식 라이브러리 리드미를 보면 아래와 같이 마크다운을 정의하고 있습니다.

"Swift Markdown는 Markdown 문서를 구문 분석, 빌드, 편집 및 분석하기 위한 Swift 패키지입니다."

 

사용하기

아래와 같이 SPM와 dependency를 통해 추가해줍니다.

.package(url: "ssh://git@github.com/apple/swift-markdown.git", .branch("main")),
.target(name: "MyTarget", dependencies: ["Markdown"]),

 

parsing을 통해 마크다운 구조 분석해보기

마크다운을 사용하면 문자열이 어떤 형태로 구성되는지 알아볼 수 있는 방법이 있습니다.

바로 Document의 parsing을 통해 분석해볼 수 있어요!

import Markdown

let source = "green is *apple developer*."
let document = Document(parsing: source)
print(document.debugDescription())

// Document
// └─ Paragraph
//    ├─ Text "green is "
//    ├─ Emphasis
//    │  └─ Text "apple developer"
//    └─ Text "."

요렇게 봐보시죠!

자 어디서 많이본 구조같지 않나요!?

트리 구조입니다!

green is와 강조 구문은 같은 레벨단입니다.

그러나 강조 구문에서 apple developer 텍스트로 한단계 들어가게 됩니다!

정말 트리트리 합니다🎄

 

마크업 트리 만들기

그럼 요소들을 하나씩 구성해가면서 마크업 트리도 만들어 텍스트를 나타낼 수도 있겠죠?

import Markdown

let document = Document(
    Paragraph(
        Text("green is "),
        Emphasis(
            Text("apple developer")
        ),
        Text(".")))

이렇게 말이죠!🥳

 

마크업 트리 수정하기

마크업 트리를 구성하고 그안에 요소들을 수정할때 기존 트리인 document를 변경하지 않고 수정해줄 수 있습니다!

필요한 하위 구조만 복사하여 변경 불가능한 복사 값 유형을 제공합니다.

코드로 예를 보시죠!

import Markdown

let source = "green is *apple developer.*"
let document = Document(parsing: source)
print(document.debugDescription())
// Document
// └─ Paragraph
//    ├─ Text "green is "
//    └─ Emphasis
//       └─ Text "apple developer."

var text = document.child(through:
    0, // Paragraph --> green is
    1, // Emphasis  --> apple developer
    0) as! Text // Text

text.string = "android developer"
print(text.root.debugDescription())
// Document
// └─ Paragraph
//    ├─ Text "green is "
//    └─ Emphasis
//       └─ Text "android developer."

// The original document is unchanged:

print(document.debugDescription())
// Document
// └─ Paragraph
//    ├─ Text "green is "
//    └─ Emphasis
//       └─ Text "android developer."

자 이렇게 보면 Emphasis의 요소는 변경하여 text의 루트를 출력하면 복사되어 변경된 문자열이 나옵니다.

그러나 기존 document의 문자열은 변하지 않는걸 볼 수 있습니다👍

 

이렇게 곧 나온 따끈따끈한 Swift - markdown에 대해 알아보았습니다.
당연히 모든 마크다운이 적용되진 않더라구요?
예를들어 테이블 같은 구성들..?
뭐 강조, 흘림, 밑줄, 가운데줄, 링크 이정도만 하더라도 저는 만족하고 있습니다😅
그래도 이번 기회에 애플의 라이브러리를 까보고 심지어 기여까지 해보는 좋은 경험이 되었습니다!
점점 발전하는 SwiftUI를 위해 치얼스~🍻

 

[참고자료]

https://github.com/apple/swift-markdown

 

GitHub - apple/swift-markdown: A Swift package for parsing, building, editing, and analyzing Markdown documents.

A Swift package for parsing, building, editing, and analyzing Markdown documents. - GitHub - apple/swift-markdown: A Swift package for parsing, building, editing, and analyzing Markdown documents.

github.com