sourcehypertextpubliccalendricalannexe.js

import attic from "../../../app/attic.js";

const getGregorianCalendar = year =>
	[
		31,
		year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) ? 29 : 28,
		31,
		30,
		31,
		30,
		31,
		31,
		30,
		31,
		30,
		31
	]
		.map((numOfDays, monthIdx) =>
			new Array(numOfDays)
				.fill(0)
				.map(
					(_, dayIdx) =>
						`${year}-${(monthIdx + 1)
							.toString()
							.padStart(2, "0")}-${(dayIdx + 1)
							.toString()
							.padStart(2, "0")}`
				)
		)
		.flat();

const holidays = {
	gregorian: [
		{
			name: {
				en: "Imbolc",
				nl: "Imbolc",
				grc: "Ἴμβολξ"
			},
			date: "02-01",
			class: "wiccan"
		},
		{
			name: {
				en: "Liberalia",
				nl: "Liberaliën",
				grc: "Λιβεράλια"
			},
			date: "03-17",
			class: "theonym",
			dedication: "Δ"
		},
		{
			name: {
				en: "April Fool’s Day",
				nl: "…Kikker in je bil",
				grc: "Πρωταπρίλια"
			},
			date: "04-01"
		},
		{
			name: {
				en: "<span class='theonym'>Earth</span> Day",
				nl: "Dag van de <span class='theonym'>Aarde</span>",
				grc: "Ἡμέρα τῆς <span class='theonym'>Γῆς</span>"
			},
			date: "04-22"
		},
		{
			name: {
				en: "St George’s Day",
				nl: "Sint-Jorisdag",
				grc: "Ἡμέρα τοῦ Γεωργίου"
			},
			date: "04-23",
			class: "christian"
		},
		{
			name: {
				en: "Majuma*",
				nl: "Majuma*",
				grc: "Μαϊουμᾶς*"
			},
			date: "05-01",
			dedication: "Δ"
		},
		{
			name: {
				en: "Beltane",
				nl: "Beltane",
				grc: "Βέλταν"
			},
			date: "05-01",
			class: "wiccan"
		},
		{
			name: {
				en: "Mercuralia",
				nl: "Mercuraliën",
				grc: "Ἑρμαῖα"
			},
			date: "05-15",
			class: "theonym",
			dedication: "Ε"
		},
		{
			name: {
				en: "Lughnasadh",
				nl: "Lughnasadh",
				grc: "Λούνασα"
			},
			date: "08-01",
			class: "wiccan"
		},
		{
			name: {
				en: "Hallowe’en",
				nl: "Halloween",
				grc: "Προτεραία Ἁγίων Πάντων"
			},
			date: "10-31",
			class: "christian"
		},
		{
			name: {
				en: "Samhain",
				nl: "Samhain",
				grc: "Σαύαινον"
			},
			date: "11-01",
			class: "wiccan"
		},
		{
			name: {
				en: "Bonfire Night",
				nl: "Guy Fawkesnacht",
				grc: "Νύξ τοῦ Γυίδου Φαύκος"
			},
			date: "11-05"
		},
		{
			name: {
				en: "“Salmacalia”",
				nl: "„Salmacaliën”",
				grc: "«Σαλμάκια»"
			},
			date: "11-05",
			class: "theonym"
		},
		{
			name: {
				en: "St Martin’s Day",
				nl: "Sint-Maarten",
				grc: "Ἡμέρα τοῦ Μαρτίνου"
			},
			date: "11-11",
			class: "christian"
		},
		{
			name: {
				en: "St Nicholas’ Day",
				nl: "Sinterklaas",
				grc: "Ἡμέρα τοῦ Νικολάου"
			},
			date: "12-05",
			class: "christian"
		},
		{
			name: {
				en: "<span class='theonym'>Saturnalia</span> begins",
				nl: "De <span class='theonym'>Saturnaliën</span> beginnen",
				grc: "Ἀρχὴ τῶν <span class='theonym'>Κρονίων</span>"
			},
			date: "12-17"
		},
		{
			name: {
				en: "<span class='theonym'>Saturnalia</span> ends",
				nl: "De <span class='theonym'>Saturnaliën</span> eindigen",
				grc: "Τέλος τῶν <span class='theonym'>Κρονίων</span>"
			},
			date: "12-23"
		},
		{
			name: {
				en: "Christmas Eve",
				nl: "Kerstavond",
				grc: "Προτεραία Χριστουγέννων"
			},
			date: "12-24",
			class: "christian"
		},
		{
			name: {
				en: "Christmas",
				nl: "Eerste kerstdag",
				grc: "Χριστούγεννα"
			},
			date: "12-25",
			class: "christian"
		},
		{
			name: {
				en: "Boxing Day",
				nl: "Tweede kerstdag",
				grc: "Ὑστεραία Χριστουγέννων"
			},
			date: "12-26",
			class: "christian"
		}
	],
	attic: [
		{
			name: {
				en: "Genesia",
				nl: "Genesia",
				grc: "Γενέσια"
			},
			class: "attic",
			date: [2, 5]
		},
		{
			name: {
				en: "Boedromia",
				nl: "Boëdromia",
				grc: "Βοηδρόμια"
			},
			date: [2, 7],
			class: "attic theonym",
			dedication: "Α"
		},
		{
			name: {
				en: "Pyanepsia",
				nl: "Pyanepsia",
				grc: "Πυανέψια"
			},
			date: [3, 7],
			class: "attic",
			dedication: "Α"
		},
		{
			name: {
				en: "Oschophoria",
				nl: "Oschophoria",
				grc: "Ὠσχοφόρια"
			},
			date: [3, 7],
			class: "attic",
			dedication: "Δ"
		},
		{
			name: {
				en: "Country <span class='theonym'>Dionysia</span>*",
				nl: "Kleine <span class='theonym'>Dionysia</span>*",
				grc: "<span class='theonym'>Διονύσια</span> τὰ κατ’ ἀγρούς*"
			},
			date: [5, 10],
			class: "attic",
			dedication: "Δ"
		},
		{
			name: {
				en: "Haloa",
				nl: "Haloa",
				grc: "Ἁλῶα"
			},
			date: [5, -5],
			class: "attic",
			dedication: "Δ"
		},
		{
			name: {
				en: "<span class='attic'>Lenæa</span> begins",
				nl: "De <span class='attic'>lenæa</span> beginnen",
				grc: "Ἀρχὴ τῶν <span class='attic'>Ληναίων</span>"
			},
			date: [7, 12],
			dedication: "Δ"
		},
		{
			name: {
				en: "<span class='attic'>Lenæa</span> ends",
				nl: "De <span class='attic'>lenæa</span> eindigen",
				grc: "Τέλος τῶν <span class='attic'>Ληναίων</span>"
			},
			date: [7, 15],
			dedication: "Δ"
		},
		{
			name: {
				en: "<span class='attic'>Anthesteria</span> begins",
				nl: "De <span class='attic'>anthesteria</span> beginnen",
				grc: "Ἀρχὴ τῶν <span class='attic'>Ἀνθεστηρίων</span>"
			},
			date: [8, 11],
			dedication: "Δ"
		},
		{
			name: {
				en: "<span class='attic'>Anthesteria</span> ends",
				nl: "De <span class='attic'>anthesteria</span> eindigen",
				grc: "Τέλος τῶν <span class='attic'>Ἀνθεστηρίων</span>"
			},
			date: [8, 13],
			dedication: "Δ"
		},
		{
			name: {
				en: "<span class='attic'>City <span class='theonym'>Dionysia</span></span> begins",
				nl: "De <span class='attic'>grote <span class='theonym'>Dionysia</span></span> beginnen",
				grc: "Ἀρχή τῶν <span class='attic'><span class='theonym'>Διονυσίων</span> τῶν μεγάλων</span>"
			},
			date: [9, 10],
			dedication: "Δ"
		},
		{
			name: {
				en: "<span class='attic'>City <span class='theonym'>Dionysia</span></span> ends",
				nl: "De <span class='attic'>grote <span class='theonym'>Dionysia</span></span> eindigen",
				grc: "Τέλος τῶν <span class='attic'><span class='theonym'>Διονυσίων</span> τῶν μεγάλων</span>"
			},
			date: [9, 16],
			dedication: "Δ"
		},
		{
			name: {
				en: "<span class='attic'>Thargelia</span> begins",
				nl: "De <span class='attic'>thargelia</span> beginnen",
				grc: "Ἀρχή τῶν <span class='attic'>Θαργηλίων</span>"
			},
			date: [11, 6],
			dedication: "Α"
		},
		{
			name: {
				en: "<span class='attic'>Thargelia</span> ends",
				nl: "De <span class='attic'>thargelia</span> eindigen",
				grc: "Τέλος τῶν <span class='attic'>Θαργηλίων</span>"
			},
			date: [11, 7],
			dedication: "Α"
		}
	],
	custom: [
		{
			name: {
				en: "Easter",
				nl: "Pasen",
				grc: "Πάσχα"
			},
			// list of dates starts in 2020
			dates: [
				"04-12",
				"04-04",
				"04-17",
				"04-09",
				"03-31",
				"04-20",
				"04-05",
				"03-28",
				"04-16",
				"04-01",
				"04-21"
			],
			class: "christian"
		},
		{
			name: {
				en: "King’s Day",
				nl: "Koningsdag",
				grc: "Ἡμέρα Βασιλέως"
			},
			// list of dates starts in 2020
			dates: [
				"04-27",
				"04-27",
				"04-27",
				"04-27",
				"04-27",
				"04-26",
				"04-27",
				"04-27",
				"04-27",
				"04-27",
				"04-27"
			]
		},
		{
			name: {
				en: "Spring equinox, <span class='wiccan'>Ostara</span>",
				nl: "Lentepunt, <span class='wiccan'>Ostara</span>",
				grc: "Ἰσημερία ἡαρινή, <span class='wiccan'>Ὄσταρα</span>"
			},
			// list of dates starts in 2020
			dates: [
				"03-20",
				"03-20",
				"03-20",
				"03-20",
				"03-20",
				"03-20",
				"03-20",
				"03-20",
				"03-20",
				"03-20"
			]
		},
		{
			name: {
				en: "Summer solstice, <span class='wiccan'>Litha</span>",
				nl: "Zomerwende, <span class='wiccan'>Litha</span>",
				grc: "Τροπαὶ αἰ θεριναί, <span class='wiccan'>Λίθα</span>"
			},
			// list of dates starts in 2020
			dates: [
				"06-20",
				"06-21",
				"06-21",
				"06-21",
				"06-20",
				"06-21",
				"06-21",
				"06-21",
				"06-20",
				"06-21"
			]
		},
		{
			name: {
				en: "Autumn equinox, <span class='wiccan'>Mabon</span>",
				nl: "Herfstpunt, <span class='wiccan'>Mabon</span>",
				grc: "Ἰσημερία ἡ μετοπωρινή, <span class='wiccan'>Μάβων</span>"
			},
			// list of dates starts in 2020
			dates: [
				"09-22",
				"09-22",
				"09-23",
				"09-23",
				"09-22",
				"09-22",
				"09-23",
				"09-23",
				"09-22",
				"09-22"
			]
		},
		{
			name: {
				en: "Winter solstice, <span class='wiccan'>Yule</span>",
				nl: "Winterwende, <span class='wiccan'>Joelfeest</span>",
				grc: "Τροπαὶ αἰ χειμεριναί, <span class='wiccan'>Ἰοῦλα</span>"
			},
			// list of dates starts in 2020
			dates: [
				"12-21",
				"12-21",
				"12-21",
				"12-22",
				"12-21",
				"12-21",
				"12-21",
				"12-22",
				"12-21",
				"12-21"
			]
		}
	]
};

const getCalendarObj = year => {
	const cal = getGregorianCalendar(year).map(x => ({
		gregorian: x,
		attic: attic(x),
		feasts: []
	}));

	for (const day of cal) {
		day.feasts.push(
			...holidays.gregorian.filter(holiday =>
				day.gregorian.endsWith(holiday.date)
			)
		);

		day.feasts.push(
			...holidays.attic.filter(
				holiday =>
					day.attic.month == holiday.date[0] &&
					day.attic.signedDate == holiday.date[1]
			)
		);

		day.feasts.push(
			...holidays.custom.filter(
				holiday =>
					holiday.dates.length > year - 2020 &&
					day.gregorian.endsWith(holiday.dates[year - 2020])
			)
		);

		day.feasts = Object.fromEntries(
			["en", "nl", "grc"].map(lang => [
				lang,
				day.feasts
					.map(
						feast =>
							`${
								"class" in feast
									? `<span class="${feast.class}">`
									: ""
							}${feast.name[lang]}${
								"class" in feast ? "</span>" : ""
							}${
								"dedication" in feast
									? ` <span class="dedication">(${feast.dedication})</span>`
									: ""
							}`
					)
					.join(", ")
			])
		);
	}

	return cal;
};

export default getCalendarObj;