File: RenderNode%2BIndexable.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 (87 lines) | stat: -rw-r--r-- 3,411 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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
 This source file is part of the Swift.org open source project

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

extension RenderNode {
    public var headings: [String] {
        return contentSections
            // Exclude headings from call-to-action sections, since they always link to standalone (indexed) pages.
            .filter { $0.kind != .callToAction }
            .flatMap { $0.headings }
    }

    var rawIndexableTextContent: String {
        return contentSections
            // Exclude text from call-to-action sections, since they always link to standalone (indexed) pages.
            .filter { $0.kind != .callToAction }
            .map { $0.rawIndexableTextContent(references: references) }.joined(separator: " ")
    }
    
    private var contentSections: [RenderSection] {
        guard kind == .symbol || (kind == .article && sections.isEmpty) else {
            return sections
        }
        
        return [ContentRenderSection(kind: .content, content: [.paragraph(.init(inlineContent: abstract ?? []))])]
            + primaryContentSections
    }
}

extension RenderNode: Indexable {
    func topLevelIndexingRecord() throws -> IndexingRecord {
        let kind: IndexingRecord.Kind
        switch self.kind {
        case .tutorial:
            kind = .tutorial
        case .section:
            kind = .tutorialSection
        case .overview:
            kind = .overview
        case .article:
            kind = .article
        case .symbol:
            kind = .symbol
        }
        
        guard let title = metadata.title, !title.isEmpty else {
            // We at least need a title for a search result.
            throw IndexingError.missingTitle(identifier)
        }
        
        let summaryParagraph: RenderBlockContent?
        if let abstract = self.abstract {
            summaryParagraph = RenderBlockContent.paragraph(.init(inlineContent: abstract))
        } else if let intro = self.sections.first as? IntroRenderSection, let firstBlock = intro.content.first, case .paragraph = firstBlock {
            summaryParagraph = firstBlock
        } else {
            summaryParagraph = nil
        }

        let summary = summaryParagraph?.rawIndexableTextContent(references: references) ?? ""
        
        return IndexingRecord(kind: kind, location: .topLevelPage(identifier), title: title, summary: summary, headings: self.headings, rawIndexableTextContent: self.rawIndexableTextContent, platforms: metadata.platforms)
    }
    
    public func indexingRecords(onPage page: ResolvedTopicReference) throws -> [IndexingRecord] {
        switch self.kind {
        case .tutorial:
            let sectionRecords = try self.sections
                .flatMap { section -> [IndexingRecord] in
                    guard let sectionsSection = section as? TutorialSectionsRenderSection else {
                        return []
                    }
                    return try sectionsSection.indexingRecords(onPage: page, references: references)
            }
            
            return [try topLevelIndexingRecord()] + sectionRecords
        default:
            return [try topLevelIndexingRecord()]
        }
    }
}