Skip to content

ethanhuang13/NSAttributedStringBuilder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

873f3e3 Β· Jun 5, 2022

History

55 Commits
Apr 28, 2021
Jul 11, 2019
Jun 5, 2022
Apr 28, 2021
Jun 5, 2022
Jul 9, 2019
Feb 27, 2020
Feb 27, 2020
Apr 28, 2021
Apr 28, 2021
Jul 9, 2019
Apr 28, 2021
Apr 28, 2021
Apr 28, 2021
Jul 18, 2019
Jul 18, 2019

Repository files navigation

NSAttributedStringBuilder

Build Status codecov GitHub release GitHub top language License Twitter Donate

Composing NSAttributedString with SwiftUI-style syntax, powered by Result Builder.

Project Link: https://github.com/ethanhuang13/NSAttributedStringBuilder

Features

Features
🐦 Open source library written in Swift 5.4
🍬 SwiftUI-like syntax
πŸ’ͺ Support most attributes in NSAttributedString.Key
πŸ“¦ Distribution with Swift Package Manager
πŸ§ͺ Fully tested code
πŸ›  Continuously integrates in Swift Source Compatibility Suite

How to use?

Traditionally we compose a NSAttributedString like this:

let mas = NSMutableAttributedString(string: "")
mas.append(NSAttributedString(string: "Hello world", attributes: [.font: UIFont.systemFont(ofSize: 24), .foregroundColor: UIColor.red]))
mas.append(NSAttributedString(string: "\n"))
mas.append(NSAttributedString(string: "with Swift", attributes: [.font: UIFont.systemFont(ofSize: 20), .foregroundColor: UIColor.orange]))

Now, with NSAttributedStringBuilder, we can use SwiftUI-like syntax to declare NSAttributedString:

let attributedString = NSAttributedString {
    AText("Hello world")
        .font(.systemFont(ofSize: 24))
        .foregroundColor(.red)
    LineBreak()
    AText("with Swift")
        .font(.systemFont(ofSize: 20))
        .foregroundColor(.orange)
}

Requirements

Xcode 12.5. This project uses Swift 5.4 feature Result Builder.

Installation

Swift Package

Open your project in Xcode 12, navigate to Menu -> Swift Packages -> Add Package Dependency and enter https://github.com/ethanhuang13/NSAttributedStringBuilder to install.

CocoaPods

Add pod 'NSAttributedStringBuilder13' to your Podfile.

SwiftUI Sample Project

Besides clearer NSAttributedString syntax, since NSAttributedStringBuilder uses Result Builder it also enables API to build components in UIViewRepresentable(which embeds UIView in a SwiftUI View).

Just like a SwiftUI Text takes a String as input, the purpose of AttributedText in the sample project is to take a NSAttributedString as input and render in SwiftUI.

To achieve this, AttributedText.swift uses @NSAttributedStringBuilder to support SwiftUI-style syntax:

AttributedText.swift

Then using an AttributedText will be like: ContentView.swift

Open the sample in /SwiftUISampleApp/AttributedTextSample.xcodeproj and check AttributedText. It uses UITextView, you can also use UILabel or NSTextView.

TODO

  • Better tests for image attachment

Known Issue

  • NSAttributedString does not support link color, therefore Link component with a .color() modifier has no effect. Alternatively you need to specify in UITextView.linkTextAttributes or .tintColor.

Others

Initially discussed on this Twitter thread. Some code are inspired by zonbleπŸ™.