Skip to content

Commit

Permalink
Preserve attributes with custom font
Browse files Browse the repository at this point in the history
  • Loading branch information
gaebel committed Aug 20, 2021
1 parent 761a30e commit d95f931
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ public extension MarkdownFont {
func bold() -> MarkdownFont {
return NSFontManager().convert(self, toHaveTrait: NSFontTraitMask.boldFontMask)
}

func isItalic() -> Bool {
return NSFontManager().traits(of: self).contains(.italicFontMask)
}

func isBold() -> Bool {
return NSFontManager().traits(of: self).contains(.boldFontMask)
}

func withSize(_ size: CGFloat) -> NSFont {
return NSFontManager().convert(self, toSize: size)
Expand Down
9 changes: 7 additions & 2 deletions MarkdownKit/Sources/Common/Elements/Bold/MarkdownBold.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,18 @@ open class MarkdownBold: MarkdownCommonElement {
}

public init(font: MarkdownFont? = nil, color: MarkdownColor? = nil) {
self.font = font?.bold()
self.font = font
self.color = color
}

public func match(_ match: NSTextCheckingResult, attributedString: NSMutableAttributedString) {
attributedString.deleteCharacters(in: match.range(at: 4))

attributedString.enumerateAttribute(.font, in: match.range(at: 3)) { value, range, stop in
if let font = value as? MarkdownFont {
guard let font = value as? MarkdownFont else { return }
if let customFont = self.font {
self.font = font.isItalic() ? customFont.bold().italic() : customFont.bold()
} else {
attributedString.addAttribute(
NSAttributedString.Key.font,
value: font.bold(),
Expand All @@ -36,6 +39,8 @@ open class MarkdownBold: MarkdownCommonElement {
}
}

addAttributes(attributedString, range: match.range(at: 3))

attributedString.deleteCharacters(in: match.range(at: 2))
}
}
11 changes: 8 additions & 3 deletions MarkdownKit/Sources/Common/Elements/Italic/MarkdownItalic.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,19 @@ open class MarkdownItalic: MarkdownCommonElement {
return MarkdownItalic.regex
}

public init(font: MarkdownFont?, color: MarkdownColor? = nil) {
self.font = font?.italic()
public init(font: MarkdownFont? = nil, color: MarkdownColor? = nil) {
self.font = font
self.color = color
}

public func match(_ match: NSTextCheckingResult, attributedString: NSMutableAttributedString) {
attributedString.deleteCharacters(in: match.range(at: 4))

attributedString.enumerateAttribute(.font, in: match.range(at: 3)) { value, range, stop in
if let font = value as? MarkdownFont {
guard let font = value as? MarkdownFont else { return }
if let customFont = self.font {
self.font = font.isBold() ? customFont.bold().italic() : customFont.italic()
} else {
attributedString.addAttribute(
NSAttributedString.Key.font,
value: font.italic(),
Expand All @@ -36,6 +39,8 @@ open class MarkdownItalic: MarkdownCommonElement {
}
}

addAttributes(attributedString, range: match.range(at: 3))

attributedString.deleteCharacters(in: match.range(at: 2))
}
}
18 changes: 9 additions & 9 deletions MarkdownKit/Sources/Common/MarkdownParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -94,15 +94,15 @@ open class MarkdownParser {
self.font = font
self.color = color

self.header = MarkdownHeader(font: font)
self.list = MarkdownList(font: font)
self.quote = MarkdownQuote(font: font)
self.link = MarkdownLink(font: font)
self.automaticLink = MarkdownAutomaticLink(font: font)
self.bold = MarkdownBold(font: font)
self.italic = MarkdownItalic(font: font)
self.code = MarkdownCode(font: font)
self.strikethrough = MarkdownStrikethrough(font: font)
self.header = MarkdownHeader()
self.list = MarkdownList()
self.quote = MarkdownQuote()
self.link = MarkdownLink()
self.automaticLink = MarkdownAutomaticLink()
self.bold = MarkdownBold()
self.italic = MarkdownItalic()
self.code = MarkdownCode()
self.strikethrough = MarkdownStrikethrough()

self.escapingElements = [codeEscaping, escaping]
self.unescapingElements = [code, unescaping]
Expand Down
8 changes: 8 additions & 0 deletions MarkdownKit/Sources/UIKit/Extensions/UIFont+Traits.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ extension UIFont {
func italic() -> UIFont {
return withTraits(fontDescriptor.symbolicTraits, .traitItalic) ?? self
}

func isItalic() -> Bool {
return fontDescriptor.symbolicTraits.contains(.traitItalic)
}

func isBold() -> Bool {
return fontDescriptor.symbolicTraits.contains(.traitBold)
}
}

#endif

0 comments on commit d95f931

Please sign in to comment.