import Foundation struct ImageSet: HtmlProducer { let image: FileResource let maxWidth: Int let maxHeight: Int let quality: CGFloat let description: String? let extraAttributes: String init(image: FileResource, maxWidth: Int, maxHeight: Int, description: String?, quality: CGFloat = 0.7, extraAttributes: String? = nil) { self.image = image self.maxWidth = maxWidth self.maxHeight = maxHeight self.description = description self.quality = quality self.extraAttributes = extraAttributes ?? "" } var jobs: [ImageVersion] { let type = image.type let width2x = maxWidth * 2 let height2x = maxHeight * 2 return [ .init(image: image, type: .avif, maximumWidth: maxWidth, maximumHeight: maxHeight, quality: quality), .init(image: image, type: .avif, maximumWidth: width2x, maximumHeight: height2x, quality: quality), .init(image: image, type: .webp, maximumWidth: maxWidth, maximumHeight: maxHeight, quality: quality), .init(image: image, type: .webp, maximumWidth: width2x, maximumHeight: height2x, quality: quality), .init(image: image, type: type, maximumWidth: maxWidth, maximumHeight: maxHeight, quality: quality), .init(image: image, type: type, maximumWidth: width2x, maximumHeight: height2x, quality: quality) ] } private var imageAltText: String { guard let description else { return "" } return " alt='\(description.htmlEscaped())'" } func populate(_ result: inout String) { let fileExtension = image.type.fileExtension.map { "." + $0 } ?? "" let prefix1x = "/\(image.outputImageFolder)/\(maxWidth)x\(maxHeight)" let prefix2x = "/\(image.outputImageFolder)/\(maxWidth*2)x\(maxHeight*2)" let imageSize = (image.getImageDimensions()?.scaledToFit(in: .init(width: maxWidth, height: maxHeight))) .map { " width='\(Int($0.width))' height='\(Int($0.height))'" } result += "" result += "" result += "" result += "" result += "" } }