{-# LANGUAGE FlexibleContexts #-}

{- | Module for pretty-printing epub metadata info

   Used internally by Codec.Epub.Format
-}
module Codec.Epub.Format.Metadata
   ( formatMetadata
   )
   where

import Control.Monad.Writer.Lazy
import qualified Data.Foldable as Foldable
import qualified Data.Map.Strict as Map
import Text.Printf

import Codec.Epub.Format.Util
import Codec.Epub.Data.Metadata


tellTitle :: MonadWriter (Seq Char) m => Title -> m ()
tellTitle :: forall (m :: * -> *). MonadWriter (Seq Char) m => Title -> m ()
tellTitle (Title Maybe String
Nothing Maybe String
Nothing Maybe Int
Nothing String
text) =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"title: %s\n" String
text
tellTitle Title
title =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"title\n%s%s%s%s"
      (String -> Maybe String -> String
formatSubline String
"text" (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Title -> String
titleText Title
title))
      (String -> Maybe String -> String
formatSubline String
"lang" (Title -> Maybe String
titleLang Title
title))
      (String -> Maybe String -> String
formatSubline String
"title-type" (Title -> Maybe String
titleType Title
title))
      (String -> Maybe String -> String
formatSubline String
"display-seq" (forall a. Show a => a -> String
show forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Title -> Maybe Int
titleSeq Title
title))


tellCreator :: MonadWriter (Seq Char) m => Creator -> m ()
tellCreator :: forall (m :: * -> *). MonadWriter (Seq Char) m => Creator -> m ()
tellCreator (Creator Maybe String
Nothing Maybe String
Nothing Maybe Int
Nothing String
creator) =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"creator: %s\n" String
creator
tellCreator (Creator Maybe String
role Maybe String
fileAs Maybe Int
dseq String
creator) =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"creator\n%s%s%s%s"
      (String -> Maybe String -> String
formatSubline String
"text" (forall a. a -> Maybe a
Just String
creator))
      (String -> Maybe String -> String
formatSubline String
"file-as" Maybe String
fileAs)
      (String -> Maybe String -> String
formatSubline String
"role" Maybe String
role)
      (String -> Maybe String -> String
formatSubline String
"display-seq" (forall a. Show a => a -> String
show forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Maybe Int
dseq))


tellContributor :: MonadWriter (Seq Char) m => Creator -> m ()
tellContributor :: forall (m :: * -> *). MonadWriter (Seq Char) m => Creator -> m ()
tellContributor (Creator Maybe String
Nothing Maybe String
Nothing Maybe Int
Nothing String
contributor) =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"contributor: %s\n" String
contributor
tellContributor (Creator Maybe String
role Maybe String
fileAs Maybe Int
dseq String
contributor) =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"contributor\n%s%s%s%s"
      (String -> Maybe String -> String
formatSubline String
"text" (forall a. a -> Maybe a
Just String
contributor))
      (String -> Maybe String -> String
formatSubline String
"file-as" Maybe String
fileAs)
      (String -> Maybe String -> String
formatSubline String
"role" Maybe String
role)
      (String -> Maybe String -> String
formatSubline String
"display-seq" (forall a. Show a => a -> String
show forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Maybe Int
dseq))


tellDate :: MonadWriter (Seq Char) m => (DateEvent, DateValue) -> m ()
tellDate :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
(DateEvent, DateValue) -> m ()
tellDate (DateEvent
event', DateValue String
date') =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"date\n%s%s"
      (String -> Maybe String -> String
formatSubline String
"event" (forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. DateEvent -> String
dateEventToString forall a b. (a -> b) -> a -> b
$ DateEvent
event'))
      (String -> Maybe String -> String
formatSubline String
"text" (forall a. a -> Maybe a
Just String
date'))


tellId :: MonadWriter (Seq Char) m => Identifier -> m ()
tellId :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
Identifier -> m ()
tellId Identifier
ident =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"identifier\n%s%s%s%s"
      (String -> Maybe String -> String
formatSubline String
"id" (Identifier -> Maybe String
idId Identifier
ident))
      (String -> Maybe String -> String
formatSubline String
"identifier-type" (Identifier -> Maybe String
idType Identifier
ident))
      (String -> Maybe String -> String
formatSubline String
"scheme" (Identifier -> Maybe String
idScheme Identifier
ident))
      (String -> Maybe String -> String
formatSubline String
"text" (forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identifier -> String
idText forall a b. (a -> b) -> a -> b
$ Identifier
ident))


tellDescription :: MonadWriter (Seq Char) m => Description -> m ()
tellDescription :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
Description -> m ()
tellDescription (Description Maybe String
Nothing String
text) =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"description: %s\n" String
text
tellDescription (Description Maybe String
lang String
text) =
   forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
"description\n%s%s"
      (String -> Maybe String -> String
formatSubline String
"lang" Maybe String
lang)
      (String -> Maybe String -> String
formatSubline String
"text" (forall a. a -> Maybe a
Just String
text))


tellSimpleString :: MonadWriter (Seq Char) m => String -> String -> m ()
tellSimpleString :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
label = forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall r. PrintfType r => String -> r
printf String
"%s: %s\n" String
label)


tellSimpleMbString :: MonadWriter (Seq Char) m => String
   -> Maybe String -> m ()
tellSimpleMbString :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> Maybe String -> m ()
tellSimpleMbString String
_     Maybe String
Nothing  = forall (m :: * -> *) a. Monad m => a -> m a
return ()
tellSimpleMbString String
label (Just String
s) = forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
label String
s


tellMetadata :: MonadWriter (Seq Char) m => Metadata -> m ()
tellMetadata :: forall (m :: * -> *). MonadWriter (Seq Char) m => Metadata -> m ()
tellMetadata (Metadata [Identifier]
ids [Title]
titles [String]
langs [Creator]
contributors [Creator]
creators Map DateEvent DateValue
dates Maybe String
source Maybe String
mType [String]
coverage [Description]
desc [String]
format [String]
publisher [String]
relation [String]
rights [String]
subjects) = do
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall (m :: * -> *).
MonadWriter (Seq Char) m =>
Identifier -> m ()
tellId [Identifier]
ids
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall (m :: * -> *). MonadWriter (Seq Char) m => Title -> m ()
tellTitle [Title]
titles
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"language") [String]
langs
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall (m :: * -> *). MonadWriter (Seq Char) m => Creator -> m ()
tellContributor [Creator]
contributors
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall (m :: * -> *). MonadWriter (Seq Char) m => Creator -> m ()
tellCreator [Creator]
creators
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall (m :: * -> *).
MonadWriter (Seq Char) m =>
(DateEvent, DateValue) -> m ()
tellDate forall a b. (a -> b) -> a -> b
$ forall k a. Map k a -> [(k, a)]
Map.toList Map DateEvent DateValue
dates
   forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> Maybe String -> m ()
tellSimpleMbString String
"source" Maybe String
source
   forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> Maybe String -> m ()
tellSimpleMbString String
"type" Maybe String
mType
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"coverage") [String]
coverage
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall (m :: * -> *).
MonadWriter (Seq Char) m =>
Description -> m ()
tellDescription [Description]
desc
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"format") [String]
format
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"publisher") [String]
publisher
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"relation") [String]
relation
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"rights") [String]
rights
   forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"subject") [String]
subjects


{- | Format an epub Metadata structure for pretty printing
-}
formatMetadata :: Metadata -> String
formatMetadata :: Metadata -> String
formatMetadata Metadata
meta = forall (t :: * -> *) a. Foldable t => t a -> [a]
Foldable.toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall w a. Writer w a -> w
execWriter
   forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). MonadWriter (Seq Char) m => Metadata -> m ()
tellMetadata Metadata
meta