62 lines
1.7 KiB
Swift
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: ``
|
|
*/
|
|
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
|
|
}
|
|
}
|
|
}
|