• This repository has been archived on 17/Oct/2021
  • Stars
    star
    421
  • Rank 103,003 (Top 3 %)
  • Language
    Swift
  • License
    MIT License
  • Created over 4 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Create NSAttributedStrings from Markdown Text

CommonMarkAttributedString

CI Documentation

CommonMarkAttributedString is a Swift package that lets you create attributed strings using familiar CommonMark (Markdown) syntax. It's built on top of CommonMark, which is fully compliant with the CommonMark Spec.

Supported Platforms

  • macOS 10.10+
  • Mac Catalyst 13.0+
  • iOS 9.0+
  • tvOS 9.0+

Usage

import CommonMarkAttributedString

let commonmark = "A *bold* way to add __emphasis__ to your `code`"

let attributes: [NSAttributedString.Key: Any] = [
    .font: NSFont.systemFont(ofSize: 24.0),
    .foregroundColor: NSColor.systemBlue,
]

let attributedString = try NSAttributedString(commonmark: commonmark, attributes: attributes)

Result

You can also use CommonMarkAttributedString to create attributed strings that have multiple paragraphs, with links, headings, lists, and images.

let commonmark = #"""
# [Universal Declaration of Human Rights][uhdr]

## Article 1.

All human beings are born free and equal in dignity and rights.
They are endowed with reason and conscience
and should act towards one another in a spirit of brotherhood.

[uhdr]: https://www.un.org/en/universal-declaration-human-rights/ "View full version"
"""#

let attributes: [NSAttributedString.Key: Any] = [
    .font: NSFont.systemFont(ofSize: NSFont.systemFontSize),
    .foregroundColor: NSColor.textColor,
    .backgroundColor: NSColor.textBackgroundColor,
]

let attributedString = try NSAttributedString(commonmark: commonmark, attributes: attributes)

Result

Supported CommonMark Elements

  • Code
  • Emphasis
  • Link (inline links, link references, and autolinks)
  • Strong
  • > Block Quotes
  • Headings
  • Raw <html> *
  • โ€ข Bulleted Lists *
  • 1. Ordered Lists *
  • ๐Ÿ–ผ Images *

Raw Inline HTML

According to the CommonMark specification, each inline HTML tag is considered its own element. That is to say, CommonMark doesn't have a concept of opening or closing tags. So, for example, the CommonMark string <span style="color: red;">hello</span> corresponds to a paragraph block containing three inline elements:

  • Code (<span style="color: red;">)
  • Text (hello)
  • Code (</span>)

Parsing and rendering HTML is out of scope for this library, so whenever CommonMarkAttributedString receives text containing any HTML, it falls back on NSAttributedString's built-in HTML initializer.

Bulleted and Ordered Lists

CommonMarkAttributedString renders bulleted and ordered lists using conventional indentation and markers --- disc (โ€ข), circle(โ—ฆ), and square (โ– ) for unordered lists and decimal numerals (1.), lowercase roman numerals (i.), and lowercase letters (a.) for ordered lists.

  • Level 1
    • Level 2
      • Level 3

  1. Level 1
    1. Level 2
      1. Level 3

Images

Attributed strings can embed images using the NSTextAttachment class. However, there's no built-in way to load images asynchronously. Rather than load images synchronously as they're encountered in CommonMark text, CommonMarkAttributedString provides an optional attachments parameter that you can use to associate existing text attachments with image URL strings.

let commonmark = "![](https://example.com/image.png)"

let attachments: [String: NSTextAttachment] = [
    "https://example.com/image.png": NSTextAttachment(data: <#...#>, ofType: "public.png")
]

let attributedString = try NSAttributedString(commonmark: commonmark, attributes: attributes, attachments: attachments)

Requirements

  • Swift 5.1+

Installation

Swift Package Manager

Add the CommonMarkAttributedString package to your target dependencies in Package.swift:

import PackageDescription

let package = Package(
  name: "YourProject",
  dependencies: [
    .package(
        url: "https://github.com/mattt/CommonMarkAttributedString",
        from: "0.2.0"
    ),
  ]
)

Then run the swift build command to build your project.

License

MIT

Contact

Mattt (@mattt)

More Repositories

1

Ono

A sensible way to deal with XML & HTML for iOS & macOS
Objective-C
2,603
star
2

GroundControl

Remote configuration for iOS
Objective-C
1,946
star
3

CargoBay

The Essential StoreKit Companion
Objective-C
1,770
star
4

Euler

Swift Custom Operators for Mathematical Notation
Swift
1,156
star
5

AnimatedGIFImageSerialization

Complete Animated GIF Support for iOS, with Functions, NSJSONSerialization-style Class, and (Optional) UIImage Swizzling
Objective-C
1,087
star
6

TransformerKit

A block-based API for NSValueTransformer, with a growing collection of useful examples.
Objective-C
848
star
7

Navajo

Password Validator & Strength Evaluator
Objective-C
836
star
8

SkyLab

Multivariate & A/B Testing for iOS and Mac
Objective-C
790
star
9

Orbiter

Push Notification Registration for iOS
Objective-C
673
star
10

NSEtcHosts

/etc/hosts with NSURLProtocol
Objective-C
666
star
11

Chroma-Hash

A colorful visualization of password field input
JavaScript
624
star
12

rack-scaffold

Automatically generate REST APIs from Core Data models
Ruby
528
star
13

sinatra-param

Parameter Validation & Type Coercion for Sinatra
Ruby
519
star
14

InflectorKit

Efficiently Singularize and Pluralize Strings
Objective-C
476
star
15

NSSortDescriptor-WilsonRank

The Correct Way To Rank Up/Down Voted Items
Objective-C
433
star
16

Antenna

Extensible Remote Logging for iOS
Objective-C
424
star
17

Godzippa

Godzippa! - GZip Compression / Decompression Category for NSData
Objective-C
424
star
18

rack-push-notification

A Rack-mountable webservice for managing push notifications
Ruby
378
star
19

TTTLocalizedPluralString

NSLocalizedString with a Count Argument
Objective-C
378
star
20

CupertinoYankee

An NSDate Category With Locale-Aware Calculations for Beginning & End of Day, Week, Month, and Year
Objective-C
305
star
21

WebPImageSerialization

Complete WebP Support for iOS, with Functions, NSJSONSerialization-style Class, and (Optional) UIImage Swizzling
C
282
star
22

CHChromaHashView

A classic password visualization concept, ported to iOS
Objective-C
273
star
23

Xcode-Licensed-Templates

Minimal Xcode Templates for Open Source Developers
255
star
24

GeoJSONSerialization

Encode & Decode Between GeoJSON & MapKit Shapes
Objective-C
231
star
25

terminal-share

Command Line & Ruby Interface to Mac OS X Sharing Services
Objective-C
228
star
26

TTTRandomizedEnumerator

Mix things up with your collection classes with style and class (well, a category, but you get the idea).
Objective-C
223
star
27

BritishInvasion

Localise Your .m Files, For Queen And Country ๐Ÿ‡ฌ๐Ÿ‡ง
Objective-C
212
star
28

OpenAI

A Swift client for the OpenAI API.
Swift
181
star
29

AnyJSON

Encode / Decode JSON By Any Means Possibleโ„ข
Objective-C
119
star
30

MsgPackSerialization

MsgPack Serialization for Objective-C
C
96
star
31

Morse.js

A jQuery Plugin to annotate text with Morse Code
JavaScript
95
star
32

rack-smart-app-banner

Rack middleware to automatically include code for Smart App Banners on iOS
Ruby
85
star
33

vCardSerialization

Encodes and decodes between vCard files and AddressBook records.
Objective-C
69
star
34

UIFontSerialization

Encode and decode between UIFont and Postscript font data
Objective-C
64
star
35

rack-http-logger

Log metrics from HTTP request parameters according to l2met conventions
Ruby
57
star
36

rack-passbook

Rack middleware that provides Passbook web service endpoints.
Ruby
52
star
37

rack-in-app-purchase

Rack middleware that manages products for in-app-purchases and verifies receipts.
Ruby
51
star
38

swift-package-registry-oas

OpenAPI Specification for proposed Swift Package Registry web service
Swift
41
star
39

core_data

Parse Core Data Model (.xcdatamodel) Files
Ruby
39
star
40

swift-registry

A reference implementation of the Swift Package Registry, written in Swift and using Git as a database / transparent log.
Swift
37
star
41

rack-subdomain

Rack middleware to transparently route requests with a subdomain to a specified path with substitutions
Ruby
37
star
42

rack-newsstand

Automatically generate webservice endpoints for Newsstand
Ruby
33
star
43

rack-remote-configuration

Serve property list or JSON configuration files
Ruby
24
star
44

commoditize

A command-line utility for macOS that mounts a Docker container image as an external disk image.
Shell
20
star
45

swift-package-sbom

A software bill of materials (SBoM) generator for Swift packages
Swift
17
star
46

vscode-unicorn

๐Ÿฆ„๐Ÿ’ฌ A Visual Studio Code extension that adds a status bar entry showing Unicode data for the currently selected character.
TypeScript
15
star
47

hype

Write Python functions. Call them from language models.
Python
15
star
48

Sonic-Hash

A melodic Sonification of password field input
JavaScript
14
star
49

NFPA704View

UIView Subclass for NFPA 704 "Fire Diamonds"
Objective-C
13
star
50

swift-package-registry-codeartifact

A basic implementation of the Swift package registry interface that uses AWS CodeArtifact as a backend for package releases and assets.
TypeScript
10
star
51

rack-heroku-no-such-app

Rack middleware to prevent loading from `*.heroku.com` / `*.herokuapp.com` addresses
Ruby
9
star
52

glitz

Glitz adds ANSI-colorized glamour to your terminal output
Ruby
9
star
53

replicate-swift

Unofficial Swift client for the Replicate API
Swift
8
star
54

swift-package-serialization-lambda

Swift
7
star
55

cog-replicate-logo-generator

Python
5
star
56

rack-typekit

Rack middleware to automatically inject Typekit into webpages
Ruby
4
star
57

CycloneDX

Swift
4
star
58

swift-registry-benchmark-harness

A harness for benchmarking the performance of building a project with Swift Package Manager using the new package registry interface.
Ruby
4
star
59

documentation-block

[WIP] View symbol documentation for a file
TypeScript
3
star
60

swift-evolution

This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Markdown
1
star