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

 Copyright (c) 2022-2023 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 directive for specifying small print text like legal, license, or copyright text that
/// should be rendered in a smaller font size.
///
/// The `@Small` directive is based on HTML's small tag (`<small>`). It supports any inline markup
/// formatting like bold and italics but does not support more structured markup like ``Row``
/// and ``Row/Column``.
///
/// ```md
/// You can create a sloth using the ``init(name:color:power:)``
/// initializer, or create randomly generated sloth using a
/// ``SlothGenerator``:
///    
///    let slothGenerator = MySlothGenerator(seed: randomSeed())
///    let habitat = Habitat(isHumid: false, isWarm: true)
///
///    // ...
///
/// @Small {
///     _Licensed under Apache License v2.0 with Runtime Library Exception._
/// }
/// ```
public final class Small: Semantic, AutomaticDirectiveConvertible, MarkupContaining {
    public static let introducedVersion = "5.8"
    public let originalMarkup: BlockDirective
    
    /// The inline markup that should be rendered in a small font.
    @ChildMarkup(numberOfParagraphs: .oneOrMore)
    public private(set) var content: MarkupContainer
    
    static var keyPaths: [String : AnyKeyPath] = [
        "content" : \Small._content,
    ]
    
    override var children: [Semantic] {
        return [content]
    }
    
    var childMarkup: [Markup] {
        return content.elements
    }
    
    @available(*, deprecated,
        message: "Do not call directly. Required for 'AutomaticDirectiveConvertible'."
    )
    init(originalMarkup: BlockDirective) {
        self.originalMarkup = originalMarkup
    }
}

extension Small: RenderableDirectiveConvertible {
    func render(with contentCompiler: inout RenderContentCompiler) -> [RenderContent] {
        // Render the content normally
        let renderBlockContent = content.elements.flatMap { markupElement in
            return contentCompiler.visit(markupElement) as! [RenderBlockContent]
        }
        
        // Transform every paragraph in the render block content to a small paragraph
        let transformedRenderBlockContent = renderBlockContent.map { block -> RenderBlockContent in
            guard case let .paragraph(paragraph) = block else {
                return block
            }
            
            return .small(RenderBlockContent.Small(inlineContent: paragraph.inlineContent))
        }
        
        return transformedRenderBlockContent
    }
}