Skip to content

Commit

Permalink
Compile performance improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
ivanbruel committed Aug 30, 2016
1 parent d24110d commit aeead78
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 74 deletions.
16 changes: 8 additions & 8 deletions MarkdownKit/Classes/Elements/Escaping/MarkdownCodeEscaping.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,27 @@
import UIKit

public class MarkdownCodeEscaping: MarkdownElement {

private static let regex = "(?<!\\\\)(?:\\\\\\\\)*+(`+)(.*?[^`].*?)(\\1)(?!`)"

public var regex: String {
return MarkdownCodeEscaping.regex
}

public func regularExpression() throws -> NSRegularExpression {
return try NSRegularExpression(pattern: regex, options: .DotMatchesLineSeparators)
}

public func match(match: NSTextCheckingResult, attributedString: NSMutableAttributedString) {
let range = match.rangeAtIndex(2)
// escaping all characters
let matchString = attributedString.attributedSubstringFromRange(range).string
let escapedString = Array(matchString.utf16)
.map { String(format: "%04x", $0) }
.reduce("") { (string, character) -> String in
let escapedString = Array<UInt16>(matchString.utf16)
.map { (value: UInt16) -> String in String(format: "%04x", value) }
.reduce("") { (string: String, character: String) -> String in
return "\(string)\(character)"
}
attributedString.replaceCharactersInRange(range, withString: escapedString)
}

}
14 changes: 7 additions & 7 deletions MarkdownKit/Classes/Elements/Escaping/MarkdownEscaping.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,25 @@
import UIKit

public class MarkdownEscaping: MarkdownElement {

private static let regex = "\\\\."

public var regex: String {
return MarkdownEscaping.regex
}

public func regularExpression() throws -> NSRegularExpression {
return try NSRegularExpression(pattern: regex, options: .DotMatchesLineSeparators)
}

public func match(match: NSTextCheckingResult, attributedString: NSMutableAttributedString) {
let range = NSRange(location: match.range.location + 1, length: 1)
// escape one character
let matchString = attributedString.attributedSubstringFromRange(range).string
if let escapedString = Array(matchString.utf16).first
.flatMap({ String(format: "%04x", $0) }) {
if let escapedString = Array<UInt16>(matchString.utf16).first
.flatMap({ (value: UInt16) -> String in String(format: "%04x", value) }) {
attributedString.replaceCharactersInRange(range, withString: escapedString)
}
}

}
42 changes: 21 additions & 21 deletions MarkdownKit/Classes/Elements/MarkdownCode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,26 @@
import UIKit

public class MarkdownCode: MarkdownCommonElement {

private static let regex = "(\\s+|^)(`+)(\\s*.*?[^`]\\s*)(\\1)(?!`)"

public var font: UIFont?
public var color: UIColor?

public var regex: String {
return MarkdownCode.regex
}

public init(font: UIFont? = UIFont(name: "Courier New",size: UIFont.smallSystemFontSize()),
color: UIColor? = nil) {
self.font = font
self.color = color
}

public func addAttributes(attributedString: NSMutableAttributedString, range: NSRange) {
let matchString = attributedString.attributedSubstringFromRange(range).string
guard let unescapedString = matchString.unescapeUTF16() else { return }
attributedString.replaceCharactersInRange(range, withString: unescapedString)
attributedString.addAttributes(attributes, range: NSRange(location: range.location, length: unescapedString.characters.count))
}
private static let regex = "(\\s+|^)(`+)(\\s*.*?[^`]\\s*)(\\1)(?!`)"

public var font: UIFont?
public var color: UIColor?

public var regex: String {
return MarkdownCode.regex
}

public init(font: UIFont? = UIFont(name: "Courier New",size: UIFont.smallSystemFontSize()),
color: UIColor? = nil) {
self.font = font
self.color = color
}

public func addAttributes(attributedString: NSMutableAttributedString, range: NSRange) {
let matchString: String = attributedString.attributedSubstringFromRange(range).string
guard let unescapedString = matchString.unescapeUTF16() else { return }
attributedString.replaceCharactersInRange(range, withString: unescapedString)
attributedString.addAttributes(attributes, range: NSRange(location: range.location, length: unescapedString.characters.count))
}
}
14 changes: 7 additions & 7 deletions MarkdownKit/Classes/Elements/MarkdownHeader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,19 @@
import UIKit

public class MarkdownHeader: MarkdownLevelElement {

private static let regex = "^(#{1,%@})\\s*(.+)$"

public var maxLevel: Int
public var font: UIFont?
public var color: UIColor?
public var fontIncrease: Int

public var regex: String {
let level = maxLevel > 0 ? "\(maxLevel)" : ""
let level: String = maxLevel > 0 ? "\(maxLevel)" : ""
return String(format: MarkdownHeader.regex, level)
}

public init(maxLevel: Int = 0,
font: UIFont? = UIFont.boldSystemFontOfSize(UIFont.smallSystemFontSize()),
fontIncrease: Int = 2, color: UIColor? = nil) {
Expand All @@ -30,11 +30,11 @@ public class MarkdownHeader: MarkdownLevelElement {
self.color = color
self.fontIncrease = fontIncrease
}

public func formatText(attributedString: NSMutableAttributedString, range: NSRange, level: Int) {
attributedString.deleteCharactersInRange(range)
}

public func attributesForLevel(level: Int) -> [String: AnyObject] {
var attributes = self.attributes
if let font = font {
Expand Down
12 changes: 6 additions & 6 deletions MarkdownKit/Classes/Elements/MarkdownList.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,20 @@
import UIKit

public class MarkdownList: MarkdownLevelElement {

private static let regex = "^([\\*\\+\\-]{1,%@})\\s+(.+)$"

public var maxLevel: Int
public var font: UIFont?
public var color: UIColor?
public var separator: String
public var indicator: String

public var regex: String {
let level = maxLevel > 0 ? "\(maxLevel)" : ""
let level: String = maxLevel > 0 ? "\(maxLevel)" : ""
return String(format: MarkdownList.regex, level)
}

public init(maxLevel: Int = 0, indicator: String = "", separator: String = " ", font: UIFont? = nil,
color: UIColor? = nil) {
self.maxLevel = maxLevel
Expand All @@ -31,7 +31,7 @@ public class MarkdownList: MarkdownLevelElement {
self.font = font
self.color = color
}

public func formatText(attributedString: NSMutableAttributedString, range: NSRange, level: Int) {
var string = (0..<level).reduce("") { (string, _) -> String in
return "\(string)\(separator)"
Expand Down
27 changes: 13 additions & 14 deletions MarkdownKit/Classes/Elements/MarkdownQuote.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,36 +9,35 @@
import UIKit

public class MarkdownQuote: MarkdownLevelElement {

private static let regex = "^(\\>{1,%@})\\s*(.+)$"

public var maxLevel: Int
public var font: UIFont?
public var color: UIColor?
public var separator: String
public var indicator: String

public var regex: String {
let level = maxLevel > 0 ? "\(maxLevel)" : ""
let level: String = maxLevel > 0 ? "\(maxLevel)" : ""
return String(format: MarkdownQuote.regex, level)
}

public init(maxLevel: Int = 0, indicator: String = ">", separator: String = " ", font: UIFont? = nil,
color: UIColor? = nil) {
color: UIColor? = nil) {
self.maxLevel = maxLevel
self.indicator = indicator
self.separator = separator
self.font = font
self.color = color
}


public func formatText(attributedString: NSMutableAttributedString, range: NSRange, level: Int) {
var string = (0..<level).reduce("") { (string, _) -> String in
return "\(string)\(separator)"
}
string = "\(string)\(indicator) "
attributedString.replaceCharactersInRange(range, withString: string)
var string = (0..<level).reduce("") { (string: String, _: Int) -> String in
return "\(string)\(separator)"
}
string = "\(string)\(indicator) "
attributedString.replaceCharactersInRange(range, withString: string)
}
}

26 changes: 15 additions & 11 deletions MarkdownKit/Classes/MarkdownParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ public class MarkdownParser {
private var escapingElements: [MarkdownElement]
private var defaultElements: [MarkdownElement]
private var unescapingElements: [MarkdownElement]

public var customElements: [MarkdownElement]

// MARK: Basic Elements
public var header = MarkdownHeader()
public var list = MarkdownList()
Expand All @@ -26,12 +26,12 @@ public class MarkdownParser {
public var bold = MarkdownBold()
public var italic = MarkdownItalic()
public var code = MarkdownCode()

// MARK: Escaping Elements
private var codeEscaping = MarkdownCodeEscaping()
private var escaping = MarkdownEscaping()
private var unescaping = MarkdownUnescaping()

// MARK: Configuration
/// Enables or disables detection of URLs even without Markdown format
public var automaticLinkDetectionEnabled: Bool = true
Expand All @@ -44,12 +44,12 @@ public class MarkdownParser {
self.unescapingElements = [code, unescaping]
self.customElements = customElements
}

// MARK: Element Extensibility
public func addCustomElement(element: MarkdownElement) {
customElements.append(element)
}

public func removeCustomElement(element: MarkdownElement) {
guard let index = customElements.indexOf({ someElement -> Bool in
return element === someElement
Expand All @@ -58,20 +58,24 @@ public class MarkdownParser {
}
customElements.removeAtIndex(index)
}

// MARK: Parsing
public func parse(markdown: String) -> NSAttributedString {
return parse(NSAttributedString(string: markdown))
}

public func parse(markdown: NSAttributedString) -> NSAttributedString {
let attributedString = NSMutableAttributedString(attributedString: markdown)
(escapingElements + defaultElements + customElements + unescapingElements).forEach { element in
var elements: [MarkdownElement] = escapingElements
elements.appendContentsOf(defaultElements)
elements.appendContentsOf(customElements)
elements.appendContentsOf(unescapingElements)
elements.forEach { element in
if automaticLinkDetectionEnabled || element.dynamicType != MarkdownAutomaticLink.self {
element.parse(attributedString)
}
}
return attributedString
}
}

}

0 comments on commit aeead78

Please sign in to comment.