38 lines
981 B
Swift
38 lines
981 B
Swift
|
import Foundation
|
||
|
|
||
|
struct PageVideoTemplate: Template {
|
||
|
|
||
|
typealias VideoSource = (url: String, type: VideoType)
|
||
|
|
||
|
enum Key: String, CaseIterable {
|
||
|
case options = "OPTIONS"
|
||
|
case sources = "SOURCES"
|
||
|
}
|
||
|
|
||
|
enum VideoOption: String {
|
||
|
case controls
|
||
|
case autoplay
|
||
|
case muted
|
||
|
case loop
|
||
|
case playsinline
|
||
|
case poster
|
||
|
case preload
|
||
|
}
|
||
|
|
||
|
static let templateName = "video.html"
|
||
|
|
||
|
let raw: String
|
||
|
|
||
|
func generate<T>(sources: [VideoSource], options: T) -> String where T: Sequence, T.Element == VideoOption {
|
||
|
let sourcesCode = sources.map(makeSource).joined(separator: "\n")
|
||
|
let optionCode = options.map { $0.rawValue }.joined(separator: " ")
|
||
|
return generate([.sources: sourcesCode, .options: optionCode])
|
||
|
}
|
||
|
|
||
|
private func makeSource(_ source: VideoSource) -> String {
|
||
|
"""
|
||
|
<source src="\(source.url)" type="\(source.type.htmlType)">
|
||
|
"""
|
||
|
}
|
||
|
}
|