-
Notifications
You must be signed in to change notification settings - Fork 137
/
Copy pathDocumentationBundle.swift
193 lines (166 loc) · 8.17 KB
/
DocumentationBundle.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/*
This source file is part of the Swift.org open source project
Copyright (c) 2021-2024 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See https://swift.org/LICENSE.txt for license information
See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/
public import Foundation
/// A collection of the build inputs for a unit of documentation.
///
/// A unit of documentation may for example cover a framework, library, or tool.
/// Projects or packages may have multiple units of documentation to represent the different consumable products in that project or package.
///
/// ## Topics
///
/// ### Input files
///
/// - ``markupURLs``
/// - ``symbolGraphURLs``
/// - ``miscResourceURLs``
///
/// ### Render customization
///
/// - ``customHeader``
/// - ``customFooter``
/// - ``themeSettings``
///
/// ### Metadata
///
/// - ``info``
/// - ``displayName``
/// - ``identifier``
public struct DocumentationBundle {
public enum PropertyListError: DescribedError {
case invalidVersionString(String)
case keyNotFound(String)
public var errorDescription: String {
switch self {
case .invalidVersionString(let versionString):
return "'\(versionString)' is not a valid version string"
case .keyNotFound(let name):
return "Expected key \(name.singleQuoted) not found"
}
}
}
/// Non-content information or metadata about this unit of documentation.
public let info: Info
/// A human-readable display name for this unit of documentation.
public var displayName: String {
info.displayName
}
@available(*, deprecated, renamed: "id", message: "Use 'id' instead. This deprecated API will be removed after 6.2 is released")
public var identifier: String {
id.rawValue
}
/// The documentation bundle's stable and locally unique identifier.
public var id: DocumentationBundle.Identifier {
info.id
}
/**
The documentation bundle's version.
It's not safe to make computations based on assumptions about the format of bundle's version. The version can be in any format.
*/
@available(*, deprecated, message: "This deprecated API will be removed after 6.2 is released")
public var version: String? {
info.version
}
/// Code listings extracted from the documented modules' source, indexed by their identifier.
@available(*, deprecated, message: "This deprecated API will be removed after 6.1 is released")
public var attributedCodeListings: [String: AttributedCodeListing] = [:]
/// Symbol graph JSON input files for the module that's represented by this unit of documentation.
///
/// Tutorial or article-only documentation won't have any symbol graph JSON files.
///
/// ## See Also
///
/// - ``DocumentationBundleFileTypes/isSymbolGraphFile(_:)``
public let symbolGraphURLs: [URL]
/// Documentation markup input files for this unit of documentation.
///
/// Documentation markup files include both articles, documentation extension files, and tutorial files.
///
/// ## See Also
///
/// - ``DocumentationBundleFileTypes/isMarkupFile(_:)``
public let markupURLs: [URL]
/// Miscellaneous resources (for example images, videos, or downloadable assets) for this unit of documentation.
public let miscResourceURLs: [URL]
/// A custom HTML file to use as the header for rendered output.
public let customHeader: URL?
/// A custom HTML file to use as the footer for rendered output.
public let customFooter: URL?
/// A custom JSON settings file used to theme renderer output.
public let themeSettings: URL?
/// A URL prefix to be appended to the relative presentation URL.
///
/// This is used when a built documentation is hosted in a known location.
public let baseURL: URL
/// Creates a new collection of build inputs for a unit of documentation.
///
/// - Parameters:
/// - info: Non-content information or metadata about this unit of documentation.
/// - baseURL: A URL prefix to be appended to the relative presentation URL.
/// - symbolGraphURLs: Symbol graph JSON input files for the module that's represented by this unit of documentation.
/// - markupURLs: Documentation markup input files for this unit of documentation.
/// - miscResourceURLs: Miscellaneous resources (for example images, videos, or downloadable assets) for this unit of documentation.
/// - customHeader: A custom HTML file to use as the header for rendered output.
/// - customFooter: A custom HTML file to use as the footer for rendered output.
/// - themeSettings: A custom JSON settings file used to theme renderer output.
public init(
info: Info,
baseURL: URL = URL(string: "/")!,
symbolGraphURLs: [URL],
markupURLs: [URL],
miscResourceURLs: [URL],
customHeader: URL? = nil,
customFooter: URL? = nil,
themeSettings: URL? = nil
) {
self.info = info
self.baseURL = baseURL
self.symbolGraphURLs = symbolGraphURLs
self.markupURLs = markupURLs
self.miscResourceURLs = miscResourceURLs
self.customHeader = customHeader
self.customFooter = customFooter
self.themeSettings = themeSettings
self.rootReference = ResolvedTopicReference(bundleID: info.id, path: "/", sourceLanguage: .swift)
self.documentationRootReference = ResolvedTopicReference(bundleID: info.id, path: NodeURLGenerator.Path.documentationFolder, sourceLanguage: .swift)
self.tutorialTableOfContentsContainer = ResolvedTopicReference(bundleID: info.id, path: NodeURLGenerator.Path.tutorialsFolder, sourceLanguage: .swift)
self.tutorialsContainerReference = tutorialTableOfContentsContainer.appendingPath(urlReadablePath(info.displayName))
self.articlesDocumentationRootReference = documentationRootReference.appendingPath(urlReadablePath(info.displayName))
}
@available(*, deprecated, renamed: "init(info:baseURL:symbolGraphURLs:markupURLs:miscResourceURLs:customHeader:customFooter:themeSettings:)", message: "Use 'init(info:baseURL:symbolGraphURLs:markupURLs:miscResourceURLs:customHeader:customFooter:themeSettings:)' instead. This deprecated API will be removed after 6.1 is released")
public init(
info: Info,
baseURL: URL = URL(string: "/")!,
attributedCodeListings: [String: AttributedCodeListing] = [:],
symbolGraphURLs: [URL],
markupURLs: [URL],
miscResourceURLs: [URL],
customHeader: URL? = nil,
customFooter: URL? = nil,
themeSettings: URL? = nil
) {
self.init(info: info, baseURL: baseURL, symbolGraphURLs: symbolGraphURLs, markupURLs: markupURLs, miscResourceURLs: miscResourceURLs, customHeader: customHeader, customFooter: customFooter, themeSettings: themeSettings)
self.attributedCodeListings = attributedCodeListings
}
public private(set) var rootReference: ResolvedTopicReference
/// Default path to resolve symbol links.
public private(set) var documentationRootReference: ResolvedTopicReference
@available(*, deprecated, renamed: "tutorialTableOfContentsContainer", message: "Use 'tutorialTableOfContentsContainer' instead. This deprecated API will be removed after 6.2 is released")
public var tutorialsRootReference: ResolvedTopicReference {
tutorialTableOfContentsContainer
}
/// Default path to resolve tutorial table-of-contents links.
public var tutorialTableOfContentsContainer: ResolvedTopicReference
@available(*, deprecated, renamed: "tutorialsContainerReference", message: "Use 'tutorialsContainerReference' instead. This deprecated API will be removed after 6.2 is released")
public var technologyTutorialsRootReference: ResolvedTopicReference {
tutorialsContainerReference
}
/// Default path to resolve tutorial links.
public var tutorialsContainerReference: ResolvedTopicReference
/// Default path to resolve articles.
public var articlesDocumentationRootReference: ResolvedTopicReference
}