diff options
Diffstat (limited to 'src/Zettel/Render.hs')
-rw-r--r-- | src/Zettel/Render.hs | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/src/Zettel/Render.hs b/src/Zettel/Render.hs index 27e8664..276ea9b 100644 --- a/src/Zettel/Render.hs +++ b/src/Zettel/Render.hs @@ -2,14 +2,21 @@ module Zettel.Render where +import Control.Monad as M (when) import Data.Default (def) import qualified Data.Map.Strict as Map import qualified Data.Text as T import Paths_org_zk (getDataFileName) +import Text.Pandoc.App (applyFilters) +import Text.Pandoc.Builder (HasMeta (..), ToMetaValue (..)) import Text.Pandoc.Class (runIOorExplode) import Text.Pandoc.Definition (Block (..), Inline (..)) -import Text.Pandoc.Options (WriterOptions (..), multimarkdownExtensions) +import Text.Pandoc.Extensions (Extension (..), disableExtension, enableExtension) +import Text.Pandoc.Filter (Environment (..), Filter (..)) +import Text.Pandoc.Options (CiteMethod (..), ReaderOptions (..), WriterOptions (..), getDefaultExtensions, multimarkdownExtensions) +import Text.Pandoc.Scripting (noEngine) import Text.Pandoc.Templates (WithDefaultPartials (..), compileTemplate) +import Text.Pandoc.Walk (query, walk) import Text.Pandoc.Writers (writeMarkdown) import Zettel.Types @@ -27,15 +34,53 @@ renderTitleLinks :: Int -> Text -> [ZettelId] -> [Block] renderTitleLinks level title ids = [Header level mempty (toInlines title), renderZettelLinks ids] +newtype MB = MB {unMB :: Bool} deriving (Show, Eq) + +instance Semigroup MB where + MB a <> MB b = MB $ a || b + +instance Monoid MB where + mempty = MB False + +checkCitation :: Inline -> MB +checkCitation Cite {} = MB True +checkCitation _ = MB False + renderZettel :: ZettelId -> Zettel -> IO Text renderZettel _ zettel = do templateFile <- getDataFileName "data/markdown.template" template <- decodeUtf8 <$> readFileBS templateFile Right templ <- runIOorExplode . runWithDefaultPartials $ compileTemplate "" template + let writeOpts = + ( def + { writerTemplate = Just templ, + writerExtensions = multimarkdownExtensions, + writerReferenceLinks = True + } + ) runIOorExplode $ - writeMarkdown - (def {writerTemplate = Just templ, writerExtensions = multimarkdownExtensions}) - zettel.zettelBody + if unMB $ query checkCitation zettel.zettelBody + then + let pandoc = + setMeta "csl" ("/Users/ymherklotz/Dropbox/zk/assets/ieee.csl" :: FilePath) $ + setMeta + "bibliography" + (["/Users/ymherklotz/bibliography/references.bib"] :: [FilePath]) + zettel.zettelBody + in applyFilters + noEngine + ( Environment + def {readerExtensions = getDefaultExtensions "org"} + writeOpts + { writerExtensions = + disableExtension Ext_citations writeOpts.writerExtensions + } + ) + [CiteprocFilter] + ["org"] + pandoc + >>= writeMarkdown writeOpts + else writeMarkdown writeOpts zettel.zettelBody renderZettelFile :: FilePath -> ZettelId -> Zettel -> IO () renderZettelFile dir ident zettel = do |