Coder Social home page Coder Social logo

juliansong / down Goto Github PK

View Code? Open in Web Editor NEW

This project forked from johnxnguyen/down

0.0 1.0 0.0 1.42 MB

Blazing fast Markdown rendering in Swift, built upon cmark.

License: MIT License

Ruby 0.08% HTML 0.06% JavaScript 0.01% Objective-C 0.06% Swift 2.15% C 86.88% C++ 10.78%

down's Introduction

Down

Build Status MIT licensed CocoaPods Swift macOS iOS tvOS Coverage Status

Blazing fast Markdown rendering in Swift, built upon cmark.

Is your app using it? Let me know!

Installation

Quickly install using CocoaPods:

pod 'Down'

Or Carthage:

github "iwasrobbed/Down"

Or manually install:

  1. Clone this repository
  2. Build the Down project
  3. Add the resulting framework file to your project
  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:

Example gif

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.

Parsing API

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

let down = Down(markdownString: "## [Down](https://github.com/iwasrobbed/Down)")

// Convert to HTML
let html = try? down.toHTML()
// "<h2><a href=\"https://github.com/iwasrobbed/Down\">Down</a></h2>\n"

// Convert to XML
let xml = try? down.toXML()
// "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE document SYSTEM \"CommonMark.dtd\">\n<document xmlns=\"http://commonmark.org/xml/1.0\">\n  <heading level=\"2\">\n    <link destination=\"https://github.com/iwasrobbed/Down\" title=\"\">\n      <text>Down</text>\n    </link>\n  </heading>\n</document>\n"

// Convert to groff man
let man = try? down.toGroff()
// ".SS\nDown (https://github.com/iwasrobbed/Down)\n"

// Convert to LaTeX
let latex = try? down.toLaTeX()
// "\\subsection{\\href{https://github.com/iwasrobbed/Down}{Down}}\n"

// Convert to CommonMark Markdown
let commonMark = try? down.toCommonMark()
// "## [Down](https://github.com/iwasrobbed/Down)\n"

// Convert to an attributed string
let attributedString = try? down.toAttributedString()
// NSAttributedString representation of the rendered HTML

// Convert to abstract syntax tree
let ast = try? down.toAST()
// Returns pointer to AST that you can manipulate

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
    }
}

Options

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

/**
 Default options
*/
public static let Default = DownOptions(rawValue: 0)

// MARK: - Rendering Options

/**
 Include a `data-sourcepos` attribute on all block elements
*/
public static let SourcePos = DownOptions(rawValue: 1 << 1)

/**
 Render `softbreak` elements as hard line breaks.
*/
public static let HardBreaks = DownOptions(rawValue: 1 << 2)

/**
 Suppress raw HTML and unsafe links (`javascript:`, `vbscript:`,
 `file:`, and `data:`, except for `image/png`, `image/gif`,
 `image/jpeg`, or `image/webp` mime types).  Raw HTML is replaced
 by a placeholder HTML comment. Unsafe links are replaced by
 empty strings.
*/
public static let Safe = DownOptions(rawValue: 1 << 3)

// MARK: - Parsing Options

/**
 Normalize tree by consolidating adjacent text nodes.
*/
public static let Normalize = DownOptions(rawValue: 1 << 4)

/**
 Validate UTF-8 in the input before parsing, replacing illegal
 sequences with the replacement character U+FFFD.
*/
public static let ValidateUTF8 = DownOptions(rawValue: 1 << 5)

/**
 Convert straight quotes to curly, --- to em dashes, -- to en dashes.
*/
public static let Smart = DownOptions(rawValue: 1 << 6)

Supports

Swift, ARC & iOS 8+

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.

down's People

Contributors

128keaton avatar e-kazakov avatar invlid avatar iwasrobbed avatar kumuluzz avatar tonyarnold avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.