add local anchors to headers

This commit is contained in:
Mirek Kratochvil 2023-06-15 15:05:51 +02:00
parent 1c214fa9f7
commit 0f97b7a64f
3 changed files with 30 additions and 1 deletions

View file

@ -1,3 +1,5 @@
{-# LANGUAGE OverloadedStrings #-}
module Utils where
import Control.Monad.IO.Class
@ -41,6 +43,20 @@ walkURLs f = Text.Pandoc.Walk.walkM go
pure $ Image a i (u', t)
go x = pure x
-- | A pandoc walker for adding the local links to the headings (links are
-- appended and get a given class)
addHeadingLinks ::
T.Text -> Text.Pandoc.Definition.Pandoc -> Text.Pandoc.Definition.Pandoc
addHeadingLinks cls = Text.Pandoc.Walk.walk go
where
go h@(Header lvl attr@(id, _, _) inlines) =
Header
lvl
attr
(inlines ++
[Link ("", [cls], []) [Str "#"] ("#" <> id, "Link to this section")])
go x = x
hasUriScheme :: String -> String -> Bool
hasUriScheme x = all id . zipWith (==) x . (++ ":")

View file

@ -43,6 +43,17 @@ a:hover {
text-decoration: underline;
}
a.header-local-anchor {
color: #eee;
font-weight: 300;
padding-left: 0.5em;
}
a.header-local-anchor:hover {
text-decoration: none;
color: #0ad;
}
body {
margin: 0;
background: white;

View file

@ -178,7 +178,9 @@ installPage mount pi = do
fixedUrlDoc <-
walkURLs (processLink $ pi ^. pagePath . to takeDirectory) $ pi ^. pageDoc
checkTarget file
body <- io . runIOorExplode $ writeHtml5String htmlWriteOpts fixedUrlDoc
body <-
io . runIOorExplode $ writeHtml5String htmlWriteOpts $
addHeadingLinks "header-local-anchor" fixedUrlDoc
let Y.Object meta' = pi ^. pageMeta
meta = Y.Object $ KM.insert "body" (Y.String body) meta'
meta <- addGlobalMeta meta >>= addPageMeta pi