packages feed

pandoc-columns-0.2.0.5: src/Text/Pandoc/Filters/Columns.hs

{-|
Module      : Columns
Description : Pandoc filter to support columns in Markdown.
Copyright   : (c) 2020-2023 Amy de Buitléir
License     : BSD--3
Maintainer  : amy@nualeargais.ie
Stability   : experimental
Portability : POSIX

See <https://github.com/mhwombat/pandoc-linear-table> for information
on how to use this filter.
-}

{-# LANGUAGE OverloadedStrings #-}
module Text.Pandoc.Filters.Columns
  (
    transform,
    formatColumns
  ) where

import Text.Pandoc      qualified as P
import Text.Pandoc.Walk (walk)


-- | A transformation that can be used with Hakyll.
transform :: P.Pandoc -> P.Pandoc
transform = walk formatColumns

formatColumns :: P.Block -> P.Block
formatColumns (P.Div attr@(_,["columns"],_) bs)
  = P.Table attr defaultTableCaption colSpecs
                    defaultTableHeader [body]
                    defaultTableFooter
  where body = blocksToTableBody bs
        colSpecs = map (const defaultColSpec) bs
formatColumns b = b

blocksToTableBody :: [P.Block] -> P.TableBody
blocksToTableBody bs = P.TableBody P.nullAttr (P.RowHeadColumns 0) [] [row]
  where row = blocksToTableRow bs

blocksToTableRow :: [P.Block] -> P.Row
blocksToTableRow = P.Row P.nullAttr . map blockToCell

blockToCell :: P.Block -> P.Cell
blockToCell b = P.Cell P.nullAttr P.AlignDefault (P.RowSpan 1) (P.ColSpan 1) [b]

defaultColSpec :: P.ColSpec
defaultColSpec = (P.AlignDefault, P.ColWidthDefault)

defaultTableCaption :: P.Caption
defaultTableCaption = P.Caption Nothing []

defaultTableHeader :: P.TableHead
defaultTableHeader = P.TableHead P.nullAttr []

defaultTableFooter :: P.TableFoot
defaultTableFooter = P.TableFoot P.nullAttr []