diff options
Diffstat (limited to 'src/lib/Tools/Birthdays.svelte')
| -rw-r--r-- | src/lib/Tools/Birthdays.svelte | 184 |
1 files changed, 92 insertions, 92 deletions
diff --git a/src/lib/Tools/Birthdays.svelte b/src/lib/Tools/Birthdays.svelte index e6654833..6c81a233 100644 --- a/src/lib/Tools/Birthdays.svelte +++ b/src/lib/Tools/Birthdays.svelte @@ -1,111 +1,111 @@ <script lang="ts"> - import { browser } from '$app/environment'; - import { page } from '$app/stores'; - import { ACDBBirthdays, type ACDBBirthday } from '$lib/Data/Birthday/secondary'; - import { aniSearchBirthdays, type aniSearchBirthday } from '$lib/Data/Birthday/primary'; - import Error from '$lib/Error/RateLimited.svelte'; - import { onMount } from 'svelte'; - import { clearAllParameters, parseOrDefault } from '../Utility/parameters'; - import Skeleton from '$lib/Loading/Skeleton.svelte'; - import Message from '$lib/Loading/Message.svelte'; - import tooltip from '$lib/Tooltip/tooltip'; - - interface Birthday { - name: string; - image: string; - origin?: string; +import { browser } from '$app/environment'; +import { page } from '$app/stores'; +import { ACDBBirthdays, type ACDBBirthday } from '$lib/Data/Birthday/secondary'; +import { aniSearchBirthdays, type aniSearchBirthday } from '$lib/Data/Birthday/primary'; +import Error from '$lib/Error/RateLimited.svelte'; +import { onMount } from 'svelte'; +import { clearAllParameters, parseOrDefault } from '../Utility/parameters'; +import Skeleton from '$lib/Loading/Skeleton.svelte'; +import Message from '$lib/Loading/Message.svelte'; +import tooltip from '$lib/Tooltip/tooltip'; + +interface Birthday { + name: string; + image: string; + origin?: string; +} + +const urlParameters = browser ? new URLSearchParams(window.location.search) : null; +let date = new Date(); +let month = parseOrDefault(urlParameters, 'month', date.getMonth() + 1); +let day = parseOrDefault(urlParameters, 'day', date.getDate()); +let birthdays: Promise<{ birthdays: Birthday[]; allSourcesFailed: boolean }>; + +$: { + month = Math.min(month, 12); + month = Math.max(month, 1); + day = Math.min(day, new Date(2024, month, 0).getDate()); + day = Math.max(day, 1); + + birthdays = resolveBirthdays(month, day); + + if (browser) { + $page.url.searchParams.set('month', month.toString()); + $page.url.searchParams.set('day', day.toString()); + clearAllParameters(['month', 'day']); + history.replaceState(null, '', `?${$page.url.searchParams.toString()}`); } +} - const urlParameters = browser ? new URLSearchParams(window.location.search) : null; - let date = new Date(); - let month = parseOrDefault(urlParameters, 'month', date.getMonth() + 1); - let day = parseOrDefault(urlParameters, 'day', date.getDate()); - let birthdays: Promise<{ birthdays: Birthday[]; allSourcesFailed: boolean }>; - - $: { - month = Math.min(month, 12); - month = Math.max(month, 1); - day = Math.min(day, new Date(2024, month, 0).getDate()); - day = Math.max(day, 1); - - birthdays = resolveBirthdays(month, day); - - if (browser) { - $page.url.searchParams.set('month', month.toString()); - $page.url.searchParams.set('day', day.toString()); - clearAllParameters(['month', 'day']); - history.replaceState(null, '', `?${$page.url.searchParams.toString()}`); - } - } +onMount(() => clearAllParameters(['month', 'day'])); - onMount(() => clearAllParameters(['month', 'day'])); +const normaliseName = (name: string): string => name.toLowerCase().split(' ').sort().join(' '); - const normaliseName = (name: string): string => name.toLowerCase().split(' ').sort().join(' '); +const fixName = (name: string): string => { + const split = name.split(' '); + const last = split[split.length - 1]; - const fixName = (name: string): string => { - const split = name.split(' '); - const last = split[split.length - 1]; + if (last === last.toUpperCase()) { + split[split.length - 1] = last[0] + last.slice(1).toLowerCase(); - if (last === last.toUpperCase()) { - split[split.length - 1] = last[0] + last.slice(1).toLowerCase(); + return split.join(' '); + } - return split.join(' '); - } + const bracketIndex = name.indexOf('['); - const bracketIndex = name.indexOf('['); + if (bracketIndex !== -1) return name.slice(0, bracketIndex).trim(); - if (bracketIndex !== -1) return name.slice(0, bracketIndex).trim(); + return name; +}; - return name; - }; +const combineBirthdaySources = ( + acdb: ACDBBirthday[], + aniSearch: aniSearchBirthday[] +): Birthday[] => { + const nameMap = new Map<string, Birthday>(); - const combineBirthdaySources = ( - acdb: ACDBBirthday[], - aniSearch: aniSearchBirthday[] - ): Birthday[] => { - const nameMap = new Map<string, Birthday>(); - - for (const entry of aniSearch.map((entry) => ({ - ...entry, - normalisedName: normaliseName(fixName(entry.name)) - }))) { - if (!nameMap.has(entry.normalisedName)) - nameMap.set(entry.normalisedName, { - name: fixName(entry.name), - image: entry.image - }); - } - - for (const entry of acdb) { - const normalisedName = normaliseName(fixName(entry.name)); + for (const entry of aniSearch.map((entry) => ({ + ...entry, + normalisedName: normaliseName(fixName(entry.name)) + }))) { + if (!nameMap.has(entry.normalisedName)) + nameMap.set(entry.normalisedName, { + name: fixName(entry.name), + image: entry.image + }); + } - if (!nameMap.has(normalisedName)) - nameMap.set(normalisedName, { - name: entry.name, - image: entry.character_image, - origin: entry.origin - }); - } + for (const entry of acdb) { + const normalisedName = normaliseName(fixName(entry.name)); - return Array.from(nameMap.values()); - }; + if (!nameMap.has(normalisedName)) + nameMap.set(normalisedName, { + name: entry.name, + image: entry.character_image, + origin: entry.origin + }); + } - const resolveBirthdays = async ( - month: number, - day: number - ): Promise<{ birthdays: Birthday[]; allSourcesFailed: boolean }> => { - const [acdbResult, aniSearchResult] = await Promise.allSettled([ - ACDBBirthdays(month, day), - browser ? aniSearchBirthdays(month, day) : Promise.resolve([]) - ]); - const acdb = acdbResult.status === 'fulfilled' ? acdbResult.value : []; - const aniSearch = aniSearchResult.status === 'fulfilled' ? aniSearchResult.value : []; - - return { - birthdays: combineBirthdaySources(acdb, aniSearch), - allSourcesFailed: acdbResult.status === 'rejected' && aniSearchResult.status === 'rejected' - }; + return Array.from(nameMap.values()); +}; + +const resolveBirthdays = async ( + month: number, + day: number +): Promise<{ birthdays: Birthday[]; allSourcesFailed: boolean }> => { + const [acdbResult, aniSearchResult] = await Promise.allSettled([ + ACDBBirthdays(month, day), + browser ? aniSearchBirthdays(month, day) : Promise.resolve([]) + ]); + const acdb = acdbResult.status === 'fulfilled' ? acdbResult.value : []; + const aniSearch = aniSearchResult.status === 'fulfilled' ? aniSearchResult.value : []; + + return { + birthdays: combineBirthdaySources(acdb, aniSearch), + allSourcesFailed: acdbResult.status === 'rejected' && aniSearchResult.status === 'rejected' }; +}; </script> {#await birthdays} |