From 9485e9af58c9b71594d3ad99be9eced2955a157d Mon Sep 17 00:00:00 2001 From: Pagwin Date: Sat, 20 Jul 2024 20:30:21 -0400 Subject: [PATCH] now I just need to fix shake rules so things are needed/provided correctly --- .shake/.shake.database | Bin 708 -> 945 bytes app/Main.hs | 13 ++----------- app/Templates.hs | 2 +- app/Utilities.hs | 33 +++++++++++++++++++++++++-------- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/.shake/.shake.database b/.shake/.shake.database index b54b71197283a47eb586524a0c3fd0cce6938f70..7ccfa30d1fd1cc044bcc3146a82da61baedc9a8c 100644 GIT binary patch delta 246 zcmX@Yx{-au5vF=21_lO3AcO!GAjO1)p~4K9s+fUNFbq>=1!S->fXom9Vvso?zyZX? zC5a`O$@*F#wwmV5T?z6R-h*}L0R@iEn`Z%}803JM3v4Ke2Ldn)o@~2q3gX)WF&hvv jFo**&%mQv8yCA=~q*z}|ucWd7!w#Ty)9)^GAjJRx88RC` delta 7 OcmdnUeuQ), (|%>), (~>)) -import Development.Shake.FilePath ((<.>), ()) -import Text.Pandoc (Block (Plain), Meta (..), MetaValue (..), Pandoc (..)) -import qualified Data.Aeson.Types as A +import Development.Shake (Action, Rules, (|%>), (~>)) +import Development.Shake.FilePath (()) import qualified Data.HashMap.Strict as HM -import qualified Data.Ord as Ord import qualified Data.Text as T import qualified Development.Shake as Shake import qualified Development.Shake.FilePath as Shake -import qualified Text.Mustache as Mus -import qualified Text.Mustache.Compile as Mus -import qualified Text.Pandoc as Pandoc import Config import Utilities import Templates diff --git a/app/Templates.hs b/app/Templates.hs index 60df609..3184327 100644 --- a/app/Templates.hs +++ b/app/Templates.hs @@ -12,7 +12,7 @@ import qualified Data.Aeson as A import qualified Data.Text as T import Development.Shake.FilePath (()) -applyTemplate :: ToJSON a => String -> a -> Text +applyTemplate :: ToJSON a => String -> a -> Action Text applyTemplate templateName context = do tmpl <- readTemplate $ "templates" templateName case Mus.checkedSubstitute tmpl (A.toJSON context) of diff --git a/app/Utilities.hs b/app/Utilities.hs index 5380178..be5d891 100644 --- a/app/Utilities.hs +++ b/app/Utilities.hs @@ -9,6 +9,8 @@ import qualified Development.Shake.FilePath as Shake import qualified Text.Pandoc as Pandoc import Config import Development.Shake (Action) +import Text.Pandoc +import Data.Aeson as A indexHtmlOutputPath :: FilePath -> FilePath indexHtmlOutputPath srcPath = @@ -21,19 +23,34 @@ indexHtmlSourcePath = . Shake.dropTrailingPathSeparator . Shake.dropFileName -typstToHtml :: FilePath -> Action Text +typstToHtml :: FromJSON a => FilePath -> Action (a, Text) typstToHtml filePath = do content <- Shake.readFile' filePath Shake.quietly . Shake.traced "Typst to HTML" $ do - doc <- runPandoc . Pandoc.readTypst readerOptions . T.pack $ content - - runPandoc . Pandoc.writeHtml5String writerOptions $ doc + doc@(Pandoc meta _) <- runPandoc . Pandoc.readTypst readerOptions . T.pack $ content + meta' <- fromMeta meta + html <- runPandoc . Pandoc.writeHtml5String writerOptions $ doc + return (meta', html) where readerOptions = Pandoc.def {Pandoc.readerExtensions = Pandoc.pandocExtensions} writerOptions = Pandoc.def {Pandoc.writerExtensions = Pandoc.pandocExtensions} - -runPandoc action = - Pandoc.runIO (Pandoc.setVerbosity Pandoc.ERROR >> action) - >>= either (fail . show) return + 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 + runPandoc action = + Pandoc.runIO (Pandoc.setVerbosity Pandoc.ERROR >> action) + >>= either (fail . show) return