sourcehypertextpublic100filmszoetrope.js

const sortList = (list, topic) => {
	list.innerHTML = [...list.children]
		.sort((a, b) =>
			JSON.parse(a.dataset.info)[topic] >
			JSON.parse(b.dataset.info)[topic]
				? 1
				: -1
		)
		.map(el => el.outerHTML)
		.join("");
};

documentReady(() => {
	for (const film of $$("ol.films > li")) {
		const director = film.$(".director");
		film.dataset.info = JSON.stringify({
			rank: parseInt(film.$(".marker").innerText),
			title:
				film.$("strong.title").dataset.sortAs ??
				(film.$(".translated")
					? film.$(".translated").innerText
					: film.$(".original").innerText
				)
					.toLowerCase()
					.replace(/^(the|a) /g, "")
					.replace(/[':,’]/g, ""),
			director:
				director.dataset.sortAs ??
				(director.classList.contains("surname-first")
					? director.innerText.toLowerCase()
					: (rx => `${rx[2]} ${rx[1]}`)(
							director.innerText.match(/^(.*?)([\S]+)$/)
					  ).toLowerCase()),
			country: [...film.$$("img.flag")]
				.map(el => el.getAttribute("alt").replace(/^the /, ""))
				.join(" ")
				.toLowerCase(),
			year: parseInt(film.$(".year").innerText),
			length: film.$(".length").innerText
		});
	}

	$("#sort-rank").on("click", () => sortList($("ol.films"), "rank"));
	$("#sort-title").on("click", () => sortList($("ol.films"), "title"));
	$("#sort-director").on("click", () => sortList($("ol.films"), "director"));
	$("#sort-country").on("click", () => sortList($("ol.films"), "country"));
	$("#sort-year").on("click", () => sortList($("ol.films"), "year"));
	$("#sort-length").on("click", () => sortList($("ol.films"), "length"));
});