module Rules.Blog.Search (
    build
) where

import           Control.Monad.Reader (asks, lift)
import           Hakyll
import           System.FilePath      ((</>))

import           Config.Blog          (BlogConfig (..))
import           Config.Program       (tmBlogRoot)
import           Config.Site          (defaultTimeLocale', timeZoneJST)
import           Contexts.Field       (searchBoxResultField)
import           Rules.Blog.Type
import           Rules.Blog.Utils     (appendFooter)
import           Utils                (absolutizeUrls, modifyExternalLinkAttr)
import qualified Vendor.FontAwesome   as FA

build :: FA.FontAwesomeIcons
    -> Context String
    -> BlogConfReader m Rules ()
build :: forall (m :: * -> *).
FontAwesomeIcons -> Context String -> BlogConfReader m Rules ()
build FontAwesomeIcons
faIcons Context String
ctx = do
    String
t <- (BlogConfig m -> String) -> ReaderT (BlogConfig m) Rules String
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks BlogConfig m -> String
forall (m :: * -> *). BlogConfig m -> String
blogName
    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
$ [Identifier] -> Rules () -> Rules ()
create [String -> Identifier
fromFilePath (String
t String -> String -> String
</> String
"search.html")] (Rules () -> Rules ()) -> Rules () -> Rules ()
forall a b. (a -> b) -> a -> b
$ do
        Routes -> Rules ()
route Routes
idRoute
        Compiler (Item String) -> Rules ()
forall a.
(Binary a, Typeable a, Writable a) =>
Compiler (Item a) -> Rules ()
compile (Compiler (Item String) -> Rules ())
-> Compiler (Item String) -> Rules ()
forall a b. (a -> b) -> a -> b
$
            String -> Compiler (Item String)
forall a. a -> Compiler (Item a)
makeItem String
forall a. Monoid a => a
mempty
                Compiler (Item String)
-> (Item String -> Compiler (Item String))
-> Compiler (Item String)
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Identifier
-> Context String -> Item String -> Compiler (Item String)
forall a.
Identifier -> Context a -> Item a -> Compiler (Item String)
loadAndApplyTemplate (String -> Identifier
fromFilePath (String -> Identifier) -> String -> Identifier
forall a b. (a -> b) -> a -> b
$ String
tmBlogRoot String -> String -> String
</> String
"default.html") (Context String
searchBoxResultField Context String -> Context String -> Context String
forall a. Semigroup a => a -> a -> a
<> Context String
ctx)
                Compiler (Item String)
-> (Item String -> Compiler (Item String))
-> Compiler (Item String)
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Item String -> Compiler (Item String)
absolutizeUrls
                Compiler (Item String)
-> (Item String -> Compiler (Item String))
-> Compiler (Item String)
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String
-> TimeLocale -> TimeZone -> Item String -> Compiler (Item String)
forall a.
(Binary a, Typeable a, Semigroup a) =>
String -> TimeLocale -> TimeZone -> Item a -> Compiler (Item a)
appendFooter String
t TimeLocale
defaultTimeLocale' TimeZone
timeZoneJST
                Compiler (Item String)
-> (Item String -> Compiler (Item String))
-> Compiler (Item String)
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Item String -> Compiler (Item String)
modifyExternalLinkAttr
                Compiler (Item String)
-> (Item String -> Compiler (Item String))
-> Compiler (Item String)
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Item String -> Compiler (Item String)
relativizeUrls
                Compiler (Item String)
-> (Item String -> Compiler (Item String))
-> Compiler (Item String)
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= FontAwesomeIcons -> Item String -> Compiler (Item String)
FA.render FontAwesomeIcons
faIcons