2020-05-25 20:30:22 +00:00
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
|
2020-05-25 20:28:06 +00:00
|
|
|
import Development.Shake
|
|
|
|
import Development.Shake.Command
|
|
|
|
import Development.Shake.FilePath
|
|
|
|
import Development.Shake.Util
|
2020-06-14 11:19:13 +00:00
|
|
|
|
|
|
|
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
|
2020-05-25 20:28:06 +00:00
|
|
|
|
|
|
|
main :: IO ()
|
|
|
|
main = do
|
|
|
|
let shOpts = shakeOptions { shakeVerbosity = Chatty, shakeLintInside = ["\\"] }
|
2020-06-14 11:19:13 +00:00
|
|
|
shakeArgs shOpts buildRules
|
2020-05-25 20:28:06 +00:00
|
|
|
|
2020-06-14 11:19:13 +00:00
|
|
|
buildRules :: Rules ()
|
2020-05-25 20:28:06 +00:00
|
|
|
buildRules = do
|
2020-06-14 11:19:13 +00:00
|
|
|
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 }
|
2020-05-25 20:28:06 +00:00
|
|
|
|
2020-06-14 11:19:13 +00:00
|
|
|
orgToHTML :: T.Text -> PandocPure T.Text
|
|
|
|
orgToHTML txt = Readers.readOrg (defaultReaderOpts "org") txt
|
|
|
|
>>= Writers.writeHtml5String def
|
2020-05-25 20:28:06 +00:00
|
|
|
|
|
|
|
-- | Load a post, process metadata, write it to output, then return the post object
|
|
|
|
-- Detects changes to either post content or template
|
2020-06-14 11:19:13 +00:00
|
|
|
buildPost :: FilePath -> Action ()
|
|
|
|
buildPost out = do
|
|
|
|
let org = "src/" <> (dropDirectory1 $ out -<.> "org")
|
|
|
|
liftIO . putStrLn $ "Rebuilding post: " <> out
|
|
|
|
postContent <- readFile' org
|
2020-05-25 20:28:06 +00:00
|
|
|
-- load post content and metadata as JSON blob
|
2020-06-14 11:19:13 +00:00
|
|
|
let pandocReturn = Pandoc.runPure $ orgToHTML . T.pack $ postContent
|
|
|
|
case pandocReturn of
|
|
|
|
Left _ -> putError "BAD"
|
|
|
|
Right outData -> writeFile' out (T.unpack outData)
|