File: Small.swift

package info (click to toggle)
swiftlang 6.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,856,264 kB
  • sloc: cpp: 9,995,718; ansic: 2,234,019; asm: 1,092,167; python: 313,940; objc: 82,726; f90: 80,126; lisp: 38,373; pascal: 25,580; sh: 20,378; ml: 5,058; perl: 4,751; makefile: 4,725; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (81 lines) | stat: -rw-r--r-- 2,814 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
public 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: [any 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) -> [any 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
    }
}