struct PhoneScreensBlock: OrderedKeyBlockProcessor { enum Key: String { case id case frame case tall case wide } static let blockId: ContentBlock = .screens let content: Content let results: PageGenerationResults let language: ContentLanguage init(content: Content, results: PageGenerationResults, language: ContentLanguage) { self.content = content self.results = results self.language = language } func process(_ arguments: [(key: Key, value: String)], markdown: Substring) -> String { guard let frameId = arguments.first(where: {$0.key == .frame })?.value else { invalid(markdown) return "" } guard let frameFile = content.file(frameId) else { results.missing(file: frameId, source: "Wallpaper Block") return "" } guard let id = arguments.first(where: {$0.key == .id })?.value else { invalid(markdown) return "" } let remaining = arguments.filter { $0.key == .tall || $0.key == .wide } var images = [WallpaperSlider.Image]() var tall: FileResource? var wide: FileResource? for (key, fileId) in remaining { guard let file = content.file(fileId) else { print("Missing file: \(fileId)") results.missing(file: fileId, source: "Wallpaper Block") return "" } if key == .tall { if tall != nil { print("Another tall image: \(file.id)") invalid(markdown) return "" } if let other = wide { let image = WallpaperSlider.Image( tall: file, wide: other, language: language, results: results) images.append(image) wide = nil continue } tall = file continue } // key == .wide if wide != nil { print("Another wide image: \(file.id)") invalid(markdown) return "" } guard let other = tall else { wide = file continue } let image = WallpaperSlider.Image( tall: other, wide: file, language: language, results: results) images.append(image) tall = nil } if tall != nil || wide != nil { invalid(markdown) print("Wide/tall does not have the same number of items") return "" } let frame = WallpaperSlider.Frame(frame: frameFile, language: language, results: results) let slider = WallpaperSlider(frame: frame, images: images, id: id) results.require(footer: slider.script) results.require(headers: .swiperJs, .swiperCss) results.require(header: .style(slider.style)) return slider.content } }