File: ArticleSymbolMentions.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 (52 lines) | stat: -rw-r--r-- 2,068 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
/*
 This source file is part of the Swift.org open source project

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

import Markdown

/// An index that describes which articles mention symbols.
///
/// When an article mentions a symbol from a module registered with the
/// documentation context, the mention is recorded in this data structure.
/// This is ultimately used to render a "mentioned in" section in symbol documentation.
///
/// This type should only record article -> symbol links, as the "mentioned in" section
/// is for directing readers to explanatory articles from the API reference.
struct ArticleSymbolMentions {
    /// A count of symbol mentions.
    var mentions: [ResolvedTopicReference: [ResolvedTopicReference: Int]] = [:]

    /// Record a symbol mention within an article.
    mutating func article(_ article: ResolvedTopicReference, didMention symbol: ResolvedTopicReference, weight: Int) {
        mentions[symbol, default: [:]][article, default: 0] += 1 * weight
    }

    /// The list of articles mentioning a symbol, from most frequent to least frequent.
    func articlesMentioning(_ symbol: ResolvedTopicReference) -> [ResolvedTopicReference] {
        // Mentions are sorted on demand based on the number of mentions.
        // This could change in the future.
        return mentions[symbol, default: [:]].sorted {
            $0.value > $1.value
        }
        .map { $0.key }
    }
}

struct SymbolLinkCollector: MarkupWalker {
    var context: DocumentationContext
    var article: ResolvedTopicReference
    var baseWeight: Int

    func visitSymbolLink(_ symbolLink: SymbolLink) {
        if let destination = symbolLink.destination,
           let symbol = context.referenceIndex[destination] {
            context.articleSymbolMentions.article(article, didMention: symbol, weight: baseWeight)
        }
    }
}