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 ]
--
--
-- -
-- ...
--
...
--
-- blah blah...
--
--
-- ...
--
--
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 (getPageByHP sto) (srPages result)
mkPageList showSummary pages
}
where
getPageByHP :: Storage -> HitPage -> IO Page
getPageByHP sto hp
= getPage sto (hpPageName hp) (Just (hpPageRev hp)) >>= 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]) ]
_ -> []
)