her.esy.fun/Shakefile.hs

62 lines
2.0 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
import Development.Shake
import Development.Shake.Command
import Development.Shake.FilePath
import Development.Shake.Util
import Data.Default (Default(def))
import qualified Data.Set as Set
import qualified Data.Text as T
import Text.Pandoc.Class (PandocPure)
import qualified Text.Pandoc.Class as Pandoc
import Text.Pandoc.Extensions (getDefaultExtensions)
import Text.Pandoc.Options (ReaderOptions(..),TrackChanges(RejectChanges))
import qualified Text.Pandoc.Readers as Readers
import qualified Text.Pandoc.Writers as Writers
main :: IO ()
main = do
let shOpts = shakeOptions { shakeVerbosity = Chatty, shakeLintInside = ["\\"] }
shakeArgs shOpts buildRules
buildRules :: Rules ()
buildRules = do
phony "clean" $ do
putInfo "Cleaning files in _site and _optim"
removeFilesAfter "_site" ["//*"]
removeFilesAfter "_optim" ["//*"]
"_site//*.html" %> buildPost
-- buildPosts
-- allPosts <- buildPosts
-- buildIndex allPosts
-- buildFeed allPosts
-- copyStaticFiles
data Post = Post { postTitle :: T.Text
, postAuthor :: T.Text
, postDate :: T.Text
}
defaultReaderOpts t =
def { readerExtensions = getDefaultExtensions t
, readerStandalone = True }
orgToHTML :: T.Text -> PandocPure T.Text
orgToHTML txt = Readers.readOrg (defaultReaderOpts "org") txt
>>= Writers.writeHtml5String def
-- | Load a post, process metadata, write it to output, then return the post object
-- Detects changes to either post content or template
buildPost :: FilePath -> Action ()
buildPost out = do
let org = "src/" <> (dropDirectory1 $ out -<.> "org")
liftIO . putStrLn $ "Rebuilding post: " <> out
postContent <- readFile' org
-- load post content and metadata as JSON blob
let pandocReturn = Pandoc.runPure $ orgToHTML . T.pack $ postContent
case pandocReturn of
Left _ -> putError "BAD"
Right outData -> writeFile' out (T.unpack outData)