module Rakka.Wiki.Interpreter.PageList ( interpreters ) where import Control.Monad import Data.Maybe import Data.Time import Network.HTTP.Lucu.RFC1123DateTime import Rakka.Page import Rakka.Storage import Rakka.Utils import Rakka.Wiki import Rakka.Wiki.Interpreter import Text.HyperEstraier interpreters :: [Interpreter] interpreters = [ recentUpdatesInterp ] --
-- --
recentUpdatesInterp :: Interpreter recentUpdatesInterp = BlockCommandInterpreter { bciName = "recentUpdates" , bciInterpret = \ ctx (BlockCommand _ args _) -> do let items = fromMaybe 10 $ fmap read $ lookup "items" args showSummary = fromMaybe True $ fmap parseYesOrNo $ lookup "showSummary" args onlyEntity = fromMaybe True $ fmap parseYesOrNo $ lookup "onlyEntity" args onlySummarized = fromMaybe True $ fmap parseYesOrNo $ lookup "onlySummarized" args sto = ctxStorage ctx cond <- newCondition when onlyEntity $ addAttrCond cond "@type STRNE application/x-rakka-redirection" when onlySummarized $ addAttrCond cond "rakka:summary STRNE" -- summary が空でない setPhrase cond "[UVSET]" setOrder cond "@mdate NUMD" setMax cond items result <- searchPages sto cond pages <- mapM (getPageBySR sto) result mkPageList showSummary pages } where getPageBySR :: Storage -> SearchResult -> IO Page getPageBySR sto sr = getPage sto (srPageName sr) (Just (srPageRev sr)) >>= return . fromJust mkPageList :: Bool -> [Page] -> IO BlockElement mkPageList showSummary pages = do items <- mapM (mkListItem showSummary) pages return (Div [("class", "recentUpdates")] [ Block (List Bullet items) ]) mkListItem :: Bool -> Page -> IO ListItem mkListItem showSummary page = do lastMod <- utcToLocalZonedTime (entityLastMod page) return ( [ Inline ( PageLink { linkPage = Just (pageName page) , linkFragment = Nothing , linkText = Nothing } ) , Block ( Div [("class", "date")] [Inline (Text (formatRFC1123DateTime lastMod))] ) ] ++ case (showSummary, entitySummary page) of (True, Just s) -> [ Block (Paragraph [Text s]) ] _ -> [] )