summaryrefslogtreecommitdiffstats
path: root/src/Zettel/Bibliography.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Zettel/Bibliography.hs')
-rw-r--r--src/Zettel/Bibliography.hs34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/Zettel/Bibliography.hs b/src/Zettel/Bibliography.hs
index 6186917..42476be 100644
--- a/src/Zettel/Bibliography.hs
+++ b/src/Zettel/Bibliography.hs
@@ -1,25 +1,55 @@
{-# LANGUAGE OverloadedRecordDot #-}
-module Zettel.Bibliography where
+-- |
+-- Module : Zettel.Bibliography
+-- Description : Render bibliography citations to links to org bibliography
+-- Copyright : (c) 2023, Yann Herklotz
+-- License : GPL-3
+-- Maintainer : git [at] yannherklotz [dot] com
+-- Stability : experimental
+-- Portability : POSIX
+--
+-- By default, if no Org bibliography file is provided, the citations are
+-- handled during rendering. However, it is useful to link to any bibliographic
+-- notes that one might already have instead of just citing the works in the
+-- 'Zettel'.
+--
+-- 'handleBibliography' can therefore be used to replace all citations in all
+-- 'Zettel' to links instead. These will then link to the rendered
+-- bibliographic notes about the cited work, which can then include the full
+-- citation as well.
+module Zettel.Bibliography
+ ( handleBibliography,
+ replaceCitation,
+ replaceCite,
+ replaceCites,
+ )
+where
-import Text.Pandoc.Definition (Citation (..), Inline (..), Target (..))
+import Text.Pandoc.Definition (Citation (..), Inline (..), Target)
import Text.Pandoc.Walk (walk)
import Zettel.Types
+-- | Replace the Citation by the link with a description and a target.
replaceCitation :: Citation -> ([Inline], Target)
replaceCitation c =
([Str $ "@" <> zid], ("/bib/" <> zid, ""))
where
zid = citationId c
+-- | Replace a citation by a link to the Org bibliography file.
replaceCite :: Inline -> [Inline]
replaceCite (Cite c _) =
[Str "("] <> map (uncurry (Link mempty) . replaceCitation) c <> [Str ")"]
replaceCite c = [c]
+-- | Replaces all citations by a link to the Org bibliography file.
replaceCites :: [Inline] -> [Inline]
replaceCites = concatMap replaceCite
+-- | If the bibliography is non-empty (i.e. 'zettelGraphBib' is non-empty), then
+-- it replaces all citations in 'Zettel' in 'unZettelGraph' by links to
+-- @\/bib\/citationId@.
handleBibliography :: ZettelGraph -> ZettelGraph
handleBibliography zg =
if null zg.zettelGraphBib then zg else zg {unZettelGraph = walk replaceCites zg.unZettelGraph}