---
+import generateStarRating from '@utils/generateStarRating.ts';
+
interface Props {
rating: number
}
const { rating } = Astro.props;
-const filledStars = '★'.repeat(rating);
-const unfilledStars = '☆'.repeat(5 - rating);
+const starRating = generateStarRating(rating);
---
<Fragment>
- {filledStars}{unfilledStars}
+ {starRating}
</Fragment>
\ No newline at end of file
import { loadRenderers } from 'astro:container';
import { experimental_AstroContainer as AstroContainer } from 'astro/container';
import generateContentUrl from '@utils/generateContentUrl';
+import generateStarRating from '@utils/generateStarRating.ts';
export async function GET(context: APIContext) {
const articles = await getCollection('articles');
const content = await container.renderToString(Content);
const categories = (item.data.tags ?? []).concat(item.collection)
if ('type' in item.data) {
- categories.push(item.data.type)
+ categories.push(item.data.type);
}
if ('show' in item.data) {
- categories.push(item.data.show)
+ categories.push(item.data.show);
+ }
+
+ var description: string;
+ switch (item.collection) {
+ case 'reviews':
+ const starRating = generateStarRating(item.data.rating);
+ description = starRating
+ break;
+ default:
+ description = item.data.description;
+ break;
}
feedItems.push({
title: item.data.title,
link: link,
pubDate: item.data.date,
- description: item.data.description,
+ description: description,
content: content,
categories: categories
})
import type { APIRoute } from 'astro';
import { getCollection } from 'astro:content';
import generateOpenGraphImage from '@utils/generateOpenGraphImage.ts';
+import generateStarRating from '@utils/generateStarRating.ts';
export async function getStaticPaths() {
const reviews = await getCollection('reviews');
export const GET: APIRoute = async ({ props }) => {
return generateOpenGraphImage(
props.review.data.title,
- props.review.data.description ?? ""
+ generateStarRating(props.review.data.rating) ?? ""
)
};
\ No newline at end of file
import { ImageResponse } from '@vercel/og';
import { siteAuthor } from '@utils/globals.ts';
-async function loadFont() {
- const url = `https://cdn.jsdelivr.net/fontsource/fonts/public-sans@latest/latin-400-normal.ttf`
+async function loadFont(fontName: string) {
+ var url: string
+ switch (fontName) {
+ case 'Public Sans Variable':
+ url = `https://cdn.jsdelivr.net/fontsource/fonts/public-sans@latest/latin-400-normal.ttf`;
+ break;
+ case 'DejaVu Mono':
+ url = `https://cdn.jsdelivr.net/fontsource/fonts/dejavu-mono@latest/latin-400-normal.ttf`;
+ break;
+ default:
+ throw new Error('font url not defined');
+ }
+
const font = await fetch(url);
if (font) {
return await font.arrayBuffer();
width: '100%',
height: '100%',
padding: 80,
- fontFamily: 'Public Sans Variable',
+ fontFamily: 'Public Sans Variable'
},
children: [
{
style: {
fontSize: 32,
marginBottom: 40,
+ fontFamily: 'DejaVu Mono'
},
children: description,
},
fonts: [
{
name: 'Public Sans Variable',
- data: await loadFont(),
+ data: await loadFont('Public Sans Variable'),
+ style: 'normal'
+ },
+ {
+ name: 'DejaVu Mono',
+ data: await loadFont('DejaVu Mono'),
style: 'normal'
}
]
--- /dev/null
+export default function (rating: number): string {
+ const filledStars = '★'.repeat(rating);
+ const unfilledStars = '☆'.repeat(5 - rating);
+ return filledStars + unfilledStars;
+}
\ No newline at end of file