-- |
-- Description: Rules for generating the publications page.
-- Copyright: Copyright (C) 2023 Yoo Chung
-- License: All rights reserved
-- Maintainer: web@chungyc.org
--
-- Exports rules for my list of publications.
module Web.Site.Rules.Publication (rules, items) where

import Hakyll
import Web.Site.Compilers

-- |
-- Rules related to the list of my publications.
rules :: Rules ()
rules :: Rules ()
rules = do
  Pattern -> Rules () -> Rules ()
match Pattern
"publications/index.markdown" (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
$ String -> Routes
constRoute String
"publications"
    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
$
      Compiler (Item String)
publicationsCompiler
        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 Identifier
"templates/default.html" Context String
siteContext

  Pattern -> Rules () -> Rules ()
match (String -> Pattern
fromGlob String
cslFile) (Rules () -> Rules ()) -> Rules () -> Rules ()
forall a b. (a -> b) -> a -> b
$ Compiler (Item CSL) -> Rules ()
forall a.
(Binary a, Typeable a, Writable a) =>
Compiler (Item a) -> Rules ()
compile Compiler (Item CSL)
cslCompiler
  Pattern -> Rules () -> Rules ()
match (String -> Pattern
fromGlob String
bibFile) (Rules () -> Rules ()) -> Rules () -> Rules ()
forall a b. (a -> b) -> a -> b
$ Compiler (Item Biblio) -> Rules ()
forall a.
(Binary a, Typeable a, Writable a) =>
Compiler (Item a) -> Rules ()
compile Compiler (Item Biblio)
biblioCompiler

-- |
-- Pattern for files matched or created in this module.
--
-- These will be used to generate the sitemap.
items :: Pattern
items :: Pattern
items = Pattern
"publications/index.markdown"

publicationsCompiler :: Compiler (Item String)
publicationsCompiler :: Compiler (Item String)
publicationsCompiler = do
  Item CSL
csl <- Identifier -> Compiler (Item CSL)
forall a. (Binary a, Typeable a) => Identifier -> Compiler (Item a)
load (Identifier -> Compiler (Item CSL))
-> Identifier -> Compiler (Item CSL)
forall a b. (a -> b) -> a -> b
$ String -> Identifier
fromFilePath String
cslFile
  Item Biblio
bib <- Identifier -> Compiler (Item Biblio)
forall a. (Binary a, Typeable a) => Identifier -> Compiler (Item a)
load (Identifier -> Compiler (Item Biblio))
-> Identifier -> Compiler (Item Biblio)
forall a b. (a -> b) -> a -> b
$ String -> Identifier
fromFilePath String
bibFile
  Item String
body <- Compiler (Item String)
getResourceBody
  Item Pandoc
doc <- ReaderOptions
-> Item CSL -> Item Biblio -> Item String -> Compiler (Item Pandoc)
readPandocBiblio ReaderOptions
defaultHakyllReaderOptions Item CSL
csl Item Biblio
bib Item String
body
  Item String -> Compiler (Item String)
forall a. a -> Compiler a
forall (m :: * -> *) a. Monad m => a -> m a
return (Item String -> Compiler (Item String))
-> Item String -> Compiler (Item String)
forall a b. (a -> b) -> a -> b
$ Item Pandoc -> Item String
writePandoc Item Pandoc
doc

-- |
-- This is a modified version of the ACM's CSL file.
--
-- The difference is that this sorts by date in reverse order.
cslFile :: String
cslFile :: String
cslFile = String
"publications/acm.csl"

-- | This is a bibliography of my publications.
bibFile :: String
bibFile :: String
bibFile = String
"publications/chungyc.bib"