Skip to content

Commit 1864076

Browse files
committed
resolve PR comments
1 parent 38d881f commit 1864076

File tree

5 files changed

+56
-15
lines changed

5 files changed

+56
-15
lines changed

Sources/SwiftDocC/Model/Rendering/Content/RenderBlockContent+Capitalization.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,32 @@ extension RenderBlockContent: AutoCapitalizable {
5959

6060
extension RenderBlockContent.Paragraph: AutoCapitalizable {
6161
var withFirstWordCapitalized: RenderBlockContent.Paragraph {
62+
guard !self.inlineContent.isEmpty else {
63+
return self
64+
}
65+
6266
let inlineContent = [self.inlineContent[0].withFirstWordCapitalized] + self.inlineContent[1...]
6367
return .init(inlineContent: inlineContent)
6468
}
6569
}
6670

6771
extension RenderBlockContent.Aside: AutoCapitalizable {
6872
var withFirstWordCapitalized: RenderBlockContent.Aside {
73+
guard !self.content.isEmpty else {
74+
return self
75+
}
76+
6977
let content = [self.content[0].withFirstWordCapitalized] + self.content[1...]
7078
return .init(style: self.style, content: content)
7179
}
7280
}
7381

7482
extension RenderBlockContent.Small: AutoCapitalizable {
7583
var withFirstWordCapitalized: RenderBlockContent.Small {
84+
guard !self.inlineContent.isEmpty else {
85+
return self
86+
}
87+
7688
let inlineContent = [self.inlineContent[0].withFirstWordCapitalized] + self.inlineContent[1...]
7789
return .init(inlineContent: inlineContent)
7890
}

Sources/SwiftDocC/Model/Rendering/RenderContentCompiler.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ struct RenderContentCompiler: MarkupVisitor {
4242
content: aside.content.reduce(into: [], { result, child in result.append(contentsOf: visit(child))}) as! [RenderBlockContent]
4343
)
4444

45-
return [RenderBlockContent.aside(newAside).withFirstWordCapitalized]
45+
return [RenderBlockContent.aside(newAside.withFirstWordCapitalized)]
4646
}
4747

4848
mutating func visitCodeBlock(_ codeBlock: CodeBlock) -> [RenderContent] {

Sources/SwiftDocC/Utility/FoundationExtensions/String+Capitalization.swift

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,52 @@ extension String {
1919

2020
guard !self.isEmpty else { return self }
2121

22-
let selfTrimmedWhitespace = self.trimmingCharacters(in: .whitespacesAndNewlines)
22+
// let selfTrimmedWhitespace = self.trimmingCharacters(in: .whitespacesAndNewlines)
23+
// let firstWord = selfTrimmedWhitespace.prefix(while: { !$0.isWhitespace && !$0.isNewline })
24+
// guard firstWord.count > 0 else { return self }
25+
// let firstWordCharacters = CharacterSet.init(charactersIn: String(firstWord))
26+
// let acceptableCharacters = CharacterSet.lowercaseLetters.union(CharacterSet.punctuationCharacters)
27+
// guard firstWordCharacters.isSubset(of: acceptableCharacters) else {
28+
// return self
29+
// }
2330

24-
let firstWord = selfTrimmedWhitespace.prefix(while: { !$0.isWhitespace && !$0.isNewline })
2531

26-
guard firstWord.count > 0 else { return self }
32+
guard let firstWordStartIndex = self.firstIndex(where: { !$0.isWhitespace && !$0.isNewline }) else { return self }
2733

28-
let firstWordCharacters = CharacterSet.init(charactersIn: String(firstWord))
34+
// Find where the first word starts: this is additional processing to handle white spaces before the first word.
35+
let firstWord = self[firstWordStartIndex...].prefix(while: { !$0.isWhitespace && !$0.isNewline})
2936

30-
let acceptableCharacters = CharacterSet.lowercaseLetters.union(CharacterSet.punctuationCharacters)
3137

38+
guard firstWord.count > 0 else { return self }
39+
let firstWordCharacters = CharacterSet.init(charactersIn: String(firstWord))
40+
let acceptableCharacters = CharacterSet.lowercaseLetters.union(CharacterSet.punctuationCharacters)
3241
guard firstWordCharacters.isSubset(of: acceptableCharacters) else {
3342
return self
3443
}
3544

36-
let firstWordArray = Array(String(firstWord))
37-
let returnFirstWordArray = firstWordArray[0].uppercased() + selfTrimmedWhitespace.dropFirst()
3845

39-
return String(returnFirstWordArray)
46+
// Create the result string and make sure it's big enough to contain all the characters
47+
var resultString = String()
48+
resultString.reserveCapacity(self.count)
49+
50+
// Add the white spaces before the first word
51+
resultString.append(contentsOf: self[..<firstWordStartIndex])
52+
53+
// Add the capitalized first word (based on the locale)
54+
resultString.append(contentsOf: String(firstWord).localizedCapitalized)
55+
56+
// Add the rest of the string
57+
let restStartIndex = self.index(firstWordStartIndex, offsetBy: firstWord.count)
58+
resultString.append(contentsOf: self[restStartIndex...])
59+
60+
return resultString
61+
62+
63+
64+
65+
// let firstWordArray = Array(String(firstWord))
66+
// let returnFirstWordArray = firstWordArray[0].uppercased() + selfTrimmedWhitespace.dropFirst()
67+
//
68+
// return String(returnFirstWordArray)
4069
}
4170
}

Tests/SwiftDocCTests/Infrastructure/AutoCapitalizationTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class AutoCapitalizationTests: XCTestCase {
112112
let paramsRenderSection = translatedParameters?.defaultValue?.section as! ParametersRenderSection
113113

114114
XCTAssertEqual(paramsRenderSection.parameters.map(\.content), [
115-
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text("Upper-cased first parameter description.")]))],
115+
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text("Upper-Cased first parameter description.")]))],
116116
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text("The second parameter has extra white spaces")]))],
117117
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text("inValid third parameter will not be capitalized")]))],
118118
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text(""), SwiftDocC.RenderInlineContent.codeVoice(code: "code block"), SwiftDocC.RenderInlineContent.text(" will not be capitalized")]))],
@@ -152,7 +152,7 @@ class AutoCapitalizationTests: XCTestCase {
152152
let paramsRenderSection = translatedParameters?.defaultValue?.section as! ParametersRenderSection
153153

154154
XCTAssertEqual(paramsRenderSection.parameters.map(\.content), [
155-
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text("Upper-cased first parameter description.")]))],
155+
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text("Upper-Cased first parameter description.")]))],
156156
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text("The second parameter has extra white spaces")]))],
157157
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text("inValid third parameter will not be capitalized")]))],
158158
[SwiftDocC.RenderBlockContent.paragraph(SwiftDocC.RenderBlockContent.Paragraph(inlineContent: [SwiftDocC.RenderInlineContent.text(""), SwiftDocC.RenderInlineContent.codeVoice(code: "code block"), SwiftDocC.RenderInlineContent.text(" will not be capitalized")]))],

Tests/SwiftDocCTests/Utility/String+CapitalizationTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ class String_CapitalizationTests: XCTestCase {
2020

2121
func testAllLowerCaseWithPunctuation() {
2222
let testString1 = "hello, world"
23-
let testString2 = "hello-world"
23+
let testString2 = "twenty-one"
2424
let testString3 = "hello! world"
2525
let testString4 = "hello: world"
2626
let testString5 = "l'ocean world"
2727
XCTAssertEqual("Hello, world", testString1.capitalizeFirstWord())
28-
XCTAssertEqual("Hello-world", testString2.capitalizeFirstWord())
28+
XCTAssertEqual("Twenty-One", testString2.capitalizeFirstWord())
2929
XCTAssertEqual("Hello! world", testString3.capitalizeFirstWord())
3030
XCTAssertEqual("Hello: world", testString4.capitalizeFirstWord())
3131
XCTAssertEqual("L'ocean world", testString5.capitalizeFirstWord())
@@ -44,8 +44,8 @@ class String_CapitalizationTests: XCTestCase {
4444
func testWhiteSpaces() {
4545
let testString1 = " has many spaces"
4646
let testString2 = " has a tab"
47-
XCTAssertEqual("Has many spaces", testString1.capitalizeFirstWord())
48-
XCTAssertEqual("Has a tab", testString2.capitalizeFirstWord())
47+
XCTAssertEqual(" Has many spaces", testString1.capitalizeFirstWord())
48+
XCTAssertEqual(" Has a tab", testString2.capitalizeFirstWord())
4949
}
5050

5151

0 commit comments

Comments
 (0)