{-# 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"]