49 lines
1.7 KiB
Swift
49 lines
1.7 KiB
Swift
|
|
struct WebsiteImage {
|
|
|
|
static func imagePath(prefix: String, width: Int, height: Int) -> String {
|
|
"\(prefix)@\(width)x\(height)"
|
|
}
|
|
|
|
static func imagePath(prefix: String, extension fileExtension: String, width: Int, height: Int) -> String {
|
|
"\(prefix)@\(width)x\(height).\(fileExtension)"
|
|
}
|
|
|
|
static func imagePath(source: String, width: Int, height: Int) -> String {
|
|
let (prefix, ext) = source.fileNameAndExtension
|
|
return imagePath(prefix: prefix, extension: ext ?? ".jpg", width: width, height: height)
|
|
}
|
|
|
|
private let prefix1x: String
|
|
|
|
private let prefix2x: String
|
|
|
|
private let altText: String
|
|
|
|
private let ext: String
|
|
|
|
init(image: FeedEntryData.Image) {
|
|
self.init(rawImagePath: image.rawImagePath,
|
|
width: image.width,
|
|
height: image.height,
|
|
altText: image.altText)
|
|
}
|
|
|
|
init(rawImagePath: String, width: Int, height: Int, altText: String) {
|
|
let (prefix, ext) = rawImagePath.fileNameAndExtension
|
|
self.prefix1x = WebsiteImage.imagePath(prefix: prefix, width: width, height: height)
|
|
self.prefix2x = WebsiteImage.imagePath(prefix: prefix, width: 2*width, height: 2*height)
|
|
self.altText = altText.htmlEscaped()
|
|
self.ext = ext ?? "jpg"
|
|
}
|
|
|
|
var content: String {
|
|
var result = "<picture>"
|
|
result += "<source type='image/avif' srcset='\(prefix1x).avif 1x, \(prefix2x).avif 2x'/>"
|
|
result += "<source type='image/webp' srcset='\(prefix1x).webm 1x, \(prefix1x).webm 2x'/>"
|
|
result += "<img srcset='\(prefix2x).\(ext) 2x' src='\(prefix1x).\(ext)' loading='lazy' alt='\(altText)'/>"
|
|
result += "</picture>"
|
|
return result
|
|
}
|
|
}
|