* Track last modified date for category queries * Remove unused hidden tags queries * Add tags to sitemap * Calculate sitemap validation * Add remaining categories to sitemap.xml * Add photos to sitemap.xml * Finalize sitemap metadata * Guard against missing dates in sitemap.xml
83 lines
2.0 KiB
TypeScript
83 lines
2.0 KiB
TypeScript
import {
|
|
Photo,
|
|
PhotoDateRange,
|
|
descriptionForPhotoSet,
|
|
photoQuantityText,
|
|
} from '@/photo';
|
|
import {
|
|
absolutePathForFocalLength,
|
|
absolutePathForFocalLengthImage,
|
|
} from '@/app/paths';
|
|
import { AppTextState } from '@/i18n/state';
|
|
import { CategoryQueryMeta } from '@/category';
|
|
|
|
type FocalLengthWithMeta = { focal: number } & CategoryQueryMeta;
|
|
|
|
export type FocalLengths = FocalLengthWithMeta[];
|
|
|
|
export const getFocalLengthFromString = (focalString?: string) => {
|
|
const focal = focalString?.match(/^([0-9]+)mm/)?.[1];
|
|
return focal ? parseInt(focal, 10) : 0;
|
|
};
|
|
|
|
export const formatFocalLength = (focal?: number) => focal
|
|
? formatFocalLengthSafe(focal)
|
|
: undefined;
|
|
|
|
export const formatFocalLengthSafe = (focal = 0) =>
|
|
`${focal}mm`;
|
|
|
|
export const titleForFocalLength = (
|
|
focal: number,
|
|
photos: Photo[],
|
|
appText: AppTextState,
|
|
explicitCount?: number,
|
|
) => [
|
|
appText.category.focalLengthTitle(formatFocalLengthSafe(focal)),
|
|
photoQuantityText(explicitCount ?? photos.length, appText),
|
|
].join(' ');
|
|
|
|
export const shareTextFocalLength = (
|
|
focal: number,
|
|
appText: AppTextState,
|
|
) =>
|
|
appText.category.focalLengthShare(formatFocalLengthSafe(focal));
|
|
|
|
export const descriptionForFocalLengthPhotos = (
|
|
photos: Photo[],
|
|
appText: AppTextState,
|
|
dateBased?: boolean,
|
|
explicitCount?: number,
|
|
explicitDateRange?: PhotoDateRange,
|
|
) =>
|
|
descriptionForPhotoSet(
|
|
photos,
|
|
appText,
|
|
undefined,
|
|
dateBased,
|
|
explicitCount,
|
|
explicitDateRange,
|
|
);
|
|
|
|
export const generateMetaForFocalLength = (
|
|
focal: number,
|
|
photos: Photo[],
|
|
appText: AppTextState,
|
|
explicitCount?: number,
|
|
explicitDateRange?: PhotoDateRange,
|
|
) => ({
|
|
url: absolutePathForFocalLength(focal),
|
|
title: titleForFocalLength(focal, photos, appText, explicitCount),
|
|
description: descriptionForFocalLengthPhotos(
|
|
photos,
|
|
appText,
|
|
true,
|
|
explicitCount,
|
|
explicitDateRange,
|
|
),
|
|
images: absolutePathForFocalLengthImage(focal),
|
|
});
|
|
|
|
export const sortFocalLengths = (focalLengths: FocalLengths) =>
|
|
focalLengths.sort((a, b) => a.focal - b.focal);
|