{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE NoFieldSelectors #-} {-# LANGUAGE StrictData #-} {-# LANGUAGE TemplateHaskell #-} module Pages where import Control.Monad.IO.Class (liftIO) import Data.Text (Text) import Data.Text.IO qualified as T import Language.Haskell.TH.Syntax (addDependentFile) import System.Directory (makeAbsolute) import Text.Mustache.Compile qualified as M import Pages.TH data IndexData = IndexData { networks :: [IndexNetworkData] } data IndexNetworkData = IndexNetworkData { name :: Text , channels :: [IndexChannelData] } data IndexChannelData = IndexChannelData { name :: Text , alias :: Text } data CalendarData = CalendarData { network :: Text , channel :: Text , alias :: Text , years :: [CalendarYearData] } data CalendarYearData = CalendarYearData { year :: Int , monrows :: [CalendarMonthRowData] } data CalendarMonthRowData = CalendarMonthRowData { months :: [CalendarMonthData] } data CalendarMonthData = CalendarMonthData { display :: Bool , month :: Int , month00 :: Text , monthname :: Text , weeks :: [CalendarWeekData] , phantomweek :: Bool } data CalendarWeekData = CalendarWeekData { days :: [CalendarDayData'] } data CalendarDayData' = CalendarDayData' { date :: Maybe Int , date00 :: Text } data LogData = LogData { network :: Text , channel :: Text , alias :: Text , totalevents :: Text , picker :: PickerData , events :: [EventData () Text] } data CalendarDayData = CalendarDayData { network :: Text , channel :: Text , alias :: Text , date :: Text , events :: [EventData Text ()] } data PickerData = PickerData { prevpage :: Maybe Int , nextpage :: Maybe Int , firstpage :: Bool , leftdots :: Bool , rightdots :: Bool , lastpage :: Bool , leftnums :: [Int] , curnum :: Int , rightnums :: [Int] , npages :: Int } data EventData tm dttm = EventData { classlist :: Maybe Text , time :: tm , datetime :: dttm , linkid :: Text , nickwrap1 :: Maybe Text , nick :: Text , nickwrap2 :: Maybe Text , message :: Text } $(do let readTemplate name = do path <- liftIO $ makeAbsolute ("pages/" ++ name ++ ".mustache") tplSrc <- liftIO $ T.readFile path addDependentFile path case M.compileTemplate name tplSrc of Right tpl -> return tpl Left err -> fail $ "Reading " ++ path ++ ": " ++ show err concat <$> mapM (\(name, ty) -> (`makeRender` ty) =<< readTemplate name) [("log", ''LogData) ,("calendar-day", ''CalendarDayData) ,("index", ''IndexData) ,("calendar", ''CalendarData)])