gitoriaLog in with ident

calendar

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commitd6c59290d6c59290calendar: Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4, mpackdb 2cb7ae5e, http1 773de63e); gates 78/0 + 18/0mred6c59290/components/month-view/dates.hl

2.5 KB

  1. // dates.hl — plain date / text helpers shared by the server (events.hl) and the month view in the browser.
  2. // No plugins, no Date (hl:time has no time zones): dates are 'YYYY-MM-DD' texts, times 'HH:MM'.
  3. static isText = (v) => { return v != null && hlTypeName(v) == 'String' }
  4. static digitsAt = (s, at, n) => {
  5. if (s.length < at + n) { return false }
  6. let i = at
  7. while (i < at + n) {
  8. let c = s.charCodeAt(i)
  9. if (c < 48 || c > 57) { return false }
  10. i = i + 1
  11. }
  12. return true
  13. }
  14. static leap = (y) => { return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 }
  15. static daysIn = (y, m) => {
  16. if (m == 2) { return leap(y) ? 29 : 28 }
  17. if (m == 4 || m == 6 || m == 9 || m == 11) { return 30 }
  18. return 31
  19. }
  20. static pad = (n) => { return n < 10 ? '0' + n : '' + n }
  21. // 'YYYY-MM-DD' that is a real day
  22. static isDate = (s) => {
  23. if (!isText(s) || s.length != 10 || s[4] != '-' || s[7] != '-') { return false }
  24. if (!digitsAt(s, 0, 4) || !digitsAt(s, 5, 2) || !digitsAt(s, 8, 2)) { return false }
  25. let y = toNumber(s.slice(0, 4))
  26. let m = toNumber(s.slice(5, 7))
  27. let d = toNumber(s.slice(8, 10))
  28. return y >= 1 && m >= 1 && m <= 12 && d >= 1 && d <= daysIn(y, m)
  29. }
  30. // 'HH:MM'
  31. static isTime = (s) => {
  32. if (!isText(s) || s.length != 5 || s[2] != ':' || !digitsAt(s, 0, 2) || !digitsAt(s, 3, 2)) { return false }
  33. return toNumber(s.slice(0, 2)) < 24 && toNumber(s.slice(3, 5)) < 60
  34. }
  35. static nextDay = (s) => {
  36. let y = toNumber(s.slice(0, 4))
  37. let m = toNumber(s.slice(5, 7))
  38. let d = toNumber(s.slice(8, 10))
  39. if (d < daysIn(y, m)) { return s.slice(0, 8) + pad(d + 1) }
  40. if (m < 12) { return s.slice(0, 5) + pad(m + 1) + '-01' }
  41. return pad(y) + '-01-01'
  42. }
  43. static prevDay = (s) => {
  44. let y = toNumber(s.slice(0, 4))
  45. let m = toNumber(s.slice(5, 7))
  46. let d = toNumber(s.slice(8, 10))
  47. if (d > 1) { return s.slice(0, 8) + pad(d - 1) }
  48. if (m > 1) { return s.slice(0, 5) + pad(m - 1) + '-' + pad(daysIn(y, m - 1)) }
  49. return pad(y - 1) + '-12-31'
  50. }
  51. // a time zone name from the browser: letters, digits and _ / + - only
  52. static isZone = (s) => {
  53. if (!isText(s) || s.length < 1 || s.length > 64) { return false }
  54. let i = 0
  55. while (i < s.length) {
  56. let c = s.charCodeAt(i)
  57. let ok = (c >= 48 && c <= 57) || (c >= 65 && c <= 90) || (c >= 97 && c <= 122) || c == 95 || c == 47 || c == 43 || c == 45
  58. if (!ok) { return false }
  59. i = i + 1
  60. }
  61. return true
  62. }
  63. // a < b for equal-format ISO texts (hybriel #2: no ordering on strings)
  64. static before = (a, b) => {
  65. let i = 0
  66. while (i < a.length && i < b.length) {
  67. let x = a.charCodeAt(i)
  68. let y = b.charCodeAt(i)
  69. if (x != y) { return x < y }
  70. i = i + 1
  71. }
  72. return a.length < b.length
  73. }

Branches

Latest commits

  • d6c59290calendar: Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4, mpackdb 2cb7ae5e, http1 773de63e); gates 78/0 + 18/0mre
  • 7bd0337ccalendar: Hybriel master 190aa11d (fc838894 GC correctness, #126 closure scopes, #127); gates 78/0 + 18/0mre
  • ff41310ccalendar: Hybriel master 8efba065 (#126 memory, #48 lambda copy; audit: no & needed)mre
  • 14ba08c7antcolony#40: mission references point to the moved missionsmre
  • 99c73346antcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
  • 76edaa62calendar: Hybriel master ff51cf46 (re-vendor round, static workaround removed)mre
  • 90a3fc2cdeploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
  • 6722b72ddeploy.sh: never send .git or .gitignore to Byrodinmre
  • be099807State of 2026-09-27, before the move to gitoriamre