summaryrefslogtreecommitdiffstats
path: root/src/Zettel/Render.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Zettel/Render.hs')
-rw-r--r--src/Zettel/Render.hs53
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