mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-23 02:48:26 +00:00
172 lines
3.5 KiB
Elm
172 lines
3.5 KiB
Elm
{-
|
|
Copyright 2020 Eike K. & Contributors
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
-}
|
|
|
|
|
|
module Data.CalEvent exposing
|
|
( CalEvent
|
|
, everyMonth
|
|
, everyMonthTz
|
|
, fromEvent
|
|
, makeEvent
|
|
)
|
|
|
|
import Data.TimeZone exposing (TimeZone)
|
|
import Util.Maybe
|
|
|
|
|
|
type alias CalEvent =
|
|
{ weekday : Maybe String
|
|
, year : String
|
|
, month : String
|
|
, day : String
|
|
, hour : String
|
|
, minute : String
|
|
, timeZone : TimeZone
|
|
}
|
|
|
|
|
|
everyMonth : CalEvent
|
|
everyMonth =
|
|
everyMonthTz Data.TimeZone.utc
|
|
|
|
|
|
everyMonthTz : TimeZone -> CalEvent
|
|
everyMonthTz tz =
|
|
CalEvent Nothing "*" "*" "01" "00" "00" tz
|
|
|
|
|
|
makeEvent : CalEvent -> String
|
|
makeEvent ev =
|
|
let
|
|
datetime =
|
|
ev.year
|
|
++ "-"
|
|
++ ev.month
|
|
++ "-"
|
|
++ ev.day
|
|
++ " "
|
|
++ ev.hour
|
|
++ ":"
|
|
++ ev.minute
|
|
++ " "
|
|
++ Data.TimeZone.toName ev.timeZone
|
|
in
|
|
case ev.weekday of
|
|
Just wd ->
|
|
wd ++ " " ++ datetime
|
|
|
|
Nothing ->
|
|
datetime
|
|
|
|
|
|
fromEvent : String -> Maybe CalEvent
|
|
fromEvent str =
|
|
let
|
|
init =
|
|
everyMonth
|
|
|
|
parts =
|
|
String.split " " str
|
|
|
|
foldChanges : List (CalEvent -> Maybe CalEvent) -> Maybe CalEvent
|
|
foldChanges list =
|
|
List.foldl (\fmc -> \c -> Maybe.andThen fmc c) (Just init) list
|
|
in
|
|
case parts of
|
|
wd :: date :: time :: tz :: [] ->
|
|
foldChanges
|
|
[ fromWeekDays wd
|
|
, fromDate date
|
|
, fromTime time
|
|
, fromTimeZone tz
|
|
]
|
|
|
|
a :: b :: c :: [] ->
|
|
if startsWithWeekday a then
|
|
foldChanges
|
|
[ fromWeekDays a
|
|
, fromDate b
|
|
, fromTime c
|
|
]
|
|
|
|
else
|
|
foldChanges
|
|
[ fromDate a
|
|
, fromTime b
|
|
, fromTimeZone c
|
|
]
|
|
|
|
date :: time :: [] ->
|
|
foldChanges
|
|
[ fromDate date
|
|
, fromTime time
|
|
]
|
|
|
|
_ ->
|
|
Nothing
|
|
|
|
|
|
fromDate : String -> CalEvent -> Maybe CalEvent
|
|
fromDate date ev =
|
|
let
|
|
parts =
|
|
String.split "-" date
|
|
in
|
|
case parts of
|
|
y :: m :: d :: [] ->
|
|
Just
|
|
{ ev
|
|
| year = y
|
|
, month = m
|
|
, day = d
|
|
}
|
|
|
|
_ ->
|
|
Nothing
|
|
|
|
|
|
fromTime : String -> CalEvent -> Maybe CalEvent
|
|
fromTime time ev =
|
|
case String.split ":" time of
|
|
h :: m :: _ :: [] ->
|
|
Just { ev | hour = h, minute = m }
|
|
|
|
h :: m :: [] ->
|
|
Just { ev | hour = h, minute = m }
|
|
|
|
_ ->
|
|
Nothing
|
|
|
|
|
|
fromTimeZone : String -> CalEvent -> Maybe CalEvent
|
|
fromTimeZone tzStr ev =
|
|
Data.TimeZone.get tzStr
|
|
|> Maybe.map (\tz -> { ev | timeZone = tz })
|
|
|
|
|
|
fromWeekDays : String -> CalEvent -> Maybe CalEvent
|
|
fromWeekDays str ce =
|
|
if startsWithWeekday str then
|
|
Just (withWeekday str ce)
|
|
|
|
else
|
|
Nothing
|
|
|
|
|
|
withWeekday : String -> CalEvent -> CalEvent
|
|
withWeekday wd ev =
|
|
{ ev | weekday = Util.Maybe.fromString wd }
|
|
|
|
|
|
weekDays : List String
|
|
weekDays =
|
|
[ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" ]
|
|
|
|
|
|
startsWithWeekday : String -> Bool
|
|
startsWithWeekday str =
|
|
List.any (\a -> String.startsWith a str) weekDays
|