File: AbstractContainsFormattedTextOnly.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 (69 lines) | stat: -rw-r--r-- 2,575 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
/*
 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 document's abstract may only contain formatted text. Images and links are not allowed.
 */
public struct AbstractContainsFormattedTextOnly: Checker {
    public var problems: [Problem] = [Problem]()
    private var sourceFile: URL?
    
    /// Creates a new checker that detects non-text elements in abstracts.
    /// 
    /// - Parameter sourceFile: The URL to the documentation file that the checker checks.
    public init(sourceFile: URL?) {
        self.sourceFile = sourceFile
    }
    
    enum InvalidContent: CustomStringConvertible {
        case image, link
        
        var diagnosticIdentifier: String {
            switch self {
            case .image: return "org.swift.docc.SummaryContainsImage"
            case .link: return "org.swift.docc.SummaryContainsLink"
            }
        }
        
        var description: String {
            switch self {
            case .image: return "image"
            case .link: return "link"
            }
        }
    }
    
    private mutating func foundInvalidContent(_ invalidContent: InvalidContent, markup: Markup) {
        let explanation = """
            Summary should only contain (formatted) text. To resolve this issue, place links and images elsewhere in the document, or remove them.
            """
        let diagnostic = Diagnostic(source: sourceFile, severity: .warning, range: markup.range, identifier: invalidContent.diagnosticIdentifier, summary: "\(invalidContent.description.capitalized) in document summary will not be displayed", explanation: explanation)
        let problem = Problem(diagnostic: diagnostic, possibleSolutions: [])
        problems.append(problem)
    }
    
    public mutating func visitDocument(_ document: Document) -> () {
        guard let abstract = DocumentationMarkup(markup: document, parseUpToSection: .abstract).abstractSection?.paragraph else { return }
        self.visitParagraph(abstract)
    }
    
    public mutating func visitImage(_ image: Image) {
        foundInvalidContent(.image, markup: image)
        descendInto(image)
    }
    
    public mutating func visitLink(_ link: Link) {
        foundInvalidContent(.link, markup: link)
        descendInto(link)
    }
}