diff --git a/MarkdownKit/Classes/Elements/Escaping/MarkdownCodeEscaping.swift b/MarkdownKit/Classes/Elements/Escaping/MarkdownCodeEscaping.swift index ff30aa3..86eb88d 100644 --- a/MarkdownKit/Classes/Elements/Escaping/MarkdownCodeEscaping.swift +++ b/MarkdownKit/Classes/Elements/Escaping/MarkdownCodeEscaping.swift @@ -9,27 +9,27 @@ import UIKit public class MarkdownCodeEscaping: MarkdownElement { - + private static let regex = "(? 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(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) } - + } diff --git a/MarkdownKit/Classes/Elements/Escaping/MarkdownEscaping.swift b/MarkdownKit/Classes/Elements/Escaping/MarkdownEscaping.swift index 406d250..042dd49 100644 --- a/MarkdownKit/Classes/Elements/Escaping/MarkdownEscaping.swift +++ b/MarkdownKit/Classes/Elements/Escaping/MarkdownEscaping.swift @@ -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(matchString.utf16).first + .flatMap({ (value: UInt16) -> String in String(format: "%04x", value) }) { attributedString.replaceCharactersInRange(range, withString: escapedString) } } - + } diff --git a/MarkdownKit/Classes/Elements/MarkdownCode.swift b/MarkdownKit/Classes/Elements/MarkdownCode.swift index 76bf989..bbaa438 100644 --- a/MarkdownKit/Classes/Elements/MarkdownCode.swift +++ b/MarkdownKit/Classes/Elements/MarkdownCode.swift @@ -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)) + } } diff --git a/MarkdownKit/Classes/Elements/MarkdownHeader.swift b/MarkdownKit/Classes/Elements/MarkdownHeader.swift index ced2360..a2def43 100644 --- a/MarkdownKit/Classes/Elements/MarkdownHeader.swift +++ b/MarkdownKit/Classes/Elements/MarkdownHeader.swift @@ -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) { @@ -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 { diff --git a/MarkdownKit/Classes/Elements/MarkdownList.swift b/MarkdownKit/Classes/Elements/MarkdownList.swift index 45dfd7f..2e117f1 100644 --- a/MarkdownKit/Classes/Elements/MarkdownList.swift +++ b/MarkdownKit/Classes/Elements/MarkdownList.swift @@ -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 @@ -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.. String in return "\(string)\(separator)" diff --git a/MarkdownKit/Classes/Elements/MarkdownQuote.swift b/MarkdownKit/Classes/Elements/MarkdownQuote.swift index 15fcac4..aa70df2 100644 --- a/MarkdownKit/Classes/Elements/MarkdownQuote.swift +++ b/MarkdownKit/Classes/Elements/MarkdownQuote.swift @@ -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.. String in - return "\(string)\(separator)" - } - string = "\(string)\(indicator) " - attributedString.replaceCharactersInRange(range, withString: string) + var string = (0.. String in + return "\(string)\(separator)" + } + string = "\(string)\(indicator) " + attributedString.replaceCharactersInRange(range, withString: string) } } - diff --git a/MarkdownKit/Classes/MarkdownParser.swift b/MarkdownKit/Classes/MarkdownParser.swift index 9e0e1c5..d3c4f7c 100644 --- a/MarkdownKit/Classes/MarkdownParser.swift +++ b/MarkdownKit/Classes/MarkdownParser.swift @@ -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() @@ -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 @@ -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 @@ -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 } - -} \ No newline at end of file + +}