1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
{-# LANGUAGE PackageImports #-}
-- Usage: a paragraph containing just [My page](!subst)
-- will be replaced by the contents of My page.
--
-- Limitations: it is assumed that My page is
-- formatted with markdown, and contains no metadata.
module Subst (plugin) where
import "MonadCatchIO-mtl" Control.Monad.CatchIO (try)
import Data.FileStore (FileStoreError, retrieve)
import Text.Pandoc (def, readMarkdown)
import Network.Gitit.ContentTransformer (inlinesToString)
import Network.Gitit.Interface
import Network.Gitit.Framework (filestoreFromConfig)
plugin :: Plugin
plugin = mkPageTransformM substituteIntoBlock
substituteIntoBlock :: [Block] -> PluginM [Block]
substituteIntoBlock ((Para [Link ref ("!subst", _)]):xs) =
do let target = inlinesToString ref
cfg <- askConfig
let fs = filestoreFromConfig cfg
article <- try $ liftIO (retrieve fs (target ++ ".page") Nothing)
case article :: Either FileStoreError String of
Left _ -> let txt = Str ("[" ++ target ++ "](!subst)")
alt = "'" ++ target ++ "' doesn't exist. Click here to create it."
lnk = Para [Link [txt] (target,alt)]
in (lnk :) `fmap` substituteIntoBlock xs
Right a -> let (Pandoc _ content) = readMarkdown def a
in (content ++) `fmap` substituteIntoBlock xs
substituteIntoBlock (x:xs) = (x:) `fmap` substituteIntoBlock xs
substituteIntoBlock [] = return []
|