{-# LANGUAGE OverloadedStrings #-}
module Rules.Resume (rules) where

import           Control.Monad                 ((>=>))
import           Control.Monad.Extra           (concatMapM)
import           Control.Monad.Reader          (asks)
import           Control.Monad.Trans           (MonadTrans (..))
import           Data.Functor                  ((<&>))
import           Data.List                     (intercalate, sortBy, uncons)
import           Data.Ord                      (comparing)
import           Data.String                   (IsString (..))
import           Data.Time.Calendar            (toGregorian)
import           Data.Time.Clock               (getCurrentTime)
import           Data.Time.LocalTime           (LocalTime (..), utcToLocalTime)
import           Hakyll
import           System.FilePath               (joinPath, (</>))
import           System.FilePath.Posix         (takeBaseName)

import           Config                        (contentsRoot, readerOptions,
                                                siteName, timeZoneJST)
import           Contexts                      (siteCtx)
import           Hakyll.Core.Compiler.Internal (compilerUnsafeIO)
import           Media.SVG                     (mermaidTransform)
import           Rules.PageType
import           Text.Pandoc.Walk              (walkM)
import           Utils                         (mconcatM,
                                                modifyExternalLinkAttr)
import qualified Vendor.FontAwesome            as FA

resumeRoot :: FilePath
resumeRoot :: [Char]
resumeRoot = [[Char]] -> [Char]
joinPath [[Char]
contentsRoot, [Char]
"resume"]

aboutMeIdent :: Identifier
aboutMeIdent :: Identifier
aboutMeIdent = [Char] -> Identifier
forall a. IsString a => [Char] -> a
fromString
    ([Char] -> Identifier) -> [Char] -> Identifier
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
joinPath [[Char]
resumeRoot, [Char]
"about_me.md"]

resumeCareerPattern :: Pattern
resumeCareerPattern :: Pattern
resumeCareerPattern = [Char] -> Pattern
fromRegex ([Char] -> Pattern) -> [Char] -> Pattern
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
forall a. Monoid a => [a] -> a
mconcat
    [ [Char]
"(^"
    , [[Char]] -> [Char]
joinPath [[Char]
resumeRoot, [Char]
"career", [Char]
"[0-9]+\\.md"]
    , [Char]
"$)"
    ]

skillsIdent :: Identifier
skillsIdent :: Identifier
skillsIdent = [Char] -> Identifier
forall a. IsString a => [Char] -> a
fromString
    ([Char] -> Identifier) -> [Char] -> Identifier
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
joinPath [[Char]
resumeRoot, [Char]
"skills.md"]

otherActivitiesIdent :: Identifier
otherActivitiesIdent :: Identifier
otherActivitiesIdent = [Char] -> Identifier
forall a. IsString a => [Char] -> a
fromString
    ([Char] -> Identifier) -> [Char] -> Identifier
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
joinPath [[Char]
resumeRoot, [Char]
"other_activities.md"]

favTechIdent :: Identifier
favTechIdent :: Identifier
favTechIdent = [Char] -> Identifier
forall a. IsString a => [Char] -> a
fromString
    ([Char] -> Identifier) -> [Char] -> Identifier
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
joinPath [[Char]
resumeRoot, [Char]
"fav_tech.md"]

sortByNum :: [Item a] -> [Item a]
sortByNum :: forall a. [Item a] -> [Item a]
sortByNum = (Item a -> Item a -> Ordering) -> [Item a] -> [Item a]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy
    ((Item a -> Item a -> Ordering) -> [Item a] -> [Item a])
-> (Item a -> Item a -> Ordering) -> [Item a] -> [Item a]
forall a b. (a -> b) -> a -> b
$ (Item a -> Item a -> Ordering) -> Item a -> Item a -> Ordering
forall a b c. (a -> b -> c) -> b -> a -> c
flip
    ((Item a -> Item a -> Ordering) -> Item a -> Item a -> Ordering)
-> (Item a -> Item a -> Ordering) -> Item a -> Item a -> Ordering
forall a b. (a -> b) -> a -> b
$ (Item a -> MonthOfYear) -> Item a -> Item a -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing
    ((Item a -> MonthOfYear) -> Item a -> Item a -> Ordering)
-> (Item a -> MonthOfYear) -> Item a -> Item a -> Ordering
forall a b. (a -> b) -> a -> b
$ ([Char] -> MonthOfYear
forall a. Read a => [Char] -> a
read :: String -> Int) ([Char] -> MonthOfYear)
-> (Item a -> [Char]) -> Item a -> MonthOfYear
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [Char]
takeBaseName ([Char] -> [Char]) -> (Item a -> [Char]) -> Item a -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identifier -> [Char]
toFilePath (Identifier -> [Char])
-> (Item a -> Identifier) -> Item a -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Item a -> Identifier
forall a. Item a -> Identifier
itemIdentifier

mdRule :: Snapshot
    -> Pattern
    -> PageConfReader Rules ()
mdRule :: [Char] -> Pattern -> PageConfReader Rules ()
mdRule [Char]
ss Pattern
pat = do
    WriterOptions
wOpt <- (PageConf -> WriterOptions) -> ReaderT PageConf Rules WriterOptions
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks PageConf -> WriterOptions
pcWriterOpt
    KaTeXRender
katexRender <- (PageConf -> KaTeXRender) -> ReaderT PageConf Rules KaTeXRender
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks PageConf -> KaTeXRender
pcKaTeXRender
    FontAwesomeIcons
faIcons <- (PageConf -> FontAwesomeIcons)
-> ReaderT PageConf Rules FontAwesomeIcons
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks PageConf -> FontAwesomeIcons
pcFaIcons
    Rules () -> PageConfReader Rules ()
forall (m :: * -> *) a. Monad m => m a -> ReaderT PageConf m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Rules () -> PageConfReader Rules ())
-> Rules () -> PageConfReader Rules ()
forall a b. (a -> b) -> a -> b
$ Pattern -> Rules () -> Rules ()
match Pattern
pat (Rules () -> Rules ()) -> Rules () -> Rules ()
forall a b. (a -> b) -> a -> b
$ Compiler (Item [Char]) -> Rules ()
forall a.
(Binary a, Typeable a, Writable a) =>
Compiler (Item a) -> Rules ()
compile (Compiler (Item [Char]) -> Rules ())
-> Compiler (Item [Char]) -> Rules ()
forall a b. (a -> b) -> a -> b
$ do
        ReaderOptions
-> WriterOptions
-> (Pandoc -> Compiler Pandoc)
-> Compiler (Item [Char])
pandocCompilerWithTransformM ReaderOptions
readerOptions WriterOptions
wOpt ((Block -> Compiler Block) -> Pandoc -> Compiler Pandoc
forall a b (m :: * -> *).
(Walkable a b, Monad m, Applicative m, Functor m) =>
(a -> m a) -> b -> m b
forall (m :: * -> *).
(Monad m, Applicative m, Functor m) =>
(Block -> m Block) -> Pandoc -> m Pandoc
walkM Block -> Compiler Block
mermaidTransform)
            Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= KaTeXRender
modifyExternalLinkAttr
            Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= KaTeXRender
relativizeUrls
            Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= FontAwesomeIcons -> KaTeXRender
FA.render FontAwesomeIcons
faIcons
            Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= KaTeXRender
katexRender
            Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> KaTeXRender
forall a.
(Binary a, Typeable a) =>
[Char] -> Item a -> Compiler (Item a)
saveSnapshot [Char]
ss

getLastModDate :: [Pattern] -> Compiler String
getLastModDate :: [Pattern] -> Compiler [Char]
getLastModDate [Pattern]
items = Compiler Identifier
getUnderlying
    Compiler Identifier
-> (Identifier -> Compiler [UTCTime]) -> Compiler [UTCTime]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Pattern -> Compiler [UTCTime]) -> [Pattern] -> Compiler [UTCTime]
forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
concatMapM (Pattern -> Compiler [Identifier]
forall (m :: * -> *). MonadMetadata m => Pattern -> m [Identifier]
getMatches (Pattern -> Compiler [Identifier])
-> ([Identifier] -> Compiler [UTCTime])
-> Pattern
-> Compiler [UTCTime]
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> (Identifier -> Compiler UTCTime)
-> [Identifier] -> Compiler [UTCTime]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Identifier -> Compiler UTCTime
getItemModificationTime) ([Pattern] -> Compiler [UTCTime])
-> (Identifier -> [Pattern]) -> Identifier -> Compiler [UTCTime]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Pattern -> [Pattern] -> [Pattern]
forall a. a -> [a] -> [a]
:[Pattern]
items) (Pattern -> [Pattern])
-> (Identifier -> Pattern) -> Identifier -> [Pattern]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Identifier] -> Pattern
fromList ([Identifier] -> Pattern)
-> (Identifier -> [Identifier]) -> Identifier -> Pattern
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identifier -> [Identifier] -> [Identifier]
forall a. a -> [a] -> [a]
:[])
    Compiler [UTCTime]
-> ([UTCTime] -> Compiler UTCTime) -> Compiler UTCTime
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Compiler UTCTime
-> ((UTCTime, [UTCTime]) -> Compiler UTCTime)
-> Maybe (UTCTime, [UTCTime])
-> Compiler UTCTime
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (IO UTCTime -> Compiler UTCTime
forall a. IO a -> Compiler a
compilerUnsafeIO IO UTCTime
getCurrentTime) (UTCTime -> Compiler UTCTime
forall a. a -> Compiler a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (UTCTime -> Compiler UTCTime)
-> ((UTCTime, [UTCTime]) -> UTCTime)
-> (UTCTime, [UTCTime])
-> Compiler UTCTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UTCTime, [UTCTime]) -> UTCTime
forall a b. (a, b) -> a
fst) (Maybe (UTCTime, [UTCTime]) -> Compiler UTCTime)
-> ([UTCTime] -> Maybe (UTCTime, [UTCTime]))
-> [UTCTime]
-> Compiler UTCTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [UTCTime] -> Maybe (UTCTime, [UTCTime])
forall a. [a] -> Maybe (a, [a])
uncons ([UTCTime] -> Maybe (UTCTime, [UTCTime]))
-> ([UTCTime] -> [UTCTime])
-> [UTCTime]
-> Maybe (UTCTime, [UTCTime])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UTCTime -> UTCTime -> Ordering) -> [UTCTime] -> [UTCTime]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy ((UTCTime -> UTCTime -> Ordering) -> UTCTime -> UTCTime -> Ordering
forall a b c. (a -> b -> c) -> b -> a -> c
flip UTCTime -> UTCTime -> Ordering
forall a. Ord a => a -> a -> Ordering
compare)
    Compiler UTCTime
-> (UTCTime -> (Year, MonthOfYear, MonthOfYear))
-> Compiler (Year, MonthOfYear, MonthOfYear)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> Day -> (Year, MonthOfYear, MonthOfYear)
toGregorian (Day -> (Year, MonthOfYear, MonthOfYear))
-> (UTCTime -> Day) -> UTCTime -> (Year, MonthOfYear, MonthOfYear)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LocalTime -> Day
localDay (LocalTime -> Day) -> (UTCTime -> LocalTime) -> UTCTime -> Day
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TimeZone -> UTCTime -> LocalTime
utcToLocalTime TimeZone
timeZoneJST
    Compiler (Year, MonthOfYear, MonthOfYear)
-> ((Year, MonthOfYear, MonthOfYear) -> [Char]) -> Compiler [Char]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(Year
y, MonthOfYear
m, MonthOfYear
d) -> [Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
"%2F" [Year -> [Char]
forall a. Show a => a -> [Char]
show Year
y, MonthOfYear -> [Char]
forall a. Show a => a -> [Char]
show MonthOfYear
m, MonthOfYear -> [Char]
forall a. Show a => a -> [Char]
show MonthOfYear
d]

rules :: PageConfReader Rules ()
rules :: PageConfReader Rules ()
rules = do
    let items :: [Pattern]
items = Pattern
resumeCareerPattern Pattern -> [Pattern] -> [Pattern]
forall a. a -> [a] -> [a]
: (Identifier -> Pattern) -> [Identifier] -> [Pattern]
forall a b. (a -> b) -> [a] -> [b]
map ([Identifier] -> Pattern
fromList ([Identifier] -> Pattern)
-> (Identifier -> [Identifier]) -> Identifier -> Pattern
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identifier -> [Identifier] -> [Identifier]
forall a. a -> [a] -> [a]
:[]))
            [ Identifier
aboutMeIdent
            , Identifier
skillsIdent
            , Identifier
otherActivitiesIdent
            , Identifier
favTechIdent
            ]
    (Pattern -> PageConfReader Rules ())
-> [Pattern] -> PageConfReader Rules ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ([Char] -> Pattern -> PageConfReader Rules ()
mdRule [Char]
resumeSnapshot) [Pattern]
items
    FontAwesomeIcons
faIcons <- (PageConf -> FontAwesomeIcons)
-> ReaderT PageConf Rules FontAwesomeIcons
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks PageConf -> FontAwesomeIcons
pcFaIcons
    Rules () -> PageConfReader Rules ()
forall (m :: * -> *) a. Monad m => m a -> ReaderT PageConf m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Rules () -> PageConfReader Rules ())
-> Rules () -> PageConfReader Rules ()
forall a b. (a -> b) -> a -> b
$ Pattern -> Rules () -> Rules ()
match Pattern
resumeJPPath (Rules () -> Rules ()) -> Rules () -> Rules ()
forall a b. (a -> b) -> a -> b
$ do
        Routes -> Rules ()
route (Routes -> Rules ()) -> Routes -> Rules ()
forall a b. (a -> b) -> a -> b
$ [Char] -> ([Char] -> [Char]) -> Routes
gsubRoute ([Char]
contentsRoot [Char] -> [Char] -> [Char]
</> [Char]
"pages/") ([Char] -> [Char] -> [Char]
forall a b. a -> b -> a
const [Char]
forall a. Monoid a => a
mempty)
        Compiler (Item [Char]) -> Rules ()
forall a.
(Binary a, Typeable a, Writable a) =>
Compiler (Item a) -> Rules ()
compile (Compiler (Item [Char]) -> Rules ())
-> Compiler (Item [Char]) -> Rules ()
forall a b. (a -> b) -> a -> b
$ do
            Context [Char]
resumeCtx <- [Compiler (Context [Char])] -> Compiler (Context [Char])
forall (m :: * -> *) b. (Monad m, Monoid b) => [m b] -> m b
mconcatM [
                Context [Char] -> Compiler (Context [Char])
forall a. a -> Compiler a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Context [Char] -> Compiler (Context [Char]))
-> Context [Char] -> Compiler (Context [Char])
forall a b. (a -> b) -> a -> b
$ [Char] -> [Char] -> Context [Char]
forall a. [Char] -> [Char] -> Context a
constField [Char]
"title" ([Char] -> Context [Char]) -> [Char] -> Context [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"resume - " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
siteName
              , Context [Char] -> Compiler (Context [Char])
forall a. a -> Compiler a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Context [Char]
siteCtx
              , Context [Char] -> Compiler (Context [Char])
forall a. a -> Compiler a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Context [Char]
defaultContext
              , [Char] -> [Char] -> Context [Char]
forall a. [Char] -> [Char] -> Context a
constField [Char]
"about-me-body"
                    ([Char] -> Context [Char])
-> Compiler [Char] -> Compiler (Context [Char])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Identifier -> [Char] -> Compiler [Char]
forall a.
(Binary a, Typeable a) =>
Identifier -> [Char] -> Compiler a
loadSnapshotBody Identifier
aboutMeIdent [Char]
resumeSnapshot
              , Context [Char] -> Compiler (Context [Char])
forall a. a -> Compiler a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Context [Char] -> Compiler (Context [Char]))
-> Context [Char] -> Compiler (Context [Char])
forall a b. (a -> b) -> a -> b
$ [Char]
-> Context [Char] -> Compiler [Item [Char]] -> Context [Char]
forall a b. [Char] -> Context a -> Compiler [Item a] -> Context b
listField [Char]
"career-list" (Context [Char]
forall a. Context a
metadataField Context [Char] -> Context [Char] -> Context [Char]
forall a. Semigroup a => a -> a -> a
<> [Char] -> Context [Char]
bodyField [Char]
"career-body") (Compiler [Item [Char]] -> Context [Char])
-> Compiler [Item [Char]] -> Context [Char]
forall a b. (a -> b) -> a -> b
$
                    [Item [Char]] -> [Item [Char]]
forall a. [Item a] -> [Item a]
sortByNum ([Item [Char]] -> [Item [Char]])
-> Compiler [Item [Char]] -> Compiler [Item [Char]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Pattern -> [Char] -> Compiler [Item [Char]]
forall a.
(Binary a, Typeable a) =>
Pattern -> [Char] -> Compiler [Item a]
loadAllSnapshots Pattern
resumeCareerPattern [Char]
resumeSnapshot
              , [Char] -> [Char] -> Context [Char]
forall a. [Char] -> [Char] -> Context a
constField [Char]
"skills"
                    ([Char] -> Context [Char])
-> Compiler [Char] -> Compiler (Context [Char])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Identifier -> [Char] -> Compiler [Char]
forall a.
(Binary a, Typeable a) =>
Identifier -> [Char] -> Compiler a
loadSnapshotBody Identifier
skillsIdent [Char]
resumeSnapshot
              , [Char] -> [Char] -> Context [Char]
forall a. [Char] -> [Char] -> Context a
constField [Char]
"other-activities-body"
                    ([Char] -> Context [Char])
-> Compiler [Char] -> Compiler (Context [Char])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Identifier -> [Char] -> Compiler [Char]
forall a.
(Binary a, Typeable a) =>
Identifier -> [Char] -> Compiler a
loadSnapshotBody Identifier
otherActivitiesIdent [Char]
resumeSnapshot
              , [Char] -> [Char] -> Context [Char]
forall a. [Char] -> [Char] -> Context a
constField [Char]
"fav-tech"
                    ([Char] -> Context [Char])
-> Compiler [Char] -> Compiler (Context [Char])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Identifier -> [Char] -> Compiler [Char]
forall a.
(Binary a, Typeable a) =>
Identifier -> [Char] -> Compiler a
loadSnapshotBody Identifier
favTechIdent [Char]
resumeSnapshot
              , [Char] -> [Char] -> Context [Char]
forall a. [Char] -> [Char] -> Context a
constField [Char]
"last-update"
                    ([Char] -> Context [Char])
-> Compiler [Char] -> Compiler (Context [Char])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Pattern] -> Compiler [Char]
getLastModDate [Pattern]
items
              ]
            Compiler (Item [Char])
getResourceBody
                Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Context [Char] -> KaTeXRender
applyAsTemplate Context [Char]
resumeCtx
                Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
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 [Char] -> KaTeXRender
forall a.
Identifier -> Context a -> Item a -> Compiler (Item [Char])
loadAndApplyTemplate Identifier
rootTemplate Context [Char]
resumeCtx
                Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= KaTeXRender
modifyExternalLinkAttr
                Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= KaTeXRender
relativizeUrls
                Compiler (Item [Char]) -> KaTeXRender -> Compiler (Item [Char])
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= FontAwesomeIcons -> KaTeXRender
FA.render FontAwesomeIcons
faIcons
    Rules () -> PageConfReader Rules ()
forall (m :: * -> *) a. Monad m => m a -> ReaderT PageConf m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Rules () -> PageConfReader Rules ())
-> Rules () -> PageConfReader Rules ()
forall a b. (a -> b) -> a -> b
$ [(Identifier, [Char])] -> Rules ()
createRedirects [
        ([Char] -> Identifier
fromFilePath ([Char] -> Identifier) -> [Char] -> Identifier
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
joinPath [[Char]
"resume", [Char]
"index.html"], [[Char]] -> [Char]
joinPath [[Char]
"/", [Char]
"resume", [Char]
"jp.html"])
      ]
    where
        resumeSnapshot :: [Char]
resumeSnapshot = [Char]
"resumeSS"
        resumeJPPath :: Pattern
resumeJPPath = [Char] -> Pattern
fromGlob ([Char] -> Pattern) -> [Char] -> Pattern
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
joinPath [[Char]
contentsRoot, [Char]
"pages", [Char]
"resume", [Char]
"jp.html"]
        rootTemplate :: Identifier
rootTemplate = [Char] -> Identifier
fromFilePath ([Char] -> Identifier) -> [Char] -> Identifier
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
joinPath [[Char]
contentsRoot, [Char]
"templates", [Char]
"site", [Char]
"default.html"]