File: LinkTitleResolver.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (65 lines) | stat: -rw-r--r-- 2,728 bytes parent folder | download
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
/*
 This source file is part of the Swift.org open source project

 Copyright (c) 2021 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
*/

import Foundation
import Markdown

/// A type that resolves values that are appropriate as link titles for documentation nodes.
struct LinkTitleResolver {
    /// The context to use when resolving the title of a given documentation node.
    var context: DocumentationContext
    /// The location of the source file that this documentation node's content originated from.
    ///
    /// This value will be used if the title can only be determined by semantically parsing the documentation node's content.
    var source: URL?
    
    /// Resolves the title that's appropriate for presentation as a link title for a given documentation node.
    ///
    /// Depending on the page type, semantic parsing may be necessary to determine the title of the page.
    ///
    /// - Parameter page: The page for which to resolve the title.
    /// - Returns: The variants of the link title for this page, or `nil` if the page doesn't exist in the context.
    func title(for page: DocumentationNode) -> DocumentationDataVariants<String>? {
        if let bundle = context.bundle(identifier: page.reference.bundleIdentifier),
           let directive = page.markup.child(at: 0) as? BlockDirective {
            
            var problems = [Problem]()
            switch directive.name {
            case Tutorial.directiveName:
                if let tutorial = Tutorial(from: directive, source: source, for: bundle, in: context, problems: &problems) {
                    return .init(defaultVariantValue: tutorial.intro.title)
                }
            case Technology.directiveName:
                if let overview = Technology(from: directive, source: source, for: bundle, in: context, problems: &problems) {
                    return .init(defaultVariantValue: overview.name)
                }
            default: break
            }
        }
        
        if case let .conceptual(name) = page.name {
            return .init(defaultVariantValue: name)
        }
        
        if let symbol = (page.semantic as? Symbol) {
            return symbol.titleVariants
        }
        
        if let symbol = page.symbol {
            return .init(defaultVariantValue: symbol.names.title)
        }
        
        if let article = page.semantic as? Article, let title = article.title?.plainText {
            return .init(defaultVariantValue: title)
        }
        
        return nil
    }
}