draft attr first draft

This commit is contained in:
Pagwin 2024-11-02 19:40:43 -04:00
parent e8b5caa77c
commit 5608960b63
No known key found for this signature in database
GPG key ID: 81137023740CA260
3 changed files with 46 additions and 4 deletions

View file

@ -8,12 +8,11 @@
module Main where module Main where
import Config import Config
import Control.Monad (forM, when) import Control.Monad (filterM, forM, when)
import qualified Data.HashMap.Strict as HM import qualified Data.HashMap.Strict as HM
import Data.List (sortOn) import Data.List (sortOn)
import qualified Data.Ord as Ord import qualified Data.Ord as Ord
import qualified Data.Text as T import qualified Data.Text as T
import Data.Time
import Development.Shake (Action, Rules, (%>), (|%>), (~>)) import Development.Shake (Action, Rules, (%>), (|%>), (~>))
import qualified Development.Shake as Shake import qualified Development.Shake as Shake
import Development.Shake.FilePath ((</>)) import Development.Shake.FilePath ((</>))
@ -47,7 +46,8 @@ buildSite = do
-- handle posts -- handle posts
postPaths <- Shake.getDirectoryFiles "" postGlobs postPaths <- Shake.getDirectoryFiles "" postGlobs
Shake.need $ map indexHtmlOutputPath postPaths postPaths' <- filterM isDraft postPaths
Shake.need $ map indexHtmlOutputPath postPaths'
-- posts list -- posts list
Shake.need [indexHtmlOutputPath "posts"] Shake.need [indexHtmlOutputPath "posts"]

View file

@ -26,7 +26,8 @@ data Post = Post
postTags :: [Text], postTags :: [Text],
postDate :: Maybe Text, postDate :: Maybe Text,
postContent :: Maybe Text, postContent :: Maybe Text,
postLink :: Maybe Text postLink :: Maybe Text,
postDraft :: Bool
} }
deriving (Show, Generic) deriving (Show, Generic)
deriving (FromJSON, ToJSON) via PrefixedSnake "post" Post deriving (FromJSON, ToJSON) via PrefixedSnake "post" Post

View file

@ -3,6 +3,7 @@ module Utilities where
import Config import Config
import Data.Aeson (Result (Error, Success)) import Data.Aeson (Result (Error, Success))
import qualified Data.Aeson as A import qualified Data.Aeson as A
import Data.List (find)
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Data.Text (Text) import Data.Text (Text)
import qualified Data.Text as T import qualified Data.Text as T
@ -98,6 +99,34 @@ runPandoc action =
Pandoc.runIO (Pandoc.setVerbosity Pandoc.ERROR >> action) Pandoc.runIO (Pandoc.setVerbosity Pandoc.ERROR >> action)
>>= either (fail . show) return >>= either (fail . show) return
markdownToPost :: FilePath -> Action Post
markdownToPost path = do
content <- Shake.readFile' path
(Pandoc meta _) <-
Shake.liftIO . runPandoc . Pandoc.readMarkdown readerOptions . T.pack $ content
Shake.liftIO $ fromMeta meta
where
readerOptions =
Pandoc.def
{ Pandoc.readerStandalone = True,
Pandoc.readerExtensions = Pandoc.enableExtension Pandoc.Ext_yaml_metadata_block Pandoc.pandocExtensions
}
fromMeta (Meta meta) =
A.fromJSON . A.toJSON <$> traverse metaValueToJSON meta >>= \case
Success res -> pure res
Error err -> fail $ "json conversion error:" <> err
metaValueToJSON = \case
MetaMap m -> A.toJSON <$> traverse metaValueToJSON m
MetaList m -> A.toJSONList <$> traverse metaValueToJSON m
MetaBool m -> pure $ A.toJSON m
MetaString m -> pure $ A.toJSON $ T.strip m
MetaInlines m -> metaValueToJSON $ MetaBlocks [Plain m]
MetaBlocks m ->
fmap (A.toJSON . T.strip)
. runPandoc
. Pandoc.writePlain Pandoc.def
$ Pandoc mempty m
yamlToPost :: FilePath -> Action Post yamlToPost :: FilePath -> Action Post
yamlToPost path = do yamlToPost path = do
post <- decodeFileThrow path post <- decodeFileThrow path
@ -120,3 +149,15 @@ isTypstPost path = Shake.takeExtension path == ".typ"
isMarkdownPost :: FilePath -> Bool isMarkdownPost :: FilePath -> Bool
isMarkdownPost path = Shake.takeExtension path == ".md" isMarkdownPost path = Shake.takeExtension path == ".md"
postHandles :: [(FilePath -> Bool, FilePath -> Action Post)]
postHandles = [(isTypstPost, yamlToPost . typstMetaPath), (isMarkdownPost, markdownToPost)]
isDraft :: FilePath -> Action Bool
isDraft path = do
let action =
case find (\(test, _) -> test path) postHandles of
(Just (_, action')) -> action'
Nothing -> error "no post handle for this file type"
post <- action path
return $ postDraft post