Skip to content

Commit 22962bf

Browse files
committed
Update contributor documentation about documentation input discovery
1 parent ed492be commit 22962bf

File tree

5 files changed

+115
-101
lines changed

5 files changed

+115
-101
lines changed

Sources/SwiftDocC/SwiftDocC.docc/SwiftDocC.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ SwiftDocC provides the APIs you use to load a bundle, parse the symbol-graph met
2222

2323
### Content Discovery
2424

25-
- <doc:DocumentationWorkspaceGroup>
25+
- <doc:InputDiscovery>
2626
- <doc:DocumentationContextGroup>
2727

2828
### Resolving documentation links

Sources/SwiftDocC/SwiftDocC.docc/SwiftDocC/CompilerPipeline.md

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,24 @@ Get to know the steps involved in documentation compilation.
66

77
This article describes the discrete and sequential steps of compiling documentation with DocC.
88

9-
DocC starts with content discovery by parsing the documentation sources in your documentation bundle. Next, it validates and semantically analyzes them and then builds an in-memory model of the compiled documentation. Once the in-memory model is finalized, DocC converts each topic into a persistable representation it can store on disk.
10-
11-
To use the compiled documentation, either query the in-memory model directly or convert its nodes to their render-friendly representation. For example, the `SwiftDocCUtilities` framework enumerates all the nodes in DocC's in-memory model, converts each node for rendering, and finally writes the complete documentation to the disk.
9+
DocC starts with input discovery by categorizing the documentation sources in your documentation catalog. Next, it loads and parses the those inputs to create in-memory models of the documentation pages. Once the in-memory model is finalized, DocC converts each topic into a persistable render-friendly representation it can store on disk.
1210

1311
### Discovery
1412

15-
DocC starts discovery by creating a ``DocumentationWorkspace`` to interact with the file system and a ``DocumentationContext`` that manages the in-memory model for the built documentation.
13+
DocC starts by creating a ``DocumentationContext/InputsProvider`` to discover the inputs from the user-provided command line arguments. These inputs are:
1614

17-
When a documentation bundle is found in the workspace by a ``DocumentationWorkspaceDataProvider``, the following files are recognized and processed (others are ignored):
15+
- Markup files, tutorial files, and assets (for example images)
16+
- Symbol graph files, describing the symbols in a given module (types, functions, variables, etc.) and their relationships (inheritance, conformance, etc.)
17+
- Meta information about this "unit" of documentation (for example a custom display name)
18+
- Customizations to the render template.
1819

19-
- An `Info.plist` file containing meta information like the bundle display name.
20-
- Symbol-graph files with the `.symbols.json` extension.
21-
- Authored markup files with an `.md` extension
22-
- Authored tutorial files with a `.tutorial` extension
23-
- Additional documentation assets with known extensions like `.png`, `.jpg`, `.mov`, and `.zip`.
20+
Markup, tutorials, assets, and render-template-customization can only be discovered as files inside of a documentation catalog (`.docc` directory).
21+
Symbol graph files can either be discovered as files inside of a documentation catalog or as additional files provided via user-provided command line arguments.
22+
Meta information can either be discovered from an optional top-level `Info.plist` file inside of a documentation catalog or as provided values via user-provided command line arguments. All meta information is optional.
2423

25-
You can organize the files in any way, as long as `Info.plist` is in the root of the directory tree. Here is an example of a bundle, that groups topic files in logical groups with an additional directory for shared asset files:
24+
You can organize the files inside the documentation catalog according to your preference,
25+
as long as the optional `Info.plist`--containing optional meta information--and the optional render customization files are top-level.
26+
For example, this catalog groups files based on their topic with an additional directory for shared asset files:
2627

2728
```none
2829
SwiftDocC.docc
@@ -45,9 +46,10 @@ SwiftDocC.docc
4546

4647
### Analysis and Registration
4748

48-
This phase starts with registering all symbols from the available symbol graphs into a documentation *topic graph* in memory.
49+
This phase starts with creating a ``DocumentationContext`` using the discovered inputs from the previous phase.
50+
This begins loading and registering the inputs with the context.
4951

50-
The symbol graph files are machine generated and describe all available symbols in a framework (types, functions, variables, etc.) and their relationships, for example, inheritance and conformance.
52+
The first input that the context register is the symbol information. The symbol information comes from "symbol graph files" which are machine generated and describe all available symbols in a framework (types, functions, variables, etc.) and their relationships (inheritance, conformance, etc.).
5153

5254
Each symbol becomes a documentation node in the topic graph and thus a documentation *topic* (an entity in the documentation model). The symbol's topic could optionally be extended with authored documentation from a markup file.
5355

@@ -57,7 +59,7 @@ Next, all the remaining markup files are analyzed and converted to documents (fo
5759

5860
Finally, if you reference any symbols from another framework, and DocC knows how to resolve those, the symbols are fetched and added to the graph too.
5961

60-
### Curation
62+
#### Curation
6163

6264
At this point the in-memory topic graph accurately represents the machine generated description of the documented framework. However, documentation is often better consumed when it's curated into logical groups and into an incremental learning experience.
6365

Sources/SwiftDocC/SwiftDocC.docc/SwiftDocC/DocumentationContextGroup.md

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ Build and query the in-memory documentation model.
44

55
## Discussion
66

7-
The documentation context generally manages the in-memory documentation including:
8-
7+
A documentation context is the the in-memory representation of a "unit" of documentation (for example a module, package, or technology).
8+
The context is generally responsible for:
9+
910
- Analyzing bundle file contents and converting to semantic models.
1011
- Managing a graph of documentation nodes (a single node representing one documentation topic).
1112
- Processing assets like media files or download archives.
@@ -14,12 +15,17 @@ The documentation context generally manages the in-memory documentation includin
1415

1516
### Creating a Context
1617

18+
Use ``DocumentationContext/init(bundle:dataProvider:diagnosticEngine:configuration:)`` to create a context for a given bundle:
19+
1720
```swift
18-
let workspace = DocumentationWorkspace()
19-
let context = try DocumentationContext(dataProvider: workspace)
20-
```
21+
let inputsProvider = DocumentationContext.InputsProvider()
22+
let (bundle, dataProvider) = try inputsProvider.inputsAndDataProvider(
23+
startingPoint: catalogURL,
24+
options: bundleDiscoveryOptions
25+
)
2126

22-
During initialization the context will inspect the available bundles in the workspace and load any symbol graph files and markup files.
27+
let context = try DocumentationContext(bundle: bundle, dataProvider: dataProvider)
28+
```
2329

2430
### Accessing Documentation
2531

@@ -40,19 +46,11 @@ To find out the location of the source file for a given documentation node use:
4046
let sourceFileURL = try context.documentURL(for: reference)
4147
```
4248

43-
And finally to print all known paths in the context:
44-
45-
```swift
46-
context.knownIdentifiers.forEach({ print($0) })
47-
```
48-
4949
## Topics
5050

5151
### Documentation Context
5252

5353
- ``DocumentationContext``
54-
- ``DocumentationContextDataProvider``
55-
- ``DocumentationContextDataProviderDelegate``
5654
- ``AutomaticCuration``
5755

5856
### Documentation Nodes

Sources/SwiftDocC/SwiftDocC.docc/SwiftDocC/DocumentationWorkspaceGroup.md

Lines changed: 0 additions & 72 deletions
This file was deleted.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Input Discovery
2+
3+
Learn how to discover documentation inputs on the file system.
4+
5+
## Discussion
6+
7+
A ``DocumentationContext/InputsProvider`` discovers documentation catalogs on the file system and creates a ``DocumentationBundle`` from the discovered catalog content.
8+
9+
```swift
10+
let inputProvider = DocumentationContext.InputsProvider(fileManager: fileSystem)
11+
12+
guard let catalogURL = try inputProvider.findCatalog(startingPoint: startingPoint) else {
13+
return
14+
}
15+
let bundle = try inputProvider.makeInputs(contentOf: catalogURL, options: BundleDiscoveryOptions())
16+
17+
print("A bundle with ID: \(bundle.identifier)")
18+
```
19+
20+
You can also create documentation inputs, without a documentation catalog, from a list of symbol graph files:
21+
22+
```swift
23+
let inputProvider = DocumentationContext.InputsProvider(fileManager: fileSystem)
24+
25+
guard let (bundle, dataProvider) = try inputProvider.makeInputsFromSymbolGraphs(
26+
options: BundleDiscoveryOptions(
27+
additionalSymbolGraphFiles: listOfSymbolGraphLocations
28+
)
29+
) else {
30+
return
31+
}
32+
33+
print("A bundle with ID: \(bundle.identifier)")
34+
```
35+
36+
> Note: use the returned `dataProvider` to create a ``DocumentationContext`` from this ``DocumentationBundle``.
37+
38+
It's common to want combine these two strategies and require that they discover a ``DocumentationBundle``.
39+
For this use-case, use the
40+
``DocumentationContext/InputsProvider/inputsAndDataProvider(startingPoint:allowArbitraryCatalogDirectories:options:)`` method:
41+
42+
```swift
43+
let inputProvider = DocumentationContext.InputsProvider(fileManager: fileSystem)
44+
45+
let (bundle, dataProvider) = try inputProvider.inputsAndDataProvider(
46+
startingPoint: maybeStartingPoint,
47+
options: BundleDiscoveryOptions(
48+
additionalSymbolGraphFiles: listOfSymbolGraphLocations
49+
)
50+
)
51+
52+
print("A bundle with ID: \(bundle.identifier)")
53+
```
54+
55+
### Bundle Contents
56+
57+
A ``DocumentationBundle`` represents the list of "discovered" input files--categorized by their kind--to use as documentation inputs.
58+
59+
Use a ``DataProvider`` that the ``DocumentationContext/InputsProvider`` returned alongside the bundle to read the files in the bundle.
60+
61+
## Topics
62+
63+
### Input Discovery
64+
65+
- ``DocumentationContext/InputsProvider``
66+
- ``DocumentationContext/InputsProvider/inputsAndDataProvider(startingPoint:allowArbitraryCatalogDirectories:options:)``
67+
68+
### Documentation Bundle
69+
70+
- ``DocumentationBundle``
71+
- ``BundleIdentifier``
72+
- ``DocumentationBundleFileTypes``
73+
74+
### Bundle Assets
75+
76+
- ``DataTraitCollection``
77+
- ``DataAsset``
78+
- ``BundleData``
79+
80+
### Bundle Metadata
81+
82+
- ``ExternalMetadata``
83+
- ``DefaultAvailability``
84+
- ``PlatformVersion``
85+
86+
<!-- Copyright (c) 2021-2024 Apple Inc and the Swift Project authors. All Rights Reserved. -->

0 commit comments

Comments
 (0)