1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
-- Utility module and UI widget for handling release dates.
--
-- Release dates are integers with the following format: 0 or yyyymmdd
-- Special values
-- 0 -> unknown
-- 99999999 -> TBA
-- yyyy9999 -> year known, month & day unknown
-- yyyymm99 -> year & month known, day unknown
module Lib.RDate exposing (..)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Date
type alias RDate = Int
type alias RDateComp =
{ y : Int
, m : Int
, d : Int
}
expand : RDate -> RDateComp
expand r =
{ y = r // 10000
, m = modBy 100 (r // 100)
, d = modBy 100 r
}
compact : RDateComp -> RDate
compact r = r.y * 10000 + r.m * 100 + r.d
fromDate : Date.Date -> RDateComp
fromDate d =
{ y = Date.year d
, m = Date.monthNumber d
, d = Date.day d
}
normalize : RDateComp -> RDateComp
normalize r =
if r.y == 0 then { y = 0, m = 0, d = 0 }
else if r.y == 9999 then { y = 9999, m = 99, d = 99 }
else if r.m == 99 then { y = r.y, m = 99, d = 99 }
else r
format : RDateComp -> String
format date =
case (date.y, date.m, date.d) of
( 0, _, _) -> "unknown"
(9999, _, _) -> "TBA"
( y, 99, 99) -> String.fromInt y
( y, m, 99) -> String.fromInt y ++ "-" ++ (String.padLeft 2 '0' <| String.fromInt m)
( y, m, d) -> String.fromInt y ++ "-" ++ (String.padLeft 2 '0' <| String.fromInt m) ++ "-" ++ (String.padLeft 2 '0' <| String.fromInt d)
display : Date.Date -> RDate -> Html msg
display today d =
let fmt = expand d |> format
future = d > (fromDate today |> compact)
in if future then b [ class "future" ] [ text fmt ] else text fmt
|