Skip to content

Commit 82664ed

Browse files
authored
Merge pull request #21 from prolificinteractive/feature/factory_functions_and_underline_support
Added factory functions and underline support
2 parents d314237 + e24b23d commit 82664ed

12 files changed

+1198
-8
lines changed

Marker/Marker.xcodeproj/project.pbxproj

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,21 @@
7272
27C4E66B1ED60C7700DDE387 /* UILabelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C4E6691ED60C7700DDE387 /* UILabelExtension.swift */; };
7373
480C7A5F1F15832A0094E4EA /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 271C85C81ED4E37700F8BBBB /* ParserTests.swift */; };
7474
480C7A601F15832A0094E4EA /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 271C85C81ED4E37700F8BBBB /* ParserTests.swift */; };
75+
48F232751F1FB7B600E86D5D /* TextTransform+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232741F1FB7B600E86D5D /* TextTransform+Extensions.swift */; };
76+
48F232761F1FB7B600E86D5D /* TextTransform+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232741F1FB7B600E86D5D /* TextTransform+Extensions.swift */; };
77+
48F232771F1FB7B600E86D5D /* TextTransform+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232741F1FB7B600E86D5D /* TextTransform+Extensions.swift */; };
78+
48F2327C1F1FBA4400E86D5D /* TextTransformEquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232781F1FBA2200E86D5D /* TextTransformEquatableTests.swift */; };
79+
48F2327D1F1FBA4400E86D5D /* TextTransformEquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232781F1FBA2200E86D5D /* TextTransformEquatableTests.swift */; };
80+
48F2327E1F1FBA4500E86D5D /* TextTransformEquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232781F1FBA2200E86D5D /* TextTransformEquatableTests.swift */; };
81+
48F232801F1FBA7800E86D5D /* TextStyle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F2327F1F1FBA7800E86D5D /* TextStyle+Extensions.swift */; };
82+
48F232811F1FBA7800E86D5D /* TextStyle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F2327F1F1FBA7800E86D5D /* TextStyle+Extensions.swift */; };
83+
48F232821F1FBA7800E86D5D /* TextStyle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F2327F1F1FBA7800E86D5D /* TextStyle+Extensions.swift */; };
84+
48F232841F1FBD1300E86D5D /* TextStyleEquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232831F1FBD1300E86D5D /* TextStyleEquatableTests.swift */; };
85+
48F232851F1FBD1300E86D5D /* TextStyleEquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232831F1FBD1300E86D5D /* TextStyleEquatableTests.swift */; };
86+
48F232861F1FBD1300E86D5D /* TextStyleEquatableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232831F1FBD1300E86D5D /* TextStyleEquatableTests.swift */; };
87+
48F232881F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232871F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift */; };
88+
48F232891F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232871F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift */; };
89+
48F2328A1F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F232871F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift */; };
7590
/* End PBXBuildFile section */
7691

7792
/* Begin PBXContainerItemProxy section */
@@ -132,6 +147,11 @@
132147
27C4E6601ED6080B00DDE387 /* UITextViewExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UITextViewExtension.swift; path = TextView/UITextViewExtension.swift; sourceTree = "<group>"; };
133148
27C4E6661ED6082800DDE387 /* NSTextViewExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NSTextViewExtension.swift; path = TextView/NSTextViewExtension.swift; sourceTree = "<group>"; };
134149
27C4E6691ED60C7700DDE387 /* UILabelExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UILabelExtension.swift; path = Label/UILabelExtension.swift; sourceTree = "<group>"; };
150+
48F232741F1FB7B600E86D5D /* TextTransform+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TextTransform+Extensions.swift"; sourceTree = "<group>"; };
151+
48F232781F1FBA2200E86D5D /* TextTransformEquatableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextTransformEquatableTests.swift; sourceTree = "<group>"; };
152+
48F2327F1F1FBA7800E86D5D /* TextStyle+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TextStyle+Extensions.swift"; sourceTree = "<group>"; };
153+
48F232831F1FBD1300E86D5D /* TextStyleEquatableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextStyleEquatableTests.swift; sourceTree = "<group>"; };
154+
48F232871F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextStyleFactoryFunctionTests.swift; sourceTree = "<group>"; };
135155
/* End PBXFileReference section */
136156

137157
/* Begin PBXFrameworksBuildPhase section */
@@ -216,7 +236,9 @@
216236
271C85AB1ED4E2B700F8BBBB /* Parser */,
217237
271C85B31ED4E2B700F8BBBB /* String+Extensions.swift */,
218238
271C85B41ED4E2B700F8BBBB /* TextStyle.swift */,
239+
48F2327F1F1FBA7800E86D5D /* TextStyle+Extensions.swift */,
219240
271C85B51ED4E2B700F8BBBB /* TextTransform.swift */,
241+
48F232741F1FB7B600E86D5D /* TextTransform+Extensions.swift */,
220242
27C4E61E1ED5EE3000DDE387 /* Utility */,
221243
);
222244
path = Marker;
@@ -226,6 +248,9 @@
226248
isa = PBXGroup;
227249
children = (
228250
271C85C81ED4E37700F8BBBB /* ParserTests.swift */,
251+
48F232831F1FBD1300E86D5D /* TextStyleEquatableTests.swift */,
252+
48F232871F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift */,
253+
48F232781F1FBA2200E86D5D /* TextTransformEquatableTests.swift */,
229254
271C859A1ED4E2A000F8BBBB /* Info.plist */,
230255
271C85C71ED4E37600F8BBBB /* MarkerTests-Bridging-Header.h */,
231256
);
@@ -574,13 +599,15 @@
574599
buildActionMask = 2147483647;
575600
files = (
576601
271C85C51ED4E2B700F8BBBB /* TextStyle.swift in Sources */,
602+
48F232751F1FB7B600E86D5D /* TextTransform+Extensions.swift in Sources */,
577603
271C85C01ED4E2B700F8BBBB /* MarkdownParser.swift in Sources */,
578604
271C85BB1ED4E2B700F8BBBB /* Markup.swift in Sources */,
579605
27C4E66A1ED60C7700DDE387 /* UILabelExtension.swift in Sources */,
580606
27C4E6551ED6064400DDE387 /* Font.swift in Sources */,
581607
271C85BD1ED4E2B700F8BBBB /* Element.swift in Sources */,
582608
271C85BF1ED4E2B700F8BBBB /* MarkdownElement.swift in Sources */,
583609
271C85C31ED4E2B700F8BBBB /* TagParser.swift in Sources */,
610+
48F232801F1FBA7800E86D5D /* TextStyle+Extensions.swift in Sources */,
584611
27C4E64F1ED6064400DDE387 /* UIButtonExtension.swift in Sources */,
585612
271C85C11ED4E2B700F8BBBB /* Symbol.swift in Sources */,
586613
271C85BE1ED4E2B700F8BBBB /* ElementParser.swift in Sources */,
@@ -599,6 +626,9 @@
599626
isa = PBXSourcesBuildPhase;
600627
buildActionMask = 2147483647;
601628
files = (
629+
48F2327C1F1FBA4400E86D5D /* TextTransformEquatableTests.swift in Sources */,
630+
48F232881F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift in Sources */,
631+
48F232841F1FBD1300E86D5D /* TextStyleEquatableTests.swift in Sources */,
602632
271C85C91ED4E37700F8BBBB /* ParserTests.swift in Sources */,
603633
);
604634
runOnlyForDeploymentPostprocessing = 0;
@@ -608,13 +638,15 @@
608638
buildActionMask = 2147483647;
609639
files = (
610640
27C4E6091ED5ED6400DDE387 /* TextStyle.swift in Sources */,
641+
48F232761F1FB7B600E86D5D /* TextTransform+Extensions.swift in Sources */,
611642
27C4E6041ED5ED6400DDE387 /* MarkdownParser.swift in Sources */,
612643
27C4E5FF1ED5ED6400DDE387 /* Markup.swift in Sources */,
613644
27C4E66B1ED60C7700DDE387 /* UILabelExtension.swift in Sources */,
614645
27C4E6561ED6064400DDE387 /* Font.swift in Sources */,
615646
27C4E6011ED5ED6400DDE387 /* Element.swift in Sources */,
616647
27C4E6031ED5ED6400DDE387 /* MarkdownElement.swift in Sources */,
617648
27C4E6071ED5ED6400DDE387 /* TagParser.swift in Sources */,
649+
48F232811F1FBA7800E86D5D /* TextStyle+Extensions.swift in Sources */,
618650
27C4E6501ED6064400DDE387 /* UIButtonExtension.swift in Sources */,
619651
27C4E6051ED5ED6400DDE387 /* Symbol.swift in Sources */,
620652
27C4E6021ED5ED6400DDE387 /* ElementParser.swift in Sources */,
@@ -633,6 +665,9 @@
633665
isa = PBXSourcesBuildPhase;
634666
buildActionMask = 2147483647;
635667
files = (
668+
48F2327D1F1FBA4400E86D5D /* TextTransformEquatableTests.swift in Sources */,
669+
48F232891F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift in Sources */,
670+
48F232851F1FBD1300E86D5D /* TextStyleEquatableTests.swift in Sources */,
636671
480C7A601F15832A0094E4EA /* ParserTests.swift in Sources */,
637672
);
638673
runOnlyForDeploymentPostprocessing = 0;
@@ -643,9 +678,11 @@
643678
files = (
644679
27C4E61A1ED5ED6500DDE387 /* TextStyle.swift in Sources */,
645680
27C4E64E1ED6064400DDE387 /* NSButtonExtension.swift in Sources */,
681+
48F232821F1FBA7800E86D5D /* TextStyle+Extensions.swift in Sources */,
646682
27C4E6151ED5ED6500DDE387 /* MarkdownParser.swift in Sources */,
647683
27C4E65A1ED6064400DDE387 /* NSTextFieldExtension.swift in Sources */,
648684
27C4E6541ED6064400DDE387 /* Color.swift in Sources */,
685+
48F232771F1FB7B600E86D5D /* TextTransform+Extensions.swift in Sources */,
649686
27C4E6101ED5ED6500DDE387 /* Markup.swift in Sources */,
650687
27C4E6121ED5ED6500DDE387 /* Element.swift in Sources */,
651688
27C4E6141ED5ED6500DDE387 /* MarkdownElement.swift in Sources */,
@@ -666,6 +703,9 @@
666703
isa = PBXSourcesBuildPhase;
667704
buildActionMask = 2147483647;
668705
files = (
706+
48F2327E1F1FBA4500E86D5D /* TextTransformEquatableTests.swift in Sources */,
707+
48F2328A1F1FC2F900E86D5D /* TextStyleFactoryFunctionTests.swift in Sources */,
708+
48F232861F1FBD1300E86D5D /* TextStyleEquatableTests.swift in Sources */,
669709
480C7A5F1F15832A0094E4EA /* ParserTests.swift in Sources */,
670710
);
671711
runOnlyForDeploymentPostprocessing = 0;

Marker/Marker/Marker.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public func parsedMarkdownString(from markdownText: String,
6565
elements.forEach { (element) in
6666
var font: Font? = nil
6767
var strikethroughStyle: NSUnderlineStyle? = nil
68+
var underlineStyle: NSUnderlineStyle? = nil
6869

6970
switch element {
7071
case .em(_):
@@ -73,6 +74,8 @@ public func parsedMarkdownString(from markdownText: String,
7374
font = textStyle.strongFont
7475
case .strikethrough(_):
7576
strikethroughStyle = textStyle.strikethroughStyle
77+
case .underline(_):
78+
underlineStyle = textStyle.underlineStyle
7679
}
7780

7881
if let font = font {
@@ -88,6 +91,14 @@ public func parsedMarkdownString(from markdownText: String,
8891
range: parsedString.range(from: element.range))
8992
}
9093
}
94+
95+
if let underlineStyle = underlineStyle {
96+
attributedString.addAttributes([NSUnderlineStyleAttributeName: underlineStyle.rawValue], range: parsedString.range(from: element.range))
97+
98+
if let underlineColor = textStyle.underlineColor {
99+
attributedString.addAttributes([NSUnderlineColorAttributeName: underlineColor], range: parsedString.range(from: element.range))
100+
}
101+
}
91102
}
92103

93104
return attributedString

Marker/Marker/Parser/MarkdownElement.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ import Foundation
1313
/// - em: Emphasis element.
1414
/// - strong: Strong element.
1515
/// - strikethrough: Strikethrough element.
16+
/// - underline: Underline element.
1617
internal enum MarkdownElement {
1718

1819
case em(Range<Index>)
1920
case strong(Range<Index>)
2021
case strikethrough(Range<Index>)
22+
case underline(Range<Index>)
2123

2224
/// Range of characters that the elements apply to.
2325
var range: Range<Index> {
@@ -28,6 +30,8 @@ internal enum MarkdownElement {
2830
return range
2931
case .strikethrough(let range):
3032
return range
33+
case .underline(let range):
34+
return range
3135
}
3236
}
3337

Marker/Marker/Parser/MarkdownParser.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ internal struct MarkdownParser {
2727
private static let underscoreStrongSymbol = Symbol(rawValue: "__")
2828
private static let asteriskStrongSymbol = Symbol(rawValue: "**")
2929
private static let tildeStrikethroughSymbol = Symbol(rawValue: "~~")
30+
private static let equalUnderlineSymbol = Symbol(rawValue: "==")
3031

3132
// MARK: - Static functions
3233

@@ -41,7 +42,8 @@ internal struct MarkdownParser {
4142
let asteriskEmSymbol = asteriskEmSymbol,
4243
let underscoreStrongSymbol = underscoreStrongSymbol,
4344
let asteriskStrongSymbol = asteriskStrongSymbol,
44-
let tildeStrikethroughSymbol = tildeStrikethroughSymbol else {
45+
let tildeStrikethroughSymbol = tildeStrikethroughSymbol,
46+
let equalUnderlineSymbol = equalUnderlineSymbol else {
4547
return (string, [])
4648
}
4749

@@ -53,6 +55,8 @@ internal struct MarkdownParser {
5355
return .strong(element.range)
5456
case tildeStrikethroughSymbol:
5557
return .strikethrough(element.range)
58+
case equalUnderlineSymbol:
59+
return .underline(element.range)
5660
default:
5761
throw ParserError.invalidTagSymbol
5862
}
@@ -63,7 +67,8 @@ internal struct MarkdownParser {
6367
asteriskEmSymbol,
6468
underscoreStrongSymbol,
6569
asteriskStrongSymbol,
66-
tildeStrikethroughSymbol])
70+
tildeStrikethroughSymbol,
71+
equalUnderlineSymbol])
6772
return try (strippedString, elements.map(transformToMarkdownElement))
6873
}
6974

0 commit comments

Comments
 (0)