{-# LANGUAGE OverloadedStrings , RecordWildCards , UnicodeSyntax #-} module Rakka.Wiki.Interpreter.PageList ( interpreters ) where import Control.Applicative import Control.Monad import qualified Data.ByteString.Char8 as C8 import Data.Maybe import Data.Monoid.Unicode import qualified Data.Text as T import Data.Time import qualified Data.Time.RFC1123 as RFC1123 import Network.URI import Prelude.Unicode import Rakka.Storage import Rakka.SystemConfig import Rakka.Utils import Rakka.Wiki import Rakka.Wiki.Interpreter import System.FilePath import Text.HyperEstraier interpreters :: [Interpreter] interpreters = [ recentUpdatesURLInterp , recentUpdatesInterp ] recentUpdatesURLInterp :: Interpreter recentUpdatesURLInterp = InlineCommandInterpreter { iciName = "recentUpdatesURL" , iciInterpret = \ ctx _ -> do BaseURI baseURI <- getSysConf (ctxSysConf ctx) let uri = baseURI { uriPath = uriPath baseURI "search.html" , uriQuery = '?' : C8.unpack (mkQueryString [ ("q" , "[UVSET]") , ("order", "@mdate NUMD") ]) } return $ ExternalLink uri (Just "List all pages") } --
-- --
recentUpdatesInterp ∷ Interpreter recentUpdatesInterp = BlockCommandInterpreter { bciName = "recentUpdates" , bciInterpret = \(InterpreterContext {..}) (BlockCommand _ args _) → do let items = fromMaybe 10 $ read ∘ T.unpack <$> lookup "items" args showSummary = fromMaybe True $ parseYesOrNo <$> lookup "showSummary" args onlyEntity = fromMaybe True $ parseYesOrNo <$> lookup "onlyEntity" args onlySummarized = fromMaybe True $ parseYesOrNo <$> lookup "onlySummarized" args 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 ctxStorage cond mkPageList showSummary (srPages result) } where mkPageList :: Bool -> [HitPage] -> IO BlockElement mkPageList showSummary pages = do items <- mapM (mkListItem showSummary) pages return (Div [("class", "recentUpdates")] [ Block (List Bullet items) ]) mkListItem ∷ Bool → HitPage → IO ListItem mkListItem showSummary page = do lastMod ← utcToLocalZonedTime (hpLastMod page) return ( [ Inline PageLink { linkPage = Just (hpPageName page) , linkFragment = Nothing , linkText = Nothing } , Block ( Div [("class", "date")] [Inline (Text (T.pack $ RFC1123.format lastMod))] ) ] ⊕ case (showSummary, hpSummary page) of (True, Just s) → [ Block (Paragraph [Text s]) ] _ → [] )