File: InlineContainer.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 (45 lines) | stat: -rw-r--r-- 1,732 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
/*
 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
*/

/// An element whose children must conform to `InlineMarkup`
public protocol InlineContainer: PlainTextConvertibleMarkup {}

// MARK: - Public API

public extension InlineContainer {
    /// The inline child elements of this element.
    ///
    /// - Precondition: All children of an `InlineContainer`
    ///   must conform to `InlineMarkup`.
    var inlineChildren: LazyMapSequence<MarkupChildren, InlineMarkup> {
        return children.lazy.map { $0 as! InlineMarkup }
    }

    /// Replace all inline child elements with a new sequence of inline elements.
    mutating func setInlineChildren<Items: Sequence>(_ newChildren: Items) where Items.Element == InlineMarkup {
        replaceChildrenInRange(0..<childCount, with: newChildren)
    }

    /// Replace child inline elements in a range with a new sequence of elements.
    mutating func replaceChildrenInRange<Items: Sequence>(_ range: Range<Int>, with incomingItems: Items) where Items.Element == InlineMarkup {
        var rawChildren = raw.markup.copyChildren()
        rawChildren.replaceSubrange(range, with: incomingItems.map { $0.raw.markup })
        let newRaw = raw.markup.withChildren(rawChildren)
        _data = _data.replacingSelf(newRaw)
    }

    // MARK: PlainTextConvertibleMarkup

    var plainText: String {
        return children.compactMap {
            return ($0 as? InlineMarkup)?.plainText
        }.joined()
    }
}