ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - Markdown
    Swift 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

     

    'Swift' 카테고리의 다른 글

    Property Wrapper  (0) 2022.04.21
    Method Swizzling  (0) 2022.01.14
    KeyPath  (0) 2021.09.04
    Dictionary.init(uniqueKeysWithValues:)  (0) 2021.08.31
    순수함수와 사이드이펙트  (0) 2021.08.22
Designed by Tistory.