57 lines
1.7 KiB
Swift
57 lines
1.7 KiB
Swift
|
//
|
||
|
// RenderingBlock.swift
|
||
|
// GeminiRenderer
|
||
|
//
|
||
|
// Created by Shadowfacts on 7/12/20.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
import GeminiFormat
|
||
|
|
||
|
enum RenderingBlock: Equatable {
|
||
|
case text(String)
|
||
|
case link(URL, text: String?)
|
||
|
case preformatted(String, alt: String?)
|
||
|
case heading(String, level: Document.HeadingLevel)
|
||
|
case unorderedListItem(String)
|
||
|
case quote(String)
|
||
|
}
|
||
|
|
||
|
extension Document {
|
||
|
var renderingBlocks: [RenderingBlock] {
|
||
|
var blocks = [RenderingBlock]()
|
||
|
|
||
|
var currentPreformatted: (text: String, alt: String?)?
|
||
|
|
||
|
for line in self.lines {
|
||
|
switch line {
|
||
|
case let .preformattedToggle(alt: alt):
|
||
|
if let (text, alt) = currentPreformatted {
|
||
|
// drop last trailing newline
|
||
|
let realText = String(text.dropLast(1))
|
||
|
blocks.append(.preformatted(realText, alt: alt))
|
||
|
currentPreformatted = nil
|
||
|
} else {
|
||
|
currentPreformatted = ("", alt: alt)
|
||
|
}
|
||
|
case let .preformattedText(text):
|
||
|
currentPreformatted!.text += text
|
||
|
currentPreformatted!.text += "\n"
|
||
|
case let .text(text):
|
||
|
blocks.append(.text(text))
|
||
|
case let .link(url, text: text):
|
||
|
blocks.append(.link(url, text: text))
|
||
|
case let .heading(text, level: level):
|
||
|
blocks.append(.heading(text, level: level))
|
||
|
case let .unorderedListItem(text):
|
||
|
blocks.append(.unorderedListItem(text))
|
||
|
case let .quote(text):
|
||
|
blocks.append(.quote(text))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
return blocks
|
||
|
}
|
||
|
}
|