Skip to content

Commit fb2264b

Browse files
authored
Merge pull request #30 from 5anniversary/font_family_n_text_align
[Feat] text align style
2 parents 2b03114 + db737b8 commit fb2264b

File tree

8 files changed

+73
-22
lines changed

8 files changed

+73
-22
lines changed

Sources/ZMarkupParser/Core/Markup/Markups/HeadMarkup.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ final class HeadMarkup: Markup {
1717
case h6
1818
}
1919

20-
let levle: Level
21-
init(levle: Level) {
22-
self.levle = levle
20+
let level: Level
21+
init(level: Level) {
22+
self.level = level
2323
}
2424

2525
weak var parentMarkup: Markup? = nil

Sources/ZMarkupParser/HTML/HTMLTag/HTMLTagStyleAttribute/HTMLTagStyleAttributeVisitor.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public protocol HTMLTagStyleAttributeVisitor {
1919
func visit(_ styleAttribute: FontFamilyHTMLTagStyleAttribute) -> Result
2020
func visit(_ styleAttribute: LineHeightHTMLTagStyleAttribute) -> Result
2121
func visit(_ styleAttribute: WordSpacingHTMLTagStyleAttribute) -> Result
22+
func visit(_ styleAttribute: TextAlignHTMLTagStyleAttribute) -> Result
2223
}
2324

2425
public extension HTMLTagStyleAttributeVisitor {
@@ -36,7 +37,8 @@ public extension ZHTMLParserBuilder {
3637
FontWeightHTMLTagStyleAttribute(),
3738
LineHeightHTMLTagStyleAttribute(),
3839
WordSpacingHTMLTagStyleAttribute(),
39-
FontFamilyHTMLTagStyleAttribute()
40+
FontFamilyHTMLTagStyleAttribute(),
41+
TextAlignHTMLTagStyleAttribute()
4042
]
4143
}
4244
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// TextAlignHTMLTagStyleAttribute.swift
3+
//
4+
//
5+
// Created by 오준현 on 2023/08/10.
6+
//
7+
import Foundation
8+
9+
public struct TextAlignHTMLTagStyleAttribute: HTMLTagStyleAttribute {
10+
public let styleName: String = "text-align"
11+
12+
public init() {
13+
14+
}
15+
16+
public func accept<V>(_ visitor: V) -> V.Result where V : HTMLTagStyleAttributeVisitor {
17+
return visitor.visit(self)
18+
}
19+
}

Sources/ZMarkupParser/HTML/Processor/HTMLElementMarkupComponentMarkupStyleVisitor.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ struct HTMLElementMarkupComponentMarkupStyleVisitor: MarkupVisitor {
9696

9797
func visit(_ markup: HeadMarkup) -> Result {
9898
let defaultStyle: MarkupStyle?
99-
switch markup.levle {
99+
switch markup.level {
100100
case .h1:
101101
defaultStyle = .h1
102102
case .h2:

Sources/ZMarkupParser/HTML/Processor/HTMLTagAttributeToMarkupStyleVisitor.swift

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,47 @@ struct HTMLTagStyleAttributeToMarkupStyleVisitor: HTMLTagStyleAttributeVisitor {
9292

9393
func visit(_ styleAttribute: LineHeightHTMLTagStyleAttribute) -> Result {
9494
guard let lineHeightFloat = self.convert(fromPX: value) else { return nil }
95-
return MarkupStyle(paragraphStyle: MarkupStyleParagraphStyle(minimumLineHeight: CGFloat(lineHeightFloat), maximumLineHeight: CGFloat(lineHeightFloat)))
95+
return MarkupStyle(paragraphStyle: MarkupStyleParagraphStyle(minimumLineHeight: lineHeightFloat, maximumLineHeight: lineHeightFloat))
9696
}
9797

9898
func visit(_ styleAttribute: WordSpacingHTMLTagStyleAttribute) -> Result {
9999
guard let lineSpacing = self.convert(fromPX: value) else { return nil }
100-
return MarkupStyle(paragraphStyle: MarkupStyleParagraphStyle(lineSpacing: CGFloat(lineSpacing)))
100+
return MarkupStyle(paragraphStyle: MarkupStyleParagraphStyle(lineSpacing: lineSpacing))
101101
}
102102

103-
func convert(fromPX string: String) -> Int? {
104-
guard let regex = try? NSRegularExpression(pattern: "([0-9]+)p(x|t)"),
103+
func convert(fromPX string: String) -> CGFloat? {
104+
guard let regex = try? NSRegularExpression(pattern: "([0-9]+.?[0-9]*)p(x|t)"),
105105
let firstMatch = regex.firstMatch(in: string, options: [], range: NSRange(location: 0, length: string.utf16.count)),
106106
firstMatch.range(at: 1).location != NSNotFound,
107107
let range = Range(firstMatch.range(at: 1), in: string),
108108
let size = Float(String(string[range])) else {
109109
return nil
110110
}
111-
return Int(size)
111+
return CGFloat(size)
112112
}
113+
114+
func visit(_ styleAttribute: TextAlignHTMLTagStyleAttribute) -> MarkupStyle? {
115+
return MarkupStyle(
116+
paragraphStyle: MarkupStyleParagraphStyle(
117+
alignment: convertAlign(align: value)
118+
)
119+
)
120+
}
121+
122+
private func convertAlign(align: String) -> NSTextAlignment? {
123+
switch align {
124+
case "center":
125+
return .center
126+
case "justified":
127+
return .justified
128+
case "natural":
129+
return .natural
130+
case "right":
131+
return .right
132+
case "left":
133+
return .left
134+
default:
135+
return nil
136+
}
137+
}
113138
}

Sources/ZMarkupParser/HTML/Processor/HTMLTagNameToHTMLMarkupVisitor.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,27 +114,27 @@ struct HTMLTagNameToMarkupVisitor: HTMLTagNameVisitor {
114114
}
115115

116116
func visit(_ tagName: H1_HTMLTagName) -> Result {
117-
return HeadMarkup(levle: .h1)
117+
return HeadMarkup(level: .h1)
118118
}
119119

120120
func visit(_ tagName: H2_HTMLTagName) -> Result {
121-
return HeadMarkup(levle: .h2)
121+
return HeadMarkup(level: .h2)
122122
}
123123

124124
func visit(_ tagName: H3_HTMLTagName) -> Result {
125-
return HeadMarkup(levle: .h3)
125+
return HeadMarkup(level: .h3)
126126
}
127127

128128
func visit(_ tagName: H4_HTMLTagName) -> Result {
129-
return HeadMarkup(levle: .h4)
129+
return HeadMarkup(level: .h4)
130130
}
131131

132132
func visit(_ tagName: H5_HTMLTagName) -> Result {
133-
return HeadMarkup(levle: .h5)
133+
return HeadMarkup(level: .h5)
134134
}
135135

136136
func visit(_ tagName: H6_HTMLTagName) -> Result {
137-
return HeadMarkup(levle: .h6)
137+
return HeadMarkup(level: .h6)
138138
}
139139

140140
func visit(_ tagName: S_HTMLTagName) -> Result {

Tests/ZMarkupParserTests/HTML/AllTagStyleAttributesHasAddToBuilderDefaultListTests.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ final class AllTagStyleAttributesHasAddToBuilderDefaultListTests: XCTestCase {
1515
ZHTMLParserBuilder.styleAttributes.forEach { style in
1616
let _ = visitor.visit(styleAttribute: style)
1717
}
18-
XCTAssertEqual(visitor.count, 7, "Must added new pre-defined HTMLTagStyleAttribute to ZHTMLParserBuilder.styleAttributes")
18+
XCTAssertEqual(visitor.count, 8, "Must added new pre-defined HTMLTagStyleAttribute to ZHTMLParserBuilder.styleAttributes")
1919
}
2020
}
2121

@@ -63,4 +63,9 @@ private class StubVisitor: HTMLTagStyleAttributeVisitor {
6363
count += 1
6464
return count
6565
}
66+
67+
func visit(_ styleAttribute: TextAlignHTMLTagStyleAttribute) -> Int {
68+
count += 1
69+
return count
70+
}
6671
}

Tests/ZMarkupParserTests/HTML/HTMLElementMarkupComponentMarkupStyleVisitorTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ final class HTMLElementMarkupComponentMarkupStyleVisitorTests: XCTestCase {
1414
func testDefaultStyleByDefault() {
1515
let visitor = HTMLElementMarkupComponentMarkupStyleVisitor(policy: .respectMarkupStyleFromCode, components: [], styleAttributes: [])
1616

17-
let result = visitor.visit(markup: HeadMarkup(levle: .h1))
17+
let result = visitor.visit(markup: HeadMarkup(level: .h1))
1818
XCTAssertEqual(result?.font.size, MarkupStyle.h1.font.size)
1919
}
2020

@@ -28,7 +28,7 @@ final class HTMLElementMarkupComponentMarkupStyleVisitorTests: XCTestCase {
2828
}
2929

3030
func testDefaultStyleShouldOverrideByCustomStyle() {
31-
let markup = HeadMarkup(levle: .h1)
31+
let markup = HeadMarkup(level: .h1)
3232
let customStyle = MarkupStyle(font: .init(size: 99))
3333
let visitor = HTMLElementMarkupComponentMarkupStyleVisitor(policy: .respectMarkupStyleFromCode, components: [.init(markup: markup, value: .init(tag: .init(tagName: H1_HTMLTagName(), customStyle: customStyle), tagAttributedString: NSAttributedString(string: "<h1>test</h1>"), attributes: [:]))], styleAttributes: [])
3434

@@ -37,15 +37,15 @@ final class HTMLElementMarkupComponentMarkupStyleVisitorTests: XCTestCase {
3737
}
3838

3939
func testDefaultStyleShouldOverrideByStyleAttributed() {
40-
let markup = HeadMarkup(levle: .h1)
40+
let markup = HeadMarkup(level: .h1)
4141
let visitor = HTMLElementMarkupComponentMarkupStyleVisitor(policy: .respectMarkupStyleFromCode, components: [.init(markup: markup, value: .init(tag: .init(tagName: H1_HTMLTagName()), tagAttributedString: NSAttributedString(string: "<h1>test</h1>"), attributes: ["style": "font-size:99pt"]))], styleAttributes: [FontSizeHTMLTagStyleAttribute()])
4242

4343
let result = visitor.visit(markup: markup)
4444
XCTAssertEqual(result?.font.size, 99)
4545
}
4646

4747
func testDefaultStylePolicyRespectMarkupStyleFromCode() {
48-
let markup = HeadMarkup(levle: .h1)
48+
let markup = HeadMarkup(level: .h1)
4949
let customStyle = MarkupStyle(font: .init(size: 109))
5050
let visitor = HTMLElementMarkupComponentMarkupStyleVisitor(policy: .respectMarkupStyleFromCode, components: [.init(markup: markup, value: .init(tag: .init(tagName: H1_HTMLTagName(), customStyle: customStyle), tagAttributedString: NSAttributedString(string: "<h1>test</h1>"), attributes: ["style": "font-size:99pt"]))], styleAttributes: [FontSizeHTMLTagStyleAttribute()])
5151

@@ -54,7 +54,7 @@ final class HTMLElementMarkupComponentMarkupStyleVisitorTests: XCTestCase {
5454
}
5555

5656
func testDefaultStylePolicyRespectMarkupStyleFromHTMLStyleAttribute() {
57-
let markup = HeadMarkup(levle: .h1)
57+
let markup = HeadMarkup(level: .h1)
5858
let customStyle = MarkupStyle(font: .init(size: 109))
5959
let visitor = HTMLElementMarkupComponentMarkupStyleVisitor(policy: .respectMarkupStyleFromHTMLStyleAttribute, components: [.init(markup: markup, value: .init(tag: .init(tagName: H1_HTMLTagName(), customStyle: customStyle), tagAttributedString: NSAttributedString(string: "<h1>test</h1>"), attributes: ["style": "font-size:99pt"]))], styleAttributes: [FontSizeHTMLTagStyleAttribute()])
6060

0 commit comments

Comments
 (0)