summaryrefslogtreecommitdiff
path: root/elm/Lib/RDate.elm
diff options
context:
space:
mode:
Diffstat (limited to 'elm/Lib/RDate.elm')
-rw-r--r--elm/Lib/RDate.elm68
1 files changed, 68 insertions, 0 deletions
diff --git a/elm/Lib/RDate.elm b/elm/Lib/RDate.elm
new file mode 100644
index 00000000..7af8f89f
--- /dev/null
+++ b/elm/Lib/RDate.elm
@@ -0,0 +1,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