Skip to content

rrbox/Tsumiji

Repository files navigation

つみじ Tsumiji

GitHub issues GitHub license

📎English

AttributedString を Builder パターンや, 文字列リテラルで作成する SwiftPM です.

Overview

Tsumiji を一言で表すと, 構造化された Attributed String です.

let sample = Editor()
    .text("white")
    .font([.fontColor: UIColor.red]).text("red").fontEnd()
    .text("white")
    .product
  • XML のタグのように, 文字の一部を .font(_ attribute:).fontEnd() で入れ子状に挟むことができます.
  • アトリビュートを入れ子状にすることで, アトリビュートを合成することができます.

sample を SwiftUI などで表示するとこうなります.

sample_image

DEMO

Builder パターンでの設計

extension Attribute {
    static let impact: Attribute = [.fontName: "Impact"]
    static let red: Attribute = [.fontColor: UIColor.red]
}


let attrtext = Editor()
    .font(.impact).font(.red).text("Hello,").fontEnd().text(" World!\n")
    .font(.red).text("Hi").fontEnd().text("こんにちはこんにちは!!")
    .product

生成された AttributedString を表示したものがこちら.

result_0

アトリビュートの構造をコメントで示すとこうなります.

let attrtext = Editor()
//  <------------------------- impact --------------------- impact ----------------- impact -------------------------- impact ----------
//                <=========== red ==================>                  <=========== red ===================>
//                           [ impact + red ]         [     impact     ]           [ impact + red ]          [         impact          ]
    .font(.impact).font(.red).text("Hello,").fontEnd().text(" World!\n").font(.red).text("Hi")     .fontEnd().text("こんにちはこんにちは!!")
    .product

文字列リテラルでの設計

extension Attribute {
    static let red: Self = [.fontColor: NSColor.red]
    static let impact: Self = [.fontName: "Impact"]
    static let roman: Self = [.fontName: "times new roman"]
}

let editor: EditorLiteral = "\(.roman)He\(.fontEnd)\(.impact)l\(.fontEnd)lo, \(.red)literal\(.fontEnd)\(.impact)!\(.fontEnd)"

// get attributed string.
editor.product

生成された AttributedString を表示したものがこちら.

result_1