legit

Fork of https://git.icyphox.sh/legit

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
// Copyright 2025 Shota FUJI <pockawoooh@gmail.com>
// SPDX-License-Identifier: MIT
//
// ===
//
// This script scans every "<time>" elements with "data-local-format" attribute,
// replaces each element's text node with local datetime.
// If a "<time>" element does not have valid "datetime" attribute, this script
// skips the "<time>" element.
//
// "data-local-format" attribute accepts one of the below:
// - "datetime" ... displays date and time (default)
// - "date"     ... displays date
// - "time"     ... displays time
//
// This script intentionally uses scratch serialization instead of locale-aware
// APIs; locale strings often includes non-English characters thus does not
// incorporate with the rest of a page. As majority of readers are familiar with
// softwares, using RFC3339-ish style date and time format fits better than an
// uncontrollable locale string.

function toTimeString(date) {
	return date.getHours().toString().padStart(2, "0") + ":"
		+ date.getMinutes().toString().padStart(2, "0") + ":"
		+ date.getSeconds().toString().padStart(2, "0");
}

function toDateString(date) {
	// I don't expect this software/code will survive for 8000yrs.
	return date.getFullYear().toString().padStart(4, "0") + "-"
		// stupid spec made by American
		+ (date.getMonth() + 1).toString().padStart(2, "0") + "-"
		+ date.getDate().toString().padStart(2, "0");
}

function toDateTimeString(date) {
	return toDateString(date) + " " + toTimeString(date);
}

const targets = document.querySelectorAll("time[data-local-format]");
for (const target of targets) {
	const datetime = target.dateTime && Date.parse(target.dateTime);
	if (Number.isNaN(datetime)) {
		continue;
	}

	const originalText = target.textContent.trim();

	switch (target.dataset.localFormat || "datetime") {
		case "datetime":
			target.textContent = toDateTimeString(new Date(datetime));
			break;
		case "date":
			target.textContent = toDateString(new Date(datetime));
			break;
		case "time":
			target.textContent = toTimeString(new Date(datetime));
			break;
		default:
			console.warn(
				`Found unknown value on data-local-format attribute: "${target.dataset.localFormat}".\n`
					+ `Available values are: "datetime", "date", "time"\n`
					+ "Skipping text replacement.",
			);
			break;
	}

	target.title = originalText;
}