Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
D

Down

> 前端框架
Open source

Blazing fast Markdown / CommonMark rendering in Swift, built upon cmark.

2.5K stars0 likes0 views
WebsiteGitHub

About

Blazing fast Markdown / CommonMark rendering in Swift, built upon cmark.

Down

Blazing fast Markdown (CommonMark) rendering in Swift, built upon cmark v0.29.0.

Is your app using it? Let us know!

If you're looking for iwasrobbed/Down, you found it! Rob Phillips, the originator of this repository, has transferred it to me as I will be the primary maintainer from now on. Thanks to Rob for bringing Down as far as it has come and for entrusting me with its care.

All existing references to iwasrobbed/Down should redirect to this repository. However, It is recommended to update those urls to point to this repository.

Maintainers

  • John Nguyen
  • Rob Phillips
  • Keaton Burleson
  • phoney
  • Tony Arnold
  • Ken Harris
  • Chris Zielinski
  • Other contributors

Installation

Note: Swift support is summarized in the table below.

Swift Version Tag
Swift 5.1 >= 0.9.0
Swift 5.0 >= 0.8.1
Swift 4 >= 0.4.x
Swift 3 0.3.x

now on the master branch and any tag >= 0.8.1 (Swift 4 is >= 0.4.x, Swift 3 is 0.3.x)

Quickly install using CocoaPods:

pod 'Down'

Install using Carthage:

github "johnxnguyen/Down"

Due to limitations in Carthage regarding platform specification, you need to define the platform with Carthage.

e.g.

carthage update --platform iOS

Install using Swift Package Manager:

To add Down to your project, select File → Swift Packages → Add Package Dependency and enter the GitHub URL for Down. See Adding Package Dependencies to Your App for detailed instructions.

Or manually install:

  1. Clone this repository
  2. Drag and drop the Down project into your workspace file, adding the framework in the embedded framework section
  3. Build and run your app
  4. ?
  5. Profit

Robust Performance

cmark can render a Markdown version of War and Peace in the blink of an eye (127 milliseconds on a ten year old laptop, vs. 100-400 milliseconds for an eye blink). In our benchmarks, cmark is 10,000 times faster than the original Markdown.pl, and on par with the very fastest available Markdown processors.

The library has been extensively fuzz-tested using american fuzzy lop. The test suite includes pathological cases that bring many other Markdown parsers to a crawl (for example, thousands-deep nested bracketed text or block quotes).

Output Formats

  • Web View (see DownView class)
  • HTML
  • XML
  • LaTeX
  • groff man
  • CommonMark Markdown
  • NSAttributedString
  • AST (abstract syntax tree)

View Rendering

The DownView class offers a very simple way to parse a UTF-8 encoded string with Markdown and convert it to a web view that can be added to any view:

let downView = try? DownView(frame: self.view.bounds, markdownString: "**Oh Hai**") {
    // Optional callback for loading finished
}
// Now add to view or constrain w/ Autolayout
// Or you could optionally update the contents at some point:
try? downView?.update(markdownString:  "## [Google](https://google.com)") {
    // Optional callback for loading finished
}

Meta example of rendering this README:

Parsing API

The Down struct has everything you need if you just want out-of-the-box setup for parsing and conversion.

…

Rendering Granularity

If you'd like more granularity for the output types you want to support, you can create your own struct conforming to at least one of the renderable protocols:

  • DownHTMLRenderable
  • DownXMLRenderable
  • DownLaTeXRenderable
  • DownGroffRenderable
  • DownCommonMarkRenderable
  • DownASTRenderable
  • DownAttributedStringRenderable

Example:

public struct MarkdownToHTML: DownHTMLRenderable {
    /**
     A string containing CommonMark Markdown
    */
    public var markdownString: String

    /**
     Initializes the container with a CommonMark Markdown string which can then be rendered as HTML using `toHTML()`

     - parameter markdownString: A string containing CommonMark Markdown

     - returns: An instance of Self
     */
    @warn_unused_result
    public init(markdownString: String) {
        self.markdownString = markdownString
    }
}

Configuration of DownView

DownView can be configured with a custom bundle using your own HTML / CSS or to do things like supporting Dynamic Type or custom fonts, etc. It's completely configurable.

This option can be found in DownView's instantiation function.

Prevent zoom

The default implementation of the DownView allows for zooming in the rendered content. If you want to disable this, then you’ll need to instantiate the DownView with a custom bundle where the viewport in index.html has been assigned user-scalable=no. More info can be found here.

Options

Each protocol has options that will influence either rendering or parsing:

…

Supports

Swift; iOS 9+, tvOS 9+, macOS 10.11+

Markdown Specification

Down is built upon the CommonMark specification.

A little help from my friends

Please feel free to fork and create a pull request for bug fixes or improvements, being sure to maintain the general coding style, adding tests, and adding comments as necessary.

Credit

This library is a wrapper around cmark, which is built upon the CommonMark Markdown specification.

cmark is Copyright (c) 2014, John MacFarlane. View full license.

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

Castcmarkcommonmarkhtml

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category前端框架
PricingOpen source

> Related tools

R
React
用于构建用户界面的 JavaScript 库
V
Vue.js
渐进式 JavaScript 框架
N
Next.js
基于 React 的全栈 Web 框架