{-|
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]
Meta
m valueOf :: Meta -> Text -> [Text]
`valueOf` Text
k = MetaValue -> [Text]
metaValueToTexts (MetaValue -> [Text]) -> (Meta -> MetaValue) -> Meta -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetaValue -> Maybe MetaValue -> MetaValue
forall a. a -> Maybe a -> a
fromMaybe ([Inline] -> MetaValue
P.MetaInlines []) (Maybe MetaValue -> MetaValue)
-> (Meta -> Maybe MetaValue) -> Meta -> MetaValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Meta -> Maybe MetaValue
P.lookupMeta Text
k (Meta -> [Text]) -> Meta -> [Text]
forall a b. (a -> b) -> a -> b
$ Meta
m

metaValueToTexts :: P.MetaValue -> [T.Text]
metaValueToTexts :: MetaValue -> [Text]
metaValueToTexts (P.MetaMap Map Text MetaValue
_) = [Char] -> [Text]
forall a. HasCallStack => [Char] -> a
error [Char]
"This version of pandoc-query does not support queries on MetaMap values"
metaValueToTexts (P.MetaList [MetaValue]
xs) = (MetaValue -> Text) -> [MetaValue] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map ([Text] -> Text
T.concat ([Text] -> Text) -> (MetaValue -> [Text]) -> MetaValue -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetaValue -> [Text]
metaValueToTexts) [MetaValue]
xs
metaValueToTexts (P.MetaBool Bool
x) = [ [Char] -> Text
T.pack ([Char] -> Text) -> [Char] -> Text
forall a b. (a -> b) -> a -> b
$ Bool -> [Char]
forall a. Show a => a -> [Char]
show Bool
x ]
metaValueToTexts (P.MetaString Text
t) = [Text
t]
metaValueToTexts (P.MetaInlines [Inline]
xs) = [ (Inline -> Text) -> [Inline] -> Text
forall c. Monoid c => (Inline -> c) -> [Inline] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query Inline -> Text
inlineToText [Inline]
xs ]
metaValueToTexts (P.MetaBlocks [Block]
xs) = [ (Inline -> Text) -> [Block] -> Text
forall c. Monoid c => (Inline -> c) -> [Block] -> c
forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
query Inline -> Text
inlineToText [Block]
xs ]

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