diff options
| author | Mirek Kratochvil <exa.exa@gmail.com> | 2023-06-18 22:11:01 +0200 |
|---|---|---|
| committer | Mirek Kratochvil <exa.exa@gmail.com> | 2023-06-18 22:11:01 +0200 |
| commit | 6cd0b9f6631d14f66c4b994771dee60ef74b270c (patch) | |
| tree | 68b144c0b2b13543dad8d40df1a62f9e06b6c0b1 /site.hs | |
| parent | 8fd47d38bb4c3dead49600f93f5345c0b06a6fec (diff) | |
| download | reploy-6cd0b9f6631d14f66c4b994771dee60ef74b270c.tar.gz reploy-6cd0b9f6631d14f66c4b994771dee60ef74b270c.tar.bz2 | |
configurable tocs
Diffstat (limited to 'site.hs')
| -rw-r--r-- | site.hs | 23 |
1 files changed, 21 insertions, 2 deletions
@@ -3,7 +3,7 @@ -- | The main deployment script. module Main where -import Control.Monad ((>=>), unless, when) +import Control.Monad ((>=>), unless, when, join) import Control.Monad.Extra (whenM) import Control.Monad.Trans.State.Lazy import qualified Data.Aeson as AE @@ -15,6 +15,7 @@ import Data.Foldable (traverse_) import Data.List (inits, nub, sort) import Data.List.Extra (groupSort) import qualified Data.Map as M +import qualified Data.Scientific import qualified Data.Set as S import Data.String (fromString) import qualified Data.Text as T @@ -36,9 +37,11 @@ import System.FilePath ) import qualified Text.Mustache as Mu import Text.Pandoc.Class (runIOorExplode) +import qualified Text.Pandoc.Definition import Text.Pandoc.Readers.Markdown (readMarkdown) import Text.Pandoc.Writers (writePlain) import Text.Pandoc.Writers.HTML (writeHtml5String) +import Text.Pandoc.Writers.Shared (toTableOfContents) import qualified Text.Parsec.Error import FormatOpts @@ -175,6 +178,22 @@ addPageMeta pi (Y.Object m) = do to splitDirectories pure . Y.Object $ KM.insert "htags" (Y.array htagMeta) m +-- | If viable for a page (by config), add the TOC field +addTOC :: PageInfo -> Text.Pandoc.Definition.Pandoc -> Y.Value -> Site Y.Value +addTOC pi doc meta@(Y.Object meta') = + let go n = do + toc <- + io . runIOorExplode $ writeHtml5String htmlWriteOpts $ + withPandocBlocks + (pure . toTableOfContents (tocWriteOpts n)) + doc + pure . Y.Object $ KM.insert "toc" (Y.String toc) meta' + in case ( pi ^? pageMeta . key "toc" . _Bool + , join $ pi ^? pageMeta . key "toc" . _Number . to Data.Scientific.toBoundedInteger) of + (Just False, _) -> pure meta + (_, Nothing) -> go (3 :: Int) + (_, Just n) -> go n + -- | Render a page using the current template. installPage :: FilePath -> PageInfo -> Site () installPage mount pi = do @@ -189,7 +208,7 @@ installPage mount pi = do addHeadingLinks "header-local-anchor" fixedUrlDoc let Y.Object meta' = pi ^. pageMeta meta = Y.Object $ KM.insert "body" (Y.String body) meta' - meta <- addGlobalMeta meta >>= addPageMeta pi + meta <- addGlobalMeta meta >>= addTOC pi fixedUrlDoc >>= addPageMeta pi io $ do putStrLn $ "P -> " ++ file makeDirectories file |
