Skip to content

A text view for creating tokenized text.

License

Notifications You must be signed in to change notification settings

open-turo/token-text-view

Repository files navigation

TokenTextView

TokenTextView is a lightweight UITextView class for editing & managing tokenized text.

Generates and renders templates using token syntax (mustache by default)

Features

Insert a token into the text

Create templated or tokenized text

to:

Hey {{GUEST_NAME}}!\nThanks for booking our {{VEHICLE_NAME}}. Feel free to contact us at {{HOST_PHONE_NUMBER}} if you have any questions.\nBest\n{{HOST_FIRST_NAME}}

and vice-versa.

Cut/copy & paste tokens

Requirements

  • iOS 11.0+
  • Xcode 14.0+

Installation

TokenTextView can be installed via CocoaPods

Swift Package Manager

TokenTextView can be installed via SPM. Once your Swift package is set up, simply add TokenTextView to dependencies in Package.swift:

dependencies: [
  .package(url: "https://github.com/open-turo/token-text-view.git", upToNextMajor:(from:"1.0.0"))
]

You can also use Xcode to install TokenTextView via SPM. Go to File -> Swift Packages -> Add Package Dependency. Enter the url (https://github.com/open-turo/token-text-view.git), select Version -> Up to next major and enter 1.0.0 under the Rules section. Click Next and your package will be installed!

CocoaPods

Add the following line to your Podfile:

pod 'TokenTextView'

Then install TokenTextView:

pod install

Setup

init

TokenTextView is a subclass of UITextView, so you can declare it like a normal UIKit object in either code or via Storyboard:

let tokenTextView = TokenTextView()

or

@IBOutlet var tokenTextView: TokenTextView!

TokenTextView has the following initializer:

init(messageText: String, tokens: [Token], tokenOpen: String, tokenClose: String)

TokenTextView needs to be initialized with Token objects before it can tokenize text. You can do this during object initialization or set them later:

let tokenArray = [Token]()
let tokenTextView = TokenTextView(tokens: tokenArray)

or

let tokenTextView = TokenTextView()
let tokenArray = [Token]()

tokenTextView.tokens = tokenArray

TokenTextView can turn tokenized text into text templates and vice-versa. In order to do so, it uses identifiers to designate tokens. It's set up to use "mustache" syntax as the default:

{{TOKEN_IDENTIFIER}}

You can use custom identifiers by passing in tokenOpen and tokenClose parameters during initialization:

let tokenTextView = TokenTextView(tokenOpen: "{{", tokenClose: "}}")

Usage

Insert a token

You can insert a token to TokenTextView's text by using the following method:

insert(_ token: Token, at insertRange: NSRange? = nil)

You can specify the location to insert the token:

let token = Token(name: "Token name", identifier: "TOKEN_IDENTIFIER")
let range = NSRange(location: 0, length: 0)

tokenTextView.insert(token, at: range)

Or you can leave `insertRange blank, and the current cursor location will be used:

let token = Token(name: "Token name", identifier: "TOKEN_IDENTIFIER")

tokenTextView.insert(token)

Styling tokens & text

You can set the backgroundColor, foregroundColor and font of both the text and tokens via the tokenAttributes and textAttributes properties.

For example:

tokenTextView.tokenAttributes.backgroundColor = .gray
tokenTextView.tokenAttributes.foregroundColor = .purple
tokenTextView.tokenAttributes.font = UIFont.boldSystemFont(ofSize: 12.0)

You also set a kern value and additional NSMutableParagraphStyle values via the kern and paragraphStyle properties.

Create templated text

TokenTextView has a computed property called templatedText that converts rendered text into text templates with tokens in identifiers:

print(tokenTextView.templatedText)

will produce:

This is an example templated message. Some variables can be {{START_TIME}} and {{END_TIME}} or {{NAME}} and {{BIRTHDATE}}

Create tokenized text

TokenTextView can render existing templated text. Setting tokenList (a list of all potential tokens) will initiate rendering.tokenOpen and tokenClose must correspond to the identifiers in the templated text.

tokenTextView.text = "Hey {{GUEST_NAME}}!\nThanks for booking our {{VEHICLE_NAME}}. Feel free to contact us at {{HOST_PHONE_NUMBER}} if you have any questions.\nBest\n{{HOST_FIRST_NAME}}"
tokenTextView.tokenList = tokenArray

will produce:

Example

Feel free to check out the example project in Example/TokenTextView.

Open TokenTextViewExample.xcodeproj and run the project. A view controller containg TokenTextView and a list of example tokens will appear. Simply tap the token to insert a token into the text:

Contributions

Please see here for guidelines on how to contribute to this project.

License

TokenTextView is released under the MIT License. See LICENSE.md for details