_includes/resources/article/ArticleModels.ts (81 lines of code) (raw):
import { Static, Type } from "@sinclair/typebox";
import {
getThumbnailPath,
Resource,
ResourceFrontmatter,
} from "../../../src/ResourceModels";
import { EleventyPage } from "../../../src/models";
import { ARTICLE_RESOURCE_TYPE } from "../../../src/resourceType";
import { ThumbnailField, VideoField } from "../commonModels";
import path from "upath";
// noinspection DuplicatedCode
export const ArticleFrontmatter = Type.Intersect([
ResourceFrontmatter,
ThumbnailField,
VideoField,
Type.Object({
animatedGif: Type.Optional(
Type.Object(
{
file: Type.String({
description: "File name of the animated GIF, can be webm or gif",
}),
width: Type.Optional(
Type.Number({
description: "Width the animated GIF should be rendered",
}),
),
height: Type.Optional(
Type.Number({
description: "Height the animated GIF should be rendered",
}),
),
},
{ description: "Animated GIF to show in this tip" },
),
),
screenshot: Type.Optional(
Type.String({
description: "File name of a screenshot to show in this tip",
}),
),
seealso: Type.Optional(
Type.Any({
description: "Item(s) to show in the See Also section of this tip",
}),
),
}),
]);
export type ArticleFrontmatter = Static<typeof ArticleFrontmatter>;
export class Article
extends Resource<ARTICLE_RESOURCE_TYPE>
implements ArticleFrontmatter
{
animatedGif?: ArticleFrontmatter["animatedGif"];
screenshot?: ArticleFrontmatter["screenshot"];
seealso?: any;
thumbnail: ArticleFrontmatter["thumbnail"];
video?: ArticleFrontmatter["video"];
static frontmatterSchema = ArticleFrontmatter;
constructor({
data,
page,
}: {
data: ArticleFrontmatter;
page: EleventyPage;
}) {
// noinspection DuplicatedCode
super({ data, page });
this.animatedGif = data.animatedGif;
if (this.animatedGif) {
this.animatedGif.file = path.join(page.url, this.animatedGif.file);
}
this.video = data.video;
this.screenshot = data.screenshot
? path.join(page.url, data.screenshot)
: undefined;
this.seealso = data.seealso;
this.thumbnail = getThumbnailPath(data.thumbnail, page.url);
}
getThumbnail(): string {
return this.thumbnail;
}
}