AttributedString を Builder パターンや, 文字列リテラルで作成する SwiftPM です.
Tsumiji を一言で表すと, 構造化された Attributed String です.
let sample = Editor()
.text("white")
.font([.fontColor: UIColor.red]).text("red").fontEnd()
.text("white")
.product
- XML のタグのように, 文字の一部を
.font(_ attribute:)
と.fontEnd()
で入れ子状に挟むことができます. - アトリビュートを入れ子状にすることで, アトリビュートを合成することができます.
sample
を SwiftUI などで表示するとこうなります.
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 を表示したものがこちら.
アトリビュートの構造をコメントで示すとこうなります.
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 を表示したものがこちら.