Skip to content

Commit fbe197e

Browse files
author
Jesse Haigh
committed
showLineNumbers option
1 parent 8cd9c23 commit fbe197e

File tree

9 files changed

+28
-15
lines changed

9 files changed

+28
-15
lines changed

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,14 @@ public enum RenderBlockContent: Equatable {
127127
public var copyToClipboard: Bool = true
128128
public var wrap: Int = 100
129129
public var highlight: [Int] = [Int]()
130+
public var showLineNumbers: Bool = false
130131
public var strikeout: [Int] = [Int]()
131132

132133
public enum OptionName: String, CaseIterable {
133134
case nocopy
134135
case wrap
135136
case highlight
137+
case showLineNumbers
136138
case strikeout
137139
case unknown
138140

@@ -146,13 +148,14 @@ public enum RenderBlockContent: Equatable {
146148
}
147149

148150
/// Make a new `CodeListing` with the given data.
149-
public init(syntax: String?, code: [String], metadata: RenderContentMetadata?, copyToClipboard: Bool, wrap: Int, highlight: [Int], strikeout: [Int]) {
151+
public init(syntax: String?, code: [String], metadata: RenderContentMetadata?, copyToClipboard: Bool, wrap: Int, highlight: [Int], strikeout: [Int], showLineNumbers: Bool) {
150152
self.syntax = syntax
151153
self.code = code
152154
self.metadata = metadata
153155
self.copyToClipboard = copyToClipboard
154156
self.wrap = wrap
155157
self.highlight = highlight
158+
self.showLineNumbers = showLineNumbers
156159
self.strikeout = strikeout
157160
}
158161
}
@@ -721,7 +724,7 @@ extension RenderBlockContent.Table: Codable {
721724
extension RenderBlockContent: Codable {
722725
private enum CodingKeys: CodingKey {
723726
case type
724-
case inlineContent, content, caption, style, name, syntax, code, level, text, items, media, runtimePreview, anchor, summary, example, metadata, start, copyToClipboard, wrap, highlight, strikeout
727+
case inlineContent, content, caption, style, name, syntax, code, level, text, items, media, runtimePreview, anchor, summary, example, metadata, start, copyToClipboard, wrap, highlight, strikeout, showLineNumbers
725728
case request, response
726729
case header, rows
727730
case numberOfColumns, columns
@@ -751,7 +754,8 @@ extension RenderBlockContent: Codable {
751754
copyToClipboard: container.decodeIfPresent(Bool.self, forKey: .copyToClipboard) ?? copy,
752755
wrap: container.decodeIfPresent(Int.self, forKey: .wrap) ?? 0,
753756
highlight: container.decodeIfPresent([Int].self, forKey: .highlight) ?? [Int](),
754-
strikeout: container.decodeIfPresent([Int].self, forKey: .strikeout) ?? [Int]()
757+
strikeout: container.decodeIfPresent([Int].self, forKey: .strikeout) ?? [Int](),
758+
showLineNumbers: container.decodeIfPresent(Bool.self, forKey: .showLineNumbers) ?? false
755759
))
756760
case .heading:
757761
self = try .heading(.init(level: container.decode(Int.self, forKey: .level), text: container.decode(String.self, forKey: .text), anchor: container.decodeIfPresent(String.self, forKey: .anchor)))
@@ -859,6 +863,7 @@ extension RenderBlockContent: Codable {
859863
try container.encode(l.wrap, forKey: .wrap)
860864
try container.encode(l.highlight, forKey: .highlight)
861865
try container.encode(l.strikeout, forKey: .strikeout)
866+
try container.encode(l.showLineNumbers, forKey: .showLineNumbers)
862867
case .heading(let h):
863868
try container.encode(h.level, forKey: .level)
864869
try container.encode(h.text, forKey: .text)

Sources/SwiftDocC/Model/Rendering/RenderContentCompiler.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ struct RenderContentCompiler: MarkupVisitor {
5858
copyToClipboard: true, // default value
5959
wrap: 0, // default value
6060
highlight: [Int](), // default value
61-
strikeout: [Int]() // default value
61+
strikeout: [Int](), // default value
62+
showLineNumbers: false, // default value
6263
)
6364

6465
// apply code block options
@@ -76,6 +77,8 @@ struct RenderContentCompiler: MarkupVisitor {
7677
listing.highlight = parseCodeBlockOptionArray(value) ?? []
7778
case .strikeout:
7879
listing.strikeout = parseCodeBlockOptionArray(value) ?? []
80+
case .showLineNumbers:
81+
listing.showLineNumbers = true
7982
case .unknown:
8083
break
8184
}
@@ -84,7 +87,7 @@ struct RenderContentCompiler: MarkupVisitor {
8487
return [RenderBlockContent.codeListing(listing)]
8588

8689
} else {
87-
return [RenderBlockContent.codeListing(.init(syntax: codeBlock.language ?? bundle.info.defaultCodeListingLanguage, code: codeBlock.code.splitByNewlines, metadata: nil, copyToClipboard: false, wrap: 0, highlight: [Int](), strikeout: [Int]()))]
90+
return [RenderBlockContent.codeListing(.init(syntax: codeBlock.language ?? bundle.info.defaultCodeListingLanguage, code: codeBlock.code.splitByNewlines, metadata: nil, copyToClipboard: false, wrap: 0, highlight: [Int](), strikeout: [Int](), showLineNumbers: false))]
8891
}
8992
}
9093

Sources/SwiftDocC/Semantics/Snippets/Snippet.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ extension Snippet: RenderableDirectiveConvertible {
8484
let minimumIndentation = lines.map { $0.prefix { $0.isWhitespace }.count }.min() ?? 0
8585
let trimmedLines = lines.map { String($0.dropFirst(minimumIndentation)) }
8686
let copy = FeatureFlags.current.isExperimentalCodeBlockEnabled
87-
return [RenderBlockContent.codeListing(.init(syntax: snippetMixin.language, code: trimmedLines, metadata: nil, copyToClipboard: copy, wrap: 0, highlight: [Int](), strikeout: [Int]()))]
87+
return [RenderBlockContent.codeListing(.init(syntax: snippetMixin.language, code: trimmedLines, metadata: nil, copyToClipboard: copy, wrap: 0, highlight: [Int](), strikeout: [Int](), showLineNumbers: false))]
8888
} else {
8989
// Render the whole snippet with its explanation content.
9090
let docCommentContent = snippetEntity.markup.children.flatMap { contentCompiler.visit($0) }
9191
let copy = FeatureFlags.current.isExperimentalCodeBlockEnabled
92-
let code = RenderBlockContent.codeListing(.init(syntax: snippetMixin.language, code: snippetMixin.lines, metadata: nil, copyToClipboard: copy, wrap: 0, highlight: [Int](), strikeout: [Int]()))
92+
let code = RenderBlockContent.codeListing(.init(syntax: snippetMixin.language, code: snippetMixin.lines, metadata: nil, copyToClipboard: copy, wrap: 0, highlight: [Int](), strikeout: [Int](), showLineNumbers: false))
9393
return docCommentContent + [code]
9494
}
9595
}

Sources/SwiftDocC/SwiftDocC.docc/Resources/RenderNode.spec.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,9 @@
809809
"copyToClipboard": {
810810
"type": "boolean"
811811
},
812+
"showLineNumbers": {
813+
"type": "boolean"
814+
},
812815
"wrap": {
813816
"type": "integer"
814817
},

Sources/SwiftDocC/Utility/ParseLanguageString.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public func tokenizeLanguageString(_ input: String?) -> (lang: String?, tokens:
4444
let key = part.trimmingCharacters(in: .whitespaces).lowercased()
4545
if key == "nocopy" {
4646
tokens.append((.nocopy, nil as String?))
47+
} else if key == "showlinenumbers" {
48+
tokens.append((.showLineNumbers, nil as String?))
4749
} else if key == "wrap" {
4850
tokens.append((.wrap, nil as String?))
4951
} else if key == "highlight" {

Tests/SwiftDocCTests/Checker/Checkers/InvalidCodeBlockOptionTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ let a = 1
2424
var checker = InvalidCodeBlockOption(sourceFile: nil)
2525
checker.visit(document)
2626
XCTAssertTrue(checker.problems.isEmpty)
27-
XCTAssertEqual(RenderBlockContent.CodeListing.knownOptions, ["highlight", "nocopy", "strikeout", "unknown", "wrap"])
27+
XCTAssertEqual(RenderBlockContent.CodeListing.knownOptions, ["highlight", "nocopy", "strikeout", "unknown", "wrap", "showLineNumbers"])
2828
}
2929

3030
func testOption() {

Tests/SwiftDocCTests/Model/RenderContentMetadataTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class RenderContentMetadataTests: XCTestCase {
5454
RenderInlineContent.text("Content"),
5555
])
5656

57-
let code = RenderBlockContent.codeListing(.init(syntax: nil, code: [], metadata: metadata, copyToClipboard: false, wrap: 0, highlight: [], strikeout: []))
57+
let code = RenderBlockContent.codeListing(.init(syntax: nil, code: [], metadata: metadata, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [], showLineNumbers: false))
5858
let data = try JSONEncoder().encode(code)
5959
let roundtrip = try JSONDecoder().decode(RenderBlockContent.self, from: data)
6060

Tests/SwiftDocCTests/Model/RenderNodeSerializationTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class RenderNodeSerializationTests: XCTestCase {
4444
.strong(inlineContent: [.text("Project > Run")]),
4545
.text(" menu item, or the following code:"),
4646
])),
47-
.codeListing(.init(syntax: "swift", code: ["xcrun xcodebuild -h", "xcrun xcodebuild build -configuration Debug"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [])),
47+
.codeListing(.init(syntax: "swift", code: ["xcrun xcodebuild -h", "xcrun xcodebuild build -configuration Debug"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [], showLineNumbers: false)),
4848
]))
4949
]
5050

@@ -71,16 +71,16 @@ class RenderNodeSerializationTests: XCTestCase {
7171
let assessment1 = TutorialAssessmentsRenderSection.Assessment(title: [.paragraph(.init(inlineContent: [.text("Lorem ipsum dolor sit amet?")]))],
7272
content: nil,
7373
choices: [
74-
.init(content: [.codeListing(.init(syntax: "swift", code: ["override func viewDidLoad() {", "super.viewDidLoad()", "}"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: []))], isCorrect: true, justification: [.paragraph(.init(inlineContent: [.text("It's correct because...")]))], reaction: "That's right!"),
75-
.init(content: [.codeListing(.init(syntax: "swift", code: ["sceneView.delegate = self"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: []))], isCorrect: false, justification: [.paragraph(.init(inlineContent: [.text("It's incorrect because...")]))], reaction: "Not quite."),
74+
.init(content: [.codeListing(.init(syntax: "swift", code: ["override func viewDidLoad() {", "super.viewDidLoad()", "}"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [], showLineNumbers: false))], isCorrect: true, justification: [.paragraph(.init(inlineContent: [.text("It's correct because...")]))], reaction: "That's right!"),
75+
.init(content: [.codeListing(.init(syntax: "swift", code: ["sceneView.delegate = self"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [], showLineNumbers: false))], isCorrect: false, justification: [.paragraph(.init(inlineContent: [.text("It's incorrect because...")]))], reaction: "Not quite."),
7676
.init(content: [.paragraph(.init(inlineContent: [.text("None of the above.")]))], isCorrect: false, justification: [.paragraph(.init(inlineContent: [.text("It's incorrect because...")]))], reaction: nil),
7777
])
7878

7979
let assessment2 = TutorialAssessmentsRenderSection.Assessment(title: [.paragraph(.init(inlineContent: [.text("Duis aute irure dolor in reprehenderit?")]))],
8080
content: [.paragraph(.init(inlineContent: [.text("What is the airspeed velocity of an unladen swallow?")]))],
8181
choices: [
82-
.init(content: [.codeListing(.init(syntax: "swift", code: ["super.viewWillAppear()"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: []))], isCorrect: true, justification: [.paragraph(.init(inlineContent: [.text("It's correct because...")]))], reaction: "Correct."),
83-
.init(content: [.codeListing(.init(syntax: "swift", code: ["sceneView.delegate = self"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: []))], isCorrect: true, justification: [.paragraph(.init(inlineContent: [.text("It's correct because...")]))], reaction: "Yep."),
82+
.init(content: [.codeListing(.init(syntax: "swift", code: ["super.viewWillAppear()"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [], showLineNumbers: false))], isCorrect: true, justification: [.paragraph(.init(inlineContent: [.text("It's correct because...")]))], reaction: "Correct."),
83+
.init(content: [.codeListing(.init(syntax: "swift", code: ["sceneView.delegate = self"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [], showLineNumbers: false))], isCorrect: true, justification: [.paragraph(.init(inlineContent: [.text("It's correct because...")]))], reaction: "Yep."),
8484
.init(content: [.paragraph(.init(inlineContent: [.text("None of the above.")]))], isCorrect: false, justification: [.paragraph(.init(inlineContent: [.text("It's incorrect because...")]))], reaction: "Close!"),
8585
])
8686

Tests/SwiftDocCTests/Utility/ListItemExtractorTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ class ListItemExtractorTests: XCTestCase {
514514
// ```
515515
// Inner code block
516516
// ```
517-
.codeListing(.init(syntax: nil, code: ["Inner code block"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [])),
517+
.codeListing(.init(syntax: nil, code: ["Inner code block"], metadata: nil, copyToClipboard: false, wrap: 0, highlight: [], strikeout: [], showLineNumbers: false)),
518518

519519
// > Warning: Inner aside, with ``ThirdNotFoundSymbol`` link
520520
.aside(.init(style: .init(asideKind: .warning), content: [

0 commit comments

Comments
 (0)