2025-01-06 10:00:51 +01:00

62 lines
1.7 KiB
Swift

struct PageLinkCommand: CommandProcessor {
static let commandType: CommandType = .pageLink
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
}
/**
Format: `![page](<pageId>)`
*/
func process(_ arguments: [String], markdown: Substring) -> String {
guard arguments.count == 1 else {
invalid(markdown)
return ""
}
let pageId = arguments[0]
guard let page = content.page(pageId) else {
results.missing(page: pageId, source: "Page link command")
return ""
}
guard !page.isDraft else {
// Prevent linking to unpublished content
return ""
}
results.linked(to: page)
let localized = page.localized(in: language)
let url = page.absoluteUrl(in: language)
let title = localized.linkPreviewTitle ?? localized.title
let description = localized.linkPreviewDescription ?? ""
let image = makePageImage(item: localized)
return RelatedPageLink(
title: title,
description: description,
url: url,
image: image)
.content
}
private func makePageImage(item: LinkPreviewItem) -> ImageSet? {
item.linkPreviewImage.map { image in
let size = content.settings.pages.pageLinkImageSize
let imageSet = image.imageSet(width: size, height: size, language: language)
results.require(imageSet: imageSet)
return imageSet
}
}
}