packages feed

emanote-1.2.0.0: src/Emanote/Model/Stork.hs

module Emanote.Model.Stork (
  renderStorkIndex,
) where

import Control.Monad.Logger (MonadLoggerIO)
import Data.Default (Default (def))
import Data.IxSet.Typed qualified as Ix
import Emanote.Model.Meta (lookupRouteMeta)
import Emanote.Model.Note qualified as N
import Emanote.Model.Stork.Index (
  Config (Config),
  File (File),
  FileType (FileType_Markdown, FileType_PlainText),
  Handling,
  Input (Input),
  readOrBuildStorkIndex,
 )
import Emanote.Model.Title qualified as Tit
import Emanote.Model.Type (Model)
import Emanote.Model.Type qualified as M
import Emanote.Route qualified as R
import Emanote.Route.SiteRoute qualified as SR
import Emanote.Source.Loc qualified as Loc
import Optics.Core ((^.))
import Relude
import System.FilePath ((</>))

renderStorkIndex :: (MonadIO m, MonadLoggerIO m) => Model -> m LByteString
renderStorkIndex model = do
  let config = Config $ Input (storkFiles model) (frontmatterHandling model)
  readOrBuildStorkIndex (model ^. M.modelStorkIndex) config

storkFiles :: Model -> [File]
storkFiles model =
  let baseDir = Loc.locPath . Loc.primaryLayer $ model ^. M.modelLayers
   in Ix.toList (model ^. M.modelNotes) <&> \note ->
        let fp = ((baseDir </>) $ R.withLmlRoute R.encodeRoute $ note ^. N.noteRoute)
            ft = case note ^. N.noteRoute of
              R.LMLRoute_Md _ -> FileType_Markdown
              R.LMLRoute_Org _ -> FileType_PlainText
         in File
              fp
              (SR.siteRouteUrl model $ SR.lmlSiteRoute (R.LMLView_Html, note ^. N.noteRoute))
              (Tit.toPlain $ note ^. N.noteTitle)
              ft

frontmatterHandling :: Model -> Handling
frontmatterHandling model =
  let indexRoute = M.modelIndexRoute model
   in lookupRouteMeta def ("template" :| ["stork", "frontmatter-handling"]) indexRoute model