UNPKG

@paperbits/common

Version:
54 lines (40 loc) 2.32 kB
import { HtmlPage } from "./htmlPage"; import { HtmlPagePublisherPlugin } from "./htmlPagePublisherPlugin"; import { IMediaService } from "../media"; export class SocialShareDataHtmlPagePublisherPlugin implements HtmlPagePublisherPlugin { constructor(private readonly mediaService: IMediaService) { } private appendLink(document: Document, rel: string, href: string): void { const canonicalLinkElement: HTMLStyleElement = document.createElement("link"); canonicalLinkElement.setAttribute("rel", rel); canonicalLinkElement.setAttribute("href", href); document.head.appendChild(canonicalLinkElement); } private appendMetaTag(document: Document, name: string, content: string): void { const element: HTMLMetaElement = document.createElement("meta"); element.setAttribute("name", name); element.setAttribute("content", content); document.head.appendChild(element); } public async apply(document: Document, page: HtmlPage): Promise<void> { if (!page.socialShareData?.image?.sourceKey) { return; } const media = await this.mediaService.getMediaByKey(page.socialShareData.image.sourceKey); if (!media) { return; } const baseUrl = page.siteHostName ? `https://${page.siteHostName}` : ""; this.appendLink(document, "image_src", baseUrl + media.permalink); // this.appendMetaTag(document, "twitter:site", "@hostmeapp"); TODO: Collect Twitter data. this.appendMetaTag(document, "twitter:card", "summary_large_image"); this.appendMetaTag(document, "twitter:title", page.socialShareData.title || page.title); this.appendMetaTag(document, "twitter:description", page.socialShareData.description || page.description); this.appendMetaTag(document, "twitter:image", baseUrl + media.permalink); const imageWidth = page.socialShareData?.image?.width; const imageHeight = page.socialShareData?.image?.height; if (imageWidth && imageHeight) { this.appendMetaTag(document, "twitter:image:width", imageWidth.toString()); this.appendMetaTag(document, "twitter:image:height", imageHeight.toString()); } } }