objcio/attributed-string-builder
A simple way to build up attributed strings using result builders from a variety of sources. Based on the episodes from [Swift Talk](https://talk.objc.io/episodes/S01E337-attributed-string-builder-part-1). Here are the things you can embed:
Features
Attributes
The Attributes struct is a value type representing the attributes in an NSAttributedString. During the building of the attributed string, this is passed on through the environment. For example, this is how you can build a simple attributed string using plain strings and .modify:
@AttributedStringBuilder var sample1: some AttributedStringConvertible {
"Hello"
"World".modify { $0.textColor = .red }
}Strings
You can turn any string directly into an attributed string. The attributes from the environment are used to do this. You can also modify the environment in a way very similar to what SwiftUI does. For example, you can write "Hello".bold()" to take the current attributes, make them bold, and then render the string "Hello"` using these modified attributes.
Markdown
You can take any Markdown string and render it into an attributed string as well. For most customization, you can pass in a custom stylesheet. In the Markdown string literal, you can embed other values that convert to AttributedStringConvertible:
@AttributedStringBuilder var sample2: some AttributedStringConvertible {
Markdown("""
This is *Markdown* syntax.
With \("inline".modify { $0.underlineStyle = .single }) nesting.
""")
}Images
You can embed any NSImage into the attributed string, they're rendered as-is.
SwiftUI Views
SwiftUI views can be embedded using the Embed modifier. By default, it proposes nil⨉nil to the view, but this can be customized. SwiftUI views are rendered into a PDF context and are embedded as vector graphics.
Tables
You can construct tables in attributed strings using the Table support. This interface might still change (ideally, we'd use result builders for this as well).
Environment
You can use the environment in a way similar to SwiftUI's Environment to pass values down the tree.
State
Similar to the environment, you can also thread state through. This is useful (for example) to number footnotes. While the modified environment is always passed to children of the current node, modified state is passed to the next nodes that are rendered.
Swift Talk Episodes
Package Metadata
Repository: objcio/attributed-string-builder
Default branch: main
README: README.md