mdoc-0.1.0.0: src/Mdoc/Gen/CrossRef.hs
-- |
--
-- Module : Mdoc.Gen.CrossRef
-- Copyright : (c) 2026 Patrick Brisbin
-- License : AGPL-3
-- Maintainer : pbrisbin@gmail.com
-- Stability : experimental
-- Portability : POSIX
module Mdoc.Gen.CrossRef
( CrossRef (..)
, renderCrossRefs
) where
import Mdoc.Prelude
import Data.List.NonEmpty qualified as NE
import Mdoc.MacroArg
import Mdoc.MacroName
import Mdoc.MdocLine
data CrossRef = CrossRef
{ name :: String
, section :: Int -- TODO enum
}
deriving stock (Eq, Show)
instance Ord CrossRef where
a `compare` b = a.section `compare` b.section <> a.name `compare` b.name
renderCrossRefs :: NonEmpty CrossRef -> NonEmpty MdocLine
renderCrossRefs = go . NE.sort
where
go ne = map xr_ (init ne) |: xr (last ne)
-- | @.Xr@ for a single (or final) cross reference
xr :: CrossRef -> MdocLine
xr CrossRef {name, section} =
MacroLine Xr [Bare $ esc $ pack name, Bare $ esc $ pack $ show section]
-- | @.Xr@ for leading cross references with trailing comma
xr_ :: CrossRef -> MdocLine
xr_ CrossRef {name, section} =
MacroLine Xr [Bare $ esc $ pack name, Bare $ esc $ pack $ show section, ","]