module Rules.Blog.Index ( build ) where import Control.Monad.Reader (asks, lift) import Hakyll import System.FilePath ((</>)) import Config.Blog (BlogConfig (..)) import Rules.Blog.ListPage import Rules.Blog.Type import Utils (makePageIdentifier) import qualified Vendor.FontAwesome as FA build :: FA.FontAwesomeIcons -> Tags -> ListPageOpts -> BlogConfReader m Rules () build :: forall (m :: * -> *). FontAwesomeIcons -> Tags -> ListPageOpts -> BlogConfReader m Rules () build FontAwesomeIcons faIcons Tags tags ListPageOpts opts = do PageNumber -> Identifier makeId <- (BlogConfig m -> PageNumber -> Identifier) -> ReaderT (BlogConfig m) Rules (PageNumber -> Identifier) forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a asks ((BlogConfig m -> PageNumber -> Identifier) -> ReaderT (BlogConfig m) Rules (PageNumber -> Identifier)) -> (BlogConfig m -> PageNumber -> Identifier) -> ReaderT (BlogConfig m) Rules (PageNumber -> Identifier) forall a b. (a -> b) -> a -> b $ FilePath -> PageNumber -> Identifier makePageIdentifier (FilePath -> PageNumber -> Identifier) -> (BlogConfig m -> FilePath) -> BlogConfig m -> PageNumber -> Identifier forall b c a. (b -> c) -> (a -> b) -> a -> c . (FilePath -> FilePath -> FilePath </> FilePath "index.html") (FilePath -> FilePath) -> (BlogConfig m -> FilePath) -> BlogConfig m -> FilePath forall b c a. (b -> c) -> (a -> b) -> a -> c . BlogConfig m -> FilePath forall (m :: * -> *). BlogConfig m -> FilePath blogName Rules [Identifier] -> Rules [[Identifier]] f <- (BlogConfig m -> Rules [Identifier] -> Rules [[Identifier]]) -> ReaderT (BlogConfig m) Rules (Rules [Identifier] -> Rules [[Identifier]]) forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a asks ((BlogConfig m -> Rules [Identifier] -> Rules [[Identifier]]) -> ReaderT (BlogConfig m) Rules (Rules [Identifier] -> Rules [[Identifier]])) -> (BlogConfig m -> Rules [Identifier] -> Rules [[Identifier]]) -> ReaderT (BlogConfig m) Rules (Rules [Identifier] -> Rules [[Identifier]]) forall a b. (a -> b) -> a -> b $ ([Identifier] -> [[Identifier]]) -> Rules [Identifier] -> Rules [[Identifier]] forall a b. (a -> b) -> Rules a -> Rules b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (([Identifier] -> [[Identifier]]) -> Rules [Identifier] -> Rules [[Identifier]]) -> (BlogConfig m -> [Identifier] -> [[Identifier]]) -> BlogConfig m -> Rules [Identifier] -> Rules [[Identifier]] forall b c a. (b -> c) -> (a -> b) -> a -> c . PageNumber -> [Identifier] -> [[Identifier]] forall a. PageNumber -> [a] -> [[a]] paginateEvery (PageNumber -> [Identifier] -> [[Identifier]]) -> (BlogConfig m -> PageNumber) -> BlogConfig m -> [Identifier] -> [[Identifier]] forall b c a. (b -> c) -> (a -> b) -> a -> c . BlogConfig m -> PageNumber forall (m :: * -> *). BlogConfig m -> PageNumber blogPageEntriesNum Pattern ep <- (BlogConfig m -> Pattern) -> ReaderT (BlogConfig m) Rules Pattern forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a asks BlogConfig m -> Pattern forall (m :: * -> *). BlogConfig m -> Pattern blogEntryPattern Rules () -> BlogConfReader m Rules () forall (m :: * -> *) a. Monad m => m a -> ReaderT (BlogConfig m) m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (Rules () -> BlogConfReader m Rules ()) -> Rules () -> BlogConfReader m Rules () forall a b. (a -> b) -> a -> b $ Maybe FilePath -> FontAwesomeIcons -> Tags -> ListPageOpts -> Paginate -> Rules () listPage Maybe FilePath forall a. Maybe a Nothing FontAwesomeIcons faIcons Tags tags ListPageOpts opts (Paginate -> Rules ()) -> Rules Paginate -> Rules () forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< ([Identifier] -> Rules [[Identifier]]) -> Pattern -> (PageNumber -> Identifier) -> Rules Paginate forall (m :: * -> *). MonadMetadata m => ([Identifier] -> m [[Identifier]]) -> Pattern -> (PageNumber -> Identifier) -> m Paginate buildPaginateWith (Rules [Identifier] -> Rules [[Identifier]] f (Rules [Identifier] -> Rules [[Identifier]]) -> ([Identifier] -> Rules [Identifier]) -> [Identifier] -> Rules [[Identifier]] forall b c a. (b -> c) -> (a -> b) -> a -> c . [Identifier] -> Rules [Identifier] forall (m :: * -> *). (MonadMetadata m, MonadFail m) => [Identifier] -> m [Identifier] sortRecentFirst) Pattern ep PageNumber -> Identifier makeId