Git Product home page Git Product logo

markdowntextview's Introduction

MarkdownTextView

Rich Markdown Editing for iOS

MarkdownTextView is an iOS framework for adding rich Markdown editing capabilities. Support for Markdown syntax is implemented inside an easily extensible NSTextStorage subclass, with a UITextView subclass being provided for convenience.

Screenshot

Example App

Check out the includeded Example app to try out the text view and to see how MarkdownTextView is integrated into the project.

Installation

With CocoaPods:
pod "MarkdownTextView"
With Carthage:
github "indragiek/MarkdownTextView"

Getting Started

The simplest possible usage is as follows:

let textView = MarkdownTextView(frame: CGRectZero)
view.addSubview(textView)

This gives you a text view with support for most of the features defined in the original Markdown implementation (strong, emphasis, inline code, code blocks, block quotes, headers) with the default styling provided by the framework.

Customizing Appearance

All of the styling can be customized using standard NSAttributedString attributes. For example, if you wanted to customize bold text such that it appeared red, you would do this:

var attributes = MarkdownTextAttributes()
attributes.strongAttributes = [
	NSForegroundColorAttributeName: UIColor.redColor()
]
let textStorage = MarkdownTextStorage(attributes: attributes)
let textView = MarkdownTextView(frame: CGRectZero, textStorage: textStorage)
view.addSubview(textView)

Extensions Support

Extension classes conforming to the HighlighterType protocol can be used to add support for unofficial Markdown extensions. The framework comes with the following extensions already implemented:

From Github Flavored Markdown:

  • MarkdownStrikethroughHighlighter - Support for ~~strikethrough~~
  • MarkdownFencedCodeHighlighter - Support for fenced code blocks
  • LinkHighlighter - Support for auto-linking

Other:

  • MarkdownSuperscriptHighlighter - Support for super^scripted^text

These extensions do not come activated by default. They must manually be added to an instance of MarkdownTextStorage as follows:

let textStorage = MarkdownTextStorage()
var error: NSError?
if let linkHighlighter = LinkHighlighter(errorPtr: &error) {
    textStorage.addHighlighter(linkHighlighter)
} else {
    assertionFailure("Error initializing LinkHighlighter: \(error)")
}
textStorage.addHighlighter(MarkdownStrikethroughHighlighter())
textStorage.addHighlighter(MarkdownSuperscriptHighlighter())
if let codeBlockAttributes = attributes.codeBlockAttributes {
    textStorage.addHighlighter(MarkdownFencedCodeHighlighter(attributes: codeBlockAttributes))
}

let textView = MarkdownTextView(frame: CGRectZero, textStorage: textStorage)
view.addSubview(textView)

Credits

Contact

License

MarkdownTextView is licensed under the MIT License. See LICENSE for more information.

markdowntextview's People

Contributors

indragiek avatar to4iki avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

markdowntextview's Issues

Swift 3

Hy, I am using your framework in my application.

Now I was wondering if you plan to port your component to swift 3.

How do I add Markdown to a UITextView which has been added in the storyboard ?

 @IBOutlet weak var texView:  MarkdownTextView!
  var textStorage: MarkdownTextStorage?

  let attributes = MarkdownAttributes()
        let textStorage = MarkdownTextStorage(attributes: attributes)
        do {
            textStorage.addHighlighter(try LinkHighlighter())
        } catch let error {
            fatalError("Error initializing LinkHighlighter: \(error)")
        }
        textStorage.addHighlighter(MarkdownStrikethroughHighlighter())
        textStorage.addHighlighter(MarkdownSuperscriptHighlighter())
        if let codeBlockAttributes = attributes.codeBlockAttributes {
            textStorage.addHighlighter(MarkdownFencedCodeHighlighter(attributes: codeBlockAttributes))
        }



..... 

Pasting Markdown Text then crash

I created some md texts in this view. When I copy some md text then paste at the first line of the text area, it crashes with the following message:

2017-10-06 08:06:36.430585+0200 xxx[59886:2281740] /Users/clear/Dropbox/dev/Traces/libs/MarkdownTextView-master/MarkdownTextView/MarkdownTextStorage.swift: 14: 12: fatal error: use of unimplemented initializer 'init()' for class 'MarkdownTextView.MarkdownTextStorage'

Swift 2.0 support

I had to refactor a bunch of the code, to use with my project in Swift 2.0. You should make this compliant with that standard.

Images

Support for rendering embedded images.

Memory Leak

Causes ~50 memory leaks in its current state.

My code for reference:

lazy var composeTextView: MarkdownTextView = {

  // MarkdownTextView
    var attributes = MarkdownAttributes()
    attributes.defaultAttributes = [
        NSFontAttributeName: UIFont.systemFont(ofSize: constants.compose.textFontSize),
        NSForegroundColorAttributeName: constants.compose.textFontColor
    ]
    
    let textStorage = MarkdownTextStorage(attributes: attributes)
    do {
        textStorage.addHighlighter(try LinkHighlighter())
    } catch let error {
        fatalError("Error initializing LinkHighlighter: \(error)")
    }
    textStorage.addHighlighter(MarkdownStrikethroughHighlighter())
    textStorage.addHighlighter(MarkdownSuperscriptHighlighter())
    if let codeBlockAttributes = attributes.codeBlockAttributes {
        textStorage.addHighlighter(MarkdownFencedCodeHighlighter(attributes: codeBlockAttributes))
    }
    
    let textView = MarkdownTextView(frame: CGRect.zero, textStorage: textStorage)
    //textView.font = UIFont.systemFont(ofSize: constants.compose.textFontSize)
    //textView.textColor = constants.compose.textFontColor
    textView.backgroundColor = .clear
    //textView.textColor = constants.compose.textFontColor
    textView.font = UIFont.systemFont(ofSize: constants.compose.textFontSize)
    //textView.tintColor = constants.compose.textFontColor
    textView.textContainerInset = UIEdgeInsets(top: 5, left: 9, bottom: constants.compose.helpButton.padding, right: 9)
    
    textView.isEditable = true
    textView.isSelectable = true
    textView.isScrollEnabled = true
    textView.showsVerticalScrollIndicator = false
    textView.showsHorizontalScrollIndicator = false
    
    textView.keyboardAppearance = UIKeyboardAppearance.light
    
    // testing purposes
    textView.layer.borderWidth = constants.testingBorderWidth
    textView.layer.borderColor = UIColor.red.cgColor
    
    return textView
}()

Carthage is not supported

Framework scheme is set to shared after tag 1.0.0. While using Carthage, it fetch the newest tag (1.0.0) and at that time the scheme is not shared which cause a error.
Add a new tag can fix that.

Update to Swift 4

I'd love to see this project updated to Swift 4 , since it has a lot of potencial.

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.