{-|
Module      : Metadata
Description : Utilities for working with Pandoc metadata.
Copyright   : (c) 2023 Amy de Buitléir
License     : GPL-3.0-only
Maintainer  : amy@nualeargais.ie
Stability   : experimental
Portability : POSIX
-}

{-# LANGUAGE OverloadedStrings #-}
module Text.Pandoc.Metadata
  (
    valueOf
  )
where

import Data.Maybe       (fromMaybe)
import Data.Text        qualified as T
import Text.Pandoc      qualified as P
import Text.Pandoc.Walk (query)

-- | Given metadata, extracts the values associated with the specified key.
valueOf :: P.Meta -> T.Text -> [T.Text]
m `valueOf` k = metaValueToTexts . fromMaybe (P.MetaInlines []) . P.lookupMeta k $ m

metaValueToTexts :: P.MetaValue -> [T.Text]
metaValueToTexts (P.MetaMap _) = error "This version of pandoc-query does not support queries on MetaMap values"
metaValueToTexts (P.MetaList xs) = map (T.concat . metaValueToTexts) xs
metaValueToTexts (P.MetaBool x) = [ T.pack $ show x ]
metaValueToTexts (P.MetaString t) = [t]
metaValueToTexts (P.MetaInlines xs) = [ query inlineToText xs ]
metaValueToTexts (P.MetaBlocks xs) = [ query inlineToText xs ]

inlineToText :: P.Inline -> T.Text
inlineToText (P.Str t) = t
inlineToText (P.Space) = " "
inlineToText _ = ""