agda2lagda-0.2025.9.5: src/Render.hs
-- | Render the parsed items.
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PatternSynonyms #-}
module Render
( lagdaTex
, lagdaMd
) where
import qualified Data.List.NonEmpty as List1
import qualified LexicalStructure as L
import Options (Language, languageToHighlighter)
import Markup
import Version
-- | Render into plain literate LaTeX Agda.
lagdaTex :: [L.Item] -> String
lagdaTex its = unlines $ concat
[ ["%% This file was automatically generated by agda2lagda " ++ version ++ "."]
, [""]
, map render $ markup its
]
where
render = \case
TextItem it -> renderTex it
CommItem s -> unlines $ map ("%% " ++) $ lines s
CodeItem s -> concat
[ "\\begin{code}\n"
, s
, "\\end{code}\n"
]
-- | Render a markup item
renderTex :: TextItem -> String
renderTex = \case
Paragraph p -> unlines $ List1.toList p
Heading 1 s -> "\\heading{" ++ s ++ "}\n"
Heading 2 s -> "\\subheading{" ++ s ++ "}\n"
Heading _ _ -> error "Render.renderTex: headings are only supported of level 1 or 2"
Itemize ps -> unlines $ concat $
[ [ "\\begin{itemize}\n" ]
, map (unlines . ("\\item" :) . List1.toList) ps
, [ "\\end{itemize}" ]
]
-- | Render into literate Markdown Agda.
lagdaMd :: Language -> [L.Item] -> String
lagdaMd language its = unlines $ concat
[ ["<!-- This file was automatically generated by agda2lagda " ++ version ++ ". -->"]
, [""]
, map render $ gobbleTrailingBlockCommentClosers its
]
where
render = \case
L.TextItem s -> s
L.CommItem s -> unwords ["<!--", s, "-->"]
L.CodeItem s -> concat
[ "```" ++ languageToHighlighter language ++ "\n"
, s
, "```\n"
]